From 62cb78167d84a75567634ecf95cd1be7d404f169 Mon Sep 17 00:00:00 2001 From: fengge <844143714@qq.com> Date: Tue, 2 Jun 2026 16:16:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kingway/ptt/CallBackResolution.java | 8 ---- .../stand/standapp/ui/chat/ChatViewModel.kt | 5 +-- .../standapp/ui/chat/components/ChatArea.kt | 42 +++++++------------ 3 files changed, 17 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java b/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java index e2a5942..6d3a414 100644 --- a/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java +++ b/app/src/main/java/com/example/kingway/ptt/CallBackResolution.java @@ -144,10 +144,6 @@ public class CallBackResolution { CallBackUtil.callBackGroupInfo(groupId, tempTxt, groupNo, groupCount); Timber.tag(TAG).d( "at_OEM_AT_cb group info groupId: " + groupId + ", groupNo: " + groupNo+", groupCount: " +groupCount); if (1 == groupNo) groupInfos.clear(); - if (groupInfos.size() >= MAX_GROUP_INFOS) { - Iterator it = groupInfos.keySet().iterator(); - if (it.hasNext()) { it.next(); it.remove(); } - } GroupInfoDto groupInfo = new GroupInfoDto(groupId, tempTxt, groupNo, groupCount); groupInfos.put(groupId, groupInfo); } @@ -178,10 +174,6 @@ public class CallBackResolution { String tempTxt = unicodeToString(groupMemberName.toString()); GroupMemberInfoDto infoDto = new GroupMemberInfoDto(memberId, tempTxt, status, memberNo, haveVideo); if (memberNo == 1) memberInfoDtos.clear(); - if (memberInfoDtos.size() >= MAX_GROUP_MEMBERS) { - Iterator it = memberInfoDtos.keySet().iterator(); - if (it.hasNext()) { it.next(); it.remove(); } - } memberInfoDtos.put(memberId, infoDto); } break; diff --git a/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt b/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt index 8c44f96..5a0c6e7 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/ChatViewModel.kt @@ -280,15 +280,14 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { } private fun finalizeAiMessage(messageId: String) { - flushStreamingMessage(messageId) + val finalResidue = chunkBuffer.remove(messageId)?.toString() ?: "" _messages.value = _messages.value.map { msg -> if (msg.id == messageId) { - val finalContent = _streamingContent.value[messageId] ?: msg.content + val finalContent = (_streamingContent.value[messageId] ?: msg.content) + finalResidue _streamingContent.update { it - messageId } msg.copy(content = finalContent, isStreaming = false) } else msg } - chunkBuffer.remove(messageId) lastFlushAt.remove(messageId) saveCacheToLocal() } diff --git a/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt b/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt index 11e6d3a..3e2a1df 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/components/ChatArea.kt @@ -162,6 +162,18 @@ fun ChatArea( @Composable 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( factory = { ctx -> val textView = SafeSelectableTextView(ctx).apply { @@ -173,15 +185,14 @@ fun MarkwonRenderer(markdown: String, modifier: Modifier) { setPadding(0, 0, 0, 0) } - val markwon = MarkwonHolder.get(ctx) textView.tag = markwon textView }, update = { view -> try { - val markwon = view.tag as? io.noties.markwon.Markwon - if (markwon != null) { - markwon.setMarkdown(view, markdown) + val currentMarkwon = view.tag as? io.noties.markwon.Markwon + if (currentMarkwon != null) { + currentMarkwon.setMarkdown(view, markdown) } else { view.text = markdown } @@ -192,26 +203,3 @@ fun MarkwonRenderer(markdown: String, 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() - } -}