From 4e471d77dc1c6f09ff391d407c60194a61f6772b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Tue, 2 Jun 2026 15:02:05 +0100 Subject: [PATCH 1/5] Expose reactions as toggle buttons to TalkBack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `ReactionToggle` is used both in the long-press reactions bar and in the full emoji picker. Its `Modifier.toggleable` was wired with `role = Role.Checkbox`, so TalkBack announced reactions as "[emoji], checkbox, not checked, double tap to toggle". Reactions are tap-to-add / tap-to-remove toggle buttons, not checkboxes — the Figma a11y principle for role calls this out explicitly with the example "Thumbs up, toggle button, not pressed" vs the don't case "Thumbs up sign, checkbox". Switch the role to `Role.Button` and attach an explicit `stateDescription` of "Pressed" / "Not pressed" so TalkBack reads "[emoji], button, pressed / not pressed, double tap to toggle" — the canonical Android toggle-button pattern, since Compose has no `Role.ToggleButton`. Two new strings (`stream_compose_reactions_pressed` and `stream_compose_reactions_not_pressed`) translated across the 7 supported locales. Internal-only composable; no public API change. This overrides the deliberate `Role.Checkbox` decision from #6440 in favour of the design source-of-truth. --- .../ui/components/reactions/ReactionToggle.kt | 33 ++++++++++++++++--- .../src/main/res/values-es/strings.xml | 4 +++ .../src/main/res/values-fr/strings.xml | 4 +++ .../src/main/res/values-hi/strings.xml | 4 +++ .../src/main/res/values-in/strings.xml | 4 +++ .../src/main/res/values-it/strings.xml | 4 +++ .../src/main/res/values-ja/strings.xml | 4 +++ .../src/main/res/values-ko/strings.xml | 4 +++ .../src/main/res/values/strings.xml | 4 +++ 9 files changed, 60 insertions(+), 5 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt index 2541009b7a6..de129171644 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt @@ -29,10 +29,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.stateDescription import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.ui.theme.ReactionIconParams import io.getstream.chat.android.compose.ui.util.ReactionResolver @@ -60,6 +65,10 @@ internal fun ReactionToggle( ) { emoji?.let { val containerSize = size.toContainerSize() + val selectedStateDescription = stringResource(R.string.stream_compose_reactions_state_selected) + val notSelectedStateDescription = stringResource(R.string.stream_compose_reactions_state_not_selected) + val selectActionLabel = stringResource(R.string.stream_compose_reactions_action_select) + val unselectActionLabel = stringResource(R.string.stream_compose_reactions_action_unselect) ChatTheme.componentFactory.ReactionIcon( params = ReactionIconParams( type = type, @@ -70,11 +79,25 @@ internal fun ReactionToggle( background(ChatTheme.colors.backgroundUtilitySelected, CircleShape) } .ifNotNull(onCheckedChange) { onChange -> - clip(CircleShape).toggleable( - value = checked, - role = Role.Checkbox, - onValueChange = onChange, - ) + clip(CircleShape) + .toggleable( + value = checked, + role = Role.Button, + onValueChange = onChange, + ) + .semantics { + stateDescription = if (checked) { + selectedStateDescription + } else { + notSelectedStateDescription + } + onClick( + label = if (checked) unselectActionLabel else selectActionLabel, + ) { + onChange(!checked) + true + } + } } .defaultMinSize(minWidth = containerSize, minHeight = containerSize) .wrapContentSize(), 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..db95d572ad1 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 @@ -225,8 +225,12 @@ "Responder a %s" "Responder a ti" "Tú" + "Seleccionar" + "Deseleccionar" "Añadir reacción" "Toca para eliminar" + "No seleccionado" + "Seleccionado" "Tú" "Archivos recientes" "+%1$d" 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..b30cd8fa50e 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 @@ -225,8 +225,12 @@ "Répondre à %s" "Répondre à vous-même" "Vous" + "Sélectionner" + "Désélectionner" "Ajouter une réaction" "Appuyez pour supprimer" + "Non sélectionné" + "Sélectionné" "Vous" "Fichiers récents" "+%1$d" 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..8bc76ae630f 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 @@ -285,8 +285,12 @@ "%s को जवाब" "स्वयं को जवाब" "आप" + "चुनें" + "अचयन करें" "प्रतिक्रिया जोड़ें" "हटाने के लिए टैप करें" + "चयनित नहीं" + "चयनित" "आप" "हाल ही की फाइलें" "+%1$d" 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..0b6615a9d98 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 @@ -225,8 +225,12 @@ "Balas ke %s" "Balas ke diri sendiri" "Anda" + "Pilih" + "Batalkan pilihan" "Tambahkan reaksi" "Ketuk untuk menghapus" + "Tidak dipilih" + "Dipilih" "Anda" "File Terbaru" "+%1$d" 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..4b997005e85 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 @@ -285,8 +285,12 @@ "Rispondi a %s" "Rispondi a te stesso" "Tu" + "Seleziona" + "Deseleziona" "Aggiungi reazione" "Tocca per rimuovere" + "Non selezionato" + "Selezionato" "Tu" "File recenti" "+%1$d" 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..11c7d6db736 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 @@ -261,8 +261,12 @@ "%d本の動画" "あなた" + "選択" + "選択解除" "リアクションを追加" "タップして削除" + "選択されていません" + "選択されています" "あなた" "最近のファイル" "+%1$d" 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..0914a06a6d9 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 @@ -261,8 +261,12 @@ "%d개의 동영상" "나" + "선택" + "선택 해제" "리액션 추가" "탭하여 삭제" + "선택되지 않음" + "선택됨" "나" "최근 파일" "+%1$d" 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..bcbf16d4a17 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -155,6 +155,10 @@ Add reaction You Tap to remove + Selected + Not selected + Select + Unselect Show more reactions From f2a7e451b38204add20c9a529ba50a7628f7a3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Tue, 2 Jun 2026 15:09:03 +0100 Subject: [PATCH 2/5] Announce reaction add and remove to TalkBack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tapping a reaction toggle in either the long-press reactions bar or the full emoji picker grid produced no screen-reader confirmation. TalkBack re-focused the underlying message but emitted no signal that the toggle state changed, leaving SR users unsure whether the action took effect. Wrap `ReactionToggle.onValueChange` to fire a polite live region announce before forwarding the new state to the caller. Both surfaces inherit the behaviour automatically because the full emoji picker's `ReactionMenuOptionItem` factory delegates to the same `ReactionToggle`. The announce string carries the emoji character as `%1$s`. TalkBack reads the character with its locale-native name (e.g. `👍` → "Thumbs up sign"), so the announce reads naturally as "Thumbs up sign reaction added" without maintaining a per-reaction name table in the SDK. Two new strings (`stream_compose_reactions_added` and `stream_compose_reactions_removed`) translated across the 7 supported locales. --- .../ui/components/reactions/ReactionToggle.kt | 14 ++++++++++++-- .../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, 28 insertions(+), 2 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt index de129171644..fdf75e3123d 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt @@ -29,6 +29,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.onClick @@ -69,6 +70,9 @@ internal fun ReactionToggle( val notSelectedStateDescription = stringResource(R.string.stream_compose_reactions_state_not_selected) val selectActionLabel = stringResource(R.string.stream_compose_reactions_action_select) val unselectActionLabel = stringResource(R.string.stream_compose_reactions_action_unselect) + val addedAnnouncement = stringResource(R.string.stream_compose_reactions_added, emoji) + val removedAnnouncement = stringResource(R.string.stream_compose_reactions_removed, emoji) + val view = LocalView.current ChatTheme.componentFactory.ReactionIcon( params = ReactionIconParams( type = type, @@ -79,11 +83,17 @@ internal fun ReactionToggle( background(ChatTheme.colors.backgroundUtilitySelected, CircleShape) } .ifNotNull(onCheckedChange) { onChange -> + val toggleAndAnnounce: (Boolean) -> Unit = { newChecked -> + view.announceForAccessibility( + if (newChecked) addedAnnouncement else removedAnnouncement, + ) + onChange(newChecked) + } clip(CircleShape) .toggleable( value = checked, role = Role.Button, - onValueChange = onChange, + onValueChange = toggleAndAnnounce, ) .semantics { stateDescription = if (checked) { @@ -94,7 +104,7 @@ internal fun ReactionToggle( onClick( label = if (checked) unselectActionLabel else selectActionLabel, ) { - onChange(!checked) + toggleAndAnnounce(!checked) true } } 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 db95d572ad1..7161a50ed54 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 @@ -228,7 +228,9 @@ "Seleccionar" "Deseleccionar" "Añadir reacción" + "Reacción %1$s añadida" "Toca para eliminar" + "Reacción %1$s eliminada" "No seleccionado" "Seleccionado" "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 b30cd8fa50e..056246ee69c 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 @@ -228,7 +228,9 @@ "Sélectionner" "Désélectionner" "Ajouter une réaction" + "Réaction %1$s ajoutée" "Appuyez pour supprimer" + "Réaction %1$s supprimée" "Non sélectionné" "Sélectionné" "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 8bc76ae630f..7ab12238256 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 @@ -288,7 +288,9 @@ "चुनें" "अचयन करें" "प्रतिक्रिया जोड़ें" + "%1$s प्रतिक्रिया जोड़ी गई" "हटाने के लिए टैप करें" + "%1$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 0b6615a9d98..2a22e81e6f2 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 @@ -228,7 +228,9 @@ "Pilih" "Batalkan pilihan" "Tambahkan reaksi" + "Reaksi %1$s ditambahkan" "Ketuk untuk menghapus" + "Reaksi %1$s dihapus" "Tidak dipilih" "Dipilih" "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 4b997005e85..725723eff22 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 @@ -288,7 +288,9 @@ "Seleziona" "Deseleziona" "Aggiungi reazione" + "Reazione %1$s aggiunta" "Tocca per rimuovere" + "Reazione %1$s rimossa" "Non selezionato" "Selezionato" "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 11c7d6db736..1236cb6e237 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 @@ -264,7 +264,9 @@ "選択" "選択解除" "リアクションを追加" + "%1$s リアクションを追加しました" "タップして削除" + "%1$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 0914a06a6d9..30481cbd658 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 @@ -264,7 +264,9 @@ "선택" "선택 해제" "리액션 추가" + "%1$s 리액션 추가됨" "탭하여 삭제" + "%1$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 bcbf16d4a17..ed1792e2d0b 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -159,6 +159,8 @@ Not selected Select Unselect + %1$s reaction added + %1$s reaction removed Show more reactions From 1011ab9e001f85b8966ea063d5d31f47bab68160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Tue, 2 Jun 2026 15:18:16 +0100 Subject: [PATCH 3/5] Announce the message actions menu pane title to TalkBack When the long-press menu opened, TalkBack leaked the host activity's `android:label` ("Chat Sample Compose") before the focused element, giving screen-reader users no signal that a new surface had appeared. Declare `paneTitle = "Message actions"` on the inner `Column` inside the `Dialog`. TalkBack treats `paneTitle` changes as a window-state event and announces the title on dialog entry, so the new opening announcement reads "Message actions, [first focused item]" instead of the host activity label. One new string (`stream_compose_message_actions_menu_title`) translated across the 7 supported locales. --- .../ui/components/messageactions/MessageActions.kt | 9 ++++++++- .../src/main/res/values-es/strings.xml | 1 + .../src/main/res/values-fr/strings.xml | 1 + .../src/main/res/values-hi/strings.xml | 1 + .../src/main/res/values-in/strings.xml | 1 + .../src/main/res/values-it/strings.xml | 1 + .../src/main/res/values-ja/strings.xml | 1 + .../src/main/res/values-ko/strings.xml | 1 + .../src/main/res/values/strings.xml | 1 + 9 files changed, 16 insertions(+), 1 deletion(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messageactions/MessageActions.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messageactions/MessageActions.kt index 408d8424568..aa47da67cb2 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messageactions/MessageActions.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messageactions/MessageActions.kt @@ -49,6 +49,8 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInWindow import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.paneTitle import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.tooling.preview.Preview @@ -59,6 +61,7 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogWindowProvider import androidx.compose.ui.zIndex +import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.state.messageoptions.MessageOptionItemState import io.getstream.chat.android.compose.state.messages.MessageAlignment import io.getstream.chat.android.compose.ui.components.messageoptions.defaultMessageOptionsState @@ -175,9 +178,13 @@ public fun MessageActions( if (isInspection) animation.snapIn() else animation.animateIn() } + val menuPaneTitle = stringResource(R.string.stream_compose_message_actions_menu_title) Column( modifier = modifier - .semantics { testTagsAsResourceId = true } + .semantics { + testTagsAsResourceId = true + paneTitle = menuPaneTitle + } .fillMaxSize() .clickable(onClick = animatedDismiss, indication = null, interactionSource = null) .systemBarsPadding() 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 7161a50ed54..35a648bb3cd 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 @@ -135,6 +135,7 @@ "Abrir archivos adjuntos" "Mensaje eliminado" "Mensaje eliminado" + "Acciones del mensaje" "Abrir hilo" "Mostrar opciones del mensaje" "Abrir archivo adjunto" 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 056246ee69c..f2e458d9293 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 @@ -135,6 +135,7 @@ "Ouvrir les pièces jointes" "Message supprimé" "Message supprimé" + "Actions du message" "Ouvrir le fil" "Afficher les options du message" "Ouvrir la pièce jointe" 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 7ab12238256..64bc8a09479 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 @@ -195,6 +195,7 @@ "अटैचमेंट खोलें" "मैसेज मिटाया गया" "मैसेज हटा दिया गया" + "संदेश की क्रियाएँ" "थ्रेड खोलें" "संदेश के विकल्प दिखाएँ" "अटैचमेंट खोलें" 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 2a22e81e6f2..f0f12836082 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 @@ -135,6 +135,7 @@ "Buka lampiran" "Pesan dihapus" "Pesan dihapus" + "Tindakan pesan" "Buka utas" "Tampilkan opsi pesan" "Buka lampiran" 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 725723eff22..0047b244399 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 @@ -195,6 +195,7 @@ "Apri allegati" "Messaggio cancellato" "Messaggio cancellato" + "Azioni del messaggio" "Apri thread" "Mostra opzioni messaggio" "Apri allegato" 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 1236cb6e237..e1d60615d6a 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 @@ -147,6 +147,7 @@ "添付ファイルを開く" "メッセージは削除されました" "メッセージは削除されました" + "メッセージのアクション" "スレッドを開く" "メッセージのオプションを表示" "添付ファイルを開く" 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 30481cbd658..ece8c2302da 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 @@ -147,6 +147,7 @@ "첨부파일 열기" "메시지가 삭제되었습니다" "메시지가 삭제되었습니다" + "메시지 작업" "스레드 열기" "메시지 옵션 표시" "첨부파일 열기" 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 ed1792e2d0b..003d6608789 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -111,6 +111,7 @@ Show message options Show reactions Open attachment + Message actions Voice message (%s) From e70d4a253e08873a010c7a9b8329889fc9e45800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Tue, 2 Jun 2026 15:37:43 +0100 Subject: [PATCH 4/5] Announce the emoji picker sheet to TalkBack When the emoji picker `ModalBottomSheet` opened from the "+" in the reactions bar, TalkBack focused the drag handle and announced "Collapsed, drag handle, actions available, swipe up or swipe down". Screen-reader users had no signal that the emoji picker had appeared and the drag handle drowned out the actual content. `ModalBottomSheet` swallows the standard `paneTitle` window-state event (verified in #6466 / `PollDialogHeader`), so announce the title programmatically via `view.announceForAccessibility` in a `LaunchedEffect`. TalkBack now reads "Emoji picker" on sheet open. Hide the drag handle from the accessibility tree via `Modifier.semantics { hideFromAccessibility() }`. The handle stays visually present and remains draggable for sighted users; TalkBack focus skips it and lands on the first emoji in the picker grid instead. One new string (`stream_compose_emoji_picker_title`) translated across the 7 supported locales. No public API changes. --- .../api/stream-chat-android-compose.api | 14 +++++++++++++- .../ui/components/StreamModalBottomSheet.kt | 4 ++++ .../reactionpicker/ReactionsPicker.kt | 18 ++++++++++++++++++ .../src/main/res/values-es/strings.xml | 1 + .../src/main/res/values-fr/strings.xml | 1 + .../src/main/res/values-hi/strings.xml | 1 + .../src/main/res/values-in/strings.xml | 1 + .../src/main/res/values-it/strings.xml | 1 + .../src/main/res/values-ja/strings.xml | 1 + .../src/main/res/values-ko/strings.xml | 1 + .../src/main/res/values/strings.xml | 1 + 11 files changed, 43 insertions(+), 1 deletion(-) 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..37136f724ac 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -1084,6 +1084,12 @@ public final class io/getstream/chat/android/compose/ui/components/ComposableSin public final fun getLambda$2132906032$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; } +public final class io/getstream/chat/android/compose/ui/components/ComposableSingletons$StreamModalBottomSheetKt { + public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/ComposableSingletons$StreamModalBottomSheetKt; + public fun ()V + public final fun getLambda$42975036$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; +} + public final class io/getstream/chat/android/compose/ui/components/ComposerCancelIconKt { public static final fun ComposerCancelIcon (Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V } @@ -1712,6 +1718,12 @@ public final class io/getstream/chat/android/compose/ui/components/reactionoptio public final fun getLambda$857155321$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } +public final class io/getstream/chat/android/compose/ui/components/reactionpicker/ComposableSingletons$ReactionsPickerKt { + public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/reactionpicker/ComposableSingletons$ReactionsPickerKt; + public fun ()V + public final fun getLambda$1237548717$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; +} + public final class io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPickerKt { public static final fun ReactionsPicker (Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V public static final fun ReactionsPickerContent (Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V @@ -1858,7 +1870,7 @@ public final class io/getstream/chat/android/compose/ui/messages/attachments/Com public final fun getLambda$-2013272462$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; public final fun getLambda$-2042605497$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$12639049$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$2047105752$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; + public final fun getLambda$1654106807$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; } public final class io/getstream/chat/android/compose/ui/messages/attachments/ComposableSingletons$AttachmentTypePickerKt { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt index f63e8e1c3db..96a1a593152 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt @@ -19,6 +19,7 @@ package io.getstream.chat.android.compose.ui.components import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState @@ -53,6 +54,7 @@ import io.getstream.chat.android.compose.ui.theme.StreamTokens * @param onDismissRequest Invoked when the user dismisses the sheet. * @param modifier Modifier applied to the sheet container. * @param sheetState State controlling the sheet's visibility and target value. + * @param dragHandle Composable rendered as the sheet's drag handle. Defaults to the M3 default. * @param content Sheet body, laid out vertically in a [ColumnScope]. */ @OptIn(ExperimentalMaterial3Api::class) @@ -61,6 +63,7 @@ internal fun StreamCardBottomSheet( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, sheetState: SheetState = rememberStreamSheetState(initialValueInInspection = SheetValue.PartiallyExpanded), + dragHandle: @Composable () -> Unit = { BottomSheetDefaults.DragHandle() }, content: @Composable ColumnScope.() -> Unit, ) { ModalBottomSheet( @@ -70,6 +73,7 @@ internal fun StreamCardBottomSheet( shape = StreamCardSheetShape, containerColor = ChatTheme.colors.backgroundCoreElevation1, scrimColor = ChatTheme.colors.backgroundCoreScrim, + dragHandle = dragHandle, content = content, ) } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt index e8c842e19e8..f4293148bf7 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt @@ -17,9 +17,16 @@ package io.getstream.chat.android.compose.ui.components.reactionpicker import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.hideFromAccessibility +import androidx.compose.ui.semantics.semantics +import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.ui.components.StreamCardBottomSheet import io.getstream.chat.android.compose.ui.components.reactionoptions.ExtendedReactionsOptions import io.getstream.chat.android.compose.ui.theme.ChatTheme @@ -45,9 +52,20 @@ public fun ReactionsPicker( modifier: Modifier = Modifier, onDismiss: () -> Unit = {}, ) { + val view = LocalView.current + val emojiPickerTitle = stringResource(R.string.stream_compose_emoji_picker_title) + // ModalBottomSheet swallows the standard `paneTitle` window-state-changed event, so + // announce the title programmatically. See PollDialogHeader for the same workaround. + LaunchedEffect(emojiPickerTitle) { view.announceForAccessibility(emojiPickerTitle) } + StreamCardBottomSheet( onDismissRequest = onDismiss, modifier = modifier, + dragHandle = { + BottomSheetDefaults.DragHandle( + modifier = Modifier.semantics { hideFromAccessibility() }, + ) + }, ) { ChatTheme.componentFactory.MessageReactionsPickerContent( params = MessageReactionsPickerContentParams( 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 35a648bb3cd..9a86ff36599 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 @@ -85,6 +85,7 @@ "Descartar" "Actualizar tu comentario" "Editar mensaje" + "Selector de emojis" "Archivo" "Marcar mensaje" "¿Quieres enviar una copia de este mensaje a un moderador para una investigación más detallada?" 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 f2e458d9293..2e729c249a1 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 @@ -85,6 +85,7 @@ "Ignorer" "Mettre à jour votre commentaire" "Modifier le message" + "Sélecteur d’emojis" "Fichier" "Signaler le message" "Voulez-vous envoyer une copie de ce message à un modérateur pour une enquête plus approfondie ?" 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 64bc8a09479..3f0fa143cc6 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 @@ -145,6 +145,7 @@ "खारिज करें" "अपनी टिप्पणी अपडेट करें" "मैसेज एडिट करें" + "इमोजी चयनकर्ता" "फ़ाइल" "मैसेज चिह्नित करें" "क्या आप आगे की जांच के लिए इस संदेश की एक कॉपी मॉडरेटर को भेजना चाहते हैं?" 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 f0f12836082..8048a67c750 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 @@ -85,6 +85,7 @@ "Tutup" "Perbarui Komentar Anda" "Edit Pesan" + "Pemilih emoji" "File" "Tandai Pesan" "Apakah Anda ingin mengirim salinan pesan ini ke moderator untuk investigasi lebih lanjut?" 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 0047b244399..6df51a803b2 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 @@ -145,6 +145,7 @@ "Chiudi" "Aggiorna il tuo commento" "Modifica messaggio" + "Selettore emoji" "File" "Segnala messaggio" "Vuoi mandare una copia di questo messaggio ad un moderatore?" 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 e1d60615d6a..221488983a9 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 @@ -92,6 +92,7 @@ "閉じる" "コメントを更新" "メッセージを編集" + "絵文字ピッカー" "ファイル" "%dファイル" 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 ece8c2302da..44f0f886896 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 @@ -92,6 +92,7 @@ "닫기" "댓글 수정" "메시지 수정" + "이모지 선택기" "파일" "%d개의 파일" 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 003d6608789..0bed299296e 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -165,6 +165,7 @@ Show more reactions + Emoji picker Delete message From f9d5581ff7e87c30545de997ea157737b7a5238c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mion?= Date: Mon, 8 Jun 2026 14:56:11 +0100 Subject: [PATCH 5/5] Apply review feedback on emoji picker a11y 1. StreamCardBottomSheet bakes `hideFromAccessibility()` into its default drag handle instead of exposing a `dragHandle` parameter for the emoji picker to override. The handle has no value for TalkBack users, so hiding it from the accessibility tree is the right default for every Stream card sheet rather than opt-in per call site. 2. `ReactionToggle` announces are renamed from added/removed to selected/unselected (variables and `stream_compose_reactions_*` keys). The component does not know whether a caller uses it to add or remove a reaction, so selected/unselected matches its actual semantic. Translations updated across the 7 supported locales. KDoc cleanup: dropped the rationale paragraph from `StreamCardBottomSheet` so the contract describes behaviour only. --- .../api/stream-chat-android-compose.api | 10 ++-------- .../compose/ui/components/StreamModalBottomSheet.kt | 13 +++++++++---- .../ui/components/reactionpicker/ReactionsPicker.kt | 8 -------- .../ui/components/reactions/ReactionToggle.kt | 6 +++--- .../src/main/res/values-es/strings.xml | 4 ++-- .../src/main/res/values-fr/strings.xml | 4 ++-- .../src/main/res/values-hi/strings.xml | 4 ++-- .../src/main/res/values-in/strings.xml | 4 ++-- .../src/main/res/values-it/strings.xml | 4 ++-- .../src/main/res/values-ja/strings.xml | 4 ++-- .../src/main/res/values-ko/strings.xml | 4 ++-- .../src/main/res/values/strings.xml | 4 ++-- 12 files changed, 30 insertions(+), 39 deletions(-) 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 37136f724ac..f849ce0de22 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -1087,7 +1087,7 @@ public final class io/getstream/chat/android/compose/ui/components/ComposableSin public final class io/getstream/chat/android/compose/ui/components/ComposableSingletons$StreamModalBottomSheetKt { public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/ComposableSingletons$StreamModalBottomSheetKt; public fun ()V - public final fun getLambda$42975036$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; + public final fun getLambda$932570128$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } public final class io/getstream/chat/android/compose/ui/components/ComposerCancelIconKt { @@ -1718,12 +1718,6 @@ public final class io/getstream/chat/android/compose/ui/components/reactionoptio public final fun getLambda$857155321$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; } -public final class io/getstream/chat/android/compose/ui/components/reactionpicker/ComposableSingletons$ReactionsPickerKt { - public static final field INSTANCE Lio/getstream/chat/android/compose/ui/components/reactionpicker/ComposableSingletons$ReactionsPickerKt; - public fun ()V - public final fun getLambda$1237548717$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; -} - public final class io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPickerKt { public static final fun ReactionsPicker (Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V public static final fun ReactionsPickerContent (Lio/getstream/chat/android/models/Message;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V @@ -1870,7 +1864,7 @@ public final class io/getstream/chat/android/compose/ui/messages/attachments/Com public final fun getLambda$-2013272462$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; public final fun getLambda$-2042605497$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$12639049$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2; - public final fun getLambda$1654106807$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; + public final fun getLambda$2047105752$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3; } public final class io/getstream/chat/android/compose/ui/messages/attachments/ComposableSingletons$AttachmentTypePickerKt { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt index 96a1a593152..6ee8e68e330 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/StreamModalBottomSheet.kt @@ -31,6 +31,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.semantics.hideFromAccessibility +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.Dp import io.getstream.chat.android.compose.ui.theme.ChatTheme import io.getstream.chat.android.compose.ui.theme.StreamTokens @@ -39,7 +41,8 @@ import io.getstream.chat.android.compose.ui.theme.StreamTokens * Card-style Stream modal bottom sheet. * * Bakes the design-system tokens for a card sitting above the app: - * 32dp top corners, elevated surface color, heavier scrim, and the M3 default drag handle. + * 32dp top corners, elevated surface color, heavier scrim, and the M3 default drag handle + * (hidden from the accessibility tree). * Use for menus and option pickers that appear on top of the underlying screen * (e.g. reactions, channel info member modal, attachment command picker). * @@ -54,7 +57,6 @@ import io.getstream.chat.android.compose.ui.theme.StreamTokens * @param onDismissRequest Invoked when the user dismisses the sheet. * @param modifier Modifier applied to the sheet container. * @param sheetState State controlling the sheet's visibility and target value. - * @param dragHandle Composable rendered as the sheet's drag handle. Defaults to the M3 default. * @param content Sheet body, laid out vertically in a [ColumnScope]. */ @OptIn(ExperimentalMaterial3Api::class) @@ -63,7 +65,6 @@ internal fun StreamCardBottomSheet( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, sheetState: SheetState = rememberStreamSheetState(initialValueInInspection = SheetValue.PartiallyExpanded), - dragHandle: @Composable () -> Unit = { BottomSheetDefaults.DragHandle() }, content: @Composable ColumnScope.() -> Unit, ) { ModalBottomSheet( @@ -73,7 +74,11 @@ internal fun StreamCardBottomSheet( shape = StreamCardSheetShape, containerColor = ChatTheme.colors.backgroundCoreElevation1, scrimColor = ChatTheme.colors.backgroundCoreScrim, - dragHandle = dragHandle, + dragHandle = { + BottomSheetDefaults.DragHandle( + modifier = Modifier.semantics { hideFromAccessibility() }, + ) + }, content = content, ) } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt index f4293148bf7..bca38531533 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactionpicker/ReactionsPicker.kt @@ -17,15 +17,12 @@ package io.getstream.chat.android.compose.ui.components.reactionpicker import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.hideFromAccessibility -import androidx.compose.ui.semantics.semantics import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.ui.components.StreamCardBottomSheet import io.getstream.chat.android.compose.ui.components.reactionoptions.ExtendedReactionsOptions @@ -61,11 +58,6 @@ public fun ReactionsPicker( StreamCardBottomSheet( onDismissRequest = onDismiss, modifier = modifier, - dragHandle = { - BottomSheetDefaults.DragHandle( - modifier = Modifier.semantics { hideFromAccessibility() }, - ) - }, ) { ChatTheme.componentFactory.MessageReactionsPickerContent( params = MessageReactionsPickerContentParams( diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt index fdf75e3123d..d3cbb9ba4ce 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt @@ -70,8 +70,8 @@ internal fun ReactionToggle( val notSelectedStateDescription = stringResource(R.string.stream_compose_reactions_state_not_selected) val selectActionLabel = stringResource(R.string.stream_compose_reactions_action_select) val unselectActionLabel = stringResource(R.string.stream_compose_reactions_action_unselect) - val addedAnnouncement = stringResource(R.string.stream_compose_reactions_added, emoji) - val removedAnnouncement = stringResource(R.string.stream_compose_reactions_removed, emoji) + val selectedAnnouncement = stringResource(R.string.stream_compose_reactions_selected, emoji) + val unselectedAnnouncement = stringResource(R.string.stream_compose_reactions_unselected, emoji) val view = LocalView.current ChatTheme.componentFactory.ReactionIcon( params = ReactionIconParams( @@ -85,7 +85,7 @@ internal fun ReactionToggle( .ifNotNull(onCheckedChange) { onChange -> val toggleAndAnnounce: (Boolean) -> Unit = { newChecked -> view.announceForAccessibility( - if (newChecked) addedAnnouncement else removedAnnouncement, + if (newChecked) selectedAnnouncement else unselectedAnnouncement, ) onChange(newChecked) } 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 9a86ff36599..0966f3a4956 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 @@ -230,9 +230,9 @@ "Seleccionar" "Deseleccionar" "Añadir reacción" - "Reacción %1$s añadida" "Toca para eliminar" - "Reacción %1$s eliminada" + "Reacción %1$s seleccionada" + "Reacción %1$s deseleccionada" "No seleccionado" "Seleccionado" "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 2e729c249a1..aab62aed9cc 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 @@ -230,9 +230,9 @@ "Sélectionner" "Désélectionner" "Ajouter une réaction" - "Réaction %1$s ajoutée" "Appuyez pour supprimer" - "Réaction %1$s supprimée" + "Réaction %1$s sélectionnée" + "Réaction %1$s désélectionnée" "Non sélectionné" "Sélectionné" "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 3f0fa143cc6..152f472badf 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 @@ -290,9 +290,9 @@ "चुनें" "अचयन करें" "प्रतिक्रिया जोड़ें" - "%1$s प्रतिक्रिया जोड़ी गई" "हटाने के लिए टैप करें" - "%1$s प्रतिक्रिया हटाई गई" + "%1$s प्रतिक्रिया चुनी गई" + "%1$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 8048a67c750..b8641a0dd00 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 @@ -230,9 +230,9 @@ "Pilih" "Batalkan pilihan" "Tambahkan reaksi" - "Reaksi %1$s ditambahkan" "Ketuk untuk menghapus" - "Reaksi %1$s dihapus" + "Reaksi %1$s dipilih" + "Reaksi %1$s tidak dipilih" "Tidak dipilih" "Dipilih" "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 6df51a803b2..aa4c860bc22 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 @@ -290,9 +290,9 @@ "Seleziona" "Deseleziona" "Aggiungi reazione" - "Reazione %1$s aggiunta" "Tocca per rimuovere" - "Reazione %1$s rimossa" + "Reazione %1$s selezionata" + "Reazione %1$s deselezionata" "Non selezionato" "Selezionato" "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 221488983a9..f37bcd36aef 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 @@ -266,9 +266,9 @@ "選択" "選択解除" "リアクションを追加" - "%1$s リアクションを追加しました" "タップして削除" - "%1$s リアクションを削除しました" + "%1$s リアクションを選択しました" + "%1$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 44f0f886896..b8fede41890 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 @@ -266,9 +266,9 @@ "선택" "선택 해제" "리액션 추가" - "%1$s 리액션 추가됨" "탭하여 삭제" - "%1$s 리액션 제거됨" + "%1$s 리액션 선택됨" + "%1$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 0bed299296e..18d06556836 100644 --- a/stream-chat-android-compose/src/main/res/values/strings.xml +++ b/stream-chat-android-compose/src/main/res/values/strings.xml @@ -160,8 +160,8 @@ Not selected Select Unselect - %1$s reaction added - %1$s reaction removed + %1$s reaction selected + %1$s reaction unselected Show more reactions