Make the shared Rust mobile contract platform-neutral for Android #91

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

Goal

Turn the current iPhone-oriented mobile surface into a shared mobile application contract that Android can consume without inheriting Apple or Watch assumptions.

Scope

  • Inventory crates/storage::mobile* and crates/apple exports against the Android parity matrix.
  • Move reusable UniFFI records/conversions into a shared bridge or generate equivalent bindings from one source of truth; prevent Swift and Kotlin APIs from drifting.
  • Replace Apple-specific presentation values such as SF Symbol names with typed semantic icon/action identifiers that each UI maps to native assets.
  • Separate Watch-only selection/snapshot/status fields from phone TOTP records so Android does not derive state from “unavailable” Watch display strings or expose dead controls.
  • Add typed contracts for platform paths, secure-secret operations, clipboard presentation, clock/lifecycle events, camera frames, and any Android-only credential-provider request that cannot be implemented directly in Rust.
  • Keep repository paths, configuration, parsing, mutation decisions, Git progress, authentication leases, TOTP timing, QR envelopes, and external-credential matching in crates/storage.
  • Define stable IDs, revision/conflict tokens, cancellation ownership, object lifetime, and secret-redaction behavior across UniFFI.
  • Add contract tests that generate both Swift and Kotlin bindings and compare the public feature inventory.

Acceptance criteria

  • The Android bridge presents every non-Watch current mobile workflow without copying Apple-specific conversion code.
  • Apple builds continue to work, while Watch-only data is explicitly opt-in and absent from Android records.
  • UI-visible actions and states are enums/records, not values recovered from labels, symbol names, or error text.
  • Platform callback interfaces contain OS mechanics only and cannot make storage-domain decisions.
  • Binding compatibility, cancellation, concurrency, lifetime, large payload, and redaction tests pass.

Depends on #88 and the Rust/UniFFI packaging issue. Part of #87.

## Goal Turn the current iPhone-oriented mobile surface into a shared mobile application contract that Android can consume without inheriting Apple or Watch assumptions. ## Scope - Inventory `crates/storage::mobile*` and `crates/apple` exports against the Android parity matrix. - Move reusable UniFFI records/conversions into a shared bridge or generate equivalent bindings from one source of truth; prevent Swift and Kotlin APIs from drifting. - Replace Apple-specific presentation values such as SF Symbol names with typed semantic icon/action identifiers that each UI maps to native assets. - Separate Watch-only selection/snapshot/status fields from phone TOTP records so Android does not derive state from “unavailable” Watch display strings or expose dead controls. - Add typed contracts for platform paths, secure-secret operations, clipboard presentation, clock/lifecycle events, camera frames, and any Android-only credential-provider request that cannot be implemented directly in Rust. - Keep repository paths, configuration, parsing, mutation decisions, Git progress, authentication leases, TOTP timing, QR envelopes, and external-credential matching in `crates/storage`. - Define stable IDs, revision/conflict tokens, cancellation ownership, object lifetime, and secret-redaction behavior across UniFFI. - Add contract tests that generate both Swift and Kotlin bindings and compare the public feature inventory. ## Acceptance criteria - The Android bridge presents every non-Watch current mobile workflow without copying Apple-specific conversion code. - Apple builds continue to work, while Watch-only data is explicitly opt-in and absent from Android records. - UI-visible actions and states are enums/records, not values recovered from labels, symbol names, or error text. - Platform callback interfaces contain OS mechanics only and cannot make storage-domain decisions. - Binding compatibility, cancellation, concurrency, lifetime, large payload, and redaction tests pass. Depends on #88 and the Rust/UniFFI packaging issue. Part of #87.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:10:20 +00:00
hugo added the enhancement label 2026-08-17 19:10:20 +00:00
Sign in to join this conversation.