Glide TV focus rings and key-driven scrolling #76
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/polish-lane-e"
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?
Changes
Implement the shared foundation, recovery-toast motion regression (P02), morphing card focus outline (E02), and spring-smoothed key scrolling (E05) against
fm/tv-round2.74b737fb52bfbb2cc7afa0b0288ae59e67232320. Appliedfoundation.patchverbatim, compiled it before publishing, and made no compile repairs or history rewrites.wolfskin-design/src/main/java/org/justinvisser/wolfskin/design/RecoveryToast.ktin the shared baseRecoveryToastMotionTest.ktFocus.kt,FocusRingHost.ktFocusGlideTest.ktFrameScroll.kt,ShelfScroll.kt,HomeScreen.kt,SettingsList.ktScrollMomentumTest.ktApproved decisions
base160 ms,ease”; the existing 3200 ms caller timer is unchanged. Both fades cap at 80 ms under reduced motion.focusMove180 mseaseOut. Geometry snaps under reduced motion, with alpha capped at 80 ms.sqrt(navBlobStiffness) × |distance|; reverse-direction carry is zero. “The pinned-line and lookahead targets are unchanged; only the motion to them changes.”Integration ownership
The agreed
ShellSurfacehost wrap and toast caller substitutions belong to lanes A/B/D; title/person scroll callers and the central TV-spec updates belong to lane D. Those files are intentionally untouched here. This lane owns the shared host/primitives, Home/Settings callers and their regressions. Motion uses the shared tokens; no timing or approved copy changes beyond the agreed polish.Verification
Final corrected 14-class batch: 87 tests passed, zero failures/errors. Gradle: BUILD SUCCESSFUL in 2m32s; wall time including shared-lock queue: 1138.58s. Published the before/after strips and visually inspected native toast fade-in/out, moving/settled shape-morphing outline, Home held-Right and Library held-Down frames.
Commands
Token generation check
Base compilation/smoke
Three touched native classes
Fourteen-class touched/neighbor batch
Aligned legacy-source capture
The legacy capture method was temporary and is removed. Six production files were replayed from verified exact base blobs solely for before captures, then restored; the published base commit was never changed.
Run history
The first implementation exposed a real frame-clock restart gap. The re-entry regression exposed stale animation time after unmount. The corrected cleanup waits independently until the next frame, without suspending the old mutation. Held-scroll assertions were not weakened. Native settling permits two pixels for the spring tail; fully settled poster/tile/See all images separately require maximum channel difference ≤2 from the original rendering.
Native proof
Root:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/ui-polish-build/lane-e/.P02/before/andP02/after/: fade-in/out strips with matching approved copy; reduced-motion after strips and replacement/re-entry frames.E02/before/andE02/after/: Right then row-Down position/shape strips, normal and reduced motion; native samples.E05/before/andE05/after/: held-Right Home shelf and held-Down Library strips, normal and reduced motion; frame offsets/velocity samples.Full run notes and retained XML:
/root/.treehouse/firstmate-7bab20/2/firstmate/data/polish-lane-e/validation.mdand adjacent evidence directories.Proof uses native Compose/Robolectric rendering, not an installed APK or physical-device session. All Gradle runs used the shared-lock wrapper. No full suite, APK build, TV/ADB/emulator access, merges, or shared-infrastructure administration.
AI assistance: implementation, native regressions and this review description were produced by the firstmate-managed coding agent.
origin/fm/tv-round2without rewriting published history;UpdatesKeysTest.classicRequiresEveryRetainedRowAndTheRealScrollernow waits for real list idle with at most an additional 320 ms spring-tail allowance, preserving the exact final index4assertion and all product scroll behavior.bash docker/gradle.sh debug :app:testDefaultDebugUnitTest --tests org.justinvisser.wolfskin.tv.update.UpdatesKeysTest :wolfskin-design:testDebugUnitTest --tests org.justinvisser.wolfskin.design.ScrollMomentumTestpassed 12/12 (6 + 6), zero failures/errors, Gradle 4m29s / wall 275.68s; no full suite. The initial identical command using:app:testDebugUnitTeststopped before tests because that app task is flavor-ambiguous.Landed through the round 2 candidate #82 (merged into fm/tv-round2 as
c21d17df). Closing as superseded; nothing from this branch is lost.Pull request closed