From dac0eb6762b40ae6ddabc9a3ae3e73ba313b862a Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 7 Apr 2025 10:50:45 +0200 Subject: [PATCH] Fix bullet points not having leading margin on timeline items (#4536) * Fix bullet points not having leading margin on timeline items * Remove other usages of `SpannableString` constructor, use either `valueOf` to reuse the existing value or `SpannedString` instead if the spans don't have to change --- .../impl/timeline/components/event/TimelineItemTextView.kt | 4 ++-- .../libraries/designsystem/components/ClickableLinkText.kt | 2 +- .../android/libraries/designsystem/text/AnnotatedStrings.kt | 4 ++-- .../textcomposer/components/markdown/StableCharSequence.kt | 4 ++-- .../libraries/textcomposer/model/MarkdownTextEditorState.kt | 4 +--- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt index a4a7cff9cb..d496b94f3b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt @@ -7,7 +7,7 @@ package io.element.android.features.messages.impl.timeline.components.event -import android.text.SpannableString +import android.text.SpannedString import androidx.annotation.VisibleForTesting import androidx.compose.foundation.layout.Box import androidx.compose.material3.LocalContentColor @@ -71,7 +71,7 @@ fun TimelineItemTextView( internal fun getTextWithResolvedMentions(content: TimelineItemTextBasedContent): CharSequence { val mentionSpanUpdater = LocalMentionSpanUpdater.current val bodyWithResolvedMentions = mentionSpanUpdater.rememberMentionSpans(content.formattedBody) - return SpannableString(bodyWithResolvedMentions) + return SpannedString.valueOf(bodyWithResolvedMentions) } @PreviewsDayNight diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt index 169403104a..3638556da3 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt @@ -135,7 +135,7 @@ fun ClickableLinkText( fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString { val original = this - val spannable = SpannableString(this.text) + val spannable = SpannableString.valueOf(this.text) LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS or Linkify.PHONE_NUMBERS or Linkify.EMAIL_ADDRESSES) val spans = spannable.getSpans(0, spannable.length, URLSpan::class.java) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt index 36ac7d71bd..79f70cc2f5 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt @@ -8,7 +8,7 @@ package io.element.android.libraries.designsystem.text import android.graphics.Typeface -import android.text.SpannableString +import android.text.SpannedString import android.text.style.ForegroundColorSpan import android.text.style.StyleSpan import android.text.style.UnderlineSpan @@ -26,7 +26,7 @@ import io.element.android.compound.theme.LinkColor fun String.toAnnotatedString(): AnnotatedString = buildAnnotatedString { append(this@toAnnotatedString) - val spannable = SpannableString(this@toAnnotatedString) + val spannable = SpannedString.valueOf(this@toAnnotatedString) spannable.getSpans(0, spannable.length, Any::class.java).forEach { span -> val start = spannable.getSpanStart(span) val end = spannable.getSpanEnd(span) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt index 6d861894a6..bc1de30826 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt @@ -16,11 +16,11 @@ import io.element.android.libraries.core.extensions.orEmpty @Stable class StableCharSequence(initialText: CharSequence = "") { - private var value by mutableStateOf(SpannableString(initialText)) + private var value by mutableStateOf(SpannableString.valueOf(initialText)) private var needsDisplaying by mutableStateOf(false) fun update(newText: CharSequence?, needsDisplaying: Boolean) { - value = SpannableString(newText.orEmpty()) + value = SpannableString.valueOf(newText.orEmpty()) this.needsDisplaying = needsDisplaying } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt index 8ee7696e2b..14f56f3bbb 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.textcomposer.model import android.os.Parcelable import android.text.Spannable -import android.text.SpannableString import android.text.SpannableStringBuilder import android.text.Spanned import androidx.compose.runtime.Composable @@ -118,8 +117,7 @@ class MarkdownTextEditorState( } fun getMentions(): List { - val text = SpannableString(text.value()) - val mentionSpans = text.getMentionSpans() + val mentionSpans = text.value().getMentionSpans() return mentionSpans.mapNotNull { mentionSpan -> when (mentionSpan.type) { is MentionType.User -> IntentionalMention.User(mentionSpan.type.userId)