Android Development
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
Adds voice and video calling to an Android app in Kotlin with the headless CometChat Calls SDK v5, covering meeting-style rooms, 1:1 ringing calls, call logs and recording.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdk --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .claude/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .claude/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdkType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdk --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .agents/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .agents/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdk --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .cursor/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .cursor/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cometchat/cometchat-skills.git --path skills/cometchat-android-v5-calls-sdk--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdk --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .gemini/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .gemini/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdkInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .github/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .github/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v5-calls-sdk --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/cometchat-android-v5-calls-sdk .opencode/skills/cometchat-android-v5-calls-sdk && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-android-v5-calls-sdk" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v5-calls-sdk into .opencode/skills/cometchat-android-v5-calls-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v5-calls-sdk", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cometchat-android-v5-calls-sdkAdds voice and video calling to an Android app in Kotlin with the headless CometChat Calls SDK v5, covering meeting-style rooms, 1:1 ringing calls, call logs and recording.
This skill wires the headless CometChat Calls SDK v5 (calls-sdk-android 5.0.4) into an Android app without the UI Kit, so you build the call screen yourself. The Kotlin flow runs initFromSettings, login, generateToken and joinSession into a RelativeLayout, with listeners bound to the lifecycle. It supports meeting-style session rooms joined by session id and 1:1 ringing calls, where the Chat SDK v5 handles signaling and the Calls SDK handles media. Call logs, layouts, audio modes, recording, picture-in-picture and a background service are covered too.
The skill treats a closed method catalog and the installed AAR as the source of truth, and where the docs and the AAR disagree the AAR wins. Changes are additive wiring appended to your app, and builder options and callback lists are fetched from the docs instead of recalled from memory. Four build gates are called out: minSdk 26 from the manifest merge, a service entry in the manifest, Jetifier for the ringing path, and heap size. Reference files cover pitfalls, ringing, user switching and the method map. If you want the prebuilt call UI, the sibling v6 skills fit better.
Read from SKILL.md and the folder at commit 911b108. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxnodenpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
dl.cloudsmith.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ERROR_AUTH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Android minSdk >=26 (TRUE transitive floor of calls-sdk-android 5.0.x — react-native-svg declares 26; docs now agree); compileSdk >=35 (androidx.core 1.15.0 fails checkDebugAarMetadata at 34; match your androidx); Kotlin >=1.9 / AGP >=8; JVM target 11; com.cometchat:calls-sdk-android ^5 (5.0.x, verified 5.0.4). 1:1 ringing also needs com.cometchat:chat-sdk-android ^5 (5.0.5) for signaling. Kotlin (XML Views or Compose host via AndroidView).
From compatibility in the SKILL.md frontmatter.
CometChat Android Calls SDK v5 loads about 5.2k tokens when it runs, and up to ~15k if it reads all its reference files. Until then it costs about 169 tokens; SKILL.md has 1,272 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cometchat/cometchat-skills at commit 911b108, republished under its MIT licence (© cometchat). 1,272 words, ~5,208 tokens.
.claude/skills/cometchat-android-v5-calls-sdk/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Ground truth:
com.cometchat:calls-sdk-android:5.0.4+ catalogandroid-calls-v5.json(the CLOSED list,javap-verified on the installed AAR). Docs:/calls/android/**= v5 · Docs MCP. Fetch builder options, callback lists and filters from the docs (references/docs-map.md) — never memory. ⚠️ Where docs and AAR disagree, the AAR wins (drift list inreferences/pitfalls.md). APPEND to the user's app — additive wiring only (RULES.md). HEADLESS path (no UI Kit); for the prebuilt call UI usecometchat-android-v6-calls.
-core sibling.com.cometchat:chat-sdk-android:5.0.5) for signaling — references/ringing.md; deeper Chat-SDK usage: cometchat-android-v5-sdk.cometchat-android-v6-core + cometchat-android-v6-calls, not this skill."add calling from scratch / without the UI Kit", "standalone voice/video on Android", "build my own call screen", "headless calls SDK", "meeting room join by session id", "one-on-one ringing call". Precondition: the caller chose the from-scratch / standalone path (prebuilt call UI ⇒ see Companion skills).
// settings.gradle(.kts) → dependencyResolutionManagement.repositories
maven("https://dl.cloudsmith.io/public/cometchat/cometchat/maven/")
// app/build.gradle.kts
implementation("com.cometchat:calls-sdk-android:5.0.4") // meet-style needs ONLY this (+ the two RN lines below)
implementation("com.cometchat:chat-sdk-android:5.0.5") // + this for 1:1 RINGING (signaling)
implementation("com.facebook.react:react-android:0.77.2") // the SDK's embedded RN runtime — see "SoLoader" below
implementation("com.facebook.soloader:soloader:0.12.1") // (versions = what calls-sdk-android 5.0.4 pulls)# gradle.properties — REQUIRED for the 1:1 RINGING path (chat-sdk-android 5.0.5 still pulls android.arch.lifecycle:extensions:1.1.1 → support-compat 26.1.0)
android.useAndroidX=true
android.enableJetifier=true
org.gradle.jvmargs=-Xmx4096m # REQUIRED: Jetifier transforms the embedded react-android AAR — the AS-default -Xmx2048m OOMs (AUDIT-225)<!-- AndroidManifest.xml, inside <application> — REQUIRED for background handling: the AAR declares NO <service> -->
<service android:name="com.cometchat.calls.services.CometChatOngoingCallService"
android:exported="false"
android:foregroundServiceType="camera|microphone|mediaPlayback" />Full error-text evidence for the four build gates below (minSdk,
<service>, Jetifier, heap):references/build-truth.md.
calls-sdk-android:5.0.4 pulls react-native-svg at minSdkVersion 26; a 24/25 app fails process*MainManifest. Docs now agree (AUDIT-229) — raise minSdk first.<service> above is REQUIRED. The 5.0.4 AAR merges permissions only; without YOUR declaration CometChatOngoingCallService.launch(activity) fails silently (call dies on Home). Docs ship the <service> block (corrected upstream, verified 2026-09-09).android.enableJetifier=true, an AndroidX app + chat-sdk-android fails checkDebugDuplicateClasses. Meet-style needs none.-Xmx4096m (MANDATORY — the FIRST build OOMs, meet-style too, AUDIT-225). The AS-default -Xmx2048m OOMs Jetifier transforming the embedded react-android AAR; the gradle.properties line above fixes it.joinSession path). The call surface is an embedded React Native 0.77; without the merged-mapping init joinSession crashes the process (UnsatisfiedLinkError: … "libhermes_executor.so" not found). Add ONCE, first in Application.onCreate() (hence the two RN artifacts on YOUR compile classpath):import com.cometchat.calls.core.CometChatCalls
import com.facebook.react.soloader.OpenSourceMergedSoMapping
import com.facebook.soloader.SoLoader
SoLoader.init(this, OpenSourceMergedSoMapping) // Application.onCreate(), BEFORE CometChatCalls.initFromSettings — idempotent<service> above. Java 11 compileOptions.CAMERA + RECORD_AUDIO (video) / RECORD_AUDIO (voice) before joinSession. Denied ⇒ tell the user; never join silently muted.app/src/main/assets/cometchat-settings.json (same file the chat core uses; shape → references/docs-map.md § DOCS-GAP). Fetch via the CLI — npx @cometchat/skills-cli@3 auth login → provision use --app-id <id> --json (@3 pins the CLI major that matches the v5 skills) — or paste from Dashboard → Credentials. Mint auth tokens server-side for production; never ship the Auth Key.CometChatCalls.initFromSettings(context, listener) resolves (onSuccess) → CometChatCalls.login(uid, authKey, …) (dev) or login(authToken, …) (prod) resolves → then generateToken / joinSession / listeners. Nothing joins before init+login resolve; before init every call fails with ERROR_COMETCHAT_CALLS_SDK_INIT.
initFromSettings — the ai-agent/telemetry-attributed path (integrationSource="ai-agent", parallel to CometChat.initFromSettings; RULES §5, AUDIT-175). It reads assets/cometchat-settings.json (appId, region, optional callsSDK hosts). Intentionally undocumented (@nodoc); the documented CometChatCalls.init(context, CallAppSettings.CallAppSettingBuilder(...).build(), listener) is the FALLBACK only.authKey is read back out of the same asset (credentials.authKey) — never a second copy. Skip login only when getLoggedInUser()?.uid == uid — a DIFFERENT uid ⇒ logout → RE-INIT → login (references/user-switch.md); != null alone calls as the PREVIOUS user. Init ONCE, in Application.onCreate().import com.cometchat.calls.core.CometChatCalls
import com.cometchat.calls.exceptions.CometChatException
import com.cometchat.calls.model.CallUser
import org.json.JSONObject
// Call from Application.onCreate(); it re-enters itself after a user-switch logout.
fun initThenLogin(uid: String) {
CometChatCalls.initFromSettings(this, object : CometChatCalls.CallbackListener<String>() { // telemetry default; init(context, CallAppSettings, …) is the doc fallback
override fun onSuccess(result: String) {
val current = CometChatCalls.getLoggedInUser()
if (current?.uid == uid) return // SAME user — already logged in
if (current != null) { // DIFFERENT user — NOT `!= null` → login (that calls as the PREVIOUS user)
CometChatCalls.logout(object : CometChatCalls.CallbackListener<String>() {
// logout leaves isInitialized()==false → RE-INIT before login (ringing: CometChat.logout too — references/user-switch.md)
override fun onSuccess(msg: String) = initThenLogin(uid)
override fun onError(e: CometChatException) { /* surface e.code — never continue as the old user */ }
})
return
}
// dev: login(uid, authKey, l) — authKey from the SAME asset; prod: login(authToken, l), token minted server-side.
val authKey = JSONObject(assets.open("cometchat-settings.json").bufferedReader().readText())
.getJSONObject("credentials").getString("authKey")
CometChatCalls.login(uid, authKey, object : CometChatCalls.CallbackListener<CallUser>() {
override fun onSuccess(callUser: CallUser) { /* unlock calling */ }
override fun onError(e: CometChatException) { /* surface e.code + e.message */ }
})
}
override fun onError(e: CometChatException) { /* ERROR_SETTINGS_FILE_NOT_FOUND ⇒ the asset is missing */ }
})
}
initThenLogin(uid)generateToken(sessionId) → joinSession(token, sessionSettings, relativeLayout, …) (or the joinSession(sessionId, …) overload); everyone on the same sessionId shares the call. No ringing.CometChatCalls statics): initFromSettings · init · isInitialized · login(uid, authKey, l) / login(authToken, l) · logout · getLoggedInUser · getUserAuthTokengenerateToken(sessionId, l) → GenerateToken.token · joinSession(token | sessionId, SessionSettings, RelativeLayout, l) → CallSession (startSession/CallSettingsBuilder = v4 path, do not use) · builder CometChatCalls.SessionSettingsBuilder() (setSessionType/setLayout/setAudioMode/…, full list in the reference).CallSession.getInstance()): isSessionActive · leaveSession · lifecycle-bound listeners (addSessionStatusListener(owner, …) + siblings) · clearAllListeners.references/method-map.md): In-call actions (CUSTOM controls only) · Call logs (CallLogRequest) · Transcription & closed captions (v5.0.4+, plan-gated) · Background (CometChatOngoingCallService) · Constants/enums (SessionType/LayoutType/AudioMode/CometChatCallsConstants.*).A curated highlight, NOT the full surface — the AUTHORITATIVE closed list is the
android-calls-v5.jsoncatalog (also transcription/streaming,CometChatCallsEventsListener, the v4-eraCallSettingsBuilder). A symbol is real iff it's in the catalog; then fetch its page viareferences/docs-map.md. Full method map:references/method-map.md.
Every CallSession listener takes a LifecycleOwner and is removed with it — register from joinSession's onSuccess with the Activity/Fragment as owner; no manual remove (clearAllListeners() for hard resets). Still yours by hand: CallSession.getInstance().leaveSession() on teardown, and for ringing CometChat.removeCallListener(ID).
import android.Manifest
import android.os.Bundle
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.cometchat.calls.core.CallSession
import com.cometchat.calls.core.CometChatCalls
import com.cometchat.calls.exceptions.CometChatException
import com.cometchat.calls.listeners.SessionStatusListener
import com.cometchat.calls.model.GenerateToken
import com.cometchat.calls.model.LayoutType
import com.cometchat.calls.model.SessionType
class MeetCallActivity : AppCompatActivity() { // init + login already resolved (Application)
private lateinit var callContainer: RelativeLayout
private val permissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { granted ->
if (granted.values.all { it }) joinRoom(intent.getStringExtra("SESSION_ID") ?: "team-room")
else finish() // tell the user — a call without mic/camera cannot start
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// The SDK renders its ENTIRE call UI into this view — a RelativeLayout with REAL size. No external controls.
callContainer = RelativeLayout(this).apply {
layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
}
setContentView(callContainer)
permissions.launch(arrayOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO))
}
private fun joinRoom(sessionId: String) {
val sessionSettings = CometChatCalls.SessionSettingsBuilder() // fetch more options from /calls/android/session-settings
.setSessionType(SessionType.VIDEO) // ⚠️ setSessionType — the docs' setType() does not exist here
.setLayout(LayoutType.TILE)
.setDisplayName("Me")
.setIdleTimeoutPeriod(120) // alone for 2 min ⇒ onSessionTimedOut
.build()
CometChatCalls.generateToken(sessionId, object : CometChatCalls.CallbackListener<GenerateToken>() {
override fun onSuccess(token: GenerateToken) {
CometChatCalls.joinSession(token, sessionSettings, callContainer, object : CometChatCalls.CallbackListener<CallSession>() {
override fun onSuccess(callSession: CallSession) {
// Listeners are LIFECYCLE-BOUND (owner = this Activity) — register here, after join.
callSession.addSessionStatusListener(this@MeetCallActivity, object : SessionStatusListener() {
override fun onSessionLeft() { finish() }
override fun onSessionTimedOut() { finish() }
override fun onConnectionClosed() { finish() }
})
}
override fun onError(e: CometChatException) { /* show e.code + e.message, then finish() */ }
})
}
override fun onError(e: CometChatException) { /* ERROR_AUTH_TOKEN ⇒ not logged in; show it */ }
})
}
override fun onDestroy() {
if (CallSession.getInstance().isSessionActive) CallSession.getInstance().leaveSession() // never leak a live session
// If you called CometChatOngoingCallService.launch(...), ALSO CometChatOngoingCallService.abort(this) here —
// onSessionLeft is NOT delivered on Activity destroy (BACK), so callback-only abort leaks the FGS (AUDIT-227).
super.onDestroy()
}
}Compose host: the same code inside AndroidView(factory = { RelativeLayout(it) }) filling Modifier.fillMaxSize(); declare the Activity with configChanges (Rotation pitfall, references/pitfalls.md).
Register the CallListener once, globally (Application.onCreate, after CometChat.initFromSettings + CometChat.login — the cometchat-android-v5-sdk recipe) so the callee rings from any screen of a FOREGROUND app. Full recipe (both roles, Kotlin) + the ringing prerequisites: references/ringing.md — initiateCall → peer onIncomingCallReceived → acceptCall/rejectCall → joinSession(call.sessionId) on BOTH sides → hang-up = leaveSession and CometChat.endCall.
onIncomingCallReceived and a backgrounded caller never gets onOutgoingCallAccepted (not replayed on return). Background / killed-app ringing = the VoIP push path (/calls/android/voip-calling). Never promise it from this recipe. Full evidence + the caller-side reconcile (dismiss on timeout, onResume re-check): references/ringing.md.One-liners here; full evidence + reasoning for every one — see
references/pitfalls.md. minSdk-26 floor + missing<service>are in Prerequisites (evidence:references/build-truth.md).
joinSession renders a COMPLETE call UI (mute, camera, switch, audio mode, layout, participants, raise hand, recording, invite, timer, red leave) into your RelativeLayout — no custom control row unless the ask is "replace the controls" (then hideControlPanel(true) FIRST).setType→setSessionType · unMuteAudio→unmuteAudio · unPinParticipant→unpinParticipant · pinParticipant(uid)→(uid, pid) · MediaEventsListener.onScreenShareStarted/Stopped don't exist (they're on ParticipantEventListener) · raiseHand/setLayout/startRecording are no-ops. Per-page notes: references/docs-map.md.joinSession needs a real-sized RelativeLayout; wrap_content/zero size renders invisibly (ERROR_CALLING_VIEW_REF_NULL if null).joinSession crashes libhermes_executor.so not found — SoLoader merged-mapping init missing; see Prerequisites § SoLoader.ERROR_COMETCHAT_CALLS_SDK_INIT / ERROR_AUTH_TOKEN; chain off the callbacks.ERROR_COMETCHAT_CALLS_SDK_INIT after a user switch is MISLEADING (AUDIT-194) — re-init between logout and login: references/user-switch.md.CAMERA + RECORD_AUDIO first.joinSession's onSuccess with a LifecycleOwner.leaveSession without CometChat.endCall leaves the peer in-call; do both.configChanges (+ supportsPictureInPicture); keep alive with CometChatOngoingCallService.launch(activity) (needs the <service>)..abort in onSessionLeft (AUDIT-227) — also CometChatOngoingCallService.abort(this) in onDestroy; abort on EVERY teardown path.raiseHand/lowerHand, mid-call setLayout, startRecording/stopRecording — no effect/callback/error; prefer the SDK's own buttons.joinSession); startSession/CallSettingsBuilder + /calls/v4/android are the OLD tree.android-calls-v5.json (node test-suite/scripts/verify-catalog.mjs).calls-sdk-android:5.0.4 (npm run verify:fences:android-v6); your app builds at minSdk 26 (the manifest merge is the floor check)../gradlew :app:assembleDebug (at minSdk 26), then on an emulator/device: grant mic+camera → joinSession shows the SDK call surface with its own controls → a second device on the same sessionId appears as a tile → Home shows the ongoing-call notification (the <service> works) → leave ends cleanly (onSessionLeft). Ringing: two devices/users, BOTH apps FOREGROUND — accept joins both, hang-up ends both; then background the callee and confirm your outgoing UI times out cleanly (no callback comes). The pack's reviewer proves the round-trip via CallsSmokeTests.© cometchat, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references) in skills/cometchat-android-v5-calls-sdk of cometchat/cometchat-skills.
Open the folder on GitHubat commit 911b108
CometChat Android Calls SDK v5 next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| CometChat Android Calls SDK v5 this skillcometchat/cometchat-skills | 130 | — | ~5.2k | Automated safety check: Pass | MIT | |
| Android Developmentdpconde/claude-android-skill | 336 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Claude Android NinjaDrjacky/claude-android-ninja | 124 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Build Foremannekomangaorg/Neko | 2.8k | — | ~807 | Automated safety check: Pass | Apache-2.0 | |
| Android Audio E2Ehyochan/react-native-nitro-sound | 961 | — | ~814 | Automated safety check: Pass | MIT |
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
Drjacky/claude-android-ninja
Build and migrate Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), Navigation3, and multi-module Gradle.
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
nekomangaorg/Neko
Optimizes Gradle build scripts, compilation times, and Android Studio sync performance.
hyochan/react-native-nitro-sound
Build and run device-backed Android end-to-end checks for react-native-nitro-sound permissions, recording, playback, listeners, pause/resume, seek, speed, audio focus, lifecycle behavior, and rapid…
santimattius/structured-coroutines
Load, when a developer writes, reviews, or debugs Kotlin coroutine code and needs help spotting concurrency bugs — GlobalScope leaks, runBlocking in suspend, missing Flow catch, hardcoded or wrong…
cometchat/cometchat-skills
Builds chat on Android with your own UI against the headless CometChat Chat SDK v5, covering install, Jetifier conflicts, credentials and init-before-login ordering.
cometchat/cometchat-skills
Picks and customizes CometChat's Angular UI Kit components by their verified component list, exact input and output event names, and the surfaces that have no kit component at all.
cometchat/cometchat-skills
Enables or builds CometChat features such as polls, reactions, smart replies and pinned messages in an Angular app, first classifying how much client code each one needs.
cometchat/cometchat-skills
Decides where CometChat chat UI goes in an Angular app: a dedicated route, a dashboard panel, a support widget or the full multi-pane app, with thread and search panels.
cometchat/cometchat-skills
Add voice & video calling to any iOS app FROM SCRATCH with the headless CometChat Calls SDK v5 (CometChatCallsSDK, via Swift Package Manager) — no UI Kit.
cometchat/cometchat-skills
Add voice & video calling to any web app FROM SCRATCH with the headless CometChat Calls SDK v5 (@cometchat/calls-sdk-javascript@5) — no prebuilt UI Kit.
Categories
Adds voice and video calling to an Android app in Kotlin with the headless CometChat Calls SDK v5, covering meeting-style rooms, 1:1 ringing calls, call logs and recording. 4) into an Android app without the UI Kit, so you build the call screen yourself. The Kotlin flow runs initFromSettings, login, generateToken and joinSession into a RelativeLayout, with listeners bound to the lifecycle.
CometChat Android Calls SDK v5 fits situations like: adding standalone video or voice calling to an Android app without the UI Kit; building a custom call screen on the Calls SDK v5; letting users join a meeting room by session id; adding one-on-one ringing calls using Chat SDK signaling.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a claude-code`. Or copy the skill folder (skills/cometchat-android-v5-calls-sdk in cometchat/cometchat-skills) into .claude/skills/cometchat-android-v5-calls-sdk in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a codex`. Or copy the skill folder (skills/cometchat-android-v5-calls-sdk in cometchat/cometchat-skills) into .agents/skills/cometchat-android-v5-calls-sdk in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v5-calls-sdk -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cometchat-android-v5-calls-sdk, .gemini/skills/cometchat-android-v5-calls-sdk, .github/skills/cometchat-android-v5-calls-sdk and .opencode/skills/cometchat-android-v5-calls-sdk in your project.
Going by SKILL.md and its folder, CometChat Android Calls SDK v5 needs the command-line tools its instructions call (npx, node and npm) and credentials named ERROR_AUTH_TOKEN. Our summary lists: Android minSdk 26 or higher and compileSdk 35 or higher; Kotlin 1.9 or later, AGP 8 or later, JVM target 11; com.cometchat:calls-sdk-android 5.x; com.cometchat:chat-sdk-android 5.x for 1:1 ringing. Compatibility (from SKILL.md): Android minSdk >=26 (TRUE transitive floor of calls-sdk-android 5.0.x — react-native-svg declares 26; docs now agree); compileSdk >=35 (androidx.core 1.15.0 fails checkDebugAarMetadata at 34; match your androidx); Kotlin >=1.9 / AGP >=8; JVM target 11; com.cometchat:calls-sdk-android ^5 (5.0.x, verified 5.0.4). 1:1 ringing also needs com.cometchat:chat-sdk-android ^5 (5.0.5) for signaling. Kotlin (XML Views or Compose host via AndroidView)..
SKILL.md names 1 domain. In commands or code: dl.cloudsmith.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
CometChat Android Calls SDK v5 is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 9.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with CometChat Android Calls SDK v5: Android Development (dpconde/claude-android-skill, 336 stars), Claude Android Ninja (Drjacky/claude-android-ninja, 124 stars), Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars) and Build Foreman (nekomangaorg/Neko, 2.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cometchat (a GitHub organization) maintains it in cometchat/cometchat-skills, which has 130 GitHub stars. The repository holds 97 skills in this directory. The repository was last updated on October 5, 2026.
Source: cometchat/cometchat-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.