-
Notifications
You must be signed in to change notification settings - Fork 2
CAPABILITY_MATRIX
Canonical 3-module × KMP-target × per-API support matrix. Cells: ✅ real native impl ·
⚠️ fallback (works but not native UX) · ❌ ADR-09 #N WONTFIX (architectural OS limitation) · 🔗 v0.4 PROVISIONAL (compiles; runtime verification pending real-device CI) · ⊘ target not declared.See
cmp-app-intents/adrs/ADR-09-platform-impl-exits.mdfor the full WONTFIX rationale.
| Target | Text | Url | Image | File | Multi |
|---|---|---|---|---|---|
androidLibrary |
✅ ACTION_SEND | ✅ ACTION_SEND | ✅ ACTION_SEND | ✅ ACTION_SEND | ✅ ACTION_SEND |
jvm |
✅ OS-detect xdg-open / open / start | ||||
iosX64 / iosArm64 / iosSimulatorArm64
|
✅ UIActivityViewController | ✅ UIActivityViewController | ✅ UIActivityViewController | ✅ UIActivityViewController | ✅ UIActivityViewController |
macosX64 / macosArm64
|
✅ NSSharingServicePicker | ✅ NSSharingServicePicker | ✅ NSSharingServicePicker | ✅ NSSharingServicePicker | ✅ NSSharingServicePicker |
tvosX64 / tvosArm64 / tvosSimulatorArm64
|
🔗 Swift bridge | 🔗 Swift bridge | ❌ #1 | ❌ #1 | ❌ #1 |
watchosX64 / watchosArm32 / watchosArm64 / watchosSimulatorArm64 / watchosDeviceArm64
|
✅ WCSession.transferUserInfo | ✅ WCSession.transferUserInfo | ✅ WCSession.transferFile | ✅ WCSession.transferFile | ✅ first-success |
linuxX64 / linuxArm64
|
✅ xclip | ✅ xdg-open | ✅ xdg-open | ✅ first-success | |
mingwX64 |
✅ clip.exe | ✅ cmd start | 🔗 CF_DIB cinterop | ✅ cmd start | ✅ first-success |
js (browser) |
✅ navigator.share | ✅ navigator.share | ✅ navigator.share | ✅ navigator.share | ✅ navigator.share |
wasmJs (browser) |
✅ navigator.share | ✅ navigator.share | ✅ navigator.share | ✅ navigator.share | ✅ navigator.share |
| Target | PickImage | PickDocument | PickContact | Arbitrary URL |
|---|---|---|---|---|
androidLibrary |
✅ PHPicker-equiv | ✅ ACTION_GET_CONTENT | ✅ ContactsContract | ✅ ACTION_VIEW |
jvm |
✅ AWT FileDialog | ✅ AWT FileDialog | ❌ #7 (no JVM contact picker) | |
iosX64 / iosArm64 / iosSimulatorArm64
|
✅ PHPicker | ✅ UIDocumentPicker | ✅ CNContactPicker | ✅ UIApplication.openURL |
macosX64 / macosArm64
|
✅ NSOpenPanel | ✅ NSOpenPanel | ❌ #4 (deferred) | ✅ NSWorkspace.openURL |
tvosX64 / tvosArm64 / tvosSimulatorArm64
|
❌ #5 | ❌ #5 | ❌ #5 | ❌ #5 |
watchosX64 / watchosArm32 / watchosArm64 / watchosSimulatorArm64
|
❌ #6 | ❌ #6 | ❌ #6 | ✅ WKExtension.openSystemURL |
linuxX64 / linuxArm64
|
✅ zenity | ✅ zenity | ❌ #7 (architectural) | ✅ xdg-open |
mingwX64 |
🔗 GetOpenFileNameW | 🔗 GetOpenFileNameW | ❌ #8 (UWP-only API) | ✅ cmd start |
js (browser) |
✅ <input type=file>
|
✅ <input type=file>
|
❌ no API | |
wasmJs (browser) |
✅ @JsFun DOM |
✅ @JsFun DOM |
❌ no API |
Compose Multiplatform target reach (cmp-intent-launcher-compose): 9 targets — androidLibrary + jvm + iOS×3 + macOS×2 + js + wasmJs. tvOS/watchOS/Linux/mingw consumers use the core cmp-intent-launcher module's imperative IntentLauncher class directly (Compose Multiplatform doesn't ship compose.runtime for those targets — Phase 0 S1.A verdict UNCHANGED).
Callable from commonMain / DI / non-UI code. No Composable / ActivityResultLauncher needed. Android Context auto-injected via IntentLauncherInitProvider.
| Target | openAppSettings() |
createDocument(name, mime) |
|---|---|---|
androidLibrary |
✅ ACTION_APPLICATION_DETAILS_SETTINGS + FLAG_ACTIVITY_NEW_TASK | ✅ Invisible proxy Activity + ActivityResultContracts.CreateDocument |
jvm |
✅ OS-aware ProcessBuilder | ✅ JFileChooser SAVE_DIALOG on EDT (via Dispatchers.IO) |
iosX64 / iosArm64 / iosSimulatorArm64
|
✅ UIApplicationOpenSettingsURLString | ✅ UIDocumentPickerViewController (ExportToService) + DelegatePin |
macosX64 / macosArm64
|
✅ x-apple.systempreferences | ✅ NSSavePanel.runModal() |
tvosX64 / tvosArm64 / tvosSimulatorArm64
|
❌ #5 | ❌ #5 |
watchosX64 / watchosArm32 / watchosArm64 / watchosSimulatorArm64 / watchosDeviceArm64
|
❌ #6 | ❌ #6 |
linuxX64 / linuxArm64
|
✅ gnome-control-center / kcmshell5 / xdg-open chain | ✅ zenity --file-selection --save |
mingwX64 |
✅ start ms-settings:appsfeatures | ❌ #13 (Win32 GetSaveFileNameW cinterop deferred) |
js (browser) |
❌ #10 (no app-scoped settings) | ✅ window.showSaveFilePicker (Chromium only; ❌ on Firefox/Safari) |
wasmJs (browser) |
❌ #10 | ✅ window.showSaveFilePicker via @JsFun (Chromium only) |
New ADR-09 rows from v0.4 Phase 13: #13 mingw SystemIntents.createDocument (GetSaveFileNameW cinterop) — WONTFIX-PROVISIONAL until follow-up cinterop expansion.
| Target | register() | Runtime registry | OS surface |
|---|---|---|---|
androidLibrary |
✅ | ✅ in-memory | ✅ shortcuts.xml capability tags (BIIs) via Phase 5 generateShortcutsXml Gradle task |
jvm |
✅ in-memory | ❌ #9 architectural | |
iosX64 / iosArm64 / iosSimulatorArm64
|
✅ | ✅ in-memory | ✅ Swift bridge + AppShortcutsProvider (per ADR-04) + auto-generated Swift stubs via Phase 5 generateSwiftIntents
|
macosX64 / macosArm64
|
✅ | ✅ in-memory | ✅ same as iOS |
tvosX64 / tvosArm64 / tvosSimulatorArm64
|
✅ v0.4 manifest write | ✅ in-memory | ✅ manifest + Swift bridge (CoreSpotlight no-op via #if canImport guard) |
watchosX64 / watchosArm32 / watchosArm64 / watchosSimulatorArm64
|
✅ v0.4 manifest write | ✅ in-memory | ✅ manifest + Swift bridge (watchOS 10+ Shortcuts) |
linuxX64 / linuxArm64
|
✅ v0.4 XDG manifest + .desktop | ✅ in-memory | ✅ .desktop action handlers in $XDG_DATA_HOME/applications/
|
mingwX64 |
✅ v0.4 APPDATA manifest | ✅ in-memory | 🔗 IShellLinkW Start Menu shortcuts deferred to post-v0.4 CI verification |
js (browser) |
✅ in-memory | ❌ #10 architectural (PWA shortcut manifest = separate future cmp-pwa-shortcuts module) |
|
wasmJs (browser) |
✅ in-memory | ❌ #10 architectural |
Compose Multiplatform target reach (cmp-app-intents-compose): same 9 as above. Consumers use AppIntentsRegistration(config) Composable for lifecycle-bound registration + AppIntentsRegistry() for Material 3 styled dev/debug UI.
12 v0.4 candidate rows from v0.3-alpha:
- ✅ CLOSED: #1 (tvOS partial Swift bridge wiring); #2 (watchOS transferFile); #3 (mingw CF_DIB cinterop); #4 (JVM OS-detect ProcessBuilder); #8 (mingw GetOpenFileNameW cinterop); #11 (all 4 tier-3 manifest writes); #12 (Gradle codegen tasks).
- WONTFIX (architectural): #5 (tvOS picker surface non-existent); #6 (watchOS picker surface non-existent); #7 (Linux contact-picker absent); #9 (JVM Desktop no canonical intent surface); #10 (JS/wasmJs no canonical Web intent surface — PWA shortcuts = future module).
See ADR-09 for the per-row rationale + post-v1.0 follow-up guidance.
Are you using Compose Multiplatform in commonMain?
├── YES → Add `cmp-{share|intent-launcher|app-intents}-compose` deps
│ Use `rememberShareLauncher()` / `IntentPickerDialog()` /
│ `AppIntentsRegistration()` opinionated Composables
│
└── NO → Add `cmp-{share|intent-launcher|app-intents}` core deps only
Use `Share.share(...)` / `IntentLauncher()` /
`AppIntents.register(...)` imperative APIs directly
** Partials**
App Intents
Bubble
Clipboard
Cookbook
- Clipboard Copy Text
- Clipboard Read Text
- Consumer Anon Key Setup
- Crashlytics Attribution Per Library
- Ifonline Block
- Index
- Index
- Index
- Index
- Open Url Compose
- Pick And Share Image
- React To Offline
- Register Firebase Hooks
- Share Pdf Android
- Share Text
- Wifi Vs Cellular
Firebase Analytics
In App Update
Intent Launcher
Inter App Comms
Modules
- Cmp App Intents
- Cmp App Intents Compose
- Cmp Bubble
- Cmp Clipboard
- Cmp Deep Link
- Cmp Firebase Analytics
- Cmp In App Update
- Cmp Intent Launcher
- Cmp Intent Launcher Compose
- Cmp Library
- Cmp Network Monitor
- Cmp Network Monitor Compose
- Cmp Observe
- Cmp Observe Koin
- Cmp Open Url
- Cmp Pdf Generator
- Cmp Product Tickets
- Cmp Remote Config
- Cmp Share
- Cmp Share Compose
- Cmp Toast
Network Monitor
Open Url
Pdf Generator
Remote Config
Share
Toast
User Tickets
General