处理最新消息显示
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.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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 // 使用解析后的发送者信息
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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