From 941fb14cb0fa3c28f4ded5502958964d9246c093 Mon Sep 17 00:00:00 2001 From: GenericJam Date: Thu, 27 Aug 2026 13:05:26 -0600 Subject: [PATCH] docs: correct three stale rows in the mobile surface matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The matrix had drifted in both directions — overstating something broken and understating something shipped, twice. - **Notification tap handling: ✅ → 🟡.** It claimed "Foreground + background + cold-start". Cold-start does not work: the payload is handed to mob_set_launch_notification before nif_load has created the mutex, so the setter returns early and take_launch_notification/0 gets nil. On Android the host calls it ~75 lines before the BEAM thread is even created, so the drop is guaranteed, not racy; on iOS the integration point mob_beam.h documents (didFinishLaunchingWithOptions:) is likewise pre-BEAM. Points at #81 and the community fix in #77, which will flip this back to ✅ when it lands. - **`` (sheet presentation): 🟡 → ✅.** It said "full sheet-style modal is plugin territory". Mob.UI.sheet/2 has been core since 0.7.29 (iOS .sheet), with the Android Material 3 ModalBottomSheet renderer published in mob_new 0.4.24 — noted, since Android needs a project generated by that version or newer. - **Bottom sheets: ❌ → ✅.** Listed as a plugin candidate; it is literally the same primitive, with :detents. Notes the documented iOS scrim-opacity limitation rather than implying parity. Verified rather than assumed: Mob.UI.sheet/2 at lib/mob/ui.ex:336, MobSheetView in ios/MobRootView.swift, and MobSheet in the published mob_new 0.4.24 template. Swept the neighbouring rows too — Bluetooth Classic and QR/barcode are accurate. Separately, mob_video (0.1.0), mob_touch (0.1.0) and mob_screencast (0.1.1) are published on Hex but have no rows at all, so the matrix reads as though those capabilities don't exist. Left out of this commit rather than guessed at; each needs its platform support checked before it earns a row. Co-Authored-By: Claude Opus 5 (1M context) --- guides/mobile_surface_matrix.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/mobile_surface_matrix.md b/guides/mobile_surface_matrix.md index 338bb9c6..7bde7720 100644 --- a/guides/mobile_surface_matrix.md +++ b/guides/mobile_surface_matrix.md @@ -64,9 +64,9 @@ and orthogonal — composition over a fat component library. | Date / Time / Color pickers | ❌ | — | — | Plugin candidate | | `` | ❌ | — | — | Native search bar (UISearchBar / SearchBar). Plugin candidate | | `` | ❌ | — | — | Plugin candidate | -| `` (sheet presentation) | 🟡 | 🟡 | 🟡 | Programmatic alerts + action sheets exist; full sheet-style modal is plugin territory | +| `` (sheet presentation) | ✅ | ✓ | ✓ | `Mob.UI.sheet/2` — native modal sheet composing ordinary Mob nodes (iOS `.sheet`, Android Material 3 `ModalBottomSheet`). Android needs an app generated by `mob_new` ≥ 0.4.24. Programmatic alerts + action sheets also available via `Mob.Alert` | | Pull-to-refresh | ❌ | — | — | Missing; commonly requested. Plugin candidate | -| Bottom sheets | ❌ | — | — | Plugin candidate | +| Bottom sheets | ✅ | ✓ | ✓ | Same primitive as `` above — `Mob.UI.sheet/2` with `:detents` (`[:medium, :large]` subset). iOS cannot set the system dimming opacity, so `:scrim` is applied exactly on Android and approximated on iOS | | Drawer navigation | ❌ | — | — | Plugin candidate; mob's nav model is stack-based today | ## Touch, gesture, input @@ -188,7 +188,7 @@ and orthogonal — composition over a fat component library. | Local notification scheduling | ✅ | ✓ | ✓ | `MobNotify.schedule/2`, cancel (`mob_notify` plugin) | | Push notification registration | ✅ | ✓ | ✓ | `MobNotify.register_push/1` (`mob_notify` plugin) → token to `handle_info` | | Push delivery via APNs / FCM | ✅ | ✓ | ✓ | Via `mob_push` Hex package | -| Notification tap handling | ✅ | ✓ | ✓ | Foreground + background + cold-start (`take_launch_notification/0`) | +| Notification tap handling | 🟡 | 🟡 | 🟡 | Foreground + background work. **Cold-start does not**: the payload is stored before the NIF loads, so it is dropped and `take_launch_notification/0` returns `nil` ([#81](https://github.com/GenericJam/mob/issues/81), fix in [#77](https://github.com/GenericJam/mob/pull/77)) | | Notification actions (buttons) | ❌ | — | — | Plugin / core candidate | | Critical / time-sensitive flags (iOS) | ❌ | — | n/a | Plugin candidate | | Notification grouping / threading | ❌ | — | — | Plugin candidate |