Skip to content

Harden Android Cloud sync and release verification - #25

Merged
adibhanna merged 7 commits into
mainfrom
feature/cloud-prime-time-readiness
Aug 28, 2026
Merged

Harden Android Cloud sync and release verification#25
adibhanna merged 7 commits into
mainfrom
feature/cloud-prime-time-readiness

Conversation

@adibhanna

Copy link
Copy Markdown
Contributor

Summary

  • stream large Cloud files through a native Android 7+ signed-upload path
  • prevent filesystem permission and provider failures from being interpreted as deletions
  • improve sync timeout and error reporting
  • pin builds to an exact reviewed ZenNotes source commit
  • add dependency audits, native build and emulator CI, and deployed Cloud smoke-test automation

Verification

  • npm test
  • npm run typecheck
  • npm run upstream
  • production audits for the mobile app and pinned source
  • npm run sync
  • Gradle unit tests, lint, and debug APK assembly

Dependency

Merge ZenNotes/zennotes#687 first; this app pins that audited source commit.

The Obsidian-style gesture set, as one setting with three slots
(Settings → Appearance → Swipe gestures):

- Swipe left / swipe right over an open note each map to next/previous
  note (the shipped default), Browse, the note outline, or off. The
  existing flick recognizer stays the single arbiter of what counts as
  a swipe; only the dispatch consults the mapping, so a change in
  Settings applies to the very next swipe.
- Pull down from the top of a note runs a quick action: the command
  palette by default (nothing lived on that gesture before), or search,
  or the new-note sheet, or off. Strict by design — the touch must
  start at scrollTop 0 and cross an 88px threshold, with a floating
  hint pill and a haptic tick at the arming point, so top-of-note
  over-scrolls don't fire it.
- The left-edge swipe that opens Browse is untouched, as is the
  drawer's pull-to-refresh.

Prefs live in localStorage (zn:gestures), mirrored to native storage by
bootstrap like the layout and status-bar settings, normalized per-field
so values from a newer version degrade gracefully (covered by node
tests).

Verified on the API 35 emulator: default flick incl. end-stop, all
three remaps applied live, pull-down hint/arming, all four pull
actions, persistence across force-stop, drawer + edge-swipe untouched.
A paperclip button in the formatting toolbar, right after Find: it opens
Android's system document picker (the WebView routes <input type=file>
through Capacitor's onShowFileChooser — no native plugin), and the
picked files flow through the SAME import path as desktop drag-drop:
importDroppedFile on the active vault (MobileVault and RemoteVault both
already implement it — bytes in, unique name, change event), then
app-core's own formatImportedAssetsForInsertion places the markdown at
the cursor. Images insert as embeds, PDFs and other files as links,
exactly what a desktop drop produces; multi-select supported.

The picker element is module-level on purpose: opening it pauses the
activity, the keyboard drops, and the focus-gated toolbar unmounts — a
component-owned input would never deliver its change event. Insertion
targets the store's editorViewRef and refocuses it, so the keyboard
comes straight back.

Verified on the API 35 emulator: picked a PNG (byte-exact copy into the
vault, live-rendering embed) and a PDF (link) from Downloads via the
system picker, keyboard restored after each, saved markdown matches
desktop drop output.
Two consecutive CI failures on the same commit, zero of them in app code:
the API 35 emulator on GitHub's nested-virt runners can report
sys.boot_completed while system_server is still sick. Run one hit it as
'Failed to commit install session … Broken pipe' from the package
service (0 tests ran); the rerun spammed "Can't find service: settings"
from before the tests to the end. The emulator-runner action's own wait
accepts that half-boot, and gradle charged into it both times.

tooling/ci-wait-for-emulator.sh now gates the connected-test run: poll
the settings and package services (device_provisioned + pm path, up to
5 min), one adb reboot rescue if they never register, and a loud early
failure — instead of a misleading test failure — if the VM is beyond
saving.
Source pin unchanged at 43994ff (app-core 2.38.0 + dependency-audit
hardening) — the reproducible-build pin from 5a22b4d is the stamp.
@adibhanna
adibhanna merged commit 058f22b into main Aug 28, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant