From 3c5ef568b1f7370a196623ea505081bb44b3ca6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 27 Jun 2024 15:49:59 +0200 Subject: [PATCH 1/2] Fix `@room` mentions crashing in debug builds --- .../timeline/components/event/TimelineItemTextView.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 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 e002b6aa431..d55004c7418 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 @@ -88,10 +88,12 @@ private fun updateMentionSpans(text: CharSequence?, cache: RoomMemberProfilesCac for (mentionSpan in text.getMentionSpans()) { when (mentionSpan.type) { MentionSpan.Type.USER -> { - val displayName = cache.getDisplayName(UserId(mentionSpan.rawValue)) ?: mentionSpan.rawValue - if (mentionSpan.text != displayName) { - changedContents = true - mentionSpan.text = displayName + if (mentionSpan.rawValue != "@room") { + val displayName = cache.getDisplayName(UserId(mentionSpan.rawValue)) ?: mentionSpan.rawValue + if (mentionSpan.text != displayName) { + changedContents = true + mentionSpan.text = displayName + } } } // Nothing yet for room mentions From bc967fe7af261255f0efe0dd6d51c11fde97ac70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 27 Jun 2024 16:28:53 +0200 Subject: [PATCH 2/2] Iterate on previous solution, add `MentionSpan.Type.EVERYONE` --- .../components/event/TimelineItemTextView.kt | 14 ++++++------ .../textcomposer/mentions/MentionSpan.kt | 2 ++ .../mentions/MentionSpanProvider.kt | 2 +- .../model/MarkdownTextEditorState.kt | 22 +++++++++---------- .../impl/model/MarkdownTextEditorStateTest.kt | 2 +- 5 files changed, 21 insertions(+), 21 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 d55004c7418..b9fba5fc1a3 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 @@ -88,16 +88,16 @@ private fun updateMentionSpans(text: CharSequence?, cache: RoomMemberProfilesCac for (mentionSpan in text.getMentionSpans()) { when (mentionSpan.type) { MentionSpan.Type.USER -> { - if (mentionSpan.rawValue != "@room") { - val displayName = cache.getDisplayName(UserId(mentionSpan.rawValue)) ?: mentionSpan.rawValue - if (mentionSpan.text != displayName) { - changedContents = true - mentionSpan.text = displayName - } + val displayName = cache.getDisplayName(UserId(mentionSpan.rawValue)) ?: mentionSpan.rawValue + if (mentionSpan.text != displayName) { + changedContents = true + mentionSpan.text = displayName } } + // There's no need to do anything for `@room` pills + MentionSpan.Type.EVERYONE -> Unit // Nothing yet for room mentions - else -> Unit + MentionSpan.Type.ROOM -> Unit } } } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt index 5cb58a44cb4..286c45684e9 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt @@ -87,6 +87,7 @@ class MentionSpan( append("#") } } + Type.EVERYONE -> Unit } append(mentionText.substring(0, min(mentionText.length, MAX_LENGTH))) if (mentionText.length > MAX_LENGTH) { @@ -98,6 +99,7 @@ class MentionSpan( enum class Type { USER, ROOM, + EVERYONE, } } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt index e429d12b7ae..4e33a461b81 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt @@ -108,7 +108,7 @@ class MentionSpanProvider @AssistedInject constructor( MentionSpan( text = text, rawValue = "@room", - type = MentionSpan.Type.USER, + type = MentionSpan.Type.EVERYONE, backgroundColor = otherBackgroundColor, textColor = otherTextColor, startPadding = startPaddingPx, 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 2f85832c32a..0d3bb5fdda2 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 @@ -93,13 +93,16 @@ class MarkdownTextEditorState( for (mention in mentions.reversed()) { val start = charSequence.getSpanStart(mention) val end = charSequence.getSpanEnd(mention) - if (mention.type == MentionSpan.Type.USER) { - if (mention.rawValue == "@room") { - replace(start, end, "@room") - } else { + when (mention.type) { + MentionSpan.Type.USER -> { val link = permalinkBuilder.permalinkForUser(UserId(mention.rawValue)).getOrNull() ?: continue replace(start, end, "[${mention.rawValue}]($link)") } + MentionSpan.Type.EVERYONE -> { + replace(start, end, "@room") + } + // Nothing to do here yet + MentionSpan.Type.ROOM -> Unit } } } @@ -114,14 +117,9 @@ class MarkdownTextEditorState( val mentionSpans = text.getSpans(0, text.length) return mentionSpans.mapNotNull { mentionSpan -> when (mentionSpan.type) { - MentionSpan.Type.USER -> { - if (mentionSpan.rawValue == "@room") { - Mention.AtRoom - } else { - Mention.User(UserId(mentionSpan.rawValue)) - } - } - else -> null + MentionSpan.Type.USER -> Mention.User(UserId(mentionSpan.rawValue)) + MentionSpan.Type.EVERYONE -> Mention.AtRoom + MentionSpan.Type.ROOM -> null } } } diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt index c0e6756175a..02c98da423f 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt @@ -156,7 +156,7 @@ class MarkdownTextEditorStateTest { private fun aMarkdownTextWithMentions(): CharSequence { val userMentionSpan = MentionSpan("@Alice", "@alice:matrix.org", MentionSpan.Type.USER, 0, 0, 0, 0) - val atRoomMentionSpan = MentionSpan("@room", "@room", MentionSpan.Type.USER, 0, 0, 0, 0) + val atRoomMentionSpan = MentionSpan("@room", "@room", MentionSpan.Type.EVERYONE, 0, 0, 0, 0) return buildSpannedString { append("Hello ") inSpans(userMentionSpan) {