Fix TV startup navigation and complete title pages #39
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/tv-walk-fix1"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Outcome
Deliver the corrected TV walk build B6b. AI-assisted (fork-internal).
Final pushed head:
6e0f9952cf13225635a70767812c03674de5a652.Four final debug APKs plus verified
SHA256SUMSare in/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-build-b/apk-b6b/.Findings, causes and regressions
FirstSignInNavigationTest.firstContinueThenMoviesRendersMindelsGridWithoutReenteringThePicker— RED before the cached-entry correction; GREEN after. Fresh host, immediate signed-in Mindel replies, one Continue, rendered Movies (6), Shows (29), then Home.ShellStartupTimingTest.firstFramePickerAndEveryTabWorkBeforeSavedPeopleArrivekeeps saved-user and real-wire activity reads pending while using the picker/tabs.TitleReadFacadeTest.heldMovieResolvesCatalogueIdentityWhenTheDetailOmitsProviderIdsDiscoverTitleTimingTest.discoverDetailsFillCastAndRelatedAfterAsyncReplyAndBackRestoresDiscoverNavBandOcclusionTest.scrolledRowsNeverShowThroughTheNavBandis_animeidentifies a grouping, not owned-title counts. Before enabling Anime, issue a one-item Jellyfin existence read using the same user/library/series criteria as the Anime grid. No owners/library names or count fields are invented. Empty Home Anime shelves were already omitted and remain covered.AnimeAvailabilityTest.configuredAnimeAudienceNeedsActualTitlesBeforeItCreatesATabOrHomeShelf— signed-in Shared/Mindel, zero and nonzero titles, owner/user audience membership, empty Home shelf exclusion.Active-root review correction (B6b)
The review found that removing Anime while it was the current root left
route/rootRouteand the actual singleton navigation entry pointing to Anime. Back then emitted Pop forever against that singleton.ShellState.updatePeoplenow moves a removed root to Home and emitsShellAction.Destination("home", preservePushed = true). The real integration replaces the singleton root normally; when pages are pushed, it changes only entry zero, retaining the current title/person pages and order. Avatar and surviving-tab focus remapping remain unchanged.Regression:
AnimeRootRemovalTest.removedAnimeRootReturnsHomeWithoutDiscardingPushedPagesOrAvatarFocus. RED on the reviewed head: expected[Home(id=0)], observed[Wolfskin(route=anime)]. GREEN after the correction for all four scenarios: active root, avatar-focused root, pushed title, pushed title plus person. Back enters Home's nav ladder or pops only the current pushed page.Touched-area validation passed: 16 tests across
AnimeRootRemovalTest,AnimeAvailabilityTest,FirstSignInNavigationTest,ShellStartupTimingTest,DiscoverTitleTimingTest,ShellKeysTest, andShellSnapshotReadTest. No full suite was run for this review cycle. The optional nested-handler note is bounded explicitly in the documentation; no broader handler propagation or player change was added.Verification
make apk-debugpassed on6e0f9952cf13225635a70767812c03674de5a652, including the packaged branding check for all four APKs. All four delivered B6b SHA256 checksums verified.FirstSignInNavigationTest.firstContinueThenMoviesRendersMindelsGridWithoutReenteringThePickerpreviously timed out on Shows only in full runs: 671/672 app tests passed, while its targeted run passed. The one authorized isolation correction added Compose idle waits, a 15-second wait on the actual Shows grid, and @After restoration of endpoint/fixture/screen preference globals. The subsequent authorized serialmake testpassed on5a846660, before F6 was added. No full-suite/native retry loop was run after the F6 instruction; final F6 changes were verified with targeted regressions.java/nio/ShortBufferSIGABRT runs were avoided by serial Gradle workers/test forks. Overrides were external to the repository; no tracked build settings changed.Evidence, including the original first-entry RED output, historical 671/672 logs/XML, the passing isolation-cycle suite, native title captures and final APK output, is under
/root/.treehouse/firstmate-7bab20/2/firstmate/data/tv-walk-fix1/.Device-unverified and risk
F5 video-player Back remains device-unverified because playback was not allowed on the box. Existing playback handoff/Back regression remains; upstream player code still uses NavigationManager.goBack and was not modified. Corrected shell ownership closes the real session picker, and outgoing outer-host Back handlers are disabled. Nested title handlers retain their existing lifecycle-based behaviour (pre-existing review note); no universal nested-handler or real-player claim is made.
The F6 existence read runs after the live picker is published. A failed availability read retains the signed-in user's last confirmed value; a successful empty read hides Anime. F6's final device re-walk remains with firstmate. No ADB, release/signing, version edits, service mutations or authority widening. This request is ready for review; nothing was merged.
Behaviour/safety verdict: request changes
Reviewed TV startup navigation and title-page fixes: #39
Reviewed head:
9e15dbee8c97dede2fba370693f09eaba736f403, againstorigin/main(e794dec25344d2f5ae05d959a9d3ceaff285505a). Read-only code review; no Gradle, make, device operations, or test reruns.Blocking: B1 — Removing Anime can strand the current root destination and break Back
wolfskin-design/src/main/java/org/justinvisser/wolfskin/design/ShellState.kt:54–63remapsnavIndexwhenhasAnimechanges, but leavesrouteandrootRouteequal toanime. The new successful-empty Jellyfin read can trigger this duringonForeground(WolfskinApp.kt:126–148).[INFERENCE: deterministic source trace, not device-reproduced] Open Anime as the root tab, background the app, remove the last visible anime series (or its access), and resume. After the successful empty existence read,
tabsno longer contains Anime, but the current navigation entry is stillDestination.Wolfskin("anime"). Every Back now entersroute !in tabsand emitsShellAction.Pop(ShellState.kt:293–310). Root tabs useNavigationManager.replace, leaving a one-entry stack;NavigationManager.goBackdeliberately does nothing on that stack (NavigationManager.kt:39–44,74–83). Back therefore cannot restore nav/Home; the page can display Anime content with Home highlighted. The avatar-index fix prevents the bounds crash but does not repair the invalid active destination.Recommendation: when the removed tab is the active root, reconcile both shell route/root memory and the real navigation entry to a surviving root (Home is the conservative choice). Preserve the existing avatar/surviving-tab focus rule. Add coverage for removal while Anime itself is current, including Back; the new
AnimeAvailabilityTest:84–100only changes availability while Home/avatar is current.Non-blocking notes
Nested Back callbacks are not covered by the new explicit active-entry guard. The host callback is guarded at
WolfskinApp.kt:302, butTitleDestination.kt:316–318still enables its own callback solely ontitle != null. Navigation 3 1.1.7 caps popped/replaced entries at CREATED, so those callbacks are lifecycle-disabled; an entry covered by a push remains STARTED during the transition. This is pre-existing, not a demonstrated new misroute. Propagate active-entry ownership if strengthening that guarantee; do not describe the outer guard as covering every nested handler.The historical Shows timeout is consistent with suite isolation/timing, but its exact cause is not established by source alone. The regression creates fresh session/navigation/read objects, explicitly sets the endpoint, fixtures and screen preference, waits for the actual Shows grid, and restores those globals in
@After(FirstSignInNavigationTest.kt:50–64,69–94,126–148). Other tests mutate process-wide preference objects andDispatchers.Main;ShellStartupTimingTestdoes not restore the prior fixture flag and restores its URL only on the normal path (:35–42,96,101–104,161). These are concrete suite-isolation surfaces, not proof that a particular one caused Shows to time out. The PR body reports a later serial full-suite pass before F6; I did not rerun or independently verify that history. No separate product blocker follows from the reported full-suite-only timeout.Checks and limits
limit=1, Series-only request per matching accessible library, with no pagination/polling or recomposition-triggered read. Jellyfin SDK 1.7.1 defaults enforce 6s connect and 30s total/read timeouts; its OkHttp factory applies them. Errors retain the current user's last confirmed availability; identity changes discard late results. Empty Home Anime shelves remain omitted.rememberedViewdoes not insert into snapshot state, and all three ownedsnapshotFlowbodies remain read-only.Commit status:
review/code-gpt= failure for B1 on the reviewed SHA. No source edits, pushes, approvals or merges.