Skip to content

Accessibility sweep: label remaining unlabeled controls (#231)#634

Merged
kasnder merged 3 commits into
masterfrom
claude/app-accessibility-review-0460c5
Jul 11, 2026
Merged

Accessibility sweep: label remaining unlabeled controls (#231)#634
kasnder merged 3 commits into
masterfrom
claude/app-accessibility-review-0460c5

Conversation

@kasnder

@kasnder kasnder commented Jul 11, 2026

Copy link
Copy Markdown
Member

Why

PR #625 fixed the specific app-list Internet toggle from #231, but issue #231 ("Accessibility issues") was deliberately left open by the maintainer for "further investigation" — its title is plural and it functioned as a tracking bucket. A full TalkBack/screen-reader pass turned up a number of other controls with the same class of problem (unlabeled toggles/buttons, info conveyed only visually). This PR addresses those. It's complementary to #625 and touches a disjoint set of controls.

The app already established the right patterns (importantForAccessibility="no" on decorative images in item_insights_header.xml, labeled delete button in item_wg_profile.xml) — they were just applied inconsistently. This makes them consistent.

What changed

🔴 Critical — primary controls with no accessible name

A MaterialSwitch with no text/contentDescription is announced only as "on, switch" with no name.

  • actionmain.xml — the master tracker-blocking switch in the main header (swEnabled), the app's single most important control.
  • item_vpn_status.xml — the VPN on/off switch (vpnEnabledSwitch).
  • item_blocklist.xml + ActivityBlocklists.java — the per-row enable switch now gets a dynamic description naming the specific blocklist; the delete button gets a label and a 48dp touch target.

🟠 Moderate — information previously conveyed only visually

  • AdapterLog.java — access-log status icons now announce connection allowed/blocked, network type (Wi-Fi/other), screen-on state, and the app name (previously color/icon only).
  • 12 layouts (about, android, vpn, xposed, troubleshooting, sure, forwardadd, forwardapproval, datasaving, doze, enable, fragment_actions) — decorative illustrations marked importantForAccessibility="no" to stop TalkBack announcing "unlabeled image". Each was confirmed to sit beside a text label.

🟡 Minor — polish

  • item_insights_header.xml — share button raised from 36dp to a 48dp touch target (icon size preserved via padding).
  • item_timeline_entry.xml — decorative app icon silenced (app name is adjacent).
  • fragment_actions.xml / list_item_trackers.xmlaccessibilityHeading="true" on section titles so screen-reader users can navigate by heading.

Strings

10 new accessibility strings added to the base English values/strings.xml only — translations follow via the usual localization process.

No behavior or blocking-logic changes — purely accessibility labeling.

Verification

  • ./gradlew compileGithubDebugJavaWithJavacBUILD SUCCESSFUL.
  • Not yet spot-checked on-device with TalkBack — worth verifying announced text before merge.

Note on #231

Suggest keeping #231 open (or filing a fresh "a11y sweep" issue) rather than fully closing it — this and #625 together are what the "further investigation" note meant, but on-device TalkBack verification is still pending.

🤖 Generated with Claude Code

kasnder and others added 2 commits July 11, 2026 03:13
…612 draft)

Code-grounded fixability review of the open-issue backlog, per-item work
items with root causes and PRs, unfixable/decline buckets, and reply guidance.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Issue #231 ("Accessibility issues") was left open for "further
investigation" beyond the single app-list icon it originally named.
This addresses the rest of the unlabeled/inaccessible controls found
in a full pass, following the same pattern (static contentDescription
for controls whose role already announces state, dynamic descriptions
where a control refers to a specific item, importantForAccessibility=no
for decorative images).

Critical — primary controls that had no accessible name:
- actionmain.xml: master tracker-blocking switch (swEnabled)
- item_vpn_status.xml: VPN on/off switch (vpnEnabledSwitch)
- item_blocklist.xml + ActivityBlocklists: per-row enable switch
  (named after the blocklist) and delete button (also given a 48dp
  touch target)

Moderate — information previously conveyed only visually:
- AdapterLog: access-log status icons now announce connection
  allowed/blocked, network type, screen-on state, and app name
- Decorative illustrations across 12 screens marked
  importantForAccessibility=no to stop "unlabeled image" noise

Minor:
- item_insights_header.xml: share button raised to a 48dp target
- item_timeline_entry.xml: decorative app icon silenced
- fragment_actions.xml / list_item_trackers.xml: accessibilityHeading
  on section titles for heading navigation

New accessibility strings added to the base English strings.xml only;
translations follow via the usual localization process. No behavior or
blocking-logic changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@kasnder

kasnder commented Jul 11, 2026

Copy link
Copy Markdown
Member Author

Good accessibility direction, but this is not merge-ready yet. Please remove the unrelated OPEN_ISSUES_TRIAGE.md changes and rebase—the branch currently conflicts and has no CI. There is also a TalkBack regression in AdapterLog: when app lookup fails, the blank icon becomes a focusable “App icon” target; when lookup succeeds, it repeats the adjacent app name as a separate focus stop. The icon is decorative here, so exclude it from accessibility instead, as this PR already does for the timeline icon. Once scoped and rebased, run CI and spot-check the affected screens with TalkBack; the remaining control labels, decorative-image exclusions, and touch-target improvement look useful.

@kasnder

kasnder commented Jul 11, 2026

Copy link
Copy Markdown
Member Author

Implemented the requested review fixes in cef73ce: removed the unrelated OPEN_ISSUES_TRIAGE.md changes relative to master, removed the duplicate/phantom app-icon content descriptions, and marked the log icon decorative with importantForAccessibility="no". git diff --check passes. The full local Gradle verification became bottlenecked in the shared wgbridgeBuild; please use the new PR CI run as the definitive automated check, with an on-device TalkBack spot-check still recommended.

@kasnder kasnder merged commit e72e611 into master Jul 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant