From 2cf07d8e6258d69e9ccb8bb8e3ce975e13b1b6ce Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:19:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Compose=20=E6=98=BE=E7=A4=BA=E8=A1=A8?= =?UTF-8?q?=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/ui/widgets/compose/Texts.kt | 3 +- .../tieba/post/utils/EmoticonUtil.kt | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Texts.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Texts.kt index 028659ab..5eac5fe8 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Texts.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/widgets/compose/Texts.kt @@ -152,7 +152,7 @@ fun EmoticonText( val emoticonInlineContent = remember(sizePx) { EmoticonManager.getEmoticonInlineContent(sizePx * emoticonSize) } IconText( - text, + text.emoticonString, modifier, color, fontSize, @@ -343,7 +343,6 @@ fun TextWithMinWidth( ) } -@OptIn(ExperimentalTextApi::class) @Composable fun buildChipInlineContent( text: String, diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/EmoticonUtil.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/EmoticonUtil.kt index b04525db..e056a6a1 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/EmoticonUtil.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/EmoticonUtil.kt @@ -5,7 +5,9 @@ import android.widget.AdapterView import android.widget.EditText import androidx.annotation.DrawableRes import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.ExperimentalTextApi import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withAnnotation import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.adapters.EmoticonGridViewAdapter import com.huanchengfly.tieba.post.utils.StringUtil.getEmoticonContent @@ -119,10 +121,38 @@ object EmoticonUtil { } } + @OptIn(ExperimentalTextApi::class) val String.emoticonString: AnnotatedString get() { val regexPattern = Pattern.compile(getRegex(EMOTICON_ALL_TYPE)) val matcher = regexPattern.matcher(this) + return buildAnnotatedString { + withAnnotation("Emoticon", "true") { + append(this@emoticonString) + } + while (matcher.find()) { + val start = matcher.start() + val end = matcher.end() + val emoticonName = matcher.group(1) + if (emoticonName != null) { + addStringAnnotation( + INLINE_CONTENT_TAG, + "Emoticon#${EmoticonManager.getEmoticonIdByName(emoticonName)}", + start, + end, + ) + } + } + } + } + + val AnnotatedString.emoticonString: AnnotatedString + get() { + if (hasStringAnnotations("Emoticon", 0, length)) { + return this + } + val regexPattern = Pattern.compile(getRegex(EMOTICON_ALL_TYPE)) + val matcher = regexPattern.matcher(this.text) return buildAnnotatedString { append(this@emoticonString) while (matcher.find()) {