Implement Android TOTP discovery cache, progress, refresh, and search #110

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

Goal

Open the TOTP destination quickly from the storage-owned non-secret discovery catalog and support cancellable incremental refresh.

Scope

  • Render cached TOTP rows immediately without decrypting entries; if no usable catalog exists, start discovery only after authentication.
  • Use the existing storage cache contract: canonical entry path, SHA-256 of ciphertext, and is_totp; never cache decrypted text, OTP URI/secret, issuer/account, generated code, password, passphrase, or key material.
  • Store the catalog in the Android private/no-backup location selected by the path issue and preserve it across normal app updates.
  • Display typed monotonic phases, total, inspected, cache hits, matches, unavailable entries, determinate progress when known, cancellation, and resumable checkpoints.
  • Pull-to-refresh/explicit refresh must hash current ciphertext and decrypt only new/changed records, preserve completed checkpoints on cancellation, and prune deleted records only after a complete stable pass.
  • Add query filtering through the storage-owned cached-search API with latest-query-wins cancellation.
  • Serialize discovery and reject a complete result if the repository changes during the pass.
  • Remove Apple Watch selection/status UI and fields from Android TOTP models.

Acceptance criteria

  • Cold scan, warm zero-decrypt refresh, one-entry change/add/remove, corruption recovery, cancellation/resume, concurrent repository change, and wrong-store catalog are covered.
  • Opening a valid catalog does not authenticate or decrypt.
  • Search is responsive on large catalogs and never parses entry content in Kotlin.
  • Process death/update retains valid completed cache records without backing them up off-device.
  • No Watch controls or dead Watch state appear on Android.

Depends on private-path integration, biometric authentication, shared mobile contract, and app shell. Part of #87.

## Goal Open the TOTP destination quickly from the storage-owned non-secret discovery catalog and support cancellable incremental refresh. ## Scope - Render cached TOTP rows immediately without decrypting entries; if no usable catalog exists, start discovery only after authentication. - Use the existing storage cache contract: canonical entry path, SHA-256 of ciphertext, and `is_totp`; never cache decrypted text, OTP URI/secret, issuer/account, generated code, password, passphrase, or key material. - Store the catalog in the Android private/no-backup location selected by the path issue and preserve it across normal app updates. - Display typed monotonic phases, total, inspected, cache hits, matches, unavailable entries, determinate progress when known, cancellation, and resumable checkpoints. - Pull-to-refresh/explicit refresh must hash current ciphertext and decrypt only new/changed records, preserve completed checkpoints on cancellation, and prune deleted records only after a complete stable pass. - Add query filtering through the storage-owned cached-search API with latest-query-wins cancellation. - Serialize discovery and reject a complete result if the repository changes during the pass. - Remove Apple Watch selection/status UI and fields from Android TOTP models. ## Acceptance criteria - Cold scan, warm zero-decrypt refresh, one-entry change/add/remove, corruption recovery, cancellation/resume, concurrent repository change, and wrong-store catalog are covered. - Opening a valid catalog does not authenticate or decrypt. - Search is responsive on large catalogs and never parses entry content in Kotlin. - Process death/update retains valid completed cache records without backing them up off-device. - No Watch controls or dead Watch state appear on Android. Depends on private-path integration, biometric authentication, shared mobile contract, and app shell. Part of #87.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:15:15 +00:00
hugo added the enhancement label 2026-08-17 19:15:15 +00:00
Sign in to join this conversation.