Improve playback, preroll and TV experience

This commit is contained in:
ponzischeme89
2026-08-10 07:11:14 +12:00
parent 598a4f5c75
commit d2f2eb62be
30 changed files with 1380 additions and 142 deletions
+29 -24
View File
@@ -18,20 +18,21 @@ focus moves predictably, and whether destructive or app-leaving actions are reco
dismisses the confirmation, and Left/Right is explicitly constrained between the two
choices. The setting defaults off and is stored per television.
## Open findings
## 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.
- 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 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.
- 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.
- 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
@@ -39,10 +40,11 @@ focus moves predictably, and whether destructive or app-leaving actions are reco
- 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 a `LazyRow`, and do not wrap or
- 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.
- Recommended fix: Use a centred `LazyRow` with content padding, stable keys and remembered
horizontal state. Keep **Add another user** as the final item.
- 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
@@ -50,38 +52,41 @@ focus moves predictably, and whether destructive or app-leaving actions are reco
- 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
- 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.
- 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.
- 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.
- Finding: The focused keyed row is removed immediately, but focus is only requested when
- 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 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.
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.
- Finding: The focused footer node is reused while the card row above is replaced. The
- 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.
- 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.
- 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