Roundtable's shape: no FCM. A specialUse foreground service keeps the
process alive; EventsStream stays connected; DeliveryLauncher runs the
catch-up on every notification.created nudge and every reconnect, and is
the single owner of the service's lifetime (signed in AND the device's
"Notifications when the app is closed", on by default).
- NotificationSync pulls the newest page and announces unread notices past
a high-water mark (auth_session.notifiedUpTo, read and written through
the DAO), honouring the per-kind phone pref. A first look sets the mark
without announcing; more than three collapse to one line; nothing is
posted while the app is on screen.
- Two channels: "Your requests" and "Library health"; the ongoing notice
sits on a MIN "Background connection" channel.
- EventsStream: a connected flow, 2s→5min backoff with ±25% jitter, and an
immediate reconnect when a network comes up (a hint, not VALIDATED) or
the app comes to the foreground.
- BootReceiver restarts delivery after a reboot or a self-update.
- A tap opens what the notice links to (routeForLink), a pile the inbox.
- POST_NOTIFICATIONS is asked for on Android 13+ once delivery is wanted,
and again when the toggle is turned on.
- Room v12: auth_session.backgroundDelivery and notifiedUpTo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>