54 lines
3.5 KiB
Markdown
54 lines
3.5 KiB
Markdown
# Android name search
|
|
|
|
Search uses the shared `MobilePasswordPage` search rules in `crates/storage`.
|
|
Queries are trimmed, Unicode-lowercased, and matched as literal substrings of the
|
|
canonical entry path, including its folders and filename without `.gpg`.
|
|
This is lowercase matching, not locale collation or Unicode normalization. `/`
|
|
is the canonical separator; backslashes and regex characters remain literal.
|
|
Ordinary dot-prefixed entries are searchable; `.extensions` is excluded by the
|
|
shared password-store rules. No entry is read or decrypted to search its name.
|
|
|
|
The private-runtime API supplies typed rows with canonical folder context and
|
|
an object revision. Opening a result validates its identifier and current
|
|
revision in Rust under the private-runtime lock, then returns the same directory
|
|
navigation and structured viewer model used by Passwords. Deleted/replaced
|
|
objects clear selection and expose the existing stale-selection recovery.
|
|
No Kotlin matching, traversal, path splitting, or identity reconstruction occurs.
|
|
|
|
The Search destination is injected into `ShellViewModel`. Its repository exposes
|
|
StateFlow query/loading/results/error state and debounces typing by 250 ms.
|
|
Every query, refresh, cancellation, and manual clear invalidates pending work;
|
|
uncancellable native completions cannot publish an older query. Keyboard Search
|
|
refreshes immediately. Results are lazy, retain canonical location labels, and
|
|
expose accessible labelled click actions. Empty, loading, cancelled, error/retry,
|
|
and clear states work in compact and expanded windows.
|
|
|
|
Only the current query is retained in memory across rotation/window changes and
|
|
returning to the destination. It is not written to SavedStateHandle, disk, logs,
|
|
analytics, or history. Under this policy names remain available while the store
|
|
is locked, but manual lock clears query/results synchronously and a new process
|
|
starts empty. Decrypted entry values still follow the stricter background
|
|
revocation and native-cover policy documented in presentation-security.md.
|
|
Result lists clear when Search stops and reload on resume, incorporating external
|
|
repository changes without reusing the old objects.
|
|
|
|
Rust fixtures cover Unicode/case behavior, literal separators, duplicate names,
|
|
shared-rule equivalence, invalid ciphertext, stale replacement/deletion,
|
|
repository refresh, invalid identifiers, and 5,000 entries. Coroutine tests cover
|
|
debounce, cancelled/uncancellable work, latest-query wins, retry, empty input,
|
|
and metadata clearing. Android UI tests exercise canonical location/action
|
|
semantics, keyboard Search, compact/expanded layouts, and empty/error recovery;
|
|
native facade instrumentation connects real Rust search to the existing viewer.
|
|
|
|
Validation passed for all four required Rust workspace gates and the complete
|
|
Android debug/release/AAB, unit, lint, formatting, architecture, package and
|
|
dependency gates. App/core/bridge instrumentation, native-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 the existing Android Studio embedded emulator exercised the
|
|
public result fixture and the live Rust-backed Search destination. Native
|
|
ViewModel instrumentation verifies query survival through actual recreation,
|
|
serialized saved-state exclusion, and synchronous manual-lock clearing.
|
|
Accessibility semantics/actions were tested; spoken TalkBack output was not
|
|
claimed. ARMv7 build/package checks passed; no suitable ARMv7 emulator image is
|
|
available. Physical devices are excluded from this milestone's validation scope.
|