Implement structured Android entry viewer (#99)
This commit is contained in:
1 parent
647dc1bb4b
commit
c0ba6d43d8
29 files changed
+1768
-78
No files matched your search
@@ -0,0 +1,49 @@
|
||||
# Android structured entry viewer (#99)
|
||||
|
||||
The viewer renders Rust-provided sections and fields without parsing or serializing
|
||||
entries in Compose. Passwords, PINs, OTP URIs and other sensitive fields start masked.
|
||||
Reveal, copy and edit use the field ID together with the exact document revision.
|
||||
An external replacement rejects the old field IDs and locks the authentication
|
||||
lease. Editing saves through Rust's recoverable encryption and automatic Git commit
|
||||
workflow, then refreshes the checked navigation and document revisions.
|
||||
|
||||
Rust supplies TOTP codes, account labels and remaining seconds. The presentation
|
||||
refresh does not renew the lease. Expiry, backgrounding and manual lock remove
|
||||
sections, codes, editor inputs and mutation dialogs. Decrypted values never enter
|
||||
saved state; secret-bearing facade objects redact their string representation.
|
||||
|
||||
The Material top bar offers an editable-field picker and Move, Copy and Delete
|
||||
plans. Rust supplies destinations, overwrite requirements and checked mutation
|
||||
revisions. Confirmation is explicit. Compact and adaptive list/detail panes share
|
||||
the same viewer; wrapped values, multiline notes and repeated fields remain intact.
|
||||
Headings, labelled actions and keyboard submission expose the same typed operations.
|
||||
|
||||
Only fields marked selectable by Rust permit text selection. Selection-copy and
|
||||
explicit Copy both request the complete stored field from Rust, preserving its
|
||||
clipboard timeout. The editor explains that copying uses the saved value; saving
|
||||
first makes edits available to copy. Android marks clips sensitive, and Rust clears
|
||||
its own clip on timeout or lock without restoring previous clipboard contents or
|
||||
erasing a newer clip. Screen capture is blocked for the activity and dialogs.
|
||||
|
||||
## Validation
|
||||
|
||||
Rust regressions cover revision-bound field actions, external edits, lease expiry,
|
||||
TOTP countdown boundaries and clearing clipboard behavior. Existing document
|
||||
fixtures cover dynamic, repeated, multiline, Unicode, malformed and OTP-only
|
||||
entries without replacing their original format. Native Android instrumentation
|
||||
creates an isolated GPG-encrypted store through Rust and exercises reveal, hide,
|
||||
copy, save, copy/delete mutations, stale revisions and expiry during TOTP refresh.
|
||||
Compose checks cover masking, field actions, diagnostics, dialog revocation,
|
||||
mutation confirmation, clipboard sensitivity and screen-capture protection.
|
||||
All four required Rust workspace gates and the complete Android build, lint,
|
||||
dependency/license, module-boundary and native-package gates passed. Full app,
|
||||
core and bridge instrumentation plus five cold starts passed on ARM64 API 26/4 KB,
|
||||
API 37/4 KB and API 37/strict 16 KB. Both ARM64 and ARMv7 release artifacts were
|
||||
built and audited.
|
||||
|
||||
Computer use in Android Studio's embedded emulator checked the disposable viewer,
|
||||
masked PIN editor, repeated fields, Unicode and contextual selection at 200% font
|
||||
size. Native contextual Copy was observed dispatching the Username's field ID.
|
||||
Manual TalkBack speech was not checked; labelled accessibility actions are covered
|
||||
by instrumentation. ARMv7 is built and packaged but has no available emulator
|
||||
image. Physical-device testing is outside this milestone's scope.
|
||||
Reference in new issue
Block a user