Files
memby/bugs-0908.md
T

105 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.