{ "title": "android_ui: element-targeted Android automation shared across repos", "objective": "Give agents and scripts a way to drive a real Android device by element identity (text, content-desc, resource-id) instead of pixel coordinates read off screenshots. Success means a flow can be driven with zero hardcoded coordinates, every failure exits non-zero naming the query, and a mis-tap or unlanded keystroke is impossible to mistake for success.", "acceptance_criteria": [ "find/tap/wait resolve elements by identity and re-read the tree immediately before acting, never reusing a stale coordinate", "A query matching zero or more than one element raises rather than acting on the first match", "type_into/type_into_field verify the field's contents actually changed, and clear a filled field so typing replaces rather than appends", "keyboard_is_up() distinguishes 'element absent' from 'element behind the soft keyboard'; tap closes the keyboard first", "dismiss_keyboard closes the IME without popping the Flutter route, and raises if the keyboard stays up", "Partial uiautomator dumps (only the focused EditText nodes) are retried, and empty EditText nodes remain addressable", "100% line and branch coverage, no noqa/type:ignore suppressions anywhere" ], "out_of_scope": [ "MCP server wrapper (the CLI and library land first)", "scroll_to(): a widget outside the viewport is not in the tree yet", "Rolling the tool out to ~/todo and ~/dufs-cloud/app", "flutter drive / integration_test backend, which cannot drive a release APK" ], "verifier": "pre-commit run --files ; python3 -m pytest python_pkg/android_ui/ (57 tests, 100% coverage); plus manual exercise against the physical Pixel 6a driving workout_app's Settings/connect flow" }