feat(inbox): Visual Notification Inbox overlay (integration / build distribution)#769
feat(inbox): Visual Notification Inbox overlay (integration / build distribution)#769mahmoud-elmorabea wants to merge 12 commits into
Conversation
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, selection) (#744) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…747) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tes, no-template skip, hovering panel) (#751) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e, desugaring docs) (#752) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… poll (#758) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9205f46 to
ed05fb5
Compare
Sample app builds 📱Below you will find the list of the latest versions of the sample apps. It's recommended to always download the latest builds of the sample apps to accurately test the pull request. |
|
|
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #769 +/- ##
============================================
- Coverage 69.07% 65.40% -3.67%
- Complexity 838 1020 +182
============================================
Files 149 173 +24
Lines 4601 5851 +1250
Branches 628 878 +250
============================================
+ Hits 3178 3827 +649
- Misses 1189 1719 +530
- Partials 234 305 +71 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
|
📏 SDK Binary Size Comparison Report
|
|
Build available to test |
| ) { | ||
| val context = LocalContext.current | ||
| val state by remember(controller) { controller.uiStateFlow() } | ||
| .collectAsStateWithLifecycle(initialValue = VisualInboxUiState(loading = true)) |
There was a problem hiding this comment.
Duplicate inbox state collectors
Medium Severity
InboxListContent calls controller.uiStateFlow() and collects it separately from parent composables that already collect the same controller’s flow. Each call builds a new cold flow whose onStart triggers another load() (templates/branding fetch path), so one mounted overlay or view can run parallel load pipelines and briefly surface inconsistent UI snapshots.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit e65c84c. Configure here.
There was a problem hiding this comment.
Partially valid — the mechanism is real but the stated impact is guarded.
uiStateFlow() is a cold flow, and both the parent (NotificationInboxView/NotificationInboxOverlay) and the child InboxListContent collect it, so mounting does start two collections that each hit load() via .onStart. However, InboxRepository.loadTemplatesAndBranding() prevents the parallel load pipelines described here: an atomic in-flight guard (fetchInFlight.compareAndSet(false, true) → early return with current state) plus a once-per-session revalidation gate mean a second concurrent load short-circuits with no extra network fetch.
So the residual cost is redundant flow collection (two subscriptions + snapshot reads), not parallel fetches or divergent UI. Worth a low-priority cleanup (hoist/share a single collection), not a correctness bug.
…pty inbox) (#771) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| modifier = Modifier | ||
| .align(Alignment.BottomEnd) | ||
| .padding(16.dp) | ||
| ) |
There was a problem hiding this comment.
Overlay bell ignores renderable gate
Low Severity
NotificationInboxOverlay keeps composing InboxBellContent whenever the overlay stays mounted for panelExpanded, even when canShowChrome is false (inbox hidden or no renderable messages). NotificationInboxBell hides the bell in that case, but the overlay can still show a floating bell with nothing valid to open.
Reviewed by Cursor Bugbot for commit 138e675. Configure here.
|
|
…EventListener (#772) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 3465bce. Configure here.
| * after running its (non-dismiss) action. Matches both a JSON boolean `true` and the string `"true"`. | ||
| */ | ||
| private fun actionDismissFlag(event: JistActionEvent): Boolean = | ||
| ((event.data as? JsonObject)?.get("dismiss") as? JsonPrimitive)?.contentOrNull == "true" |
There was a problem hiding this comment.
Dismiss flag ignores JSON boolean
Medium Severity
actionDismissFlag treats data.dismiss as enabled only when JsonPrimitive.contentOrNull equals the string "true". For a normal JSON boolean true, contentOrNull is null in kotlinx.serialization, so auto-dismiss-after-click never runs even though the comment claims boolean and string forms are supported.
Reviewed by Cursor Bugbot for commit 3465bce. Configure here.
|
|


Draft integration PR for the Visual Notification Inbox overlay. Opened primarily to publish sample-app builds to Firebase App Distribution so another team can test the feature end-to-end.
Aggregates the already-reviewed sub-PRs: module skeleton, data layer, overlay UI, interaction/web-parity, message actions + branding colors, dismiss-resurrection guard, and sample-app listener demo.
Firebase App Distribution builds (java_layout + kotlin_compose) are posted as a comment on this PR once CI completes.
🤖 Generated with Claude Code
Note
Medium Risk
Large new surface area across queue polling, SSE lifecycle, inbox state, and public Compose APIs, though behavior is heavily unit-tested and failures tend to hide the inbox rather than crash hosts.
Overview
Adds a publishable
messaginginboxCompose module (NotificationInboxOverlay,NotificationInboxBell,NotificationInboxView) that renders the visual inbox with Jist, workspace branding-driven chrome, and hostInboxEventListenerinterception for actions.messaginginappgains the visual-inbox data layer: server gate viaX-CIO-Inbox-Enabled, parallel templates/branding fetch (shared gist HTTP cache + session revalidation),VisualInboxvisibility flows, andcio_inboxmessage selection. Queue polls wire enablement toInboxRepository; SSE transitions now HTTP-backfill before connect so inbox isn’t empty on fresh login. Dismiss tombstones stop deleted messages resurfacing from stale/queuepolls;InAppMessagingManager.stateexposes reactive store updates.CI lint/unit matrices include
messaginginbox; build adds jist and lifecycle-runtime-compose dependencies.Reviewed by Cursor Bugbot for commit 3465bce. Bugbot is set up for automated code reviews on this repo. Configure here.