[TV] Add folder support to the Your Podcasts tab - #5681
Conversation
Generated by 🚫 Danger |
2c70c60 to
c7aa413
Compare
|
@claude please review this |
|
Claude finished @sztomek's task in 5m 53s —— View job Code review
Nice change overall — the grid scaffold extraction is a good call, sorting via 1. Folder covers never refresh — the grid is reactive, the cards aren't
// TvYourPodcastsScreen.kt:181-184
var coverUrls by remember(folder.uuid) { mutableStateOf(emptyList<String>()) }
LaunchedEffect(folder.uuid, getFolderCoverUuids) {
coverUrls = getFolderCoverUuids(folder.uuid).map(PodcastImage::getMediumArtworkUrl)
}The view model re-runs 2. Data loading via
|
c7aa413 to
2929681
Compare
|
@claude review again pls |
|
Claude finished @sztomek's task in 4m 18s —— View job Code review (round 2)
Status of previous findings
A. Folder contents are sorted by the mobile sort setting, not A→ZThis is the one I'd want a decision on.
Meanwhile the top-level grid is deliberately forced to B. The enrichment is N+1, and
|
7705ebe to
ff84572
Compare
2929681 to
a7952c8
Compare
ff84572 to
a8f1255
Compare
a7952c8 to
71916e8
Compare
|
Claude finished @sztomek's task in 3m 46s —— View job Code review (round 3)
First, a scoping note: the commit I reviewed in round 2 ( New: the base branch now has a shared
|
a8f1255 to
d1cb9cd
Compare
71916e8 to
34fcffa
Compare
|
Claude finished @sztomek's task in 2m 10s —— View job Code review (round 4)
This push is a rebase, not a code change. The base moved ( So everything from round 3 is still open. Compressed re-statement, no new findings:
Minor, also still open: unused Same conclusion as rounds 2 and 3: no correctness blockers. A needs a decision, B collapses A and the query cost together, and C/D/ CI: 5 passed, 0 failed, 1 in progress (this job). I didn't run Gradle locally — build/lint/tests run on Buildkite. |
|
Version |
d1cb9cd to
38c5840
Compare
34fcffa to
c9cb247
Compare
|
Claude finished @sztomek's task in 2m 27s —— View job Code review (round 5)
This push is another rebase, not a code change. The base moved again ( Everything from round 4 is still open. Short re-statement, plus one new minor observation:
New this round (minor)
LaunchedEffect(folderUuid, getFolderPodcasts) { … }
Also, Also still open (minor): unused Same conclusion as rounds 2–4: no correctness blockers. A needs a decision, B collapses A and the query cost together, C/D/ CI: 2 passed, 0 failed, 1 in progress (this job). I didn't run Gradle locally — build/lint/tests run on Buildkite. |
38c5840 to
0bdff36
Compare
c9cb247 to
e064c5d
Compare
|
Claude finished @sztomek's task in 3m 9s —— View job Code review (round 6)
Unlike the last two pushes, this one contains real changes. The tip commit was rewritten ( Fixed this round
The one leftover on the shared empty state
Still open (A–E), re-verified against the current tree
Minor, also still open
Same conclusion as rounds 2–5, minus the two items you fixed: no correctness blockers. A still needs a decision, B collapses A and the query cost together, C/D and the CI: 2 passed, 0 failed, 1 in progress (this job). I didn't run Gradle locally — build/lint/tests run on Buildkite. |
geekygecko
left a comment
There was a problem hiding this comment.
Looks great.
This has similar behaviour to what I mentioned on another screen. The scrollable content doesn't include the header and title. It might be nice to address that in a future PR.
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Can this use a common component?
0bdff36 to
1d5a68b
Compare
e064c5d to
f8974ec
Compare
|
Rebased onto Treating round 6: Fixed:
Deferring as follow-ups — taking you up on the offer to stop re-raising A–E:
Validation: |
|
Claude finished @sztomek's task in 3m 53s —— View job Code review (round 7)
Thanks for the write-up — I'll take you up on it and drop A–E from here on; they're yours to file. This round is only the new code. Rebase resolution checks out. The three fixes look right:
1.
|
f8974ec to
bfa58dd
Compare
|
Both caught correctly — thank you, and you were right on the mechanism. 1. The 13 orphaned imports. Confirmed: all 13 had zero body references and were still in the file, so 2.
Validation this round: |
|
Claude finished @sztomek's task in 3m 12s —— View job Code review (round 8)
Both round-7 items are fixed, and the mechanism you described matches what's in the tree. A–E stayed dropped as agreed, so this round is only the new code. Nothing blocking. Verified fixed1. Orphaned imports. All 13 are gone from 2. The two auto-focus waits. Both are correct, and worth spelling out why the
Rebase resolution still holds from round 7: the New this round (minor)
// TvPodcastGridScaffold.kt:47-53
val focusRequesters = remember(itemKeys.size) { List(itemKeys.size) { FocusRequester() } }
if (autoFocusFirstItem) {
LaunchedEffect(Unit) {
snapshotFlow { … }.first { it }
runCatching { focusRequesters.firstOrNull()?.requestFocus() }
}
}
Neither is reachable today: the only Focus can be stranded coming back from an empty folder. New path, worth one device check: OK is focused, pressing it sets Also still open (small)
Net: the two things I raised last round are properly fixed — the import cleanup is verified by reading, and the placement waits are the right mechanism rather than a wider CI: 2 passed, 0 failed, 1 in progress (this job). Buildkite (build/lint/tests) isn't visible from here, and Gradle needs approval I don't have in this job. |
Description
Adds folder support to the TV Your Podcasts tab, mirroring the Apple TV
FolderCardView/FolderDetailView. Follow-up to the podcasts grid (#5680).FolderCardViewdraws (covers top, name bottom, 12dp corners).FolderDetailView. Back (or the empty-state button) returns to the grid.FolderManager.getHomeFolder()(folders + podcasts-not-in-a-folder) and re-queries it reactively whenever folders or subscriptions change, re-sorting the items A→Z withPodcastsSortType.NAME_A_TO_Zto match tvOS'stitleAtoZ. Folder covers and detail podcasts come fromFolderManager.findFolderPodcastsSorted().LocalColors.current.colors.getFolderColor(...)), so it uses the TV app's Extra Dark palette — the analog of tvOSAppTheme.folderColor(colorInt:).TvPodcastGridScaffold, now used by both the top-level grid and the folder detail. The newTvFolderCardreuses the existingTvTile+TvArtworkImage(whose placeholder already matches tvOS's empty-cover fill).ContentUnavailableView.Fixes PCDROID-697 https://linear.app/a8c/issue/PCDROID-697/folder-support.
Designs: Ftk3KwnfqaK4g57yCN63p0-fi-3246_3336.
Stacked on
feat/tv-your-podcasts(#5680) — merge bottom-up.Testing Instructions
./gradlew :tv:installDebugProd) and sign in with an account that has at least one folder with podcasts and some podcasts outside folders.Screenshots or Screencast
Screen_recording_20260729_190824.mp4
Checklist
./gradlew spotlessApplyto automatically apply formatting/linting)TvYourPodcastsViewModelTest)modules/services/localization/src/main/res/values/strings.xml