This commit is contained in:
fengge 2026-06-02 16:16:15 +08:00
parent d9b65c0e7e
commit 62cb78167d
3 changed files with 17 additions and 38 deletions

View File

@ -144,10 +144,6 @@ public class CallBackResolution {
CallBackUtil.callBackGroupInfo(groupId, tempTxt, groupNo, groupCount); CallBackUtil.callBackGroupInfo(groupId, tempTxt, groupNo, groupCount);
Timber.tag(TAG).d( "at_OEM_AT_cb group info groupId: " + groupId + ", groupNo: " + groupNo+", groupCount: " +groupCount); Timber.tag(TAG).d( "at_OEM_AT_cb group info groupId: " + groupId + ", groupNo: " + groupNo+", groupCount: " +groupCount);
if (1 == groupNo) groupInfos.clear(); if (1 == groupNo) groupInfos.clear();
if (groupInfos.size() >= MAX_GROUP_INFOS) {
Iterator<String> it = groupInfos.keySet().iterator();
if (it.hasNext()) { it.next(); it.remove(); }
}
GroupInfoDto groupInfo = new GroupInfoDto(groupId, tempTxt, groupNo, groupCount); GroupInfoDto groupInfo = new GroupInfoDto(groupId, tempTxt, groupNo, groupCount);
groupInfos.put(groupId, groupInfo); groupInfos.put(groupId, groupInfo);
} }
@ -178,10 +174,6 @@ public class CallBackResolution {
String tempTxt = unicodeToString(groupMemberName.toString()); String tempTxt = unicodeToString(groupMemberName.toString());
GroupMemberInfoDto infoDto = new GroupMemberInfoDto(memberId, tempTxt, status, memberNo, haveVideo); GroupMemberInfoDto infoDto = new GroupMemberInfoDto(memberId, tempTxt, status, memberNo, haveVideo);
if (memberNo == 1) memberInfoDtos.clear(); if (memberNo == 1) memberInfoDtos.clear();
if (memberInfoDtos.size() >= MAX_GROUP_MEMBERS) {
Iterator<String> it = memberInfoDtos.keySet().iterator();
if (it.hasNext()) { it.next(); it.remove(); }
}
memberInfoDtos.put(memberId, infoDto); memberInfoDtos.put(memberId, infoDto);
} }
break; break;

View File

@ -280,15 +280,14 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
} }
private fun finalizeAiMessage(messageId: String) { private fun finalizeAiMessage(messageId: String) {
flushStreamingMessage(messageId) val finalResidue = chunkBuffer.remove(messageId)?.toString() ?: ""
_messages.value = _messages.value.map { msg -> _messages.value = _messages.value.map { msg ->
if (msg.id == messageId) { if (msg.id == messageId) {
val finalContent = _streamingContent.value[messageId] ?: msg.content val finalContent = (_streamingContent.value[messageId] ?: msg.content) + finalResidue
_streamingContent.update { it - messageId } _streamingContent.update { it - messageId }
msg.copy(content = finalContent, isStreaming = false) msg.copy(content = finalContent, isStreaming = false)
} else msg } else msg
} }
chunkBuffer.remove(messageId)
lastFlushAt.remove(messageId) lastFlushAt.remove(messageId)
saveCacheToLocal() saveCacheToLocal()
} }

View File

@ -162,6 +162,18 @@ fun ChatArea(
@Composable @Composable
fun MarkwonRenderer(markdown: String, modifier: Modifier) { fun MarkwonRenderer(markdown: String, modifier: Modifier) {
val context = androidx.compose.ui.platform.LocalContext.current
val markwon = remember(context) {
io.noties.markwon.Markwon.builder(context)
.usePlugin(io.noties.markwon.core.CorePlugin.create())
.usePlugin(io.noties.markwon.ext.tables.TablePlugin.create(context))
.usePlugin(io.noties.markwon.html.HtmlPlugin.create())
.usePlugin(io.noties.markwon.linkify.LinkifyPlugin.create())
.usePlugin(io.noties.markwon.ext.strikethrough.StrikethroughPlugin.create())
.usePlugin(io.noties.markwon.ext.tasklist.TaskListPlugin.create(context))
.build()
}
androidx.compose.ui.viewinterop.AndroidView( androidx.compose.ui.viewinterop.AndroidView(
factory = { ctx -> factory = { ctx ->
val textView = SafeSelectableTextView(ctx).apply { val textView = SafeSelectableTextView(ctx).apply {
@ -173,15 +185,14 @@ fun MarkwonRenderer(markdown: String, modifier: Modifier) {
setPadding(0, 0, 0, 0) setPadding(0, 0, 0, 0)
} }
val markwon = MarkwonHolder.get(ctx)
textView.tag = markwon textView.tag = markwon
textView textView
}, },
update = { view -> update = { view ->
try { try {
val markwon = view.tag as? io.noties.markwon.Markwon val currentMarkwon = view.tag as? io.noties.markwon.Markwon
if (markwon != null) { if (currentMarkwon != null) {
markwon.setMarkdown(view, markdown) currentMarkwon.setMarkdown(view, markdown)
} else { } else {
view.text = markdown view.text = markdown
} }
@ -192,26 +203,3 @@ fun MarkwonRenderer(markdown: String, modifier: Modifier) {
modifier = modifier modifier = modifier
) )
} }
private object MarkwonHolder {
@Volatile
private var instance: io.noties.markwon.Markwon? = null
fun get(context: android.content.Context): io.noties.markwon.Markwon {
instance?.let { return it }
return synchronized(this) {
instance ?: build(context.applicationContext).also { instance = it }
}
}
private fun build(context: android.content.Context): io.noties.markwon.Markwon {
return io.noties.markwon.Markwon.builder(context)
.usePlugin(io.noties.markwon.core.CorePlugin.create())
.usePlugin(io.noties.markwon.ext.tables.TablePlugin.create(context))
.usePlugin(io.noties.markwon.html.HtmlPlugin.create())
.usePlugin(io.noties.markwon.linkify.LinkifyPlugin.create())
.usePlugin(io.noties.markwon.ext.strikethrough.StrikethroughPlugin.create())
.usePlugin(io.noties.markwon.ext.tasklist.TaskListPlugin.create(context))
.build()
}
}