# 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. ## Fixed locally after 0.2.39 — not published ### 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. - 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 previous step or presenting a skip choice. - 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. ### 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. - Previous behaviour: Profiles were rendered in a plain `Row`, not a `LazyRow`, and did not wrap or scroll. Profiles beyond the right edge can become invisible or unreachable by D-pad. - 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. ### 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. - Previous behaviour: Each tile and its overlaid removal button were 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. - 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. ### 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. - Previous behaviour: The focused keyed row was removed immediately, but focus was 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 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. ### 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. - Previous behaviour: The focused footer node was reused while the card row above was 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. - 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. ## 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.