From d8db1a19d522725c2df0222b6fc0c4014f236f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Wed, 3 Jun 2026 10:22:49 +0100 Subject: [PATCH 1/5] Announce the quoted reply context to TalkBack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When TalkBack focused on the quoted preview inside a reply, the bubble announced only the quoted message's sender and text. Screen-reader users had no signal about who replied to whom — they had to swipe to the reply row to piece the relationship together. Extend the `accessibilityName` override in `QuotedMessageUserName` to handle the in-list case (`replyMessage != null`). The quoted bubble's sender label now reads as one of: - `"You replied to your message"` (both the replier and the quoted message are the current user — e.g. a self-thread) - `"You replied to {name}'s message"` (current user replied to someone else) - `"{name} replied to your message"` (someone else replied to the current user) - `"{name} replied to {other name}'s message"` (someone else replied to a third party's message) TalkBack then reads the bubble as "{relationship}, {quoted text}, double-tap to activate" — context first, content second. Two new strings (`stream_compose_quoted_message_replied_to_your_message` and `stream_compose_quoted_message_replied_to_their_message`) translated across the 7 supported locales. The composer-banner case (`replyMessage == null`) is unchanged. --- .../ui/components/messages/QuotedMessage.kt | 24 +++++++++++++++---- .../src/main/res/values-es/strings.xml | 2 ++ .../src/main/res/values-fr/strings.xml | 2 ++ .../src/main/res/values-hi/strings.xml | 2 ++ .../src/main/res/values-in/strings.xml | 2 ++ .../src/main/res/values-it/strings.xml | 2 ++ .../src/main/res/values-ja/strings.xml | 2 ++ .../src/main/res/values-ko/strings.xml | 2 ++ .../src/main/res/values/strings.xml | 2 ++ 9 files changed, 36 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt index 16abcda92cf..7a62b299606 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt @@ -154,10 +154,26 @@ private fun QuotedMessageUserName( isComposerBanner -> stringResource(R.string.stream_compose_quoted_message_reply_to, message.user.name) else -> message.user.name } - val accessibilityName = if (isMine && isComposerBanner) { - stringResource(R.string.stream_compose_quoted_message_reply_to_you) - } else { - null + val accessibilityName = when { + replyMessage == null && isMine -> + stringResource(R.string.stream_compose_quoted_message_reply_to_you) + replyMessage != null -> { + val replierName = if (replyMessage.isMine(currentUser)) { + stringResource(R.string.stream_compose_quoted_message_you) + } else { + replyMessage.user.name + } + if (isMine) { + stringResource(R.string.stream_compose_quoted_message_replied_to_your_message, replierName) + } else { + stringResource( + R.string.stream_compose_quoted_message_replied_to_their_message, + replierName, + message.user.name, + ) + } + } + else -> null } Text( diff --git a/stream-chat-android-compose/src/main/res/values-es/strings.xml b/stream-chat-android-compose/src/main/res/values-es/strings.xml index 0e328588b14..0a481c4fa38 100644 --- a/stream-chat-android-compose/src/main/res/values-es/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-es/strings.xml @@ -222,6 +222,8 @@ "Mensaje de voz (%s)" "Giphy" "%d multimedia" + "%1$s respondió al mensaje de %2$s" + "%1$s respondió a tu mensaje" "Responder a %s" "Responder a ti" "Tú" diff --git a/stream-chat-android-compose/src/main/res/values-fr/strings.xml b/stream-chat-android-compose/src/main/res/values-fr/strings.xml index 7f2816a1484..8f9e40fa9e8 100644 --- a/stream-chat-android-compose/src/main/res/values-fr/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-fr/strings.xml @@ -222,6 +222,8 @@ "Message vocal (%s)" "Giphy" "%d média" + "%1$s a répondu au message de %2$s" + "%1$s a répondu à votre message" "Répondre à %s" "Répondre à vous-même" "Vous" diff --git a/stream-chat-android-compose/src/main/res/values-hi/strings.xml b/stream-chat-android-compose/src/main/res/values-hi/strings.xml index 7895f79f6ba..02d6c8b19f3 100644 --- a/stream-chat-android-compose/src/main/res/values-hi/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-hi/strings.xml @@ -282,6 +282,8 @@ "वॉइस मैसेज (%s)" "Giphy" "%d मीडिया" + "%1$s ने %2$s के संदेश का जवाब दिया" + "%1$s ने आपके संदेश का जवाब दिया" "%s को जवाब" "स्वयं को जवाब" "आप" diff --git a/stream-chat-android-compose/src/main/res/values-in/strings.xml b/stream-chat-android-compose/src/main/res/values-in/strings.xml index 4a95f6f35a5..ff58cebc970 100644 --- a/stream-chat-android-compose/src/main/res/values-in/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-in/strings.xml @@ -222,6 +222,8 @@ "Pesan suara (%s)" "Giphy" "%d media" + "%1$s membalas pesan %2$s" + "%1$s membalas pesan Anda" "Balas ke %s" "Balas ke diri sendiri" "Anda" diff --git a/stream-chat-android-compose/src/main/res/values-it/strings.xml b/stream-chat-android-compose/src/main/res/values-it/strings.xml index f1c60dd3d8d..793232c1a19 100644 --- a/stream-chat-android-compose/src/main/res/values-it/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-it/strings.xml @@ -282,6 +282,8 @@ "Messaggio vocale (%s)" "Giphy" "%d media" + "%1$s ha risposto al messaggio di %2$s" + "%1$s ha risposto al tuo messaggio" "Rispondi a %s" "Rispondi a te stesso" "Tu" diff --git a/stream-chat-android-compose/src/main/res/values-ja/strings.xml b/stream-chat-android-compose/src/main/res/values-ja/strings.xml index 553a50bcb49..cbaf2258978 100644 --- a/stream-chat-android-compose/src/main/res/values-ja/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ja/strings.xml @@ -255,6 +255,8 @@ "%d枚の写真" "%dメディア" + "%1$sが%2$sのメッセージに返信しました" + "%1$sがあなたのメッセージに返信しました" "%sへの返信" "自分への返信" diff --git a/stream-chat-android-compose/src/main/res/values-ko/strings.xml b/stream-chat-android-compose/src/main/res/values-ko/strings.xml index 8506f63ca69..d27cd1890c7 100644 --- a/stream-chat-android-compose/src/main/res/values-ko/strings.xml +++ b/stream-chat-android-compose/src/main/res/values-ko/strings.xml @@ -255,6 +255,8 @@ "%d장의 사진" "%d 미디어" + "%1$s님이 %2$s님의 메시지에 답장했습니다" + "%1$s님이 회원님의 메시지에 답장했습니다" "%s에게 답장" "자신에게 답장" diff --git a/stream-chat-android-compose/src/main/res/values/strings.xml b/stream-chat-android-compose/src/main/res/values/strings.xml index 20d4ebaacf8..67b40eabefa 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -118,6 +118,8 @@ %d media Reply to %s Reply to you + %1$s replied to your message + %1$s replied to %2$s\'s message You From 207fadc350acefb9873d704dd97bec8dde9f52dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Wed, 3 Jun 2026 11:09:40 +0100 Subject: [PATCH 2/5] Drop the misleading "double-tap to activate" hint on non-thread rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The row's `combinedClickable` was always enabled when either `canOpenThread` or `canOpenActions` was true, with `onClick` guarded to fire `onThreadClick` only when a thread existed. For regular messages (no thread started yet, common case) `onClick` was a no-op but the `combinedClickable` still exposed a click action to the accessibility tree, so TalkBack announced "double-tap to activate" — promising an action that didn't fire. The long-press path worked fine. Refactor the modifier into three branches by row capability, so the accessibility tree only carries the actions the row actually performs: - `canOpenThread`: keep `combinedClickable` with both `onClick` (open thread) and `onLongClick` (open actions, if available). - `canOpenActions` only: use `Modifier.pointerInput { detectTapGestures (onLongPress = ...) }` plus `Modifier.semantics(mergeDescendants = true) { onLongClick(label) }` — long-press still opens the menu, TalkBack reads only "double-tap and hold to show message options", and descendants merge into a single row focus. - Neither (deleted, uploading): empty `Modifier.semantics (mergeDescendants = true) {}` so the row stays a single focus target for TalkBack with no interaction hints. Trade-off: the `canOpenActions`-only case loses the press-down ripple that `combinedClickable` applies through its default `indication`. Sighted users still get feedback from the actions menu opening; SR users get a TalkBack hint that matches what tapping actually does. The ripple loss is the smaller of the two regressions to keep. Public API unchanged; the modifier is a local val in `MessageContainer`. --- .../ui/messages/list/MessageContainer.kt | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt index 26828e6f9ea..39b4766cff2 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt @@ -23,6 +23,7 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.gestures.detectHorizontalDragGestures +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -62,6 +63,8 @@ import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.onLongClick +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.LayoutDirection @@ -177,15 +180,28 @@ public fun MessageContainer( val openThreadLabel = stringResource(R.string.stream_compose_message_item_open_thread) val messageOptionsLabel = stringResource(R.string.stream_compose_message_item_options) - val clickModifier = Modifier.combinedClickable( - interactionSource = remember(::MutableInteractionSource), - indication = null, - enabled = canOpenThread || canOpenActions, - onClick = { if (canOpenThread) onThreadClick(message) }, - onLongClick = { if (canOpenActions) onLongItemClick(message) }, - onClickLabel = openThreadLabel.takeIf { canOpenThread }, - onLongClickLabel = messageOptionsLabel.takeIf { canOpenActions }, - ) + val clickModifier = when { + canOpenThread -> Modifier.combinedClickable( + interactionSource = remember(::MutableInteractionSource), + indication = null, + onClick = { onThreadClick(message) }, + onLongClick = { if (canOpenActions) onLongItemClick(message) }, + onClickLabel = openThreadLabel, + onLongClickLabel = messageOptionsLabel.takeIf { canOpenActions }, + ) + canOpenActions -> + Modifier + .pointerInput(message.id) { + detectTapGestures(onLongPress = { onLongItemClick(message) }) + } + .semantics(mergeDescendants = true) { + onLongClick(label = messageOptionsLabel) { + onLongItemClick(message) + true + } + } + else -> Modifier.semantics(mergeDescendants = true) {} + } val highlightColor = ChatTheme.colors.backgroundCoreHighlight val backgroundColor = when { From 3693799cae1c18aa776b3c1ef57e9440deba695a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Wed, 3 Jun 2026 11:42:03 +0100 Subject: [PATCH 3/5] Cover in-list quoted reply branches with snapshot tests The new `accessibilityName` logic in `QuotedMessageUserName` only fires when `replyMessage != null`, but every existing snapshot test constructs the composable with `replyMessage = null`. Sonar reported 6 uncovered lines and 2 uncovered conditions on the file as a result. Add two preview composables (`QuotedMessageReplyByMeToOther`, `QuotedMessageReplyByOtherToMe`) plus matching Paparazzi tests. The pair is chosen so each new conditional branch is hit in both directions: - Case A (me replies to other): `replyMessage.isMine = true`, `message.isMine = false` -> "You replied to {other}'s message". - Case B (other replies to me): `replyMessage.isMine = false`, `message.isMine = true` -> "{other} replied to your message". The file crossed the detekt `TooManyFunctions` threshold (21/20) once the two preview wrappers were added, so apply the existing project pattern of `@file:Suppress("TooManyFunctions")` (already used on `ChannelItem`, `MessageInput`, etc.). --- .../ui/components/messages/QuotedMessage.kt | 48 ++++++++++++++++++ .../components/messages/QuotedMessageTest.kt | 10 ++++ ...QuotedMessageTest_reply_by_me_to_other.png | Bin 0 -> 30348 bytes ...QuotedMessageTest_reply_by_other_to_me.png | Bin 0 -> 20184 bytes 4 files changed, 58 insertions(+) create mode 100644 stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_me_to_other.png create mode 100644 stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_other_to_me.png diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt index 7a62b299606..07e48059a97 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/QuotedMessage.kt @@ -14,6 +14,8 @@ * limitations under the License. */ +@file:Suppress("TooManyFunctions") + package io.getstream.chat.android.compose.ui.components.messages import androidx.annotation.DrawableRes @@ -303,6 +305,18 @@ private fun QuotedMessageInComposerPreview() { ChatTheme { QuotedMessageInComposer() } } +@Preview +@Composable +private fun QuotedMessageReplyByMeToOtherPreview() { + ChatTheme { QuotedMessageReplyByMeToOther() } +} + +@Preview +@Composable +private fun QuotedMessageReplyByOtherToMePreview() { + ChatTheme { QuotedMessageReplyByOtherToMe() } +} + @Composable internal fun QuotedMessageFromOtherUser() { QuotedMessage( @@ -390,3 +404,37 @@ internal fun QuotedMessageInComposer() { onCancelClick = {}, ) } + +@Composable +internal fun QuotedMessageReplyByMeToOther() { + QuotedMessage( + message = Message( + id = "msg-7", + text = "Original message from the other user", + user = PreviewUserData.user2, + ), + currentUser = PreviewUserData.user1, + replyMessage = Message( + id = "reply-7", + text = "On it.", + user = PreviewUserData.user1, + ), + ) +} + +@Composable +internal fun QuotedMessageReplyByOtherToMe() { + QuotedMessage( + message = Message( + id = "msg-8", + text = "Original message from me", + user = PreviewUserData.user1, + ), + currentUser = PreviewUserData.user1, + replyMessage = Message( + id = "reply-8", + text = "Got it, thanks!", + user = PreviewUserData.user2, + ), + ) +} diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/components/messages/QuotedMessageTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/components/messages/QuotedMessageTest.kt index 65d7ea00b31..b3f4442c05c 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/components/messages/QuotedMessageTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/components/messages/QuotedMessageTest.kt @@ -60,4 +60,14 @@ internal class QuotedMessageTest : PaparazziComposeTest { fun `in composer`() { snapshotWithDarkModeRow { QuotedMessageInComposer() } } + + @Test + fun `reply by me to other`() { + snapshotWithDarkModeRow { QuotedMessageReplyByMeToOther() } + } + + @Test + fun `reply by other to me`() { + snapshotWithDarkModeRow { QuotedMessageReplyByOtherToMe() } + } } diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_me_to_other.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_me_to_other.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4e1f180c94e0a92e636d74dd5717b849106289 GIT binary patch literal 30348 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 Z;39^ld+W_*fW1H<)t8zt$`mX@{|9os2M_=N literal 0 HcmV?d00001 diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_other_to_me.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.messages_QuotedMessageTest_reply_by_other_to_me.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc5baddea3400fa9bf8888e5e6f8e5d941c4ecd GIT binary patch literal 20184 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

a8($shgx(ztG2i17hql{|fWBLI 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 Date: Wed, 3 Jun 2026 11:57:17 +0100 Subject: [PATCH 4/5] Regenerate API dump for new QuotedMessage previews CI's clean-cache `apiCheck` picked up two new `ComposableSingletons$QuotedMessageKt` lambda accessors emitted for the `@Preview` wrappers added in the previous commit. Local `apiCheck` had served a cached `apiBuild` output and missed the diff. --- stream-chat-android-compose/api/stream-chat-android-compose.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index a09d5c3e41f..d58831d3ed7 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -1551,10 +1551,12 @@ public final class io/getstream/chat/android/compose/ui/components/messages/Comp public final class io/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$QuotedMessageKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$QuotedMessageKt; public fun ()V + public final fun getLambda$-1414494261$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-242957275$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$-615170823$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1327756724$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1642749758$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$1769024465$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$1784593268$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$976393970$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } From 4cb4e922d2818ab26ddf761f6a07ec872aa5a364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Wed, 3 Jun 2026 15:39:13 +0100 Subject: [PATCH 5/5] Fix stale message capture in non-thread long-press handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit keyed the gesture detector on `message.id`: Modifier.pointerInput(message.id) { detectTapGestures(onLongPress = { onLongItemClick(message) }) } `pointerInput` re-launches its block only when its key changes, so for the lifetime of a message row (id stable) the captured `message` and `onLongItemClick` references stay frozen to the values from the first composition. When the message updates (for example, after the user adds a reaction), the long-press still fires with the pre-reaction message — the actions menu opens against stale state, and the menu's reaction-toggle decides "add" instead of "remove" because the captured message has no reaction yet. The user-driven add->remove E2E flows (`test_deletesReaction`, `test_removesReaction_whenUnReactingToParticipantsMessage`) broke for that reason. `combinedClickable` (used in the `canOpenThread` branch) does not have this problem because its handler lambdas are reinstalled on every recomposition. Capture the message and the long-click handler with `rememberUpdatedState` and key `pointerInput` on `Unit`. The gesture detector survives recomposition, but every fire reads the current values, so the menu always opens against the latest message state. --- .../compose/ui/messages/list/MessageContainer.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt index 39b4766cff2..53a90e813e1 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt @@ -180,6 +180,12 @@ public fun MessageContainer( val openThreadLabel = stringResource(R.string.stream_compose_message_item_open_thread) val messageOptionsLabel = stringResource(R.string.stream_compose_message_item_options) + // The pointerInput lambda below is keyed on Unit, so it is launched once and survives + // recomposition. Read the latest message + handler through rememberUpdatedState so the + // long-press fires with the current state (e.g. after a reaction is added) instead of a + // stale capture from first composition. + val currentMessage by rememberUpdatedState(message) + val currentOnLongItemClick by rememberUpdatedState(onLongItemClick) val clickModifier = when { canOpenThread -> Modifier.combinedClickable( interactionSource = remember(::MutableInteractionSource), @@ -191,12 +197,14 @@ public fun MessageContainer( ) canOpenActions -> Modifier - .pointerInput(message.id) { - detectTapGestures(onLongPress = { onLongItemClick(message) }) + .pointerInput(Unit) { + detectTapGestures( + onLongPress = { currentOnLongItemClick(currentMessage) }, + ) } .semantics(mergeDescendants = true) { onLongClick(label = messageOptionsLabel) { - onLongItemClick(message) + currentOnLongItemClick(currentMessage) true } }