5.3 KiB
5.3 KiB
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:
MainActivityfinished 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.
Open findings
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.
- Finding: The screen creates focusable title/person cards and footer buttons but does not
request initial focus. It also has no
BackHandler. Focus therefore depends on Compose's geometric fallback, while Back can leave the activity instead of moving to a defined previous step or presenting a skip choice. - Recommended fix: Give the first card (or Next when the stage is empty) an explicit entry requester. Make Back move to the previous stage; on the first stage, focus a clear Skip for now confirmation instead of closing the app.
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.
- Finding: Profiles are rendered in a plain
Row, not aLazyRow, and do not wrap or scroll. Profiles beyond the right edge can become invisible or unreachable by D-pad. - Recommended fix: Use a centred
LazyRowwith content padding, stable keys and remembered horizontal state. Keep Add another user as the final item.
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.
- Finding: Each tile and its overlaid removal button are independent focus targets with no 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.
- Recommended fix: Put profile actions in a deterministic vertical group: OK opens the profile and a labelled Remove user action sits below it, with explicit Up/Down and Left/Right neighbours. Retain the existing safe Cancel-first confirmation.
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.
- Finding: The focused keyed row is removed immediately, but focus is only requested when the list changes between empty and non-empty. There is no requester for the next or previous alert after an individual removal, so focus restoration is left to framework behaviour and can appear to vanish on some Compose/TV combinations.
- Recommended fix: Track the focused alert id/index and, after removal, request the item now occupying that index (or the previous item). When the list becomes empty, move focus to the alert controls explicitly.
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.
- Finding: The focused footer node is reused while the card row above is replaced. The 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.
- Recommended fix: On each stage change, move focus to the first choice and remember the last focused choice per stage. Give the footer buttons explicit Up targets and the card row an explicit Down target.
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.