Linear: https://linear.app/engineereddev/issue/ENG-264
What's in this PR (142 files, all under apps/android/):
- Home: history from the Room
Flow(newest first), decrypted through the repository, paging older items viaGET /api/pushes; rows by type (file rows show name and size); Copy, Open, Delete with a 5-second undo snackbar beforeDELETE; scroll-to and highlight for the notificationpushId; empty, loading and offline states. - Composer: multi-line text, link indicator (existing http(s) rule), target picker with online dots, Send with pending and error states.
- ShareActivity (exported, bottom sheet):
ACTION_SEND+text/plain→ note or link (single URL), title fromEXTRA_SUBJECT, target picker, optional message; Send enqueues a WorkManager job and finishes. The job's encrypted envelope is spooled to a private file (WorkManager'sDatais capped at 10 KB). Not paired → "Pair Pneumo first". - Devices: list, rename any device, remove other devices. Settings: connection state, notification and battery-optimization status with buttons, server host, app version, Sign out.
- Session/sync integration hardened against stale cache writes after sign-out and premature catch-up end (no protocol or Room schema change).
- Dependency: WorkManager 2.12.0 (
libs.versions.toml,app/build.gradle.kts). - Tests: ViewModel (Turbine) for send note/link, delete with undo, targets, errors, races; share-intent parsing; managed-device
HomeShareSmokeTest; 66 new Roborazzi goldens and 12 re-recorded shell goldens (named in the commit).
Verify (lead, on 82cd724):
mise run check:android→ exit 0./gradlew testDebugUnitTest --rerun→ exit 0 (283 tests, 0 failures)./gradlew pixel6Api34DebugAndroidTest --rerun→ exit 0 (11 tests, 0 failures)- Acceptance (implementer, API 34 Google APIs emulator, local random-port server):
am start -a SEND … https://example.com -n dev.pneumo.app/.ShareActivity→dev-client listenreceived the link in 631 ms; Home shows it as a link (screenshot checked by the lead, not committed).
Deviations: none functional; WorkManager added as permitted; encrypted spool files for the share job.
🤖 Generated with Claude Code