Commit dc95ce0
authored
Improve channel list TalkBack accessibility (#6436)
* Fix duplicated TalkBack readout in channel preview
`MessagePreviewContent` and `DraftPreviewContent` exposed a consolidated
`text` semantic on the parent `Row` to read the sender+message (or
"Draft:"+text) as one utterance, but the child `Text` composables still
merged their own text into the surrounding clickable's accessibility
tree, so TalkBack announced each preview twice. Switching to
`clearAndSetSemantics` replaces the children and emits the composed
preview once.
* Fix TalkBack crash on mentions at the start of a message
`tagUser` in `TextUtils` decrements the mention's start index by 1 to
include the leading `@` in the highlighted span. When the mentioned user
name appears at index 0 of the message text, that produces a span start
of -1. Compose tolerates the invalid span at render time, but TalkBack
asks the platform to convert the `AnnotatedString` to a spannable, where
`Spannable.setSpan` strictly validates and throws
`IndexOutOfBoundsException: setSpan (-1 ...) starts before 0`, crashing
the app the moment an accessibility service tries to read the message
list.
Clamp the highlight start to 0 in that edge case so the span stays
valid; visually the leading `@` only drops out of the highlight when no
`@` actually precedes the name.
* Make channel list rows accessible to TalkBack
Channel rows previously announced as "Channel item, …" with the unread
badge speaking just the digit, the mute icon silent, and no `onClickLabel`
on the row so TalkBack fell back to the generic "double-tap to activate"
hint with no verb.
Push the a11y content down to the leaves so Compose's natural merge
composes them in visual reading order:
- The mute `Icon` (both inline and trailing-bottom variants) now carries a
localized "muted" `contentDescription`.
- `UnreadCountIndicator` overrides its inner numeric `Text` with a plural
label ("N unread messages") via `clearAndSetSemantics` on the badge Box.
Same component is used by `ThreadItem`, which benefits too.
- The outer `Column` drops the static "Channel item" placeholder and
declares `onClickLabel = "Open conversation"` /
`onLongClickLabel = "Open conversation options"` on `combinedClickable`.
Channel name, timestamp, read-status icon, and message preview already
expose their own semantics, so the natural merge picks them up unchanged.
Adds the four new strings across all 7 supported locales and drops the
now-unused `stream_compose_cd_channel_item` placeholder.
* Mark list-header title as a TalkBack heading
The channel-list and thread-list header titles already render in heading
typography but had no `heading()` semantics, so TalkBack's swipe-by-heading
gesture skipped them. Add `Modifier.semantics { heading() }` to both the
Connected title and the Offline "Disconnected" Text in
`DefaultListHeaderCenterContent`. The Connecting branch stays untouched
since it shows a transient loading indicator, not a heading.
Because `DefaultListHeaderCenterContent` is shared between
`ChannelListHeader` and `ThreadListHeader`, both screens gain heading
navigation from this single change.
* Include action verb in localized channel-item options label
The English `stream_compose_channel_item_options` is "Open conversation
options" — verb + noun. All seven locale translations dropped the verb
("Opciones de conversación", "Options de la conversation", and so on),
which left the TalkBack action label inconsistent with the parallel
`stream_compose_channel_item_open` ("Abrir conversación" / "Ouvrir la
conversation" / …) where every locale already includes the verb.
Re-add the verb so each `_options` label mirrors the verb-prefix
convention its sibling `_open` label uses.1 parent 70033c8 commit dc95ce0
13 files changed
Lines changed: 89 additions & 22 deletions
File tree
- stream-chat-android-compose/src/main
- java/io/getstream/chat/android/compose/ui
- channels/list
- components
- channels
- util
- res
- values-es
- values-fr
- values-hi
- values-in
- values-it
- values-ja
- values-ko
- values
Lines changed: 6 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
50 | | - | |
51 | | - | |
52 | 50 | | |
53 | 51 | | |
54 | 52 | | |
| |||
142 | 140 | | |
143 | 141 | | |
144 | 142 | | |
145 | | - | |
| 143 | + | |
| 144 | + | |
146 | 145 | | |
147 | 146 | | |
148 | 147 | | |
| |||
154 | 153 | | |
155 | 154 | | |
156 | 155 | | |
157 | | - | |
158 | 156 | | |
159 | 157 | | |
160 | 158 | | |
161 | 159 | | |
162 | 160 | | |
| 161 | + | |
163 | 162 | | |
| 163 | + | |
164 | 164 | | |
165 | 165 | | |
166 | 166 | | |
| |||
283 | 283 | | |
284 | 284 | | |
285 | 285 | | |
286 | | - | |
| 286 | + | |
287 | 287 | | |
288 | 288 | | |
289 | 289 | | |
| |||
350 | 350 | | |
351 | 351 | | |
352 | 352 | | |
353 | | - | |
| 353 | + | |
354 | 354 | | |
355 | 355 | | |
356 | 356 | | |
| |||
Lines changed: 6 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| 39 | + | |
| 40 | + | |
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
| |||
140 | 142 | | |
141 | 143 | | |
142 | 144 | | |
143 | | - | |
| 145 | + | |
| 146 | + | |
144 | 147 | | |
145 | 148 | | |
146 | 149 | | |
| |||
154 | 157 | | |
155 | 158 | | |
156 | 159 | | |
157 | | - | |
| 160 | + | |
| 161 | + | |
158 | 162 | | |
159 | 163 | | |
160 | 164 | | |
| |||
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
67 | | - | |
| 67 | + | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
| |||
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
104 | | - | |
| 104 | + | |
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
| |||
Lines changed: 11 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
30 | 33 | | |
31 | 34 | | |
32 | 35 | | |
| 36 | + | |
33 | 37 | | |
34 | 38 | | |
35 | 39 | | |
| |||
47 | 51 | | |
48 | 52 | | |
49 | 53 | | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
50 | 59 | | |
51 | 60 | | |
52 | 61 | | |
53 | 62 | | |
54 | 63 | | |
55 | | - | |
| 64 | + | |
| 65 | + | |
56 | 66 | | |
57 | 67 | | |
58 | 68 | | |
| |||
Lines changed: 7 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
226 | 226 | | |
227 | 227 | | |
228 | 228 | | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
229 | 234 | | |
230 | 235 | | |
231 | | - | |
| 236 | + | |
232 | 237 | | |
233 | 238 | | |
234 | 239 | | |
235 | 240 | | |
236 | 241 | | |
237 | 242 | | |
238 | | - | |
| 243 | + | |
239 | 244 | | |
240 | 245 | | |
241 | 246 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
259 | 261 | | |
260 | 262 | | |
261 | 263 | | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
262 | 268 | | |
263 | 269 | | |
264 | 270 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
259 | 261 | | |
260 | 262 | | |
261 | 263 | | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
262 | 268 | | |
263 | 269 | | |
264 | 270 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
18 | 22 | | |
19 | 23 | | |
20 | 24 | | |
| |||
112 | 116 | | |
113 | 117 | | |
114 | 118 | | |
115 | | - | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
116 | 122 | | |
117 | 123 | | |
118 | 124 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
259 | 261 | | |
260 | 262 | | |
261 | 263 | | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
262 | 268 | | |
263 | 269 | | |
264 | 270 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
18 | 22 | | |
19 | 23 | | |
20 | 24 | | |
| |||
112 | 116 | | |
113 | 117 | | |
114 | 118 | | |
115 | | - | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
116 | 122 | | |
117 | 123 | | |
118 | 124 | | |
| |||
0 commit comments