2026-08-09 16:57:14 +12:00
|
|
|
|
# Android TV D-pad navigation audit — 9 August 2026
|
|
|
|
|
|
|
|
|
|
|
|
This audit reviews Memby as a ten-foot Android TV interface controlled with a directional
|
|
|
|
|
|
pad, centre/OK and Back. It focuses on whether every visible action can be reached, whether
|
|
|
|
|
|
focus moves predictably, and whether destructive or app-leaving actions are recoverable.
|
|
|
|
|
|
|
|
|
|
|
|
## Fixed in 0.2.39
|
|
|
|
|
|
|
|
|
|
|
|
### NAV-001 — Back closed Memby without warning
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: High
|
|
|
|
|
|
- Surface: Home launcher
|
|
|
|
|
|
- Reproduction: Open Home with no panel or detail page visible, then press Back once.
|
|
|
|
|
|
- Previous behaviour: `MainActivity` finished immediately. An accidental Back press lost
|
|
|
|
|
|
the viewer's place and returned them to the Android TV launcher.
|
|
|
|
|
|
- Resolution: Added the optional **Confirm before closing Memby** setting. When enabled,
|
|
|
|
|
|
Back opens a two-button confirmation with **Stay in Memby** focused by default. Back also
|
|
|
|
|
|
dismisses the confirmation, and Left/Right is explicitly constrained between the two
|
|
|
|
|
|
choices. The setting defaults off and is stored per television.
|
|
|
|
|
|
|
2026-08-10 07:11:14 +12:00
|
|
|
|
## Fixed locally after 0.2.39 — not published
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
### NAV-002 — Recommendation onboarding has no deterministic entry focus or Back route
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: High
|
|
|
|
|
|
- Surface: First-time recommendation onboarding
|
|
|
|
|
|
- Reproduction: Sign in with a profile that has been prompted for taste onboarding.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Previous behaviour: The screen created focusable title/person cards and footer buttons but did not
|
|
|
|
|
|
request initial focus. It also had no `BackHandler`. Focus therefore depended on Compose's
|
|
|
|
|
|
geometric fallback, while Back could leave the activity instead of moving to a defined
|
2026-08-09 16:57:14 +12:00
|
|
|
|
previous step or presenting a skip choice.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Resolution: The first choice now receives focus explicitly; an empty stage focuses its
|
|
|
|
|
|
primary footer action. Back moves to the previous stage, while Back on the first stage
|
|
|
|
|
|
opens a Cancel-first **Skip for now** confirmation. Skipping returns to Home for this
|
|
|
|
|
|
visit without falsely recording onboarding as complete.
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
### NAV-003 — Manage users does not scale beyond one fixed row
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: Medium
|
|
|
|
|
|
- Surface: Manage users / profile chooser
|
|
|
|
|
|
- Reproduction: Save enough profiles that the fixed 154 dp tiles plus 24 dp gaps exceed the
|
|
|
|
|
|
viewport width.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Previous behaviour: Profiles were rendered in a plain `Row`, not a `LazyRow`, and did not wrap or
|
2026-08-09 16:57:14 +12:00
|
|
|
|
scroll. Profiles beyond the right edge can become invisible or unreachable by D-pad.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Resolution: Profiles now use a padded `LazyRow` with stable profile keys, so focus brings
|
|
|
|
|
|
off-screen profiles into view. **Add another user** remains the final item and has
|
|
|
|
|
|
explicit neighbours.
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
### NAV-004 — Profile removal targets rely on geometric focus search
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: Medium
|
|
|
|
|
|
- Surface: Manage users / profile chooser
|
|
|
|
|
|
- Reproduction: Move around a profile tile and its small × removal control using only the
|
|
|
|
|
|
D-pad.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Previous behaviour: Each tile and its overlaid removal button were independent focus targets with no
|
2026-08-09 16:57:14 +12:00
|
|
|
|
explicit direction mapping. Depending on card position and screen density, Up/Right can
|
|
|
|
|
|
select a different profile or skip the removal target. The 28 dp target is also difficult
|
|
|
|
|
|
to identify at TV distance.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Resolution: Every profile is now a deterministic two-action column: the profile tile and
|
|
|
|
|
|
a full-width, labelled **Remove user** action. Explicit Up/Down and Left/Right mappings
|
|
|
|
|
|
connect peer actions, **Add another user**, and **Back to Memby**. The existing
|
|
|
|
|
|
Cancel-first removal confirmation remains.
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
### NAV-005 — Dismissing an alert can leave focus without a stable successor
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: Medium
|
|
|
|
|
|
- Surface: My Alerts
|
|
|
|
|
|
- Reproduction: Focus an alert in the middle of the list and press OK to dismiss it.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Previous behaviour: The focused keyed row was removed immediately, but focus was only requested when
|
2026-08-09 16:57:14 +12:00
|
|
|
|
the list changes between empty and non-empty. There is no requester for the next or
|
2026-08-10 07:11:14 +12:00
|
|
|
|
previous alert after an individual removal, so focus restoration was left to framework
|
|
|
|
|
|
behaviour and could appear to vanish on some Compose/TV combinations.
|
|
|
|
|
|
- Resolution: The page records the dismissed row index, scrolls the remaining list to the
|
|
|
|
|
|
row now occupying that position, and requests it after composition. Removing the final
|
|
|
|
|
|
alert explicitly returns focus to the alert controls. The index rule is unit-tested.
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
### NAV-006 — Onboarding stage changes do not preserve a clear focus destination
|
|
|
|
|
|
|
|
|
|
|
|
- Severity: Medium
|
|
|
|
|
|
- Surface: Recommendation onboarding
|
|
|
|
|
|
- Reproduction: Focus **Next**, advance a stage, then continue with the D-pad.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Previous behaviour: The focused footer node was reused while the card row above was replaced. The
|
2026-08-09 16:57:14 +12:00
|
|
|
|
viewer is left at the bottom of each new question and must navigate geometrically back to
|
|
|
|
|
|
the new choices; there is no explicit Up target or per-stage return position.
|
2026-08-10 07:11:14 +12:00
|
|
|
|
- Resolution: Every stage change now places focus on the first choice, making the new
|
|
|
|
|
|
question immediately actionable. Choice cards explicitly move Down to the primary footer
|
|
|
|
|
|
action; footer actions explicitly move Up to the choices and Left/Right between each
|
|
|
|
|
|
other. This deliberately resets to the first choice rather than leaving the remote on a
|
|
|
|
|
|
stale footer node from the previous question.
|
2026-08-09 16:57:14 +12:00
|
|
|
|
|
|
|
|
|
|
## Areas checked with no blocking issue found
|
|
|
|
|
|
|
|
|
|
|
|
- Main navigation rail: explicit content/rail focus requesters and section restoration.
|
|
|
|
|
|
- Home rows: explicit cross-row movement skips empty shelves and remembers card position.
|
|
|
|
|
|
- Search: defined keyboard/results entry points, staged Back behaviour and genre focus
|
|
|
|
|
|
restoration.
|
|
|
|
|
|
- Genre browser: explicit rail escape from the first grid column and Back closes one level.
|
|
|
|
|
|
- Settings: explicit secondary-rail directions, content entry and Cancel-first dialogs.
|
|
|
|
|
|
- Details and quick actions: Back closes one overlay level and restores the originating
|
|
|
|
|
|
card.
|
|
|
|
|
|
- Player: Back closes active overlays before leaving playback; centre, seek and menu keys
|
|
|
|
|
|
have deliberate remote handling.
|
|
|
|
|
|
- Update, maintenance and install-permission screens: explicit initial focus and bounded
|
|
|
|
|
|
Left/Right navigation.
|