diff --git a/app/src/main/java/com/aiosman/riderpro/entity/Chat.kt b/app/src/main/java/com/aiosman/riderpro/entity/Chat.kt new file mode 100644 index 0000000..2dd0d82 --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/entity/Chat.kt @@ -0,0 +1,87 @@ +package com.aiosman.riderpro.entity + +import android.content.Context +import android.icu.util.Calendar +import com.aiosman.riderpro.exp.formatChatTime +import com.tencent.imsdk.v2.V2TIMImageElem +import com.tencent.imsdk.v2.V2TIMMessage + +data class ChatItem( + val message: String, + val avatar: String, + val time: String, + val userId: String, + val nickname: String, + val timeCategory: String = "", + val timestamp: Long = 0, + val imageList: MutableList = emptyList().toMutableList(), + val messageType : Int = 0, + val textDisplay : String = "", + val msgId: String, // Add this property + var showTimestamp: Boolean = false, + var showTimeDivider:Boolean = false +) { + companion object { + fun convertToChatItem(message: V2TIMMessage, context: Context): ChatItem? { +// val avatar = if (message.sender == userProfile?.trtcUserId) { +// userProfile?.avatar ?: "" +// } else { +// myProfile?.avatar ?: "" +// } +// val nickname = if (message.sender == userProfile?.trtcUserId) { +// userProfile?.nickName ?: "" +// } else { +// myProfile?.nickName ?: "" +// } + val timestamp = message.timestamp + val calendar = Calendar.getInstance() + calendar.timeInMillis = timestamp * 1000 + val imageElm = message.imageElem?.imageList + when (message.elemType) { + V2TIMMessage.V2TIM_ELEM_TYPE_IMAGE -> { + val imageElm = message.imageElem?.imageList?.all { + it.size == 0 + } + if (imageElm != true) { + return ChatItem( + message = "Image", + avatar = message.faceUrl, + time = calendar.time.formatChatTime(context), + userId = message.sender, + nickname = message.nickName, + timestamp = timestamp * 1000, + imageList = message.imageElem?.imageList + ?: emptyList().toMutableList(), + messageType = V2TIMMessage.V2TIM_ELEM_TYPE_IMAGE, + textDisplay = "Image", + msgId = message.msgID // Add this line to include msgId + ) + } + return null + } + + V2TIMMessage.V2TIM_ELEM_TYPE_TEXT -> { + return ChatItem( + message = message.textElem?.text ?: "Unsupported message type", + avatar = message.faceUrl, + time = calendar.time.formatChatTime(context), + userId = message.sender, + nickname = message.nickName, + timestamp = timestamp * 1000, + imageList = imageElm?.toMutableList() + ?: emptyList().toMutableList(), + messageType = V2TIMMessage.V2TIM_ELEM_TYPE_TEXT, + textDisplay = message.textElem?.text ?: "Unsupported message type", + msgId = message.msgID // Add this line to include msgId + ) + + } + else -> { + return null + } + + } + } + } +} + diff --git a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt index 74b7ce0..1a24291 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt @@ -3,7 +3,6 @@ package com.aiosman.riderpro.ui.chat import android.app.Activity import android.content.Intent import android.net.Uri -import android.util.Log import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.Crossfade @@ -35,7 +34,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Icon import androidx.compose.material.Scaffold import androidx.compose.material.Text @@ -43,7 +41,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -54,7 +51,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity @@ -72,6 +68,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.compose.viewModel import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.R +import com.aiosman.riderpro.entity.ChatItem import com.aiosman.riderpro.exp.formatChatTime import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.StatusBarSpacer diff --git a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatViewModel.kt b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatViewModel.kt index 05256f0..c772e88 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatViewModel.kt @@ -16,6 +16,7 @@ import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.data.UserService import com.aiosman.riderpro.data.UserServiceImpl import com.aiosman.riderpro.entity.AccountProfileEntity +import com.aiosman.riderpro.entity.ChatItem import com.aiosman.riderpro.exp.formatChatTime import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener import com.tencent.imsdk.v2.V2TIMCallback @@ -30,22 +31,6 @@ import java.io.FileOutputStream import java.io.InputStream -data class ChatItem( - val message: String, - val avatar: String, - val time: String, - val userId: String, - val nickname: String, - val timeCategory: String = "", - val timestamp: Long = 0, - val imageList: MutableList = emptyList().toMutableList(), - val messageType : Int = 0, - val textDisplay : String = "", - val msgId: String, // Add this property - var showTimestamp: Boolean = false, - var showTimeDivider:Boolean = false -) - class ChatViewModel( val userId: String, ) : ViewModel() { @@ -77,7 +62,7 @@ class ChatViewModel( override fun onRecvNewMessage(msg: V2TIMMessage?) { super.onRecvNewMessage(msg) msg?.let { - val chatItem = convertToChatItem(msg, context) + val chatItem = ChatItem.convertToChatItem(msg, context) chatItem?.let { chatData = listOf(it) + chatData } @@ -105,66 +90,7 @@ class ChatViewModel( }) } - fun convertToChatItem(message: V2TIMMessage, context: Context): ChatItem? { - val avatar = if (message.sender == userProfile?.trtcUserId) { - userProfile?.avatar ?: "" - } else { - myProfile?.avatar ?: "" - } - val nickname = if (message.sender == userProfile?.trtcUserId) { - userProfile?.nickName ?: "" - } else { - myProfile?.nickName ?: "" - } - val timestamp = message.timestamp - val calendar = Calendar.getInstance() - calendar.timeInMillis = timestamp * 1000 - val imageElm = message.imageElem?.imageList - when (message.elemType) { - V2TIMMessage.V2TIM_ELEM_TYPE_IMAGE -> { - val imageElm = message.imageElem?.imageList?.all { - it.size == 0 - } - if (imageElm != true) { - return ChatItem( - message = "Image", - avatar = avatar, - time = calendar.time.formatChatTime(context), - userId = message.sender, - nickname = nickname, - timestamp = timestamp * 1000, - imageList = message.imageElem?.imageList - ?: emptyList().toMutableList(), - messageType = V2TIMMessage.V2TIM_ELEM_TYPE_IMAGE, - textDisplay = "Image", - msgId = message.msgID // Add this line to include msgId - ) - } - return null - } - V2TIMMessage.V2TIM_ELEM_TYPE_TEXT -> { - return ChatItem( - message = message.textElem?.text ?: "Unsupported message type", - avatar = avatar, - time = calendar.time.formatChatTime(context), - userId = message.sender, - nickname = nickname, - timestamp = timestamp * 1000, - imageList = imageElm?.toMutableList() - ?: emptyList().toMutableList(), - messageType = V2TIMMessage.V2TIM_ELEM_TYPE_TEXT, - textDisplay = message.textElem?.text ?: "Unsupported message type", - msgId = message.msgID // Add this line to include msgId - ) - - } - else -> { - return null - } - - } - } fun onLoadMore(context: Context) { if (!hasMore || isLoading) { @@ -179,7 +105,7 @@ class ChatViewModel( object : V2TIMValueCallback> { override fun onSuccess(p0: List?) { chatData = chatData + (p0 ?: emptyList()).map { - convertToChatItem(it, context) + ChatItem.convertToChatItem(it, context) }.filterNotNull() if ((p0?.size ?: 0) < 20) { hasMore = false @@ -213,7 +139,7 @@ class ChatViewModel( override fun onSuccess(p0: V2TIMMessage?) { Log.d("ChatViewModel", "send message success") - val chatItem = convertToChatItem(p0!!, context) + val chatItem = ChatItem.convertToChatItem(p0!!, context) chatItem?.let { chatData = listOf(it) + chatData } @@ -245,7 +171,7 @@ class ChatViewModel( override fun onSuccess(p0: V2TIMMessage?) { Log.d("ChatViewModel", "send image message success") - val chatItem = convertToChatItem(p0!!, context) + val chatItem = ChatItem.convertToChatItem(p0!!, context) chatItem?.let { chatData = listOf(it) + chatData } @@ -293,7 +219,7 @@ class ChatViewModel( object : V2TIMValueCallback> { override fun onSuccess(p0: List?) { chatData = (p0 ?: emptyList()).mapNotNull { - convertToChatItem(it, context) + ChatItem.convertToChatItem(it, context) } if ((p0?.size ?: 0) < 20) { hasMore = false