{"id":"3169271f-8ec1-4959-96d5-3261c1b2b6f1","shortId":"LmyPxQ","kind":"skill","title":"cometchat-android-v6-events","tagline":"CometChat Android UIKit v6 event system — SharedFlow-based reactive event bus for messages, calls, users, groups, conversations, and UI events","description":"> **Companion skills:** cometchat-android-v6-core (init/login), cometchat-android-v6-kotlin-customization, cometchat-android-v6-compose-customization\n\n## Purpose\n\nSubscribe to and emit CometChat events using the v6 Kotlin SharedFlow-based event bus. This replaces the v5 Java listener interface pattern with a reactive, type-safe system built on `kotlinx.coroutines.flow.SharedFlow`.\n\n## Use this skill when\n\n- Listening for message sent/received/edited/deleted events\n- Listening for call accepted/rejected/ended events\n- Listening for user or group membership changes\n- Listening for conversation updates\n- Listening for UI events (custom UI position events)\n- Emitting custom events to trigger UI updates\n\n## Do not use this skill when\n\n- Setting up the SDK (use `cometchat-android-v6-core`)\n- Working with CometChat SDK-level listeners (`CometChat.addMessageListener`) — those are separate from UIKit events\n\n## 1. Event Bus Architecture\n\n`CometChatEvents` is a singleton object in `com.cometchat.uikit.core.events` that manages 6 event flows:\n\n```kotlin\nimport com.cometchat.uikit.core.events.CometChatEvents\n\n// 6 event flows — all are SharedFlow<T>\nCometChatEvents.messageEvents       // SharedFlow<CometChatMessageEvent>\nCometChatEvents.callEvents          // SharedFlow<CometChatCallEvent>\nCometChatEvents.userEvents          // SharedFlow<CometChatUserEvent>\nCometChatEvents.groupEvents         // SharedFlow<CometChatGroupEvent>\nCometChatEvents.conversationEvents  // SharedFlow<CometChatConversationEvent>\nCometChatEvents.uiEvents            // SharedFlow<CometChatUIEvent>\n```\n\nEach flow uses:\n- `replay = 0` — no replay of past events to new subscribers\n- `BufferOverflow.DROP_OLDEST` — drops oldest events when buffer is full\n- Buffer capacities: messages=64, groups=32, users/conversations/ui=16, calls=8\n\n## 2. Subscribing to Events\n\n### 2.1 In a ViewModel or CoroutineScope\n\n```kotlin\nimport com.cometchat.uikit.core.events.*\nimport kotlinx.coroutines.launch\n\n// In a ViewModel\nviewModelScope.launch {\n    CometChatEvents.messageEvents.collect { event ->\n        when (event) {\n            is CometChatMessageEvent.MessageSent -> {\n                val message = event.message\n                val status = event.status // IN_PROGRESS, SUCCESS, or ERROR\n            }\n            is CometChatMessageEvent.MessageEdited -> {\n                val editedMessage = event.message\n            }\n            is CometChatMessageEvent.MessageDeleted -> {\n                val deletedMessage = event.message\n            }\n            // handle other message events...\n            else -> {}\n        }\n    }\n}\n```\n\n### 2.2 In Jetpack Compose\n\n```kotlin\nimport androidx.compose.runtime.LaunchedEffect\nimport com.cometchat.uikit.core.events.*\n\n@Composable\nfun ChatScreen() {\n    LaunchedEffect(Unit) {\n        CometChatEvents.callEvents.collect { event ->\n            when (event) {\n                is CometChatCallEvent.CallAccepted -> {\n                    // Navigate to ongoing call screen\n                }\n                is CometChatCallEvent.CallRejected -> {\n                    // Dismiss call UI\n                }\n                else -> {}\n            }\n        }\n    }\n}\n```\n\n### 2.3 In an Activity or Application class\n\n```kotlin\nprivate val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    \n    scope.launch {\n        CometChatEvents.callEvents.collect { event ->\n            when (event) {\n                is CometChatCallEvent.CallAccepted -> { /* ... */ }\n                is CometChatCallEvent.CallRejected -> { /* ... */ }\n                else -> {}\n            }\n        }\n    }\n}\n\noverride fun onDestroy() {\n    super.onDestroy()\n    scope.cancel() // Always cancel to avoid leaks\n}\n```\n\n## 3. Emitting Events\n\n```kotlin\n// Emit a message event\nCometChatEvents.emitMessageEvent(\n    CometChatMessageEvent.MessageSent(message, MessageStatus.SUCCESS)\n)\n\n// Emit a call event\nCometChatEvents.emitCallEvent(\n    CometChatCallEvent.CallRejected(call)\n)\n\n// Emit a user event\nCometChatEvents.emitUserEvent(event)\n\n// Emit a group event\nCometChatEvents.emitGroupEvent(event)\n\n// Emit a conversation event\nCometChatEvents.emitConversationEvent(event)\n\n// Emit a UI event\nCometChatEvents.emitUIEvent(event)\n```\n\nAll emit functions are thread-safe — they launch on `Dispatchers.Default` internally.\n\n## 4. Event Types Reference\n\n### 4.1 CometChatMessageEvent (sealed class)\n\n| Event | Properties | When emitted |\n|---|---|---|\n| `MessageSent` | `message: BaseMessage`, `status: MessageStatus` | Text/media/custom message sent (IN_PROGRESS → SUCCESS or ERROR) |\n| `MessageEdited` | `message: BaseMessage` | Message edited |\n| `MessageDeleted` | `message: BaseMessage` | Message deleted |\n\n`MessageStatus` enum: `IN_PROGRESS`, `SUCCESS`, `ERROR`\n\n### 4.2 CometChatCallEvent (sealed class)\n\n| Event | Properties | When emitted |\n|---|---|---|\n| `CallAccepted` | `call: Call` | Incoming call accepted |\n| `CallRejected` | `call: Call` | Call rejected |\n\n### 4.3 CometChatUserEvent (sealed class)\n\nUser-related events (block, unblock, etc.)\n\n### 4.4 CometChatGroupEvent (sealed class)\n\nGroup membership events (member added, removed, scope changed, etc.)\n\n### 4.5 CometChatConversationEvent (sealed class)\n\nConversation-level events (conversation deleted, etc.)\n\n### 4.6 CometChatUIEvent (sealed class)\n\nUI-level events including `CustomUIPosition` for custom view positioning.\n\n## 5. Migration from v5\n\n| v5 Pattern | v6 Pattern |\n|---|---|\n| `CometChatMessageEvents.addListener(id, listener)` | `CometChatEvents.messageEvents.collect { }` |\n| `CometChatCallEvents.addListener(id, listener)` | `CometChatEvents.callEvents.collect { }` |\n| `listener.onTextMessageSent(message)` | `is CometChatMessageEvent.MessageSent` |\n| `removeListener(id)` | Cancel the coroutine scope |\n| Java interface callbacks | Kotlin sealed class + when expression |\n\n## Hard rules\n\n- NEVER collect flows on `Dispatchers.Default` for UI updates — switch to `Dispatchers.Main` or use `viewModelScope` / `lifecycleScope`\n- ALWAYS cancel coroutine scopes when the component is destroyed to avoid memory leaks\n- Events are emitted on `Dispatchers.Default` — the subscriber is responsible for thread switching\n- Buffer overflow uses `DROP_OLDEST` — high-frequency events may be dropped if the subscriber is slow\n- Do NOT confuse UIKit events (`CometChatEvents`) with SDK-level listeners (`CometChat.addMessageListener`) — they are separate systems\n- `CometChatUIKit.sendTextMessage()` / `sendMediaMessage()` / `sendCustomMessage()` automatically emit message events — do not double-emit","tags":["cometchat","android","events","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react"],"capabilities":["skill","source-cometchat","skill-cometchat-android-v6-events","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-events","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 (6,672 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:46.450Z","embedding":null,"createdAt":"2026-05-07T13:05:05.678Z","updatedAt":"2026-05-18T19:04:46.450Z","lastSeenAt":"2026-05-18T19:04:46.450Z","tsv":"'0':192 '1':151 '16':217 '2':220 '2.1':224 '2.2':271 '2.3':302 '3':343 '32':215 '4':398 '4.1':402 '4.2':439 '4.3':458 '4.4':469 '4.5':482 '4.6':493 '5':507 '6':164,170 '64':213 '8':219 'accept':452 'accepted/rejected/ended':93 'activ':305 'ad':477 'alway':338,558 'android':3,7,31,37,43,134 'androidx.compose.runtime.launchedeffect':277 'applic':307 'architectur':154 'automat':619 'avoid':341,568 'base':14,60 'basemessag':412,425,430 'block':466 'buffer':207,210,583 'bufferoverflow.drop':201 'built':78 'bundl':320 'bus':17,62,153 'call':20,92,218,294,299,357,361,448,449,451,454,455,456 'callaccept':447 'callback':535 'callreject':453 'cancel':339,529,559 'capac':211 'chang':101,480 'chatscreen':282 'class':308,405,442,461,472,485,496,538 'collect':544 'com.cometchat.uikit.core.events':161,232,279 'com.cometchat.uikit.core.events.cometchatevents':169 'cometchat':2,6,30,36,42,52,133,139 'cometchat-android-v6-compose-customization':41 'cometchat-android-v6-core':29,132 'cometchat-android-v6-events':1 'cometchat-android-v6-kotlin-customization':35 'cometchat.addmessagelistener':144,611 'cometchatcallev':440 'cometchatcallevent.callaccepted':290,329 'cometchatcallevent.callrejected':297,331,360 'cometchatcallevents.addlistener':519 'cometchatconversationev':483 'cometchatev':155,605 'cometchatevents.callevents':178 'cometchatevents.callevents.collect':285,324,522 'cometchatevents.conversationevents':184 'cometchatevents.emitcallevent':359 'cometchatevents.emitconversationevent':378 'cometchatevents.emitgroupevent':372 'cometchatevents.emitmessageevent':351 'cometchatevents.emituievent':384 'cometchatevents.emituserevent':366 'cometchatevents.groupevents':182 'cometchatevents.messageevents':176 'cometchatevents.messageevents.collect':239,518 'cometchatevents.uievents':186 'cometchatevents.userevents':180 'cometchatgroupev':470 'cometchatmessageev':403 'cometchatmessageevent.messagedeleted':262 'cometchatmessageevent.messageedited':257 'cometchatmessageevent.messagesent':244,352,526 'cometchatmessageevents.addlistener':515 'cometchatuiev':494 'cometchatuikit.sendtextmessage':616 'cometchatuserev':459 'companion':27 'compon':564 'compos':45,274,280 'confus':602 'convers':23,104,376,487,490 'conversation-level':486 'core':33,136 'coroutin':531,560 'coroutinescop':229,313 'custom':40,46,110,115,504 'customuiposit':502 'delet':432,491 'deletedmessag':264 'destroy':566 'dismiss':298 'dispatchers.default':396,547,575 'dispatchers.main':315,553 'doubl':626 'double-emit':625 'drop':203,586,594 'edit':427 'editedmessag':259 'els':270,301,332 'emit':51,114,344,347,355,362,368,374,380,387,409,446,573,620,627 'enum':434 'error':255,422,438 'etc':468,481,492 'event':5,10,16,26,53,61,89,94,109,113,116,150,152,165,171,197,205,223,240,242,269,286,288,325,327,345,350,358,365,367,371,373,377,379,383,385,399,406,443,465,475,489,500,571,591,604,622 'event.message':247,260,265 'event.status':250 'express':540 'flow':166,172,189,545 'frequenc':590 'full':209 'fun':281,317,334 'function':388 'group':22,99,214,370,473 'handl':266 'hard':541 'high':589 'high-frequ':588 'id':516,520,528 'import':168,231,233,276,278 'includ':501 'incom':450 'init/login':34 'interfac':69,534 'intern':397 'java':67,533 'jetpack':273 'kotlin':39,57,167,230,275,309,346,536 'kotlinx.coroutines.flow.sharedflow':80 'kotlinx.coroutines.launch':234 'launch':394 'launchedeffect':283 'leak':342,570 'level':142,488,499,609 'lifecyclescop':557 'listen':68,85,90,95,102,106,143,517,521,610 'listener.ontextmessagesent':523 'manag':163 'may':592 'member':476 'membership':100,474 'memori':569 'messag':19,87,212,246,268,349,353,411,416,424,426,429,431,524,621 'messagedelet':428 'messageedit':423 'messages':410 'messagestatus':414,433 'messagestatus.success':354 'migrat':508 'navig':291 'never':543 'new':199 'object':159 'oldest':202,204,587 'oncreat':318 'ondestroy':335 'ongo':293 'overflow':584 'overrid':316,333 'past':196 'pattern':70,512,514 'posit':112,506 'privat':310 'progress':252,419,436 'properti':407,444 'purpos':47 'reactiv':15,73 'refer':401 'reject':457 'relat':464 'remov':478 'removelisten':527 'replac':64 'replay':191,194 'respons':579 'rule':542 'safe':76,392 'savedinstancest':319,322 'scope':312,479,532,561 'scope.cancel':337 'scope.launch':323 'screen':295 'sdk':130,141,608 'sdk-level':140,607 'seal':404,441,460,471,484,495,537 'sendcustommessag':618 'sendmediamessag':617 'sent':417 'sent/received/edited/deleted':88 'separ':147,614 'set':127 'sharedflow':13,59,175,177,179,181,183,185,187 'sharedflow-bas':12,58 'singleton':158 'skill':28,83,125 'skill-cometchat-android-v6-events' 'slow':599 'source-cometchat' 'status':249,413 'subscrib':48,200,221,577,597 'success':253,420,437 'super.oncreate':321 'super.ondestroy':336 'supervisorjob':314 'switch':551,582 'system':11,77,615 'text/media/custom':415 'thread':391,581 'thread-saf':390 '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' 'trigger':118 'type':75,400 'type-saf':74 'ui':25,108,111,119,300,382,498,549 'ui-level':497 'uikit':8,149,603 'unblock':467 'unit':284 'updat':105,120,550 'use':54,81,123,131,190,555,585 'user':21,97,364,463 'user-rel':462 'users/conversations/ui':216 'v5':66,510,511 'v6':4,9,32,38,44,56,135,513 'val':245,248,258,263,311 'view':505 'viewmodel':227,237 'viewmodelscop':556 'viewmodelscope.launch':238 'work':137","prices":[{"id":"67943f5a-63c5-4a6a-a8ce-19b300ed72bd","listingId":"3169271f-8ec1-4959-96d5-3261c1b2b6f1","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-07T13:05:05.678Z"}],"sources":[{"listingId":"3169271f-8ec1-4959-96d5-3261c1b2b6f1","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-android-v6-events","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-events","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:05.678Z","lastSeenAt":"2026-05-18T19:04:46.450Z"}],"details":{"listingId":"3169271f-8ec1-4959-96d5-3261c1b2b6f1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-android-v6-events","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":"1b3483993e947067150e8560c8c9a2a020bfd5ea","skill_md_path":"skills/cometchat-android-v6-events/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-events"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-android-v6-events","license":"MIT","description":"CometChat Android UIKit v6 event system — SharedFlow-based reactive event bus for messages, calls, users, groups, conversations, and UI events","compatibility":"Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-core-android:6.x"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-android-v6-events"},"updatedAt":"2026-05-18T19:04:46.450Z"}}