Route system Back through the current navigation owner
All checks were successful
review/code-claude Code APPROVE: single Back owner, tests fail before and pass after
review/design-claude Design PASS: no visual change

This commit is contained in:
justinzeus 2026-11-07 22:30:20 +01:00
parent b51dced5fe
commit a268cdd7b8
27 changed files with 196 additions and 77 deletions

View file

@ -258,12 +258,19 @@ fall through to the older setup/user UI.
Source — Justin: “pressing back enough times should close wolfskin, currently
there is no way to go back to projectivity apart from weird methods via the old ui”.
`rememberWolfskinBackHandler` owns Android Back at the app root, including a
single-entry `NavDisplay`; full-screen hand-offs use the same `NavigationManager`
exit event rather than exposing the parent setup stack. `WolfskinRootExitTest`
mounts actual Wolfskin Home/Discover/library surfaces and covers picker,
hardware Back and Coming-in sheet precedence. `WolfskinBackStackTest` mounts
the real Updates and Home Settings pages to cover parent pops and unsaved edits.
The activity's `OnBackPressedDispatcher` owns native `KEYCODE_BACK`. It is not
mapped by `readShellKey`: a Compose key-down cannot navigate before the system
Back callback commits. Escape remains the local keyboard Back shortcut.
`rememberWolfskinBackHandler` resolves the live navigation entry and synchronizes
the shell route before the root nav/exit ladder. A title/person callback retained
during exit forwards to that live entry instead of popping its old title again;
correctness does not depend on a recomposed enabled flag.
`TitleEntryBackTest` mounts real `NavDisplay`, Home and loaded title/person
surfaces; `WolfskinRootExitTest` mounts actual Home/Discover/library surfaces.
Both run on SDK 34 and 36, including system/predictive callbacks, native key
ownership, immediate successive Back before recomposition, picker and Coming-in
precedence. `WolfskinBackStackTest` keeps the real Updates/Home Settings parent
pops and unsaved-edit protection.
Saved Jellyfin identities use the existing upstream session. Conductarr supplies
household labels, requester capabilities and library audiences after sign-in.
@ -373,21 +380,26 @@ the actual host's suspended fixture load and presses Android OK: it must open th
hero rather than activate the nav. Fixture completion does not steal a different
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/`.
Native Roborazzi captures normally use Robolectric SDK 34 and
`w960dp-h540dp-xhdpi` (1920×1080 at density 2.0). System-Back smokes also run SDK 36.
`make test` writes capture PNGs and 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.
Robolectric SDK 28/30/34 runtimes resolve through Gradle's existing persistent
Robolectric SDK 28/30/34/36 runtimes resolve through Gradle's existing persistent
dependency cache, then copy to `wolfskin-design/build/robolectric-sdk/`. Test workers
use that local directory in offline mode instead of downloading Android JARs into
the container's ephemeral home. A cache miss still needs Maven Central; rate-limited
hosts can seed the existing cache from SHA512-verified local Maven artifacts without
changing the wrapper or adding volumes.
SDK 36 Back tests use the pinned Android 16 runtime and a test-worker-only
`--add-exports=java.base/jdk.internal.access=ALL-UNNAMED` for Robolectric's
`ApplicationSharedMemory` / JDK FileDescriptor bridge. Other capture suites
retain their existing SDK selection.
Default-flavour launcher artwork and English, Hungarian and Polish string overrides
live in `app/src/default/res/`. Legacy Wolfskin strings in 25 translated