处理最新消息显示
This commit is contained in:
@@ -24,8 +24,10 @@ import com.aiosman.ravenow.ui.navigateToChatAi
|
||||
import io.openim.android.sdk.OpenIMClient
|
||||
import io.openim.android.sdk.listener.OnBase
|
||||
import io.openim.android.sdk.models.ConversationInfo
|
||||
import io.openim.android.sdk.models.Message
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
import com.aiosman.ravenow.utils.MessageParser
|
||||
|
||||
data class AgentConversation(
|
||||
val id: String,
|
||||
@@ -43,39 +45,19 @@ data class AgentConversation(
|
||||
val lastMessage = Calendar.getInstance().apply {
|
||||
timeInMillis = conversation.latestMsgSendTime
|
||||
}
|
||||
var displayText = conversation.latestMsg?: ""
|
||||
// when (conversation.latestMsg) {
|
||||
// 101 -> { // TEXT
|
||||
// displayText = conversation.latestMsg?: ""
|
||||
// }
|
||||
// 102 -> { // IMAGE
|
||||
// displayText = "[图片]"
|
||||
// }
|
||||
// 103 -> { // AUDIO
|
||||
// displayText = "[语音]"
|
||||
// }
|
||||
// 104 -> { // VIDEO
|
||||
// displayText = "[视频]"
|
||||
// }
|
||||
// 105 -> { // FILE
|
||||
// displayText = "[文件]"
|
||||
// }
|
||||
// else -> {
|
||||
// displayText = "[消息]"
|
||||
// }
|
||||
// }
|
||||
|
||||
// 解析最新消息
|
||||
val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
|
||||
return AgentConversation(
|
||||
id = conversation.conversationID,
|
||||
nickname = conversation.showName ?: "",
|
||||
lastMessage = conversation.latestMsg ?: "",
|
||||
lastMessage = displayText, // 使用解析后的显示文本
|
||||
lastMessageTime = lastMessage.time.formatChatTime(context),
|
||||
avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"),
|
||||
unreadCount = conversation.unreadCount,
|
||||
trtcUserId = conversation.userID ?: "",
|
||||
displayText = displayText,
|
||||
// TODO: openim latestMsg
|
||||
isSelf = false,
|
||||
// isSelf = conversation.latestMsg?.sendID == AppState.profile?.trtcUserId
|
||||
isSelf = isSelf // 使用解析后的发送者信息
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,8 +21,10 @@ import com.aiosman.ravenow.data.api.ApiClient
|
||||
import io.openim.android.sdk.OpenIMClient
|
||||
import io.openim.android.sdk.listener.OnBase
|
||||
import io.openim.android.sdk.models.ConversationInfo
|
||||
import io.openim.android.sdk.models.Message
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
import com.aiosman.ravenow.utils.MessageParser
|
||||
|
||||
data class FriendConversation(
|
||||
val id: String,
|
||||
@@ -40,17 +42,20 @@ data class FriendConversation(
|
||||
val lastMessage = Calendar.getInstance().apply {
|
||||
timeInMillis = conversation.latestMsgSendTime
|
||||
}
|
||||
var displayText = conversation.latestMsg
|
||||
|
||||
// 解析最新消息
|
||||
val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
|
||||
|
||||
return FriendConversation(
|
||||
id = conversation.conversationID,
|
||||
nickname = conversation.showName ?: "",
|
||||
lastMessage = conversation.latestMsg ?: "",
|
||||
lastMessage = displayText, // 使用解析后的显示文本
|
||||
lastMessageTime = lastMessage.time.formatChatTime(context),
|
||||
avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"),
|
||||
unreadCount = conversation.unreadCount,
|
||||
trtcUserId = conversation.userID ?: "",
|
||||
displayText = displayText,
|
||||
isSelf = false
|
||||
isSelf = isSelf // 使用解析后的发送者信息
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,10 @@ import io.openim.android.sdk.listener.OnAdvanceMsgListener
|
||||
import io.openim.android.sdk.listener.OnBase
|
||||
import io.openim.android.sdk.listener.OnConversationListener
|
||||
import io.openim.android.sdk.models.ConversationInfo
|
||||
import io.openim.android.sdk.models.Message
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
import com.aiosman.ravenow.utils.MessageParser
|
||||
|
||||
data class GroupConversation(
|
||||
val id: String,
|
||||
@@ -46,12 +48,15 @@ data class GroupConversation(
|
||||
val lastMessage = Calendar.getInstance().apply {
|
||||
timeInMillis = conversation.latestMsgSendTime
|
||||
}
|
||||
|
||||
// 解析最新消息
|
||||
val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
|
||||
|
||||
return GroupConversation(
|
||||
id = conversation.conversationID,
|
||||
groupId = conversation.groupID ?: "",
|
||||
groupName = conversation.showName ?: "",
|
||||
lastMessage = conversation.latestMsg?: "",
|
||||
lastMessage = displayText, // 使用解析后的显示文本
|
||||
lastMessageTime = lastMessage.time.formatChatTime(context),
|
||||
avatar = if (conversation.faceURL.isNullOrEmpty()) {
|
||||
// 将 groupId 转换为 Base64
|
||||
@@ -64,10 +69,9 @@ data class GroupConversation(
|
||||
"${ApiClient.BASE_API_URL+"/outside/rooms/avatar/"}${conversation.faceURL}"+"?token="+"${AppStore.token}"
|
||||
},
|
||||
unreadCount = conversation.unreadCount,
|
||||
displayText = conversation.latestMsg?: "",
|
||||
isSelf = false,
|
||||
// TODO openim get grouplist
|
||||
memberCount = 0
|
||||
displayText = displayText,
|
||||
isSelf = isSelf, // 使用解析后的发送者信息
|
||||
memberCount = 0 // TODO: 获取群组成员数量
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
69
app/src/main/java/com/aiosman/ravenow/utils/MessageParser.kt
Normal file
69
app/src/main/java/com/aiosman/ravenow/utils/MessageParser.kt
Normal file
@@ -0,0 +1,69 @@
|
||||
package com.aiosman.ravenow.utils
|
||||
|
||||
import com.aiosman.ravenow.AppState
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.JsonSyntaxException
|
||||
import io.openim.android.sdk.models.Message
|
||||
|
||||
/**
|
||||
* OpenIM 消息解析工具类
|
||||
* 用于解析 ConversationInfo 中的 latestMsg JSON 字符串
|
||||
*/
|
||||
object MessageParser {
|
||||
|
||||
/**
|
||||
* 解析最新消息的显示文本和发送者信息
|
||||
* @param latestMsgJson 最新消息的JSON字符串
|
||||
* @return Pair<displayText, isSelf> 显示文本和是否是自己发送的消息
|
||||
*/
|
||||
fun parseLatestMessage(latestMsgJson: String?): Pair<String, Boolean> {
|
||||
var displayText = ""
|
||||
var isSelf = false
|
||||
|
||||
try {
|
||||
if (!latestMsgJson.isNullOrEmpty()) {
|
||||
val gson = Gson()
|
||||
val message = gson.fromJson(latestMsgJson, Message::class.java)
|
||||
|
||||
// 判断是否是自己发送的消息
|
||||
isSelf = message.sendID == AppState.profile?.trtcUserId
|
||||
|
||||
// 根据消息类型生成显示文本
|
||||
displayText = getMessageDisplayText(message)
|
||||
} else {
|
||||
displayText = "[暂无消息]"
|
||||
}
|
||||
} catch (e: JsonSyntaxException) {
|
||||
// JSON 解析失败,使用原始文本
|
||||
displayText = latestMsgJson ?: "[消息解析失败]"
|
||||
} catch (e: Exception) {
|
||||
// 其他异常
|
||||
displayText = "[消息]"
|
||||
}
|
||||
|
||||
return Pair(displayText, isSelf)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据消息类型获取显示文本
|
||||
* @param message OpenIM Message 对象
|
||||
* @return 消息的显示文本
|
||||
*/
|
||||
private fun getMessageDisplayText(message: Message): String {
|
||||
return when (message.contentType) {
|
||||
101 -> { // TEXT
|
||||
message.textElem?.content ?: "[文本消息]"
|
||||
}
|
||||
102 -> "[图片]" // IMAGE
|
||||
103 -> "[语音]" // AUDIO
|
||||
104 -> "[视频]" // VIDEO
|
||||
105 -> "[文件]" // FILE
|
||||
106 -> "[位置]" // LOCATION
|
||||
107 -> "[自定义消息]" // CUSTOM
|
||||
108 -> "[合并消息]" // MERGE
|
||||
109 -> "[名片]" // CARD
|
||||
110 -> "[引用消息]" // QUOTE
|
||||
else -> "[消息]"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user