处理最新消息显示

This commit is contained in:
2025-09-10 14:03:27 +08:00
parent 5218ca7046
commit c41c097d41
4 changed files with 93 additions and 33 deletions

View File

@@ -24,8 +24,10 @@ import com.aiosman.ravenow.ui.navigateToChatAi
import io.openim.android.sdk.OpenIMClient import io.openim.android.sdk.OpenIMClient
import io.openim.android.sdk.listener.OnBase import io.openim.android.sdk.listener.OnBase
import io.openim.android.sdk.models.ConversationInfo import io.openim.android.sdk.models.ConversationInfo
import io.openim.android.sdk.models.Message
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
import com.aiosman.ravenow.utils.MessageParser
data class AgentConversation( data class AgentConversation(
val id: String, val id: String,
@@ -43,39 +45,19 @@ data class AgentConversation(
val lastMessage = Calendar.getInstance().apply { val lastMessage = Calendar.getInstance().apply {
timeInMillis = conversation.latestMsgSendTime timeInMillis = conversation.latestMsgSendTime
} }
var displayText = conversation.latestMsg?: ""
// when (conversation.latestMsg) { // 解析最新消息
// 101 -> { // TEXT val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
// displayText = conversation.latestMsg?: ""
// }
// 102 -> { // IMAGE
// displayText = "[图片]"
// }
// 103 -> { // AUDIO
// displayText = "[语音]"
// }
// 104 -> { // VIDEO
// displayText = "[视频]"
// }
// 105 -> { // FILE
// displayText = "[文件]"
// }
// else -> {
// displayText = "[消息]"
// }
// }
return AgentConversation( return AgentConversation(
id = conversation.conversationID, id = conversation.conversationID,
nickname = conversation.showName ?: "", nickname = conversation.showName ?: "",
lastMessage = conversation.latestMsg ?: "", lastMessage = displayText, // 使用解析后的显示文本
lastMessageTime = lastMessage.time.formatChatTime(context), lastMessageTime = lastMessage.time.formatChatTime(context),
avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"), avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"),
unreadCount = conversation.unreadCount, unreadCount = conversation.unreadCount,
trtcUserId = conversation.userID ?: "", trtcUserId = conversation.userID ?: "",
displayText = displayText, displayText = displayText,
// TODO: openim latestMsg isSelf = isSelf // 使用解析后的发送者信息
isSelf = false,
// isSelf = conversation.latestMsg?.sendID == AppState.profile?.trtcUserId
) )
} }
} }

View File

@@ -21,8 +21,10 @@ import com.aiosman.ravenow.data.api.ApiClient
import io.openim.android.sdk.OpenIMClient import io.openim.android.sdk.OpenIMClient
import io.openim.android.sdk.listener.OnBase import io.openim.android.sdk.listener.OnBase
import io.openim.android.sdk.models.ConversationInfo import io.openim.android.sdk.models.ConversationInfo
import io.openim.android.sdk.models.Message
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
import com.aiosman.ravenow.utils.MessageParser
data class FriendConversation( data class FriendConversation(
val id: String, val id: String,
@@ -40,17 +42,20 @@ data class FriendConversation(
val lastMessage = Calendar.getInstance().apply { val lastMessage = Calendar.getInstance().apply {
timeInMillis = conversation.latestMsgSendTime timeInMillis = conversation.latestMsgSendTime
} }
var displayText = conversation.latestMsg
// 解析最新消息
val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
return FriendConversation( return FriendConversation(
id = conversation.conversationID, id = conversation.conversationID,
nickname = conversation.showName ?: "", nickname = conversation.showName ?: "",
lastMessage = conversation.latestMsg ?: "", lastMessage = displayText, // 使用解析后的显示文本
lastMessageTime = lastMessage.time.formatChatTime(context), lastMessageTime = lastMessage.time.formatChatTime(context),
avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"), avatar = "${ApiClient.BASE_API_URL+"/"}${conversation.faceURL}"+"?token="+"${AppStore.token}".replace("storage/avatars/", "/avatar/"),
unreadCount = conversation.unreadCount, unreadCount = conversation.unreadCount,
trtcUserId = conversation.userID ?: "", trtcUserId = conversation.userID ?: "",
displayText = displayText, displayText = displayText,
isSelf = false isSelf = isSelf // 使用解析后的发送者信息
) )
} }
} }

View File

@@ -26,8 +26,10 @@ import io.openim.android.sdk.listener.OnAdvanceMsgListener
import io.openim.android.sdk.listener.OnBase import io.openim.android.sdk.listener.OnBase
import io.openim.android.sdk.listener.OnConversationListener import io.openim.android.sdk.listener.OnConversationListener
import io.openim.android.sdk.models.ConversationInfo import io.openim.android.sdk.models.ConversationInfo
import io.openim.android.sdk.models.Message
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
import com.aiosman.ravenow.utils.MessageParser
data class GroupConversation( data class GroupConversation(
val id: String, val id: String,
@@ -47,11 +49,14 @@ data class GroupConversation(
timeInMillis = conversation.latestMsgSendTime timeInMillis = conversation.latestMsgSendTime
} }
// 解析最新消息
val (displayText, isSelf) = MessageParser.parseLatestMessage(conversation.latestMsg)
return GroupConversation( return GroupConversation(
id = conversation.conversationID, id = conversation.conversationID,
groupId = conversation.groupID ?: "", groupId = conversation.groupID ?: "",
groupName = conversation.showName ?: "", groupName = conversation.showName ?: "",
lastMessage = conversation.latestMsg?: "", lastMessage = displayText, // 使用解析后的显示文本
lastMessageTime = lastMessage.time.formatChatTime(context), lastMessageTime = lastMessage.time.formatChatTime(context),
avatar = if (conversation.faceURL.isNullOrEmpty()) { avatar = if (conversation.faceURL.isNullOrEmpty()) {
// 将 groupId 转换为 Base64 // 将 groupId 转换为 Base64
@@ -64,10 +69,9 @@ data class GroupConversation(
"${ApiClient.BASE_API_URL+"/outside/rooms/avatar/"}${conversation.faceURL}"+"?token="+"${AppStore.token}" "${ApiClient.BASE_API_URL+"/outside/rooms/avatar/"}${conversation.faceURL}"+"?token="+"${AppStore.token}"
}, },
unreadCount = conversation.unreadCount, unreadCount = conversation.unreadCount,
displayText = conversation.latestMsg?: "", displayText = displayText,
isSelf = false, isSelf = isSelf, // 使用解析后的发送者信息
// TODO openim get grouplist memberCount = 0 // TODO: 获取群组成员数量
memberCount = 0
) )
} }
} }

View 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 -> "[消息]"
}
}
}