feat(notifications): the in-app inbox, and per-channel preferences (engagement Phase 8)
The app's half of the in-app channel. Phase 7 shipped four inbox routes with no consumer on either platform; this is the Android one, plus the per-channel preferences Phase 3 added and the shipped screen could not express. The drawer's "Notifications" is the INBOX now, with the preferences one tap away behind its gear — the arrangement Phase 7 shipped on the web, and what a person means when they tap the word. The settings screen moved off /notifications/subscriptions onto /notifications/channels: it renders a control per channel that applies to each id (from the item's own `channels`, never a hardcoded three) and per mode that channel accepts, which is how email's `digest` reaches the app. The old endpoint is the push projection of the new table server-side, so the shipped APK went on working the whole time. A tapped tickle whose `ref` starts with `notification:` lands on the inbox whatever its stream is — an engagement rule's stream id is a TRIGGER id in the one namespace, and `forStream`'s fixed map would have sent most of them Home. Every other tickle keeps the route it has always had. The ref is not decoded beyond that prefix and never rendered: it is a hint that a row exists, and the contract stays wake-and-pull. PLAN.md §7's "no Room cache in v1" stands; the offline snapshot is its one named exception, settled with the org lead. The inbox is a short, read-only, newest-first list with a server-side cursor, so what "works offline" needs is the newest page and the badge, not a database — one JSON blob in the DataStore the push code already uses. Every snapshot is scoped to (base URL, user id) and only handed back to that pair: that, not the clear-on-logout, is what stops a cache surviving into another account on the paths that never reach a logout at all. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -484,7 +484,7 @@
|
||||
<!-- ── Push notifications (§11, M7 Part 2) ─────────────────────────── -->
|
||||
<string name="menu_notifications">Notifications</string>
|
||||
<string name="notifications_title">Notifications</string>
|
||||
<string name="notifications_subtitle">Choose what this shard notifies you about. Nothing is sent unless you turn it on.</string>
|
||||
<string name="notifications_subtitle">Choose what this shard notifies you about, and how it reaches you. Nothing is sent unless you turn it on.</string>
|
||||
<string name="notifications_section_general">General</string>
|
||||
<string name="notifications_section_personal">Your game account</string>
|
||||
<string name="notifications_requires_link">Link a game account to enable this.</string>
|
||||
@@ -495,6 +495,18 @@
|
||||
<string name="notifications_save_error">Couldn\'t save your notification settings. Try again.</string>
|
||||
<string name="notifications_relay_error">This shard\'s push relay isn\'t reachable right now.</string>
|
||||
|
||||
<!-- The in-app inbox and the per-channel settings (ENGAGEMENT.md phase 8). -->
|
||||
<string name="notifications_mode_off">Off</string>
|
||||
<string name="notifications_mode_instant">As it happens</string>
|
||||
<string name="notifications_mode_digest">Daily summary</string>
|
||||
<string name="inbox_empty">Nothing here yet. Notifications you\'re sent will show up here.</string>
|
||||
<string name="inbox_all_read">All caught up</string>
|
||||
<string name="inbox_unread_count">%1$d unread</string>
|
||||
<string name="inbox_mark_all_read">Mark all read</string>
|
||||
<string name="inbox_open_settings">Notification settings</string>
|
||||
<string name="inbox_loading_more">Loading more…</string>
|
||||
<string name="inbox_offline_cached">Offline — showing what was saved on this device.</string>
|
||||
|
||||
<!-- Notification channels + the ongoing foreground-service notification. -->
|
||||
<string name="push_channel_messages">Shard notifications</string>
|
||||
<string name="push_channel_messages_desc">Alerts you opted into from this shard.</string>
|
||||
|
||||
Reference in New Issue
Block a user