{"id":"d84a497c-4a31-4631-ad3a-bff2d3c31583","shortId":"R8yDg7","kind":"skill","title":"cometchat-android-v6-calls","tagline":"CometChat Calls v6 integration for native Android (V6 beta — Compose + Kotlin Views). Works end-to-end on chatuikit-compose-android:6.0.0 (validated 2026-05-12 against web peer) — but only with FIVE non-obvious workarounds the kit itself doesn't ship: (1) explicit `calls-sdk-andr","description":"## ⚠️ Five required workarounds for chatuikit-compose-android:6.0.0\n\nValidated end-to-end on Pixel 3 (Android 12) ↔ Next.js peer on 2026-05-12. **All five must be applied** — the V6 beta artifacts ship without them and the app crashes on first call attempt without one of them in place.\n\n### W1 — `calls-sdk-android:5.0.+` is a REQUIRED peer dep\n\nThe V6 chatuikit advertises bundled calling, but its compose AAR references `com.cometchat.calls.core.CometChatCalls$SessionSettingsBuilder` at bytecode level — that class lives in `calls-sdk-android:5.0.0`, not in the chatuikit AAR. Without this dep, `Application.onCreate` crashes with `ClassNotFoundException`.\n\n```kotlin\nimplementation(\"com.cometchat:chatuikit-compose-android:6.0.+\")\nimplementation(\"com.cometchat:calls-sdk-android:5.0.+\")  // REQUIRED\n```\n\n### W2 — `annotations-java5` duplicate-class exclude\n\nBuild fails with `Duplicate class org.jetbrains.annotations.*` from a transitive legacy dep.\n\n```kotlin\nconfigurations.all {\n    exclude(group = \"org.jetbrains\", module = \"annotations-java5\")\n}\n```\n\n### W3 — Stub classes for chat-sdk's legacy CallManager references\n\nchat-sdk-android's `CallManager` bytecode references legacy `com.cometchat.calls.{CometChatRTCView, model.RTCUser, model.RTCReceiver, model.RTCCallback}` (V3-era paths). calls-sdk-android:5.0.0 moved everything to `com.cometchat.calls.core.*` and dropped these. Without stubs in your source tree, the first call attempt fires `E/CallManager: CometChat Calling module not found`.\n\nCreate empty stubs at the legacy paths:\n\n```java\n// app/src/main/java/com/cometchat/calls/CometChatRTCView.java\npackage com.cometchat.calls;\npublic class CometChatRTCView {}\n\n// app/src/main/java/com/cometchat/calls/model/RTCUser.java\npackage com.cometchat.calls.model;\npublic class RTCUser {\n    public RTCUser(String uid, String name, String avatar) {}\n}\n\n// app/src/main/java/com/cometchat/calls/model/RTCReceiver.java\npackage com.cometchat.calls.model;\npublic class RTCReceiver {\n    public RTCReceiver(String uid, String name, String type) {}\n}\n\n// app/src/main/java/com/cometchat/calls/model/RTCCallback.java\npackage com.cometchat.calls.model;\npublic interface RTCCallback<T> { void onSuccess(T result); }\n```\n\nClass verification finds these locally and lets CallManager load. They're never actually invoked at runtime because the V6 chatuikit uses `com.cometchat.calls.core.CometChatCalls.startSession` (a different code path) for the real call surface.\n\n### W4 — Do NOT use `CometChatCallButtons` — wire your own\n\nThe kit's `CometChatCallButtons(user = user)` composable IGNORES the per-row `user` prop and dials whichever user was first rendered (it captures global state on first composition). Symptom: every call regardless of which row you tap rings the same person. Workaround:\n\n```kotlin\n@Composable\nfun UserRow(user: User) {\n    val context = LocalContext.current\n    Row(...) {\n        Text(user.name ?: user.uid)\n        IconButton(onClick = {\n            val outgoing = Call(\n                user.uid,\n                CometChatConstants.RECEIVER_TYPE_USER,   // see W5 — order matters\n                CometChatConstants.CALL_TYPE_VIDEO,\n            )\n            CometChat.initiateCall(outgoing, object : CometChat.CallbackListener<Call>() {\n                override fun onSuccess(call: Call) {\n                    // Hand off to the kit's outgoing-call screen — this part works correctly\n                    CometChatCallActivity.Companion.launchOutgoingCallScreen(context, call, null)\n                }\n                override fun onError(e: CometChatException) { /* surface */ }\n            })\n        }) { Text(\"📹\") }\n    }\n}\n```\n\n`CometChatCallActivity.launchOutgoingCallScreen` handles the full lifecycle (ringing UI, token mint, joinSession, transition to in-call surface) correctly — only the button composable is broken.\n\n### W5 — `Call` constructor arg order CHANGED in chat-sdk 5.x\n\n```kotlin\n// ❌ v4 style — server returns ERR_BAD_REQUEST: \"Failed to validate the data sent with the request\"\nCall(receiverUid, CALL_TYPE_VIDEO, RECEIVER_TYPE_USER)\n\n// ✅ v5 (what chatuikit-compose:6.0.0 pulls in transitively as chat-sdk-android:5.0.1)\nCall(receiverUid, RECEIVER_TYPE_USER, CALL_TYPE_VIDEO)\n```\n\nBytecode-confirmed against chat-sdk-android:5.0.1: `arg1 → receiverUid`, `arg2 → receiverType`, `arg3 → type`.\n\n---\n\n## Purpose\n\nProduction-grade voice + video calling for native Android v6 (beta). Loaded by `cometchat-calls` when `android_version === \"v6\"`. Routes to the **Compose** or **Kotlin Views** sub-flow based on the surface the project uses (already determined by `cometchat-android-v6-core` from the presence of `androidx.compose.ui:ui` / `compose.material3` in the dependency graph).\n\n**⚠️ Important — V6 still needs `calls-sdk-android` on the classpath despite marketing claims.** The V6 chatuikit packages advertise \"bundled calling,\" but at runtime `CometChatUIKit.init` references `com.cometchat.calls.core.CometChatCalls$SessionSettingsBuilder` — a class that lives in `com.cometchat:calls-sdk-android`, NOT in the chatuikit AAR. Without the peer dep, the app crashes on `Application.onCreate` with `ClassNotFoundException`. Always add:\n\n```kotlin\ndependencies {\n    implementation(\"com.cometchat:chatuikit-compose-android:6.0.+\") // or chatuikit-kotlin-android\n    implementation(\"com.cometchat:calls-sdk-android:5.0.+\")          // REQUIRED — not optional\n}\n```\n\nThe `UIKitSettings` builder must still call `.setEnableCalling(true)` to register the calling extension at init time.\n\n**Read these other skills first:**\n- `cometchat-calls` — dispatcher (modes, hard rules, anti-patterns)\n- `cometchat-android-v6-core` — UIKitSettings shape, Compose vs Views detection, init order\n- `cometchat-android-v6-builder-settings` — every option on `UIKitSettings` including the calling block\n- `cometchat-android-v6-{compose,kotlin}-components` — surface-specific component catalogs\n\n**Ground truth:**\n- SDK source — installed `chatuikit-{compose,kotlin}-android@6.0.0-beta2` artifacts under `~/.gradle/caches/`\n- V5 sibling skill — `cometchat-android-v5-calls` (different module shape, same hard rules)\n- Public docs — https://www.cometchat.com/docs/calls/android/overview (note: V6 docs may still reference V5 module split)\n\n---\n\n## 1. The seven hard rules — Android v6 specialization\n\nThe same seven non-negotiables from the dispatcher; v6 changes the *how* but not the *what*.\n\n### 1.0 Calls SDK login is its own step (v5+)\n\nSame as v5 cohort — the v5 Calls SDK has its own auth state, separate from the Chat SDK. After `CometChat.login(uid, AUTH_KEY)` succeeds, you MUST also call `CometChatCalls.login(uid, AUTH_KEY, ...)` — without it, the FIRST calls API call throws **\"auth token cannot be null\"**.\n\n```kotlin\nimport com.cometchat.calls.core.CometChatCalls\nimport com.cometchat.calls.exceptions.CometChatException as CallsException\nimport com.cometchat.calls.model.CallUser   // ← callback type, NOT chat User\n\n// ✓ RIGHT — chat login first, then calls login\nCometChat.login(uid, AUTH_KEY, object : CometChat.CallbackListener<User>() {\n  override fun onSuccess(user: User) {\n    CometChatCalls.login(uid, AUTH_KEY,\n      object : CometChatCalls.CallbackListener<CallUser>() {\n        override fun onSuccess(callUser: CallUser) { /* both ready */ }\n        override fun onError(e: CallsException) { /* surface */ }\n      })\n  }\n  override fun onError(e: CometChatException) { /* surface */ }\n})\n```\n\n**Surprises (verified on real hardware, Android 12 + 14):**\n- `com.cometchat.chat.models.User` does **NOT** expose `authToken` on Android — don't try `user.authToken`. Use the `(uid, apiKey)` overload for dev or fetch the auth token from your backend for production.\n- The Calls SDK callback returns `com.cometchat.calls.model.CallUser`, NOT `com.cometchat.chat.models.User`. Importing the wrong type gives \"Type mismatch\" at compile time.\n- The Calls SDK does NOT persist login across launches like the Chat SDK does. Re-login on every cold start where `CometChat.getLoggedInUser()` returns a non-null user.\n\n### 1.1 Dual-SDK contract — same shape, simpler imports\n\nV6 still routes ringing through Chat SDK (`CometChat.initiateCall`) and the WebRTC session through the Calls SDK — but both are accessed via the unified V6 facade. The two-`Call`-classes problem from V5 still exists internally; the V6 components hide it but custom code that imports `com.cometchat.chat.core.Call` directly must still pick the right one.\n\n```kotlin\n// ⚠️ DO NOT USE — broken at chatuikit-compose:6.0.0 (see W4 above).\n// Captures first-rendered user globally; every row dials the same person.\n// CometChatCallButtons(user = user, group = null)\n\n// ✓ RIGHT — wire your own button + use the kit's outgoing-call Activity directly.\n// See §\"Five required workarounds\" W4 for the full pattern.\nIconButton(onClick = {\n    val call = Call(user.uid, RECEIVER_TYPE_USER, CALL_TYPE_VIDEO)  // see W5 — arg order\n    CometChat.initiateCall(call, object : CometChat.CallbackListener<Call>() {\n        override fun onSuccess(c: Call) {\n            CometChatCallActivity.Companion.launchOutgoingCallScreen(context, c, null)\n        }\n        override fun onError(e: CometChatException) { /* surface */ }\n    })\n}) { Text(\"📹\") }\n```\n\n### 1.2 VoIP push — same architecture, ConnectionService + FCM\n\nIdentical to V5 (rule 1.2 in `cometchat-android-v5-calls`). The V6 UIKit doesn't ship its own ConnectionService — you write one. Reference implementation in `cometchat-android-v5-calls/references/voip-calling.md` works unchanged for V6 (the FCM payload shape and ConnectionService API are platform-level, not SDK-version-specific).\n\n### 1.3 Build prerequisite — annotations-java5 duplicate-class conflict\n\n**⚠️ Mandatory exclude.** A transitive dep of `chatuikit-compose-android:6.0.+` pulls in the legacy `org.jetbrains:annotations-java5:17.0.0`, which conflicts with the modern `org.jetbrains:annotations:23.0.0` brought in by Kotlin 2.0+. AGP fails the build with dozens of `Duplicate class org.jetbrains.annotations.*` lines. Add to `app/build.gradle.kts`:\n\n```kotlin\nconfigurations.all {\n    exclude(group = \"org.jetbrains\", module = \"annotations-java5\")\n}\n```\n\nThe exclude must be on `configurations.all` (not on a specific configuration) because the legacy artifact leaks into runtime, compile, and androidTest classpaths.\n\n### 1.4 Foreground service type — UIKit-managed in V6\n\nV6 ships its own `CometChatOngoingCallService` registered automatically via the kit's manifest merge. You still must declare the Android 14+ `FOREGROUND_SERVICE_PHONE_CALL` / `FOREGROUND_SERVICE_MICROPHONE` / `FOREGROUND_SERVICE_CAMERA` permissions in your app's manifest — manifest merge does NOT pull permissions across module boundaries.\n\n```xml\n<!-- AndroidManifest.xml — required even though the service is kit-provided -->\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_PHONE_CALL\" />\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\" />\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_CAMERA\" />\n```\n\n### 1.5 Server-minted auth tokens\n\nUnchanged from V5 / chat dispatcher — see `cometchat-android-v6-production` for the token-endpoint pattern.\n\n### 1.6 Hangup cleanup — V6 components handle it\n\nThe V6 `CometChatOngoingCall` composable / Kotlin View handles the camera-light / mic-release cleanup via its own `DisposableEffect` (Compose) or `onDetachedFromWindow` (Views). Custom OngoingCall surfaces (Section 5) must replicate this — the hard rule still applies, just the canonical implementation is in the kit.\n\n### 1.7 Permissions with rationale\n\nSame set as V5, plus V6's `minSdk = 28` floor means `POST_NOTIFICATIONS` runtime prompt (Android 13+) is always required. The V6 kit ships a `CallPermissionsHandler` that runs the standard request flow with rationale strings.\n\n### 1.8 IncomingCall mounted at app root\n\nV6 exposes `CometChatIncomingCall` as a top-level composable / View. In standalone mode, mount it inside `setContent { ... }` at the root of your `MainActivity`, OUTSIDE the navigation graph, so it survives screen transitions.\n\n```kotlin\n// MainActivity.kt — Compose, standalone mode\nclass MainActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    setContent {\n      CometChatTheme {\n        Box(modifier = Modifier.fillMaxSize()) {\n          AppNavigation()                          // Your nav graph (calls or otherwise)\n          CometChatIncomingCall(modifier = Modifier.fillMaxSize())  // overlays everything\n        }\n      }\n    }\n  }\n}\n```\n\nIn Kotlin Views, the equivalent is a top-level `FrameLayout` in the Activity's layout XML containing both the host `<fragment>` and `<com.cometchat.chatuikit.calling.CometChatIncomingCall>`.\n\n---\n\n## 2. Setup — the V6 difference\n\nV6 has no separate calls module. If `chatuikit-{compose,kotlin}-android` is already in `app/build.gradle.kts` from `cometchat-android-v6-core`, calls are already on the classpath. The skill only:\n\n1. Adds calling configuration to `UIKitSettings`:\n   ```kotlin\n   val settings = UIKitSettings.Builder()\n     .setAppId(BuildConfig.COMETCHAT_APP_ID)\n     .setRegion(BuildConfig.COMETCHAT_REGION)\n     .setAuthKey(BuildConfig.COMETCHAT_AUTH_KEY)\n     .subscribePresenceForAllUsers()\n     .enableCalling()                              // ← v6 flips calling on here\n     .build()\n   ```\n2. Ensures the four FOREGROUND_SERVICE permissions and the four call permissions are in `AndroidManifest.xml`.\n3. Adds the V6 Kotlin Views theme parent rule from `cometchat-android-v6-troubleshooting`: Activity themes hosting V6 Views must inherit from `CometChatTheme.DayNight` (V6 components extend `MaterialCardView` and reference kit-specific theme attrs that aren't in `Theme.AppCompat.*` or `Theme.MaterialComponents.*`). Compose surfaces are immune.\n\nDetailed V6 init order: `cometchat-android-v6-core`. UIKitSettings option-by-option: `cometchat-android-v6-builder-settings`.\n\n---\n\n## 3. Components — Compose vs Kotlin Views\n\nBoth surfaces ship the same five call components with the same parameter names. Surface determines which import you use.\n\n### Compose (`com.cometchat.chatuikit.calling.compose.*`)\n\n| Composable | Purpose |\n|---|---|\n| `CometChatCallButtons(user, group)` | Voice + video buttons — typically in a top-bar trailing slot or contact card |\n| `CometChatIncomingCall(modifier)` | Root-mounted overlay; renders nothing when no call active |\n| `CometChatOutgoingCall(call, user, group)` | Pushed when local user initiates; auto-dismisses on accept/reject |\n| `CometChatOngoingCall(callSettingsBuilder, sessionId)` | WebRTC view — handles camera/mic/end controls |\n| `CometChatCallLogs(onItemClick)` | Paginated history; integrates with Compose Navigation |\n\n### Kotlin Views (`com.cometchat.chatuikit.calling.views.*`)\n\nSame names, different package. Inflate via XML or programmatically:\n\n```xml\n<com.cometchat.chatuikit.calling.views.CometChatCallButtons\n    android:id=\"@+id/callButtons\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\" />\n```\n\nThen in code: `binding.callButtons.setUser(user)`.\n\nFull component-by-component catalogs live in the existing `cometchat-android-v6-compose-components` and `cometchat-android-v6-kotlin-components` skills — read whichever matches the project's surface.\n\n---\n\n## 4. Standalone integration\n\nWhen `product === \"voice-video\"` and there is no V6 chat integration yet.\n\n**Split by calling mode:**\n\n### 4a. Standalone — Session mode (meeting-room UX, no ringing)\n\nCalls SDK ONLY. NO chatuikit-android, NO ConnectionService, NO FCM-for-VoIP. Same SDK as V5 (`com.cometchat.calls-sdk-android`). Scaffold:\n\n1. **`Application` class** — `CometChatCalls.init(...)` ONLY. No chatuikit, no Chat SDK init.\n2. **`MainActivity` (Compose)** — `setContent` with `NavHost` for `/`, `/meet/{sessionId}`.\n3. **`CallRoom` composable** — `AndroidView` factory wrapping `RelativeLayout` (remember-stable), `LaunchedEffect(sessionId)` fires `CometChatCalls.joinSession(sessionId, settings, container, CallbackListener)`, `DisposableEffect` cleanup. See `references/call-session.md`.\n4. **`AndroidManifest.xml`** — Camera + microphone permissions + `FOREGROUND_SERVICE_MICROPHONE/CAMERA` + `CometChatOngoingCallService` registration. NO ConnectionService.\n5. **App Links** — `https://yourapp.com/meet/<sessionId>` deep-link routing.\n\n**Why no chatuikit / no ConnectionService:** session mode never touches kit components or push. The W1–W5 V6 workarounds (which are for chatuikit's broken integration with the Calls SDK) DO NOT apply to standalone session-only — they're only relevant when the V6 kit is loaded.\n\n### 4b. Standalone — Ringing mode (kit-driven with W1–W5 workarounds)\n\nDual-SDK + telecom + push + V6 chatuikit:\n\n- **Compose path:** A `MainActivity` with `setContent` that holds: nav graph (with `/profile`, `/calls`, `/ongoing-call/{sessionId}` routes), `CometChatIncomingCall` overlay (rule 1.7), top-level theme with `CometChatTheme`. Profile screen has `CometChatCallButtons` next to the user's name.\n- **Kotlin Views path:** `MainActivity` extending `AppCompatActivity` with theme `CometChatTheme.DayNight`, a `FragmentContainerView` for nav + a sibling `CometChatIncomingCall` view in the same `FrameLayout`. Profile fragment hosts `CometChatCallButtons`.\n- VoIP push: ConnectionService + FCM (rule 1.2 — implementation copied from V5 references/voip-calling.md, unchanged on V6).\n- Manifest permissions, foreground service permissions, ProGuard rules (`-keep class com.cometchat.** { *; }`).\n- **W1–W5 workarounds apply** (see \"Five required workarounds\" above).\n\n## 5. Additive integration\n\nWhen chat is already integrated via V6. The skill:\n\n- Adds `.enableCalling()` to the existing `UIKitSettings.Builder()` chain.\n- Adds the four `FOREGROUND_SERVICE_*` permissions to manifest.\n- Mounts `CometChatIncomingCall` at the root of the existing Activity (Compose: in `setContent`; Views: in the root layout XML).\n- Wires call buttons inline — `CometChatMessageHeader` (V6) already renders them; the kit calls `initiateCall` automatically when calling is enabled.\n- VoIP push: opt-in (asks user).\n\n## 6. Anti-patterns\n\n1. **Treating V6 calls as a separate module.** No `com.cometchat:calls-sdk-android` dependency on V6 — adding it pulls a V5 module that conflicts at runtime. The setup is just `.enableCalling()`.\n2. **Mounting `CometChatIncomingCall` inside the navigation graph.** Disappears on navigation events. Mount at root (rule 1.7).\n3. **Activity theme not inheriting `CometChatTheme.DayNight` for V6 Kotlin Views.** Calls components extend `MaterialCardView` and crash with `Failed to resolve attribute at index N` if hosted in `Theme.AppCompat.*`. Compose surfaces are not affected. Already documented in `cometchat-android-v6-troubleshooting`; surfaced here because calls components are the canary that exposes the bug.\n4. **Skipping the four `FOREGROUND_SERVICE_*` permissions** because the kit \"already\" registers the service. Manifest merge does not pull permissions — your app must declare them.\n5. **Mixing V5 and V6 call types.** The V5 `SessionType.VOICE` and the V6 `CallType.AUDIO` are not interchangeable enums. If you import from `com.cometchat.calls.types.SessionType`, you're pulling V5; V6 uses `CallType` from the unified UIKit package.\n\n## 7. Verification checklist\n\n- [ ] `chatuikit-compose-android` OR `chatuikit-kotlin-android` (NOT both) in `app/build.gradle.kts` — V6 picks one surface\n- [ ] `.enableCalling()` on `UIKitSettings.Builder()`\n- [ ] Activity theme is `CometChatTheme.DayNight` (Kotlin Views only)\n- [ ] All four `FOREGROUND_SERVICE_*` permissions in `AndroidManifest.xml`\n- [ ] All four call permissions (RECORD_AUDIO / CAMERA / POST_NOTIFICATIONS / MANAGE_OWN_CALLS)\n- [ ] `CometChatIncomingCall` mounted at root (Compose: outside nav graph; Views: top-level FrameLayout)\n- [ ] **Standalone only:** ConnectionService + FCM service registered\n- [ ] **Standalone only:** PhoneAccount registered in `Application.onCreate`\n- [ ] Real device: outgoing call → audio + video two-way\n- [ ] Real device: incoming call rings on lock screen\n- [ ] Hangup releases camera + mic within 2 seconds\n- [ ] On Android 14+: ongoing-call notification visible, swipe-up doesn't kill the call\n\n## 8. Pointers\n\n- `cometchat-android-v5-calls/references/` — VoIP push, foreground service, ConnectionService, FCM payload shape — all unchanged on V6\n- `cometchat-android-v6-builder-settings` — every UIKitSettings option including calling block details\n- `cometchat-android-v6-{compose,kotlin}-components` — full surface-specific component catalogs\n- `cometchat-android-v6-production` — token endpoints, ProGuard rules\n- `cometchat-android-v6-troubleshooting` — V6 Kotlin Views theme parent crash diagnostic","tags":["cometchat","android","calls","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react"],"capabilities":["skill","source-cometchat","skill-cometchat-android-v6-calls","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-android-v6-calls","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (20,940 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:45.887Z","embedding":null,"createdAt":"2026-05-18T07:04:17.582Z","updatedAt":"2026-05-18T19:04:45.887Z","lastSeenAt":"2026-05-18T19:04:45.887Z","tsv":"'-05':31,79 '-12':32,80 '/.gradle/caches':771 '/calls':2053 '/docs/calls/android/overview':790 '/meet':1930 '/meet/':1971 '/ongoing-call':2054 '/profile':2052 '/references':2491 '/references/voip-calling.md':1208 '1':50,800,1612,1912,2209 '1.0':825 '1.1':1019 '1.2':1170,1181,2107 '1.3':1229 '1.4':1317 '1.5':1372 '1.6':1395 '1.7':1446,2060,2256 '1.8':1485 '12':74,942 '13':1466 '14':943,1345,2470 '17.0.0':1258 '2':1577,1641,1923,2241,2466 '2.0':1271 '2026':30,78 '23.0.0':1266 '28':1458 '3':72,1656,1722,1932,2257 '4':1859,1954,2310 '4a':1879 '4b':2023 '5':486,1429,1966,2135,2335 '5.0':112,169,684 '5.0.0':142,232 '5.0.1':527,544 '6':2205 '6.0':162,672,1249 '6.0.0':28,64,518,767,1090 '7':2370 '8':2484 'aar':127,147,650 'accept/reject':1793 'access':1047 'across':997,1368 'activ':1123,1568,1671,1779,2170,2258,2393 'actual':321 'ad':2226 'add':663,1283,1613,1657,2147,2154 'addit':2136 'advertis':121,626 'affect':2289 'agp':1272 'alreadi':589,1594,1605,2141,2186,2290,2320 'also':860 'alway':662,1468 'andr':55 'android':3,12,27,63,73,111,141,161,168,213,231,526,543,560,569,594,615,645,671,677,683,721,734,748,766,777,805,941,950,1185,1205,1248,1344,1386,1465,1592,1600,1668,1708,1718,1840,1847,1895,1910,2222,2295,2376,2381,2469,2488,2506,2519,2532,2541 'androidmanifest.xml':1655,1955,2406 'androidtest':1315 'androidview':1935 'androidx.compose.ui':601 'annot':173,197,1233,1256,1265,1293 'annotations-java5':172,196,1232,1255,1292 'anti':717,2207 'anti-pattern':716,2206 'api':871,1219 'apikey':958 'app':95,656,1359,1489,1624,1967,2331 'app/build.gradle.kts':1285,1596,2385 'app/src/main/java/com/cometchat/calls/cometchatrtcview.java':265 'app/src/main/java/com/cometchat/calls/model/rtccallback.java':299 'app/src/main/java/com/cometchat/calls/model/rtcreceiver.java':285 'app/src/main/java/com/cometchat/calls/model/rtcuser.java':271 'appcompatact':2082 'appli':85,1437,2007,2129 'applic':1913 'application.oncreate':151,659,2443 'appnavig':1543 'architectur':1174 'aren':1692 'arg':479,1148 'arg1':545 'arg2':547 'arg3':549 'artifact':89,769,1309 'ask':2203 'attempt':100,249 'attr':1690 'attribut':2277 'audio':2412,2448 'auth':845,855,864,874,902,913,965,1376,1631 'authtoken':948 'auto':1790 'auto-dismiss':1789 'automat':1332,2193 'avatar':284 'backend':969 'bad':494 'bar':1762 'base':582 'beta':14,88,562 'beta2':768 'binding.callbuttons.setuser':1826 'block':745,2515 'boundari':1370 'box':1540 'broken':475,1085,1999 'brought':1267 'bug':2309 'build':179,1230,1275,1640 'buildconfig.cometchat':1623,1627,1630 'builder':690,736,1720,2508 'bundl':122,627,1535 'button':472,1115,1756,2182 'bytecod':132,216,537 'bytecode-confirm':536 'c':1157,1161 'call':5,7,53,99,109,123,139,166,229,248,253,338,378,407,426,427,436,444,467,477,505,507,528,533,557,567,613,628,643,681,693,699,711,744,779,826,840,861,870,872,898,973,991,1042,1055,1122,1137,1138,1143,1151,1158,1187,1207,1349,1547,1586,1603,1614,1637,1651,1734,1778,1781,1877,1889,2003,2181,2191,2195,2212,2220,2267,2301,2340,2409,2418,2447,2456,2473,2483,2490,2514 'callback':888,975 'callbacklisten':1949 'callmanag':208,215,316 'callpermissionshandl':1475 'callroom':1933 'calls-sdk-andr':52 'calls-sdk-android':108,138,165,228,612,642,680,2219 'callsettingsbuild':1795 'callsexcept':885,928 'calltyp':2364 'calltype.audio':2348 'callus':920,921 'camera':1355,1411,1956,2413,2463 'camera-light':1410 'camera/mic/end':1800 'canari':2305 'cannot':876 'canon':1440 'captur':370,1094 'card':1767 'catalog':757,1833,2529 'chain':2153 'chang':481,818 'chat':204,211,484,524,541,850,891,894,1001,1033,1381,1872,1920,2139 'chat-sdk':203,483 'chat-sdk-android':210,523,540 'chatuikit':25,61,120,146,159,328,516,624,649,669,675,763,1088,1246,1589,1894,1918,1978,1997,2040,2374,2379 'chatuikit-android':1893 'chatuikit-compos':515,1087 'chatuikit-compose-android':24,60,158,668,1245,2373 'chatuikit-kotlin-android':674,2378 'checklist':2372 'claim':621 'class':135,177,183,201,269,275,289,309,637,1056,1237,1280,1528,1914,2124 'classnotfoundexcept':154,661 'classpath':618,1316,1608 'cleanup':1397,1416,1951 'code':333,1070,1825 'cohort':837 'cold':1009 'com.cometchat':157,164,641,667,679,2125,2218 'com.cometchat.calls':219,267,1907 'com.cometchat.calls.core':236 'com.cometchat.calls.core.cometchatcalls':129,634,881 'com.cometchat.calls.core.cometchatcalls.startsession':330 'com.cometchat.calls.exceptions.cometchatexception':883 'com.cometchat.calls.model':273,287,301 'com.cometchat.calls.model.calluser':887,977 'com.cometchat.calls.types.sessiontype':2357 'com.cometchat.chat.core.call':1073 'com.cometchat.chat.models.user':944,979 'com.cometchat.chatuikit.calling.compose':1748 'com.cometchat.chatuikit.calling.views':1812 'cometchat':2,6,252,566,593,710,720,733,747,776,1184,1204,1385,1599,1667,1707,1717,1839,1846,2294,2487,2505,2518,2531,2540 'cometchat-android-v5-calls':775,1183,1203,2486 'cometchat-android-v6':746,2517 'cometchat-android-v6-builder-settings':732,1716,2504 'cometchat-android-v6-calls':1 'cometchat-android-v6-compose-components':1838 'cometchat-android-v6-core':592,719,1598,1706 'cometchat-android-v6-kotlin-components':1845 'cometchat-android-v6-production':1384,2530 'cometchat-android-v6-troubleshooting':1666,2293,2539 'cometchat-cal':565,709 'cometchat.callbacklistener':422,905,1153 'cometchat.getloggedinuser':1012 'cometchat.initiatecall':419,1035,1150 'cometchat.login':853,900 'cometchatcallactivity.companion.launchoutgoingcallscreen':442,1159 'cometchatcallactivity.launchoutgoingcallscreen':453 'cometchatcallbutton':344,351,1106,1751,2070,2101 'cometchatcalllog':1802 'cometchatcalls.callbacklistener':916 'cometchatcalls.init':1915 'cometchatcalls.joinsession':1945 'cometchatcalls.login':862,911 'cometchatconstants.call':416 'cometchatconstants.receiver':409 'cometchatexcept':450,934,1167 'cometchatincomingcal':1493,1550,1768,2057,2092,2163,2243,2419 'cometchatmessagehead':2184 'cometchatongoingcal':1404,1794 'cometchatongoingcallservic':1330,1962 'cometchatoutgoingcal':1780 'cometchatrtcview':220,270 'cometchatthem':1539,2066 'cometchattheme.daynight':1679,2085,2262,2396 'cometchatuikit.init':632 'compil':988,1313 'compon':752,756,1065,1399,1681,1723,1735,1830,1832,1843,1850,1986,2268,2302,2523,2528 'component-by-compon':1829 'componentact':1530 'compos':15,26,62,126,160,354,391,473,517,575,670,726,750,764,1089,1247,1405,1421,1499,1525,1590,1698,1724,1747,1749,1808,1842,1925,1934,2041,2171,2285,2375,2423,2521 'compose.material3':603 'composit':375 'configur':1305,1615 'configurations.all':191,1287,1300 'confirm':538 'conflict':1238,1260,2233 'connectionservic':1175,1196,1218,1897,1965,1980,2104,2434,2496 'constructor':478 'contact':1766 'contain':1572,1948 'context':397,443,1160 'contract':1023 'control':1801 'copi':2109 'core':596,723,1602,1710 'correct':441,469 'crash':96,152,657,2272,2549 'creat':257 'custom':1069,1425 'data':500 'declar':1342,2333 'deep':1973 'deep-link':1972 'dep':117,150,189,654,1243 'depend':606,665,2223 'despit':619 'detail':1702,2516 'detect':729 'determin':590,1742 'dev':961 'devic':2445,2454 'diagnost':2550 'dial':363,1102 'differ':332,780,1581,1815 'direct':1074,1124 'disappear':2248 'dismiss':1791 'dispatch':712,816,1382 'disposableeffect':1420,1950 'doc':787,793 'document':2291 'doesn':47,1191,2479 'dozen':1277 'driven':2029 'drop':238 'dual':1021,2035 'dual-sdk':1020,2034 'duplic':176,182,1236,1279 'duplicate-class':175,1235 'e':449,927,933,1166 'e/callmanager':251 'empti':258 'enabl':2197 'enablecal':1634,2148,2240,2390 'end':20,22,67,69 'end-to-end':19,66 'endpoint':1393,2536 'ensur':1642 'enum':2352 'equival':1559 'era':226 'err':493 'event':2251 'everi':377,738,1008,1100,2510 'everyth':234,1554 'exclud':178,192,1240,1288,1296 'exist':1061,1837,2151,2169 'explicit':51 'expos':947,1492,2307 'extend':1682,2081,2269 'extens':700 'facad':1052 'factori':1936 'fail':180,496,1273,2274 'fcm':1176,1214,1900,2105,2435,2497 'fcm-for-voip':1899 'fetch':963 'find':311 'fire':250,1944 'first':98,247,367,374,708,869,896,1096 'first-rend':1095 'five':39,56,82,1126,1733,2131 'flip':1636 'floor':1459 'flow':581,1481 'foreground':1318,1346,1350,1353,1645,1959,2118,2157,2314,2402,2494 'found':256 'four':1644,1650,2156,2313,2401,2408 'fragment':2099 'fragmentcontainerview':2087 'framelayout':1565,2097,2431 'full':456,1132,1828,2524 'fun':392,424,447,907,918,925,931,1155,1164,1532 'give':984 'global':371,1099 'grade':554 'graph':607,1517,1546,2050,2247,2426 'ground':758 'group':193,1109,1289,1753,1783 'hand':428 'handl':454,1400,1408,1799 'hangup':1396,2461 'hard':714,784,803,1434 'hardwar':940 'hide':1066 'histori':1805 'hold':2048 'host':1575,1673,2100,2282 'iconbutton':403,1134 'id':1625 'ident':1177 'ignor':355 'immun':1701 'implement':156,163,666,678,1201,1441,2108 'import':608,880,882,886,980,1027,1072,1744,2355 'in-cal':465 'includ':742,2513 'incom':2455 'incomingcal':1486 'index':2279 'inflat':1817 'inherit':1677,2261 'init':702,730,1704,1922 'initi':1788 'initiatecal':2192 'inlin':2183 'insid':1506,2244 'instal':762 'integr':9,1806,1861,1873,2000,2137,2142 'interchang':2351 'interfac':303 'intern':1062 'invok':322 'java':264 'java5':174,198,1234,1257,1294 'joinsess':462 'keep':2123 'key':856,865,903,914,1632 'kill':2481 'kit':45,349,432,1118,1335,1445,1472,1687,1985,2020,2028,2190,2319 'kit-driven':2027 'kit-specif':1686 'kotlin':16,155,190,390,488,577,664,676,751,765,879,1081,1270,1286,1406,1523,1556,1591,1618,1660,1726,1810,1849,2077,2265,2380,2397,2522,2545 'launch':998 'launchedeffect':1942 'layout':1570,2178 'leak':1310 'legaci':188,207,218,262,1253,1308 'let':315 'level':133,1223,1498,1564,2063,2430 'lifecycl':457 'light':1412 'like':999 'line':1282 'link':1968,1974 'live':136,639,1834 'load':317,563,2022 'local':313,1786 'localcontext.current':398 'lock':2459 'login':828,895,899,996,1006 'mainact':1513,1529,1924,2044,2080 'mainactivity.kt':1524 'manag':1323,2416 'mandatori':1239 'manifest':1337,1361,1362,2116,2161,2324 'market':620 'match':1854 'materialcardview':1683,2270 'matter':415 'may':794 'mean':1460 'meet':1884 'meeting-room':1883 'merg':1338,1363,2325 'mic':1414,2464 'mic-releas':1413 'microphon':1352,1957 'microphone/camera':1961 'minsdk':1457 'mint':461,1375 'mismatch':986 'mix':2336 'mode':713,1503,1527,1878,1882,1982,2026 'model.rtccallback':223 'model.rtcreceiver':222 'model.rtcuser':221 'modern':1263 'modifi':1541,1551,1769 'modifier.fillmaxsize':1542,1552 'modul':195,254,781,798,1291,1369,1587,2216,2231 'mount':1487,1504,1772,2162,2242,2252,2420 'move':233 'must':83,691,859,1075,1297,1341,1430,1676,2332 'n':2280 'name':282,296,1740,1814,2076 'nativ':11,559 'nav':1545,2049,2089,2425 'navhost':1928 'navig':1516,1809,2246,2250 'need':611 'negoti':813 'never':320,1983 'next':2071 'next.js':75 'non':41,812,1016 'non-negoti':811 'non-nul':1015 'non-obvi':40 'note':791 'noth':1775 'notif':1462,2415,2474 'null':445,878,1017,1110,1162 'object':421,904,915,1152 'obvious':42 'onclick':404,1135 'oncreat':1533 'ondetachedfromwindow':1423 'one':102,1080,1199,2388 'onerror':448,926,932,1165 'ongo':2472 'ongoing-cal':2471 'ongoingcal':1426 'onitemclick':1803 'onsuccess':306,425,908,919,1156 'opt':2201 'opt-in':2200 'option':687,739,1713,1715,2512 'option-by-opt':1712 'order':414,480,731,1149,1705 'org.jetbrains':194,1254,1264,1290 'org.jetbrains.annotations':184,1281 'otherwis':1549 'outgo':406,420,435,1121,2446 'outgoing-cal':434,1120 'outsid':1514,2424 'overlay':1553,1773,2058 'overload':959 'overrid':423,446,906,917,924,930,1154,1163,1531 'packag':266,272,286,300,625,1816,2369 'pagin':1804 'paramet':1739 'parent':1663,2548 'part':439 'path':227,263,334,2042,2079 'pattern':718,1133,1394,2208 'payload':1215,2498 'peer':35,76,116,653 'per':358 'per-row':357 'permiss':1356,1367,1447,1647,1652,1958,2117,2120,2159,2316,2329,2404,2410 'persist':995 'person':388,1105 'phone':1348 'phoneaccount':2440 'pick':1077,2387 'pixel':71 'place':106 'platform':1222 'platform-level':1221 'plus':1454 'pointer':2485 'post':1461,2414 'prerequisit':1231 'presenc':599 'problem':1057 'product':553,971,1388,1863,2534 'production-grad':552 'profil':2067,2098 'programmat':1821 'proguard':2121,2537 'project':587,1856 'prompt':1464 'prop':361 'public':268,274,277,288,291,302,786 'pull':519,1250,1366,2228,2328,2360 'purpos':551,1750 'push':1172,1784,1988,2038,2103,2199,2493 'rational':1449,1483 're':319,1005,2014,2359 're-login':1004 'read':704,1852 'readi':923 'real':337,939,2444,2453 'receiv':510,530,1140 'receivertyp':548 'receiveruid':506,529,546 'record':2411 'refer':128,209,217,633,796,1200,1685 'references/call-session.md':1953 'references/voip-calling.md':2112 'regardless':379 'region':1628 'regist':697,1331,2321,2437,2441 'registr':1963 'relativelayout':1938 'releas':1415,2462 'relev':2016 'rememb':1940 'remember-st':1939 'render':368,1097,1774,2187 'replic':1431 'request':495,504,1480 'requir':57,115,170,685,1127,1469,2132 'resolv':2276 'result':308 'return':492,976,1013 'right':893,1079,1111 'ring':385,458,1031,1888,2025,2457 'room':1885 'root':1490,1510,1771,2166,2177,2254,2422 'root-mount':1770 'rout':572,1030,1975,2056 'row':359,382,399,1101 'rtccallback':304 'rtcreceiv':290,292 'rtcuser':276,278 'rule':715,785,804,1180,1435,1664,2059,2106,2122,2255,2538 'run':1477 'runtim':324,631,1312,1463,2235 'savedinstancest':1534,1537 'scaffold':1911 'screen':437,1521,2068,2460 'sdk':54,110,140,167,205,212,230,485,525,542,614,644,682,760,827,841,851,974,992,1002,1022,1034,1043,1226,1890,1904,1909,1921,2004,2036,2221 'sdk-android':1908 'sdk-version-specif':1225 'second':2467 'section':1428 'see':412,1091,1125,1146,1383,1952,2130 'sent':501 'separ':847,1585,2215 'server':491,1374 'server-mint':1373 'servic':1319,1347,1351,1354,1646,1960,2119,2158,2315,2323,2403,2436,2495 'session':1039,1881,1981,2011 'session-on':2010 'sessionid':1796,1931,1943,1946,2055 'sessionsettingsbuild':130,635 'sessiontype.voice':2344 'set':737,1451,1620,1721,1947,2509 'setappid':1622 'setauthkey':1629 'setcont':1507,1538,1926,2046,2173 'setenablecal':694 'setregion':1626 'setup':1578,2237 'seven':802,810 'shape':725,782,1025,1216,2499 'ship':49,90,1193,1327,1473,1730 'sibl':773,2091 'simpler':1026 'skill':707,774,1610,1851,2146 'skill-cometchat-android-v6-calls' 'skip':2311 'slot':1764 'sourc':244,761 'source-cometchat' 'special':807 'specif':755,1228,1304,1688,2527 'split':799,1875 'stabl':1941 'standalon':1502,1526,1860,1880,2009,2024,2432,2438 'standard':1479 'start':1010 'state':372,846 'step':832 'still':610,692,795,1029,1060,1076,1340,1436 'string':279,281,283,293,295,297,1484 'stub':200,241,259 'style':490 'sub':580 'sub-flow':579 'subscribepresenceforallus':1633 'succeed':857 'super.oncreate':1536 'surfac':339,451,468,585,754,929,935,1168,1427,1699,1729,1741,1858,2286,2298,2389,2526 'surface-specif':753,2525 'surpris':936 'surviv':1520 'swipe':2477 'swipe-up':2476 'symptom':376 'tap':384 'telecom':2037 'text':400,452,1169 'theme':1662,1672,1689,2064,2084,2259,2394,2547 'theme.appcompat':1695,2284 'theme.materialcomponents':1697 'throw':873 'time':703,989 'token':460,875,966,1377,1392,2535 'token-endpoint':1391 'top':1497,1563,1761,2062,2429 'top-bar':1760 'top-level':1496,1562,2061,2428 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'touch':1984 'trail':1763 'transit':187,463,521,1242,1522 'treat':2210 'tree':245 'tri':953 'troubleshoot':1670,2297,2543 'true':695 'truth':759 'two':1054,2451 'two-way':2450 'type':298,410,417,508,511,531,534,550,889,983,985,1141,1144,1320,2341 'typic':1757 'ui':459,602 'uid':280,294,854,863,901,912,957 'uikit':1190,1322,2368 'uikit-manag':1321 'uikitset':689,724,741,1617,1711,2511 'uikitsettings.builder':1621,2152,2392 'unchang':1210,1378,2113,2501 'unifi':1050,2367 'use':329,343,588,955,1084,1116,1746,2363 'user':352,353,360,365,394,395,411,512,532,892,909,910,1018,1098,1107,1108,1142,1752,1782,1787,1827,2074,2204 'user.authtoken':954 'user.name':401 'user.uid':402,408,1139 'userrow':393 'ux':1886 'v3':225 'v3-era':224 'v4':489 'v5':513,772,778,797,833,836,839,1059,1179,1186,1206,1380,1453,1906,2111,2230,2337,2343,2361,2489 'v6':4,8,13,87,119,327,561,571,595,609,623,722,735,749,792,806,817,1028,1051,1064,1189,1212,1325,1326,1387,1398,1403,1455,1471,1491,1580,1582,1601,1635,1659,1669,1674,1680,1703,1709,1719,1841,1848,1871,1992,2019,2039,2115,2144,2185,2211,2225,2264,2296,2339,2347,2362,2386,2503,2507,2520,2533,2542,2544 'val':396,405,1136,1619 'valid':29,65,498 'verif':310,2371 'verifi':937 'version':570,1227 'via':1048,1333,1417,1818,2143 'video':418,509,535,556,1145,1755,1866,2449 'view':17,578,728,1407,1424,1500,1557,1661,1675,1727,1798,1811,2078,2093,2174,2266,2398,2427,2546 'visibl':2475 'voic':555,1754,1865 'voice-video':1864 'void':305 'voip':1171,1902,2102,2198,2492 'vs':727,1725 'w1':107,1990,2031,2126 'w2':171 'w3':199 'w4':340,1092,1129 'w5':413,476,1147,1991,2032,2127 'way':2452 'web':34 'webrtc':1038,1797 'whichev':364,1853 'wire':345,1112,2180 'within':2465 'without':91,101,148,240,651,866 'work':18,440,1209 'workaround':43,58,389,1128,1993,2033,2128,2133 'wrap':1937 'write':1198 'wrong':982 'www.cometchat.com':789 'www.cometchat.com/docs/calls/android/overview':788 'x':487 'xml':1371,1571,1819,1822,2179 'yet':1874 'yourapp.com':1970 'yourapp.com/meet/':1969","prices":[{"id":"56778a77-b41a-4f37-9a76-bb1478e6587c","listingId":"d84a497c-4a31-4631-ad3a-bff2d3c31583","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T07:04:17.582Z"}],"sources":[{"listingId":"d84a497c-4a31-4631-ad3a-bff2d3c31583","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-android-v6-calls","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-calls","isPrimary":false,"firstSeenAt":"2026-05-18T07:04:17.582Z","lastSeenAt":"2026-05-18T19:04:45.887Z"}],"details":{"listingId":"d84a497c-4a31-4631-ad3a-bff2d3c31583","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-android-v6-calls","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"975e2c21aa325a20f0266d24adc0c5bdc0101ceb","skill_md_path":"skills/cometchat-android-v6-calls/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-calls"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-android-v6-calls","license":"MIT","description":"CometChat Calls v6 integration for native Android (V6 beta — Compose + Kotlin Views). Works end-to-end on chatuikit-compose-android:6.0.0 (validated 2026-05-12 against web peer) — but only with FIVE non-obvious workarounds the kit itself doesn't ship: (1) explicit `calls-sdk-android:5.0.+` peer dep, (2) `annotations-java5` exclude, (3) stub classes for legacy `com.cometchat.calls.{CometChatRTCView, model.RTCUser, model.RTCReceiver, model.RTCCallback}` to satisfy chat-sdk's CallManager bytecode, (4) AVOID `CometChatCallButtons` (broken — captures first-rendered user globally; ignores per-row prop) — instead wire your own button → `CometChat.initiateCall` → `CometChatCallActivity.Companion.launchOutgoingCallScreen(context, call, null)`, (5) `Call` constructor arg order CHANGED in chat-sdk 5.x: `(receiverUid, receiverType, type)` not `(receiverUid, type, receiverType)`. Covers UIKitSettings calling configuration, surface-aware Compose+Views routing, foreground service correctness on Android 14+, ConnectionService + FCM VoIP push.","compatibility":"Android Studio Hedgehog+, JDK 17, Gradle 8+, AGP 8+, minSdk 28+ (V6 raised the floor); chatuikit-compose-android:6.0.+ OR chatuikit-kotlin-android:6.0.+ PAIRED with com.cometchat:calls-sdk-android:5.0.+ (peer dep required despite the V6 marketing — see §1.0)"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-android-v6-calls"},"updatedAt":"2026-05-18T19:04:45.887Z"}}