[TV] Add the Starred Episodes screen - #5791
Conversation
|
Claude finished @sztomek's task in 5m 8s —— View job ReviewThe view model and screen are faithful mirrors of Blocking
Nits
I did not build or run the test suite for this review — findings are from reading the diff and the surrounding TV navigation code. |
Generated by 🚫 Danger |
|
Claude finished @sztomek's task in 34s —— View job ReviewNo new commits since my previous review (last commit Blocking
Nits
|
|
Claude finished @sztomek's task in 2m 18s —— View job Review
Blocking
Findings are from reading the diff and the surrounding TV focus code; I did not run the app or the test suite. |
|
Claude finished @sztomek's task in 3m 21s —— View job ReviewThree new commits since my last review: the scroll/initial-focus work in Blocking
Findings are from reading the diff and the surrounding TV focus code plus the other |
|
Claude finished @sztomek's task in 1m 11s —— View job Review
I read the diff and the surrounding TV focus / DAO call sites; I did not build the project or run the test suite. |
Description
Adds the Starred Episodes screen to the Android TV app, reaching parity with tvOS (
UI/Starred/StarredEpisodesView.swift). The profile modal already rendered a "Starred Episodes" button, but it was wired to{}with a TODO — this PR builds the screen and wires the destination.Behaviour mirrors tvOS:
TvDetailOverlay(top bar hidden, Back returns to the tab layer).StarredSyncWorker(which stars the returned episodes locally), then observes the local starred list reactively throughEpisodeManager.findStarredEpisodesFlow(). Signed-out users see the local list only (the worker is a no-op when logged out). The list live-updates when episodes are starred/unstarred elsewhere.TvEpisodeListItem), reusing the episode-actions modal (TvEpisodeActionsModal) and episode-info modal. View-only — there is no star/unstar action anywhere on TV, matching tvOS.tv_starred_empty_title/tv_starred_empty_subtitlestrings (copy taken from tvOS).A new
TvEpisodeActionContext.Starred(sourcestarred/EpisodeViewSourceType.Starred) attributes playback and episode-action analytics to the Starred screen, exactly as the podcast/search/playlist/up-next/now-playing contexts already do.Analytics
StarredShownEvent(no properties) when the screen appears — the Android equivalent of tvOSstarred_shown— viaeventHorizon.track(...), following the same pattern asTvUpNextViewModel.playback_play, etc.) flow through the shared managers/PlaybackManagerwithsource = starredvia the new action context.Follow-up refinements (parity audit v2)
Three small ride-along commits from the v2 parity audit (Part 7):
requestInitialFocus = true), matching tvOSprefersDefaultFocus(StarredEpisodesView.swift) and the sibling overlay lists. Previously nothing was deterministically focused after the overlay appeared (the tab layer behind is focus-deactivated and the top bar is hidden).EpisodeDao.findStarredEpisodesFlow()now caps atLIMIT 1000(ordered bylast_starred_date DESC), matching tvOS (StarredEpisodesViewModelLIMIT 1000) and the existing playback-history query. Note: this DAO query is shared — the phone Starred list (ProfileEpisodeListViewModel) and Wear (StarredScreenViewModel) consume the same flow, so the 1000-row cap now applies on all three platforms, consistent with the history flow they already share. Unit tests mock the flow, so none are affected.LazyListStateis hoisted to the always-composedTvStarredScreenso opening a podcast (which swaps the list out) and returning restores the scroll position; combined with (1), returning re-focuses the first visible row instead of landing at the top with nothing focused.Fixes PCDROID-735 https://linear.app/a8c/issue/PCDROID-735/starred-episodes-screen
Testing Instructions
Screenshots or Screencast
Checklist
./gradlew spotlessApplyto automatically apply formatting/linting)modules/services/localization/src/main/res/values/strings.xml