Skip to content

chore: visual inbox view (FAB, badge, slide-out panel) + sample wiring#737

Open
mahmoud-elmorabea wants to merge 8 commits into
feat/overlay-inboxfrom
overlay-inbox-views
Open

chore: visual inbox view (FAB, badge, slide-out panel) + sample wiring#737
mahmoud-elmorabea wants to merge 8 commits into
feat/overlay-inboxfrom
overlay-inbox-views

Conversation

@mahmoud-elmorabea

@mahmoud-elmorabea mahmoud-elmorabea commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

MBL-1796: Build floating entry button

Note

Not the final inbox UI. This overlay is a temporary developer utility — a visual surface over the headless inbox API used to manually exercise and validate Jist rendering in the following PRs. The layout, placeholder text rows, and temporary bell icon are intentionally minimal and are not the final inbox experience.

Adds a public Compose NotificationInboxView (floating button, unread badge, animated slide-out panel of placeholder message rows) driven by the headless inbox API, and mounts it on the kotlin_compose sample dashboard for the M1 demo.

Screenshot — java_layout sample

Visual inbox overlay on Android (java_layout sample)

🤖 Generated with Claude Code


Note

Low Risk
New opt-in UI module and sample wiring only; inbox data still comes from the existing headless API with no auth or persistence changes.

Overview
Introduces a public Compose NotificationInboxOverlay in :messaginginbox, replacing the internal skeleton with a Milestone 1 visual layer on the headless NotificationInbox API (getMessages, change listeners with optional topic, listener cleanup on dispose).

The overlay adds a floating action button (placeholder bell drawable), an unread badge driven by unreadInboxCount, and an animated slide-out panel with placeholder text rows (inboxTitle from message properties). Gradle picks up full Compose UI/Material dependencies; the module API surface is recorded in messaginginbox.api. Placeholder module tests are swapped for unit tests on the pure helpers.

Sample apps depend on messaginginbox via sample-app.gradle: kotlin_compose mounts the composable on the dashboard; java_layout adds a full-screen ComposeView plus NotificationInboxOverlayView.mount() for Java interop.

Reviewed by Cursor Bugbot for commit 743f5ee. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown

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.


@codecov

codecov Bot commented Jun 16, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 4.25532% with 90 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (feat/overlay-inbox@d6d145e). Learn more about missing BASE report.

Files with missing lines Patch % Lines
...ustomer/messaginginbox/NotificationInboxOverlay.kt 4.25% 89 Missing and 1 partial ⚠️
Additional details and impacted files
@@                  Coverage Diff                  @@
##             feat/overlay-inbox     #737   +/-   ##
=====================================================
  Coverage                      ?   67.51%           
  Complexity                    ?      890           
=====================================================
  Files                         ?      157           
  Lines                         ?     4966           
  Branches                      ?      681           
=====================================================
  Hits                          ?     3353           
  Misses                        ?     1365           
  Partials                      ?      248           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781606481)

@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown

📏 SDK Binary Size Comparison Report

No changes detected in SDK binary size ✅

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781606494)

@github-actions

Copy link
Copy Markdown

Build available to test
Version: overlay-inbox-views-SNAPSHOT
Repository: https://central.sonatype.com/repository/maven-snapshots/

@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781610533)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781610543)

@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781612086)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781612074)

@mahmoud-elmorabea mahmoud-elmorabea changed the title feat: visual inbox view (FAB, badge, slide-out panel) + sample wiring chore: visual inbox view (FAB, badge, slide-out panel) + sample wiring Jun 16, 2026
@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781614796)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781614806)

@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781618264)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781618261)

Base automatically changed from overlay-inbox-skeleton to feat/overlay-inbox June 17, 2026 15:31
mahmoud-elmorabea and others added 6 commits June 18, 2026 11:31
Introduce a public Compose NotificationInboxView that renders a floating
button with an unread badge and a slide-out panel listing inbox messages
as placeholder rows, driven by the headless inbox API (initial fetch plus
live change-listener updates removed on dispose). Hidden when empty.

Mount it on the kotlin_compose sample dashboard for the M1 demo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add messaginginbox to both the local-project and published-snapshot
dependency branches in samples/sample-app.gradle (mirroring
messaging-in-app-compose) and drop the direct project dependency from
the kotlin_compose sample. Consuming the module as a local project while
the rest of the SDK resolves to published snapshot artifacts put
messaginginapp on the classpath twice, failing minifyReleaseWithR8 with a
duplicate-class error in the AGP build matrix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ines dep

Use ModuleMessagingInApp.instance().inbox() (public @JvmStatic entry point in
the in-app module) instead of CustomerIO.instance().inAppMessaging().inbox().
CustomerIO lives in :datapipelines, so the visual-inbox module no longer needs
to depend on it — the module now depends only on :messaginginapp, mirroring the
iOS module's use of MessagingInApp.shared.inbox.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sponsive panel, java_layout wiring

- Drop internal MessagingInbox placeholder object; the public composable is the module API
- Rename NotificationInboxView -> NotificationInboxOverlay (file + composable + KDoc + call sites)
- Panel uses responsive width (fill - 16dp margins, capped at 480dp) instead of fixed 300dp
- Mount NotificationInboxOverlay as a ComposeView overlay on the java_layout dashboard

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add JVM unit tests for the overlay's pure logic — unread badge count
(unreadInboxCount) and placeholder row title derivation (inboxTitle) —
extracting both as internal functions. The headless NotificationInbox is a
final class with an internal constructor, so the Compose/UI behavior is not
unit-tested here (no fakeable seam without a UI-test runtime); this mirrors
the iOS module's coverage depth.

Also: swap the FAB Text("Inbox") for a bell icon to match iOS (adds
material-icons-core), add accessibility content descriptions to the button,
badge, and row indicator, and add a usage KDoc snippet. Adds an internal
inbox-injection overload, keeping the public composable signature unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The empty-module placeholder object was replaced by NotificationInboxOverlay
in this branch; its placeholder unit test (carried in from the merged
skeleton) no longer compiles and is superseded by NotificationInboxOverlayTest.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781768090)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781768085)

Render the floating button regardless of inbox contents so the inbox stays
reachable when empty. The unread badge remains conditional on unread count;
an empty inbox opens to an empty panel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781768782)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781768782)

Replace Icons.Filled.Notifications (which required
androidx.compose.material:material-icons-core — no longer transitive via
material 1.7+) with a bundled vector drawable for the FAB bell, and remove
the dependency. Temporary placeholder icon until the final asset lands.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
  • java_layout: overlay-inbox-views (1781777357)

@github-actions

Copy link
Copy Markdown
  • kotlin_compose: overlay-inbox-views (1781777402)

@mahmoud-elmorabea mahmoud-elmorabea marked this pull request as ready for review June 18, 2026 10:20
@mahmoud-elmorabea mahmoud-elmorabea requested a review from a team as a code owner June 18, 2026 10:20
@mahmoud-elmorabea

Copy link
Copy Markdown
Contributor Author

The CI failure is caused by issues not related to inbox, I apply a fix for them here #743

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant