M4: Home history, composer, share sheet (text), Devices and Settings (ENG-264) #28

Merged demi.dev
targeting main from stoopkidddd/eng-264-m4-home-history-composer-share-sheet-text-devices-and
Merged opened by and assigned to demi.dev
targeting main from stoopkidddd/eng-264-m4-home-history-composer-share-sheet-text-devices-and

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 via GET /api/pushes; rows by type (file rows show name and size); Copy, Open, Delete with a 5-second undo snackbar before DELETE; scroll-to and highlight for the notification pushId; 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 from EXTRA_SUBJECT, target picker, optional message; Send enqueues a WorkManager job and finishes. The job's encrypted envelope is spooled to a private file (WorkManager's Data is 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 listen received 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

Commits 0