Skip to content

TalkBack, 7 of 10: Name profile deletion targets - #6165

Draft
eliotcougar wants to merge 3 commits into
2dust:masterfrom
eliotcougar:fix/accessibility-named-profile-dialogs
Draft

eliotcougar wants to merge 3 commits into
2dust:masterfrom
eliotcougar:fix/accessibility-named-profile-dialogs

Conversation

@eliotcougar

@eliotcougar eliotcougar commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Summary

Name the specific deletion target in the existing confirmation dialogs for server
profiles, policy groups, proxy-chain profiles, and individual proxy-chain members.
The localized question comes first, followed by the target name on a separate line.

This covers direct and overflow-menu deletion from the main server list and the
registered profile editors. Bulk-deletion questions stay generic.

Target identity and restoration

  • Main-list deletion captures the profile GUID and displayed name together. The
    dialog uses the name only as text; confirmation still removes by GUID. Duplicate
    names and list reordering cannot retarget the pending operation.
  • Only these two strings are saved for the pending main-list dialog, using
    rememberSaveable and a small listSaver. No full profile or action callback is
    serialized.
  • Profile-editor dialogs name the saved profile being deleted, not the unsaved
    remarks field. Renaming or clearing a draft therefore does not change the
    identity in the destructive confirmation.
  • Pending single-profile confirmations survive activity recreation consistently
    in the main list and the ordinary, custom-config, policy-group, and proxy-chain
    editors.
  • A pending proxy-chain member deletion is tied to its stable draft row key. The
    current position and member name are resolved from that key, and confirmation
    removes the member and its key together. A member that has already disappeared
    is not replaced by another member at its former index.

Scope and accessibility approach

The existing Material confirmation dialog exposes its visible text through native
semantics. There are no custom announcements, focus manipulation, role overrides,
or role suppression.

The small server-menu dispatcher and stable-key member-removal helper are shared
with Part 9 so its custom actions use the same operation paths. This part does not
change server-row semantics, service behavior, deletion policy, or storage format.
Subscription, asset-file, and routing confirmations remain in their own parts.

The unused legacy ServerActivity is left unchanged from upstream. Existing
generic confirmation resources remain available to their existing callers.

Localization

The three named confirmation templates exist in all nine supported catalogs:
English, Arabic, Bengali, Bakhtiari, Persian, Russian, Vietnamese, Simplified
Chinese, and Traditional Chinese. All 27 entries parse as XML and contain exactly
one %1$s target placeholder. The review fixes reuse those resources without
introducing new translated text.

Validation

Reviewed revision: b8ce732ae6ac56e54169451cbd7c2bc08f29c5f0.

  • :app:testPlaystoreDebugUnitTest: 67 tests passed, no failures, errors, or skips.
    This includes 10 focused dispatcher, pending-target saver, and stable-key
    proxy-chain member tests. Saver coverage includes null, duplicate display names
    under different GUIDs, empty names, non-Latin text, and embedded newlines.
  • :app:compilePlaystoreDebugKotlin: passed.
  • :app:assemblePlaystoreDebug -PABI_FILTERS=x86_64: passed.
  • Pixel 9 Pro emulator, API 37.1, with TalkBack enabled: inspected native dialog
    text and exercised native accessibility click actions in ordinary, custom,
    policy-group, and proxy-chain editors. Unsaved renames and blank remarks did not
    change the saved deletion target. Cancel preserved each profile; actual
    activity recreation preserved each pending dialog. These emulator checks used
    the identical source tree immediately before committing; source-tree equality
    was checked before the commit.
  • Main-list emulator check: recreated a pending dialog, confirmed it, and checked
    through the existing storage owner that only the captured GUID was removed.
    Another profile and the selected-server GUID remained unchanged.
  • Used a temporary external QA harness, not an androidTest source directory in
    the PR. Removed its test fixtures and restored the emulator's original APK and
    accessibility settings. The existing lab subscription was retained.
  • Pairwise git merge-tree checks against fetched upstream and all nine companion
    branches passed in both orders and produced identical trees.
  • git diff --check: passed. No instruction files or generated inputs are in the
    feature diff.

Not run

  • Recorded TalkBack speech, swipe focus order, physical touch, keyboard, and D-pad
    interaction. Native-tree inspection and accessibility action execution do not
    establish exact spoken output or gesture behavior.
  • Other Android versions, physical devices, release builds, other ABIs, and the
    full locale/theme/layout matrix. The emulator run used one English x86_64 debug
    configuration; localized resources were checked structurally, not spoken in
    every language.

@eliotcougar eliotcougar changed the title TalkBack, 7 of N: Name profile deletion targets TalkBack, 7 of 10: Name profile deletion targets Aug 30, 2026
@eliotcougar
eliotcougar marked this pull request as ready for review August 30, 2026 17:38
@eliotcougar
eliotcougar force-pushed the fix/accessibility-named-profile-dialogs branch from 1b2ca2f to b981992 Compare September 2, 2026 00:18
@eliotcougar
eliotcougar marked this pull request as draft September 5, 2026 11:12
Use one dispatcher for the existing server menu actions and carry the display name alongside the stable GUID when requesting removal. The GUID remains the deletion identity; confirmation policy stays with MainScreen.

This common prerequisite lets named confirmations and custom accessibility actions extend the same contract without conflicting or bypassing confirmation. Cover action routing, duplicate names and blank names with JVM regression tests.
Include the displayed profile, policy group, or proxy-chain member name in each applicable confirmation. Keep main-list deletion keyed by the immutable GUID even when the dialog captures a display name.
Use the saved profile name in custom-config and proxy-chain confirmations so an unsaved rename or blank remarks field cannot misidentify the item being deleted. Keep pending single-profile dialogs across activity recreation, saving only the main-list GUID and display name with a small Compose saver.

Leave the unused legacy ServerActivity unchanged from upstream and remove imports made unnecessary by saveable dialog state. Keep shared server dispatch and stable-key proxy-chain removal intact for the companion main-list accessibility branch.

Cover the saved target and absent-target state in existing JVM tests. Validation: all 67 JVM tests and the Play Store x86_64 debug build passed; emulator checks covered saved names after draft edits, cancellation, activity recreation, and deletion of the confirmed GUID. Pairwise merge checks passed against upstream and all nine companion branches in both orders.
@eliotcougar
eliotcougar force-pushed the fix/accessibility-named-profile-dialogs branch from b8ce732 to c78df60 Compare September 10, 2026 09:37
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