Implement Android entry and folder creation, editing, and password generation #103

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

Goal

Provide native create/edit workflows over storage-owned structured entry documents and repository mutations.

Scope

  • Add Compose forms to create folders and entries, edit dynamic named fields and multiline notes, add/remove/reorder fields, and request generated/replacement passwords.
  • Use storage-provided field kinds, stable IDs, sensitivity metadata, validation, generation options, revision tokens, recipients, and save outcomes.
  • Keep passwords hidden by default with explicit reveal and generation confirmation; use secure keyboard/autofill semantics without exposing values to screenshots or saved state.
  • Hold dirty form state only in memory, scoped to the editor ViewModel/native session. Confirm before back, destination replacement, lock, background cleanup, or another operation discards it.
  • Save atomically through Rust; Kotlin must not serialize entries, generate passwords, choose .gpg-id recipients, encrypt, write files, or create Git commits.
  • On validation failure, stale revision, merge conflict, authentication expiry, or interrupted save, retain the safe in-memory draft and present storage-provided recovery options.
  • Support IME actions, focus, hardware keyboard, drag/accessibility reordering alternatives, long values, large fonts, and adaptive layouts.
  • Ensure process death never writes plaintext drafts to SavedStateHandle; recovery starts locked and explains that an unsaved draft was discarded.

Acceptance criteria

  • Dynamic, unknown, repeated, multiline, PIN, and OTP fields round-trip without loss.
  • Create folder, create entry, edit, add/remove/reorder, generate, save, cancel, failed save, stale conflict, and lock-during-edit paths are tested.
  • Ordinary navigation cannot discard dirty changes without confirmation.
  • No secret draft enters saved state, logs, clipboard, DataStore, or screenshots.
  • Kotlin contains no entry serialization, generation, recipient, encryption, filesystem, or Git policy.

Depends on the structured viewer, biometric authentication, and hierarchical navigation issues. 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 Provide native create/edit workflows over storage-owned structured entry documents and repository mutations. ## Scope - Add Compose forms to create folders and entries, edit dynamic named fields and multiline notes, add/remove/reorder fields, and request generated/replacement passwords. - Use storage-provided field kinds, stable IDs, sensitivity metadata, validation, generation options, revision tokens, recipients, and save outcomes. - Keep passwords hidden by default with explicit reveal and generation confirmation; use secure keyboard/autofill semantics without exposing values to screenshots or saved state. - Hold dirty form state only in memory, scoped to the editor ViewModel/native session. Confirm before back, destination replacement, lock, background cleanup, or another operation discards it. - Save atomically through Rust; Kotlin must not serialize entries, generate passwords, choose `.gpg-id` recipients, encrypt, write files, or create Git commits. - On validation failure, stale revision, merge conflict, authentication expiry, or interrupted save, retain the safe in-memory draft and present storage-provided recovery options. - Support IME actions, focus, hardware keyboard, drag/accessibility reordering alternatives, long values, large fonts, and adaptive layouts. - Ensure process death never writes plaintext drafts to `SavedStateHandle`; recovery starts locked and explains that an unsaved draft was discarded. ## Acceptance criteria - Dynamic, unknown, repeated, multiline, PIN, and OTP fields round-trip without loss. - Create folder, create entry, edit, add/remove/reorder, generate, save, cancel, failed save, stale conflict, and lock-during-edit paths are tested. - Ordinary navigation cannot discard dirty changes without confirmation. - No secret draft enters saved state, logs, clipboard, DataStore, or screenshots. - Kotlin contains no entry serialization, generation, recipient, encryption, filesystem, or Git policy. Depends on the structured viewer, biometric authentication, and hierarchical navigation issues. 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:15:14 +00:00
hugo added the enhancement label 2026-08-17 19:15:14 +00:00
Author
Owner

Implemented in 06575363a2c0.

