Implement Android password-store name search #101

Closed
opened 2026-08-17 19:12:20 +00:00 by hugo · 1 comment
Owner

Goal

Find entries quickly by path/name without decrypting their contents.

Scope

  • Add a top-level Search destination with debounced text input and storage-owned typed search results.
  • Match path/folder/filename according to crates/storage rules and show enough canonical location context to distinguish duplicate names.
  • Open a selected result in the same structured viewer/navigation model as Passwords.
  • Use Flow/ViewModel state for query, loading, results, empty/error state, cancellation, and latest-query-wins semantics.
  • Do not store query history by default; never expand this feature into decrypted grep without a separate explicit security design.
  • Preserve safe query state across rotation/window changes, but clear it on manual lock/process recreation if the query can reveal sensitive organizational metadata under the selected threat policy.
  • Cover Unicode, case behavior, path separators, very large stores, repository refresh, and stale result identities with Rust fixtures.

Acceptance criteria

  • Search returns the same typed matches as the shared Rust API and never decrypts an entry.
  • Rapid typing/cancellation cannot display results for an older query.
  • Selecting a stale/deleted result produces a safe typed recovery, not the wrong entry.
  • Compact and expanded layouts, TalkBack, keyboard search action, and empty/error states are complete.
  • Kotlin performs no path matching or repository traversal.

Depends on hierarchical navigation and the Compose shell. Part of #87.

Android support update (2026-10-08)

User-directed scope: Android release and CI targets are arm64-v8a and armeabi-v7a. x86_64 Android is excluded for now. Validation for every Android milestone issue uses emulator devices only; physical-device testing and physical-device checklists are excluded. Record the limits of available ARM emulator/API images without claiming physical-device coverage.

## Goal Find entries quickly by path/name without decrypting their contents. ## Scope - Add a top-level Search destination with debounced text input and storage-owned typed search results. - Match path/folder/filename according to `crates/storage` rules and show enough canonical location context to distinguish duplicate names. - Open a selected result in the same structured viewer/navigation model as Passwords. - Use Flow/ViewModel state for query, loading, results, empty/error state, cancellation, and latest-query-wins semantics. - Do not store query history by default; never expand this feature into decrypted grep without a separate explicit security design. - Preserve safe query state across rotation/window changes, but clear it on manual lock/process recreation if the query can reveal sensitive organizational metadata under the selected threat policy. - Cover Unicode, case behavior, path separators, very large stores, repository refresh, and stale result identities with Rust fixtures. ## Acceptance criteria - Search returns the same typed matches as the shared Rust API and never decrypts an entry. - Rapid typing/cancellation cannot display results for an older query. - Selecting a stale/deleted result produces a safe typed recovery, not the wrong entry. - Compact and expanded layouts, TalkBack, keyboard search action, and empty/error states are complete. - Kotlin performs no path matching or repository traversal. Depends on hierarchical navigation and the Compose shell. Part of #87. ## Android support update (2026-10-08) User-directed scope: Android release and CI targets are **arm64-v8a** and **armeabi-v7a**. x86_64 Android is excluded for now. Validation for every Android milestone issue uses emulator devices only; physical-device testing and physical-device checklists are excluded. Record the limits of available ARM emulator/API images without claiming physical-device coverage.
hugo added this to the 06 - Implement an Android version of the software milestone 2026-08-17 19:12:20 +00:00
hugo added the enhancement label 2026-08-17 19:12:20 +00:00
Author
Owner

Delivered in commit c7703d8efd.

Implemented the top-level Android Search destination using storage-owned name/path matching without entry decryption. The private Rust API reuses the shared search rules and returns typed canonical rows with object revisions; opening validates the identity/revision and hands off to the same structured Passwords viewer. Deleted/replaced results clear selection and use typed stale-navigation recovery.

The Kotlin facade exposes debounced StateFlow state with cancellation, latest-query-wins guards, immediate keyboard Search/refresh, explicit loading/cancelled/empty/error/clear states, lazy results and accessible canonical location/action labels. Queries remain in memory through rotation/window changes, are excluded from serialized saved state/history, and clear synchronously on manual lock/process recreation. Pending search selection is preserved across viewer resume/rotation instead of being replaced by an older saved navigation state. Kotlin performs no repository traversal or path matching.

