Integrate native Home and replay full title launch paths
This commit is contained in:
commit
fc02ce8646
697 changed files with 2956 additions and 146 deletions
112
docker/README.md
112
docker/README.md
|
|
@ -59,9 +59,9 @@ cover the Wolfskin nav.
|
|||
The independent `:wolfskin-design` module owns the shell components, fixed person
|
||||
colours, focus policy, per-person root-view memory, palette and motion. Its
|
||||
`tokens.json` is the copied approved TV-spec source, retaining the locked prototype
|
||||
SHA and provenance. `shell-tokens.json` adds shell/grid/request measurements;
|
||||
`title-tokens.json` and `discover-tokens.json` add their screen measurements from
|
||||
that same prototype. Generate the committed Kotlin, CSS and checksum manifest together:
|
||||
SHA and provenance. `shell-tokens.json` adds shared shell/grid/sheet measurements;
|
||||
`title-tokens.json`, `home-tokens.json` and `discover-tokens.json` add their screen
|
||||
measurements from the same locked prototype. Generate Kotlin, CSS and the checksum manifest together:
|
||||
|
||||
```sh
|
||||
python3 wolfskin-design/generate_tokens.py
|
||||
|
|
@ -89,8 +89,8 @@ Coming-in sheet described below. **Advanced settings → Wolfskin screens** is t
|
|||
rollout switch: turning it off renders upstream Home and library destinations with
|
||||
the upstream Backdrop and top scrim, while retaining Wolfskin's nav, picker and
|
||||
Settings list. Native Up traversal stays in content until the first focusable row,
|
||||
then enters the nav. Turning the switch on restores the labelled placeholders
|
||||
until the corresponding screen slices ship.
|
||||
then enters the nav. Turning the switch on renders Wolfskin Home and Libraries.
|
||||
Discover and Requests are integrated Wolfskin surfaces; title hand-offs remain labelled.
|
||||
|
||||
Debug people, tabs and initials come from the shell-only projection of the locked
|
||||
prototype fixture in `app/src/debug/assets/wolfskin-shell.json`; release resources
|
||||
|
|
@ -144,8 +144,10 @@ destination or nav selection.
|
|||
|
||||
Native Roborazzi captures use Robolectric SDK 34 and
|
||||
`w960dp-h540dp-xhdpi` (1920×1080 at density 2.0). `make test` writes capture PNGs and
|
||||
the sampled Compose nav-spring curve to `build/wolfskin-captures/`. Key replays
|
||||
exercise the Android event adapter, including the 6/8/10/11-press shell paths.
|
||||
the sampled Compose nav-spring curve to `build/wolfskin-captures/`.
|
||||
Home, Library and Discover captures use `home/`, `library/` and `discover/`
|
||||
subdirectories so shared spec state numbers cannot overwrite another renderer's image.
|
||||
Key replays exercise the Android event adapter, including the 6/8/10/11-press shell paths.
|
||||
The profile hand-off capture targets the real `HomeSettingsPage`; Playback is a
|
||||
separate press-count path.
|
||||
|
||||
|
|
@ -166,6 +168,78 @@ artifact provider and AAPT2. It checks all string, plural and array configuratio
|
|||
rejecting user-visible upstream branding while preserving the upstream legal
|
||||
attribution and project URL. The check does not depend on incremental merge files.
|
||||
|
||||
## Wolfskin Home
|
||||
|
||||
Home is one lazy frame: a non-rotating resume → Next up → newest → pick hero,
|
||||
Jellyfin shelves, per-destination "Your …" shelves and the Discover continuation.
|
||||
The final action opens the real merged Discover screen at its top through the
|
||||
shell's root re-selection transition. Home's See all cards open `WolfskinSeeAllLists`, carrying
|
||||
the complete underlying list rather than the visible shelf window. Title content
|
||||
remains the later-slice target.
|
||||
|
||||
All Home components and immutable screen models live in `:wolfskin-design`.
|
||||
The shell's remembered view owns vertical position, each row's selected card and
|
||||
actual horizontal `LazyListState`, and the bounded six-hour ratings session cache.
|
||||
Composing destinations bind `rememberedView(route)` before navigation effects run, so a
|
||||
new See all grid cannot borrow or clamp Home's scroller. Re-entry restores the
|
||||
remembered track before the page with `scrollToItem`, preserving exact indices and
|
||||
pixel offsets rather than animating back. Android focus stays with the shell;
|
||||
cards use its logical focus, without requests against uncomposed lazy items.
|
||||
Back preserves the viewport; returning to Home does not re-run focus-follow over
|
||||
a manually scrolled saved view. The next arrow re-enters visible content when
|
||||
scrolling moved focus off-screen.
|
||||
Pointing changes focus without activation, cards activate on key-up, and held
|
||||
OK events cannot activate twice.
|
||||
Between shelves, an unvisited row selects the nearest visible card center even
|
||||
when card widths differ. A visited row restores its column. Horizontal movement
|
||||
keeps the track still while focus remains in its visible middle.
|
||||
The initial skeleton parks focus on the nav. When the first content arrives,
|
||||
an untouched fresh entry focuses hero button zero; intervening nav input prevents
|
||||
that automatic transfer. Home, Libraries and Discover use the same `ShellContentFocus`
|
||||
release/repeat guard and Back ladder.
|
||||
|
||||
`HomeReadFacade` is the only Home code importing Jellyfin API clients. Release
|
||||
variants read the selected user's Resume, Next up, newest titles and destination
|
||||
shelves, with app-private last-known-good projections through the shared atomic
|
||||
disk cache. A missing saved library becomes a recovery panel; a saved library
|
||||
stays visible when Jellyfin is unreachable. Playback resolves an actual film or
|
||||
episode and checks Jellyfin before opening upstream's player. No season,
|
||||
recommendation stub or different person's session is promoted to playback.
|
||||
An unresolved person switch shows the same sign-in guard for Home as for native
|
||||
library content, before mounting Home's source reads.
|
||||
|
||||
Debug variants additionally package the locked fixture and local artwork under
|
||||
`wolfskin-design/src/debug/assets/wolfskin-home/`; release variants exclude them.
|
||||
The fixture provider supplies the approved household data and Home states without
|
||||
network reads in tests. Conductarr sign-in is not implemented here: real signed-out
|
||||
Home hides every rating and shows "Discover needs sign-in". No Seerr fallback is
|
||||
used. Catalogue data and ratings in debug captures are fixture-backed.
|
||||
|
||||
Home, Libraries and Discover reuse `TitleCard`, `Caption` and `LibrarySeeAllCard`;
|
||||
those screens and Requests share one `WolfskinImages` loader. Exact-slot requests use RGB565 for posters,
|
||||
disable crossfades, share a 64 MiB memory/128 MiB disk cache, limit image work to
|
||||
four reads and prefetch the next shelf. Rating plates start at 14 sp, shrink to 12 sp
|
||||
and drop trailing entries rather than wrap. Their uncached read gate is 350 ms;
|
||||
cached focus returns without that delay.
|
||||
|
||||
Focus rings and native lift draw outside fixed slots. The Saved nav chip uses its
|
||||
own geometry; the Discover section uses a warning pill. Caption separators multiply
|
||||
the existing muted colour alpha by the shared 40% token. Home-only untrimmed styles
|
||||
and `exactLineBox` honor the declared CSS line boxes despite Android's intrinsic
|
||||
paragraph minimums; shell and library typography retain their existing defaults.
|
||||
The shared See all component uses its canonical locked 8px gap, not the generic
|
||||
10px tail spacing. Focus lifts use the merged draw-only `FocusLift` implementation;
|
||||
the obsolete Home shadow helper and duplicate gap/lift measurements are removed.
|
||||
Vertical moves clamp to short target rows, including a final See all card.
|
||||
|
||||
`make test` includes `HomeCaptureTest` (23 native acceptance states) and the
|
||||
data-driven paths in `wolfskin-home-presses.json`: play next 2, resume 3, Discover
|
||||
4, deep-row Back/Down 9, Trending 13 and Trending's See all card 33 presses.
|
||||
Home captures are written to `build/wolfskin-captures/home/`. Compare those images
|
||||
side by side with the frozen spec captures; Compose Roboto/JPEG rasterisation,
|
||||
the approved button-scale consolidation and removal of prototype sample pills
|
||||
are recorded differences, not a claim of browser pixel equality.
|
||||
|
||||
## Requests under Settings
|
||||
|
||||
The Requests row and Coming-in sheet share one immutable household snapshot.
|
||||
|
|
@ -187,7 +261,7 @@ the generated-client data path. There is no Seerr fallback or handwritten HTTP.
|
|||
Foreground refreshes once; an open sheet or unsettled requests refresh every
|
||||
30 seconds while started. The immutable debug projection is loaded once, not
|
||||
decoded again on every poll.
|
||||
Thumbnails reuse `LibraryImages` with a 96×144-pixel request, RGB565, no crossfade,
|
||||
Thumbnails reuse `WolfskinImages` with a 96×144-pixel request, RGB565, no crossfade,
|
||||
the shared 64 MB memory/128 MB disk cache and four-read limit. Actor separator
|
||||
dots use the surrounding text colour; the 40% rule applies only to poster captions.
|
||||
|
||||
|
|
@ -197,8 +271,8 @@ page and spec 6.12, resolving the contradictory no-dwell sentence in spec 7.8.
|
|||
Deterministic coroutine-clock tests cover cancellation, reentry, cached return,
|
||||
sign-out and refreshed locale scores; a thin Compose test verifies actual Dutch
|
||||
rendering and sign-out suppression. The approved nine-key Requests path is JSON
|
||||
data replayed through the real shell. Home's hero content is not implemented
|
||||
here: its launch-to-nav shell suffix is the acceptance seam.
|
||||
data replayed through the real shell. The Requests-only harness starts at the
|
||||
Home-to-nav boundary; Home's actual hero and asynchronous entry have separate key replays.
|
||||
|
||||
Sheet dimensions, padding, glyphs, scales, colours and durations are generated
|
||||
tokens. Scoped sheet line boxes retain CSS heights and baselines independently
|
||||
|
|
@ -265,8 +339,8 @@ music keep their upstream destinations.
|
|||
`LibraryCaptureTest` renders the sixteen approved library/See all states offline.
|
||||
`LibraryKeysTest` reads the approved JSON path and reaches Spirited Away in exactly
|
||||
20 Android key presses. Paging and snapshot tests cover duplicate-only reads,
|
||||
failure/retry, stale copies, and person/server isolation. Captures are written to
|
||||
the same `build/wolfskin-captures/` directory as the shell captures.
|
||||
failure/retry, stale copies, and person/server isolation. Library captures are written
|
||||
to `build/wolfskin-captures/library/`; Discover's independent captures use `discover/`.
|
||||
|
||||
## Title pages and people
|
||||
|
||||
|
|
@ -274,7 +348,7 @@ the same `build/wolfskin-captures/` directory as the shell captures.
|
|||
cast and related shelves. `PersonSurface` owns the real biography and continuous
|
||||
six-column filmography. Both reuse the shell/nav/back ladder, `LibraryPoster`,
|
||||
the adaptive `LibraryRatingPlate`, shared captions and the single bounded
|
||||
`LibraryImages` loader. Image requests use exact slot sizes, RGB565 for opaque
|
||||
`WolfskinImages` loader. Image requests use exact slot sizes, RGB565 for opaque
|
||||
posters, no crossfade, four concurrent reads and next-row prefetch. The fixed
|
||||
title backdrop remains visible behind deep rows; only off-screen row images
|
||||
leave composition.
|
||||
|
|
@ -320,12 +394,12 @@ entry, remembered columns, long-sheet visibility and full media-table geometry.
|
|||
and view-model, then exercises content focus and hardware Back. Subtitles Off
|
||||
maps to the player's explicit disabled sentinel, not its unspecified default.
|
||||
|
||||
The approved current gate uses exact title-entry suffixes, not padded launch
|
||||
paths. `title-press-paths.json` retains the full sequences and entry boundaries.
|
||||
The full 4/8/15/11 launch replays will be added after the native Home slice merges;
|
||||
the corresponding title-entry paths are 1/5/6/2. SDK cache, exact-episode,
|
||||
track-index, identity, locale-layout and trailer-handler tests run offline with
|
||||
in-process service replies and local art.
|
||||
`TitleLaunchKeysTest` starts at Who's watching and replays the full 4/8/15/11
|
||||
sequences through the real Home hero/shelves and title/person surfaces.
|
||||
`title-press-paths.json` supplies every event; no prefix is skipped or padded.
|
||||
The shorter 1/5/6/2 title-entry replays remain as focused regressions. SDK cache,
|
||||
exact-episode, track-index, identity, locale-layout and trailer-handler tests
|
||||
run offline with in-process service replies and local art.
|
||||
|
||||
|
||||
## Toolchain and disk use
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue