From 4c752380c78d42fd6620faab93931e93192722b3 Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Tue, 4 Feb 2025 11:09:12 +0200 Subject: [PATCH 1/2] fix: Crash on inserting mention --- .../ui/home/messagecomposer/EnabledMessageComposer.kt | 3 +-- .../home/messagecomposer/state/MessageCompositionHolder.kt | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/EnabledMessageComposer.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/EnabledMessageComposer.kt index 4a3c0c0a36a..784eb4b303a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/EnabledMessageComposer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/EnabledMessageComposer.kt @@ -271,8 +271,7 @@ fun EnabledMessageComposer( ) val mentionSearchResult = messageComposerViewState.value.mentionSearchResult - if (mentionSearchResult.isNotEmpty() && inputStateHolder.isTextExpanded - ) { + if (mentionSearchResult.isNotEmpty() && inputStateHolder.isTextExpanded) { DropDownMentionsSuggestions( currentSelectedLineIndex = currentSelectedLineIndex, cursorCoordinateY = cursorCoordinateY, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt index 4687c34b381..d6baec568c1 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.substring +import com.wire.android.appLogger import com.wire.android.ui.home.conversations.model.UIMention import com.wire.android.ui.home.conversations.model.UIMessage import com.wire.android.ui.home.conversations.model.UIQuotedMessage @@ -200,6 +201,10 @@ class MessageCompositionHolder( userId = UserId(contact.id, contact.domain), handler = String.MENTION_SYMBOL + contact.name ) + if (mention.start < 0 || mention.length < 2) { + appLogger.e("MessageCompositionHolder: Failure to add mention") + return + } insertMentionIntoText(mention) messageComposition.update { it.copy( From 5a991f6dcc8334a5da5d24bf3b7aa2fd6fe83016 Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Wed, 5 Feb 2025 18:57:48 +0200 Subject: [PATCH 2/2] Added tests --- .../state/MessageCompositionHolderTest.kt | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt index 91fee977b50..e533b91752d 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt @@ -24,7 +24,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.text.TextRange import com.wire.android.config.SnapshotExtension import com.wire.android.framework.TestConversation +import com.wire.android.ui.home.conversationslist.model.Membership import com.wire.android.ui.home.messagecomposer.model.MessageComposition +import com.wire.android.ui.home.newconversation.model.Contact +import com.wire.kalium.logic.data.user.ConnectionState import io.mockk.MockKAnnotations import io.mockk.impl.annotations.MockK import kotlinx.coroutines.Dispatchers @@ -174,4 +177,56 @@ class MessageCompositionHolderTest { state.messageTextState.text.toString() ) } + + @Test + fun `given non empty text, when adding mention, mention is added`() = runTest { + // given + val text = "@men" + state.messageTextState.edit { + replace(0, length, text) + selection = TextRange(start = text.length, end = text.length) + } + + // when + state.addMention( + Contact( + id = "id", + domain = "domain", + name = "name", + handle = "men handle", + connectionState = ConnectionState.ACCEPTED, + membership = Membership.Guest + ) + ) + + // then + assertEquals("@name ", state.messageTextState.text.toString()) + assertEquals(1, state.messageComposition.value.selectedMentions.size) + } + + @Test + fun `given non empty text without @ symbol, when adding mention, nothing happen`() = runTest { + // given + val text = "mann" + state.messageTextState.edit { + replace(0, length, text) + selection = TextRange(start = 4, end = 4) + } + + // when + state.addMention( + Contact( + id = "id", + domain = "domain", + name = "name", + handle = "men handle", + connectionState = ConnectionState.ACCEPTED, + membership = Membership.Guest + ) + ) + + // then + assertEquals(text, state.messageTextState.text.toString()) + assertEquals(0, state.messageComposition.value.selectedMentions.size) + } }