Acceptance review covered the complete storage/bridge/facade/viewmodel/navigation/DI/UI path, all callers, privacy boundaries and lifecycle races. Rust fixtures prove shared-rule equivalence, Unicode/case and literal separator behavior, duplicate location context, invalid ciphertext, refresh, stale replacement/deletion, invalid identities and a 5,000-entry store. Coroutine regressions cover debounce, uncancellable completions, latest-query wins, cancellation, retry and clearing. Native facade instrumentation opens real Rust search results in the viewer while locked. UI tests cover compact/expanded layouts, accessibility action semantics, keyboard Search, recovery, pending-selection resume, real ViewModel recreation, saved-bundle exclusion and manual-lock clearing.

Validation: all four required Rust workspace gates passed (local mock-server/socket tests were run with authorized access). Full Android debug/release/AAB, unit, lint, ktlint, architecture, package and dependency gates passed for both ARM ABIs. App/core/bridge instrumentation, native cold-load checks and five cold starts passed on ARM64 API 26/4 KB, API 37/4 KB and strict API 37/16 KB. Computer use in Android Studio's existing embedded emulator verified the public result fixture, cancellation/selection/clear controls and the live Rust-backed Search destination.

Behavior and test evidence are documented in docs/android/name-search.md. ARMv7 receives build/package validation because no suitable emulator image is available. Spoken TalkBack output is not claimed; accessibility semantics/actions were exercised. Physical devices are excluded by the milestone scope. No Apple UI/project changed.

Delivered in commit c7703d8efda325574e615361cffe7b3e2596e174. Implemented the top-level Android Search destination using storage-owned name/path matching without entry decryption. The private Rust API reuses the shared search rules and returns typed canonical rows with object revisions; opening validates the identity/revision and hands off to the same structured Passwords viewer. Deleted/replaced results clear selection and use typed stale-navigation recovery. The Kotlin facade exposes debounced StateFlow state with cancellation, latest-query-wins guards, immediate keyboard Search/refresh, explicit loading/cancelled/empty/error/clear states, lazy results and accessible canonical location/action labels. Queries remain in memory through rotation/window changes, are excluded from serialized saved state/history, and clear synchronously on manual lock/process recreation. Pending search selection is preserved across viewer resume/rotation instead of being replaced by an older saved navigation state. Kotlin performs no repository traversal or path matching. Acceptance review covered the complete storage/bridge/facade/viewmodel/navigation/DI/UI path, all callers, privacy boundaries and lifecycle races. Rust fixtures prove shared-rule equivalence, Unicode/case and literal separator behavior, duplicate location context, invalid ciphertext, refresh, stale replacement/deletion, invalid identities and a 5,000-entry store. Coroutine regressions cover debounce, uncancellable completions, latest-query wins, cancellation, retry and clearing. Native facade instrumentation opens real Rust search results in the viewer while locked. UI tests cover compact/expanded layouts, accessibility action semantics, keyboard Search, recovery, pending-selection resume, real ViewModel recreation, saved-bundle exclusion and manual-lock clearing. Validation: all four required Rust workspace gates passed (local mock-server/socket tests were run with authorized access). Full Android debug/release/AAB, unit, lint, ktlint, architecture, package and dependency gates passed for both ARM ABIs. App/core/bridge instrumentation, native cold-load checks and five cold starts passed on ARM64 API 26/4 KB, API 37/4 KB and strict API 37/16 KB. Computer use in Android Studio's existing embedded emulator verified the public result fixture, cancellation/selection/clear controls and the live Rust-backed Search destination. Behavior and test evidence are documented in docs/android/name-search.md. ARMv7 receives build/package validation because no suitable emulator image is available. Spoken TalkBack output is not claimed; accessibility semantics/actions were exercised. Physical devices are excluded by the milestone scope. No Apple UI/project changed.
hugo closed this issue 2026-10-09 17:31:08 +00:00
Sign in to join this conversation.