Commit ea3537b
fix(a11y): restore TalkBack tab states, native toggle/checkbox/radio roles, in-locale Connect strings (#45)
* docs(a11y): add 2026-05-19 accessibility fixes plan
Captures the four TalkBack regressions reported by blind users and
the plan to fix them using native Role.Tab/Role.Switch/Role.Checkbox
semantics plus in-app-locale Connect-button strings.
* chore(a11y): add Compose selection/Role/clearAndSetSemantics imports
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(a11y): use Role.Tab + selectable for bottom nav tabs
Restores 'selected' state announcement and eliminates the triple
read of each tab label by merging descendants and dropping the
Icon's redundant contentDescription.
* fix(a11y): use Role.Tab + selectable for ProfileTabSwitch
Drops custom cd_profile_tab_selected/unselected strings in favor of
the platform's native Tab role announcement.
* fix(a11y): make ToggleRow a Role.Switch toggleable row
Drops custom cd_toggle_row_on/off strings. The native Switch role
makes TalkBack announce on/off naturally, fulfilling the user's
'use native controls' request.
* fix(a11y): make ParallelTestConfigRow a Role.Checkbox toggleable row
Single focus stop per config, native checked/not-checked announcement,
honors the row's enabled parameter for the screen reader.
* fix(a11y): localize Connect button screen-reader strings
Migrates cd_connect_button_* into WhiteDnsStrings / WhiteDnsL10n so the
button's accessibility description follows the in-app language picker,
not the device system locale. Adds merged semantics so the button is a
single focus stop.
* chore(a11y): remove cd_* resources superseded by native semantics
These keys are no longer referenced from Kotlin code now that bottom
nav, profile tabs, ToggleRow, ParallelTestConfigRow, and the Connect
button use native Role-based semantics or the in-app WhiteDnsL10n
pipeline.
* fix(a11y): use Role.RadioButton + selectable for segmented controls
Language, Theme, and Connection mode segmented controls each had
.clickable(enabled = !selected) on the option boxes, which:
- gave the selected option no Role, so TalkBack never announced
"selected" when the language (or theme/mode) changed
- made the selected option non-focusable for the screen reader
Switching to .selectable(selected, role = Role.RadioButton, onClick)
+ .semantics(mergeDescendants = true) {} fixes both: TalkBack now
announces "<label>, radio button, selected/not selected" with a
single focus stop per option. The ConnectionMode control keeps its
outer enabled flag wired through to selectable.enabled.
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>1 parent eee75ad commit ea3537b
6 files changed
Lines changed: 960 additions & 91 deletions
File tree
- app/src/main
- java/shop/whitedns/client/ui
- res
- values-fa
- values
- docs/superpowers/plans
Lines changed: 85 additions & 69 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
140 | 142 | | |
141 | 143 | | |
142 | 144 | | |
| 145 | + | |
143 | 146 | | |
| 147 | + | |
144 | 148 | | |
145 | 149 | | |
146 | 150 | | |
| |||
1246 | 1250 | | |
1247 | 1251 | | |
1248 | 1252 | | |
1249 | | - | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
1250 | 1259 | | |
1251 | 1260 | | |
1252 | 1261 | | |
1253 | 1262 | | |
1254 | 1263 | | |
1255 | 1264 | | |
1256 | 1265 | | |
1257 | | - | |
| 1266 | + | |
| 1267 | + | |
1258 | 1268 | | |
1259 | 1269 | | |
1260 | 1270 | | |
| |||
2232 | 2242 | | |
2233 | 2243 | | |
2234 | 2244 | | |
2235 | | - | |
2236 | 2245 | | |
2237 | 2246 | | |
2238 | 2247 | | |
| |||
2266 | 2275 | | |
2267 | 2276 | | |
2268 | 2277 | | |
2269 | | - | |
2270 | | - | |
2271 | | - | |
2272 | | - | |
2273 | | - | |
2274 | | - | |
2275 | | - | |
2276 | | - | |
2277 | | - | |
| 2278 | + | |
| 2279 | + | |
| 2280 | + | |
| 2281 | + | |
| 2282 | + | |
| 2283 | + | |
| 2284 | + | |
| 2285 | + | |
| 2286 | + | |
2278 | 2287 | | |
2279 | 2288 | | |
2280 | 2289 | | |
2281 | 2290 | | |
2282 | 2291 | | |
2283 | 2292 | | |
2284 | | - | |
| 2293 | + | |
2285 | 2294 | | |
2286 | 2295 | | |
2287 | 2296 | | |
| |||
2305 | 2314 | | |
2306 | 2315 | | |
2307 | 2316 | | |
2308 | | - | |
2309 | 2317 | | |
2310 | 2318 | | |
2311 | 2319 | | |
| |||
2331 | 2339 | | |
2332 | 2340 | | |
2333 | 2341 | | |
2334 | | - | |
2335 | | - | |
2336 | | - | |
2337 | | - | |
2338 | | - | |
2339 | | - | |
2340 | | - | |
2341 | | - | |
2342 | | - | |
2343 | | - | |
2344 | | - | |
| 2342 | + | |
| 2343 | + | |
| 2344 | + | |
| 2345 | + | |
| 2346 | + | |
| 2347 | + | |
| 2348 | + | |
| 2349 | + | |
| 2350 | + | |
2345 | 2351 | | |
2346 | 2352 | | |
2347 | 2353 | | |
| |||
2445 | 2451 | | |
2446 | 2452 | | |
2447 | 2453 | | |
2448 | | - | |
2449 | | - | |
2450 | | - | |
2451 | | - | |
| 2454 | + | |
| 2455 | + | |
| 2456 | + | |
| 2457 | + | |
| 2458 | + | |
| 2459 | + | |
| 2460 | + | |
| 2461 | + | |
| 2462 | + | |
| 2463 | + | |
2452 | 2464 | | |
2453 | 2465 | | |
2454 | 2466 | | |
| |||
2510 | 2522 | | |
2511 | 2523 | | |
2512 | 2524 | | |
2513 | | - | |
2514 | | - | |
2515 | | - | |
2516 | | - | |
| 2525 | + | |
| 2526 | + | |
| 2527 | + | |
| 2528 | + | |
| 2529 | + | |
| 2530 | + | |
| 2531 | + | |
| 2532 | + | |
| 2533 | + | |
2517 | 2534 | | |
2518 | 2535 | | |
2519 | 2536 | | |
| |||
6573 | 6590 | | |
6574 | 6591 | | |
6575 | 6592 | | |
6576 | | - | |
6577 | | - | |
6578 | | - | |
6579 | | - | |
| 6593 | + | |
| 6594 | + | |
| 6595 | + | |
| 6596 | + | |
| 6597 | + | |
| 6598 | + | |
| 6599 | + | |
| 6600 | + | |
| 6601 | + | |
6580 | 6602 | | |
6581 | 6603 | | |
6582 | 6604 | | |
| |||
7404 | 7426 | | |
7405 | 7427 | | |
7406 | 7428 | | |
7407 | | - | |
| 7429 | + | |
| 7430 | + | |
7408 | 7431 | | |
7409 | 7432 | | |
7410 | 7433 | | |
| |||
7417 | 7440 | | |
7418 | 7441 | | |
7419 | 7442 | | |
7420 | | - | |
7421 | | - | |
7422 | | - | |
7423 | | - | |
7424 | | - | |
7425 | | - | |
7426 | | - | |
| 7443 | + | |
| 7444 | + | |
| 7445 | + | |
| 7446 | + | |
| 7447 | + | |
7427 | 7448 | | |
7428 | 7449 | | |
7429 | 7450 | | |
| |||
9334 | 9355 | | |
9335 | 9356 | | |
9336 | 9357 | | |
9337 | | - | |
9338 | 9358 | | |
9339 | 9359 | | |
9340 | 9360 | | |
9341 | 9361 | | |
9342 | 9362 | | |
9343 | 9363 | | |
9344 | | - | |
9345 | | - | |
9346 | | - | |
9347 | | - | |
9348 | | - | |
9349 | | - | |
9350 | | - | |
9351 | | - | |
9352 | | - | |
9353 | | - | |
9354 | | - | |
| 9364 | + | |
| 9365 | + | |
| 9366 | + | |
| 9367 | + | |
| 9368 | + | |
| 9369 | + | |
| 9370 | + | |
| 9371 | + | |
| 9372 | + | |
9355 | 9373 | | |
9356 | 9374 | | |
9357 | 9375 | | |
9358 | 9376 | | |
9359 | | - | |
9360 | | - | |
9361 | | - | |
9362 | | - | |
9363 | | - | |
9364 | | - | |
9365 | | - | |
9366 | | - | |
| 9377 | + | |
| 9378 | + | |
| 9379 | + | |
| 9380 | + | |
| 9381 | + | |
| 9382 | + | |
| 9383 | + | |
| 9384 | + | |
9367 | 9385 | | |
9368 | 9386 | | |
| 9387 | + | |
9369 | 9388 | | |
9370 | | - | |
9371 | | - | |
9372 | | - | |
9373 | | - | |
| 9389 | + | |
9374 | 9390 | | |
9375 | 9391 | | |
9376 | 9392 | | |
| |||
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
353 | 353 | | |
354 | 354 | | |
355 | 355 | | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
356 | 359 | | |
357 | 360 | | |
358 | 361 | | |
| |||
1035 | 1038 | | |
1036 | 1039 | | |
1037 | 1040 | | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
1038 | 1044 | | |
1039 | 1045 | | |
1040 | 1046 | | |
| |||
1696 | 1702 | | |
1697 | 1703 | | |
1698 | 1704 | | |
| 1705 | + | |
| 1706 | + | |
| 1707 | + | |
1699 | 1708 | | |
1700 | 1709 | | |
1701 | 1710 | | |
| |||
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
485 | 485 | | |
486 | 486 | | |
487 | 487 | | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
488 | 491 | | |
489 | 492 | | |
490 | 493 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | 12 | | |
19 | 13 | | |
20 | 14 | | |
| |||
222 | 216 | | |
223 | 217 | | |
224 | 218 | | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | 219 | | |
229 | 220 | | |
230 | 221 | | |
| |||
236 | 227 | | |
237 | 228 | | |
238 | 229 | | |
239 | | - | |
240 | | - | |
241 | 230 | | |
242 | 231 | | |
243 | 232 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | 12 | | |
19 | 13 | | |
20 | 14 | | |
| |||
222 | 216 | | |
223 | 217 | | |
224 | 218 | | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | 219 | | |
229 | 220 | | |
230 | 221 | | |
| |||
236 | 227 | | |
237 | 228 | | |
238 | 229 | | |
239 | | - | |
240 | | - | |
241 | 230 | | |
242 | 231 | | |
243 | 232 | | |
| |||
0 commit comments