feat(engine): one-shot What's-new card after updates (Phase I) #180
Reference in New Issue
Block a user
Delete Branch "feat/whats-new-card"
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?
First Phase I item from docs/ui-redesign-2026-07.md — and directly motivated by today: four releases shipped whose features nobody would discover on their own (ObtainX updates are silent).
How it works
Settings::last_seen_whats_new, a dismissible card summarises the latest changelog section. "Got it" or Esc dismisses; the seen-version stamp persists on spawn, so the card can never nag twice even if the app dies with it open.CHANGELOG.md(include_str!, §4.2-compliant): its topmost## [x.y.z]section provides both the card content and the app's release identity. No build-time version plumbing — the APK'sversionNamenever reaches Rust and the workspace Cargo version is static (0.1.0; the splash'senv!(CARGO_PKG_VERSION)display has been wrong forever, separate cleanup).### Internalsections dropped (players don't care about CI), each bullet reduced to its bold lead sentence, capped at 8.spawn_home_on_launchwaits on the newWhatsNewPendingresource exactly like it waits for onboarding. Fresh installs never see the card — onboarding completion stamps the current version silently.ScrimDismissible: scrim-tap despawns without running the close handler, which would hold the launch beat forever.Tests
8 new — changelog parsing (synthetic + the real embedded file), upgrade-shows/seen-skips/fresh-install-never gating, beat release on dismissal. Full workspace + clippy green. Emulator smoke skipped for this one: simulating an upgrade needs on-device settings surgery, and the gating logic is exactly what the unit tests pin down.
Remaining Phase I: contextual one-time tips (first stall → hint tip, first long-press stack → radial tip).
🤖 Generated with Claude Code