Implemented native Android folder/entry creation and structured editing, with Rust-owned validation, lossless serialization, recipients, generation, revisions, atomic writes and Git commits.

  • Compose supports dynamic/repeated named fields, multiline notes, PIN/OTP fields, add/remove/reorder, explicit reveal and confirmed password replacement. Rust supplies stable IDs, capabilities and generation bounds; opaque non-UTF8 fields remain intact.
  • Back, tab changes and explicit lock require dirty-discard confirmation. Background/expiry clears plaintext immediately; Rust keeps ciphertext-only in-memory recovery checkpoints, original conflict bases and versioned inputs. Successful save/discard deletes checkpoints. Process recreation starts locked and shows the Rust-provided discarded-draft notice; saved state contains no draft or native handle.
  • Failed validation and stale saves retain the draft. Regression fixtures cover exact repeated/Unicode/opaque-byte round trips, failure/conflict, background, two-second expiry, recovery, generation and confirmed discard. UI tests include 200% text, keyboard save, Android Back, empty configured stores, safe process recreation and a marshalled Activity saved-bundle check for every draft field value. Live validation fixed editor-entry and post-mutation refresh lock races.

Validation: all four required Rust workspace gates; full Android debug/release, ARM packaging/16 KB, lint/ktlint, unit, architecture, manifest/backup, dependency/license and SBOM gates; complete app/core/bridge instrumentation plus native cold loads and five app cold starts on ARM64 API 26 (4 KB), API 37 (4 KB) and API 37 (strict 16 KB). Computer use in Android Studio's embedded emulator verified public-fixture setup, folder/entry creation, generation, PIN editing, save/reopen, dirty-navigation cancellation, background/expiry recovery and confirmed discard. No user secret was needed.

The additive shared contract regenerated hardened Swift bindings. XcodeGen and iPhone/dependent watch simulator builds passed; the iPhone update preserved its container/enrollment, and computer use verified locked folder navigation.

Reviewed the complete implementation against this issue. ARMv7 was built/packaged; no live ARMv7 image was available. Physical devices and x86_64 are excluded by the milestone support policy.

Implemented in [06575363a2c0](https://git.rfc1437.de/hugo/IronStorage/commit/06575363a2c0b1853e712d4518185914ab917cb1). Implemented native Android folder/entry creation and structured editing, with Rust-owned validation, lossless serialization, recipients, generation, revisions, atomic writes and Git commits. - Compose supports dynamic/repeated named fields, multiline notes, PIN/OTP fields, add/remove/reorder, explicit reveal and confirmed password replacement. Rust supplies stable IDs, capabilities and generation bounds; opaque non-UTF8 fields remain intact. - Back, tab changes and explicit lock require dirty-discard confirmation. Background/expiry clears plaintext immediately; Rust keeps ciphertext-only in-memory recovery checkpoints, original conflict bases and versioned inputs. Successful save/discard deletes checkpoints. Process recreation starts locked and shows the Rust-provided discarded-draft notice; saved state contains no draft or native handle. - Failed validation and stale saves retain the draft. Regression fixtures cover exact repeated/Unicode/opaque-byte round trips, failure/conflict, background, two-second expiry, recovery, generation and confirmed discard. UI tests include 200% text, keyboard save, Android Back, empty configured stores, safe process recreation and a marshalled Activity saved-bundle check for every draft field value. Live validation fixed editor-entry and post-mutation refresh lock races. Validation: all four required Rust workspace gates; full Android debug/release, ARM packaging/16 KB, lint/ktlint, unit, architecture, manifest/backup, dependency/license and SBOM gates; complete app/core/bridge instrumentation plus native cold loads and five app cold starts on ARM64 API 26 (4 KB), API 37 (4 KB) and API 37 (strict 16 KB). Computer use in Android Studio's embedded emulator verified public-fixture setup, folder/entry creation, generation, PIN editing, save/reopen, dirty-navigation cancellation, background/expiry recovery and confirmed discard. No user secret was needed. The additive shared contract regenerated hardened Swift bindings. XcodeGen and iPhone/dependent watch simulator builds passed; the iPhone update preserved its container/enrollment, and computer use verified locked folder navigation. Reviewed the complete implementation against this issue. ARMv7 was built/packaged; no live ARMv7 image was available. Physical devices and x86_64 are excluded by the milestone support policy.
hugo closed this issue 2026-10-09 20:13:02 +00:00
Sign in to join this conversation.