Build the Compose Material 3 adaptive application shell and navigation #102

Open
opened 2026-08-17 19:12:21 +00:00 by hugo · 0 comments
Owner

Goal

Provide the native Android shell for Home, Passwords, Search, TOTP, and Settings using storage-provided state.

Scope

  • Build one ComponentActivity with Jetpack Compose, Material 3, and independent navigation/back-stack state for each top-level destination.
  • Use a bottom navigation bar on compact widths and an appropriate navigation rail/drawer on larger windows.
  • Use Material 3 Adaptive list-detail/supporting-pane patterns for phones, tablets, foldables, multi-window, desktop windowing, and live resize/fold transitions.
  • Drive loading, empty, ready, locked, stale, and error presentations from typed Rust fixtures. Kotlin must not derive state from titles or icon strings.
  • Use Navigation 3 or the stable navigation choice recorded by #88, ViewModels, immutable StateFlow, Hilt, and lifecycle-aware collection.
  • Preserve selected destination and safe navigation state across configuration/process recreation; never put secrets, decrypted records, editor contents, or native object handles in saved state.
  • Cancel screen-scoped work when its destination leaves scope and reject stale completions by operation/revision identity.
  • Implement edge-to-edge system bars, Material theming, light/dark/system appearance, keyboard/back behavior, and test tags/accessibility semantics.

Acceptance criteria

  • All five destinations work on compact and expanded windows with independent, predictable back stacks.
  • Process recreation restores only non-secret navigation state and starts protected screens locked.
  • Deterministic fixtures exercise every shell state without a real repository.
  • TalkBack, large font, display scaling, keyboard navigation, and touch targets pass shell-level checks.
  • Compose contains no repository, Git, OpenPGP, OTP, config, or persistence rules.

Depends on #88, the Gradle scaffold, and the platform-neutral mobile contract. Part of #87.

## Goal Provide the native Android shell for Home, Passwords, Search, TOTP, and Settings using storage-provided state. ## Scope - Build one `ComponentActivity` with Jetpack Compose, Material 3, and independent navigation/back-stack state for each top-level destination. - Use a bottom navigation bar on compact widths and an appropriate navigation rail/drawer on larger windows. - Use Material 3 Adaptive list-detail/supporting-pane patterns for phones, tablets, foldables, multi-window, desktop windowing, and live resize/fold transitions. - Drive loading, empty, ready, locked, stale, and error presentations from typed Rust fixtures. Kotlin must not derive state from titles or icon strings. - Use Navigation 3 or the stable navigation choice recorded by #88, ViewModels, immutable StateFlow, Hilt, and lifecycle-aware collection. - Preserve selected destination and safe navigation state across configuration/process recreation; never put secrets, decrypted records, editor contents, or native object handles in saved state. - Cancel screen-scoped work when its destination leaves scope and reject stale completions by operation/revision identity. - Implement edge-to-edge system bars, Material theming, light/dark/system appearance, keyboard/back behavior, and test tags/accessibility semantics. ## Acceptance criteria - All five destinations work on compact and expanded windows with independent, predictable back stacks. - Process recreation restores only non-secret navigation state and starts protected screens locked. - Deterministic fixtures exercise every shell state without a real repository. - TalkBack, large font, display scaling, keyboard navigation, and touch targets pass shell-level checks. - Compose contains no repository, Git, OpenPGP, OTP, config, or persistence rules. Depends on #88, the Gradle scaffold, and the platform-neutral mobile contract. Part of #87.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:12:21 +00:00
hugo added the enhancement label 2026-08-17 19:12:21 +00:00
Sign in to join this conversation.