# 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.
