cometchat-android-v6-events — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cometchat-android-v6-events (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Ground truth:com.cometchat:chatuikit-{compose,kotlin}-android:6.x(+calls-sdk-android:5.x) — resolved AAR (javap) +ui-kit/android/v6. Official docs: https://www.cometchat.com/docs/ui-kit/android/v6/overview · Docs MCP:claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp(or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
Companion skills: cometchat-android-v6-core (init/login), cometchat-android-v6-kotlin-customization, cometchat-android-v6-compose-customization
Subscribe 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.
cometchat-android-v6-core)CometChat.addMessageListener) — those are separate from UIKit eventsCometChatEvents is a singleton object in com.cometchat.uikit.core.events that manages 6 event flows:
import com.cometchat.uikit.core.events.CometChatEvents
// 6 event flows — all are SharedFlow<T>
CometChatEvents.messageEvents // SharedFlow<CometChatMessageEvent>
CometChatEvents.callEvents // SharedFlow<CometChatCallEvent>
CometChatEvents.userEvents // SharedFlow<CometChatUserEvent>
CometChatEvents.groupEvents // SharedFlow<CometChatGroupEvent>
CometChatEvents.conversationEvents // SharedFlow<CometChatConversationEvent>
CometChatEvents.uiEvents // SharedFlow<CometChatUIEvent>Each flow uses:
replay = 0 — no replay of past events to new subscribersBufferOverflow.DROP_OLDEST — drops oldest events when buffer is fullimport com.cometchat.uikit.core.events.*
import kotlinx.coroutines.launch
// In a ViewModel
viewModelScope.launch {
CometChatEvents.messageEvents.collect { event ->
when (event) {
is CometChatMessageEvent.MessageSent -> {
val message = event.message
val status = event.status // IN_PROGRESS, SUCCESS, or ERROR
}
is CometChatMessageEvent.MessageEdited -> {
val editedMessage = event.message
}
is CometChatMessageEvent.MessageDeleted -> {
val deletedMessage = event.message
}
// handle other message events...
else -> {}
}
}
}import androidx.compose.runtime.LaunchedEffect
import com.cometchat.uikit.core.events.*
@Composable
fun ChatScreen() {
LaunchedEffect(Unit) {
CometChatEvents.callEvents.collect { event ->
when (event) {
is CometChatCallEvent.CallAccepted -> {
// Navigate to ongoing call screen
}
is CometChatCallEvent.CallRejected -> {
// Dismiss call UI
}
else -> {}
}
}
}
}private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
scope.launch {
CometChatEvents.callEvents.collect { event ->
when (event) {
is CometChatCallEvent.CallAccepted -> { /* ... */ }
is CometChatCallEvent.CallRejected -> { /* ... */ }
else -> {}
}
}
}
}
override fun onDestroy() {
super.onDestroy()
scope.cancel() // Always cancel to avoid leaks
}// Emit a message event
CometChatEvents.emitMessageEvent(
CometChatMessageEvent.MessageSent(message, MessageStatus.SUCCESS)
)
// Emit a call event
CometChatEvents.emitCallEvent(
CometChatCallEvent.CallRejected(call)
)
// Emit a user event
CometChatEvents.emitUserEvent(event)
// Emit a group event
CometChatEvents.emitGroupEvent(event)
// Emit a conversation event
CometChatEvents.emitConversationEvent(event)
// Emit a UI event
CometChatEvents.emitUIEvent(event)All emit functions are thread-safe — they launch on Dispatchers.Default internally.
| Event | Properties | When emitted |
|---|---|---|
MessageSent | message: BaseMessage, status: MessageStatus | Text/media/custom message sent (IN_PROGRESS → SUCCESS or ERROR) |
MessageEdited | message: BaseMessage | Message edited |
MessageDeleted | message: BaseMessage | Message deleted |
MessageStatus enum: IN_PROGRESS, SUCCESS, ERROR
| Event | Properties | When emitted |
|---|---|---|
CallAccepted | call: Call | Incoming call accepted |
CallRejected | call: Call | Call rejected |
CallEnded | call: Call | Call ended |
OutgoingCall | call: Call | Outgoing call initiated |
User-related events (block, unblock, etc.)
Group membership events (member added, removed, scope changed, etc.)
Conversation-level events (conversation deleted, etc.)
UI-level events including CustomUIPosition for custom view positioning.
| v5 Pattern | v6 Pattern |
|---|---|
CometChatMessageEvents.addListener(id, listener) | CometChatEvents.messageEvents.collect { } |
CometChatCallEvents.addListener(id, listener) | CometChatEvents.callEvents.collect { } |
listener.onTextMessageSent(message) | is CometChatMessageEvent.MessageSent |
removeListener(id) | Cancel the coroutine scope |
| Java interface callbacks | Kotlin sealed class + when expression |
Dispatchers.Default for UI updates — switch to Dispatchers.Main or use viewModelScope / lifecycleScopeDispatchers.Default — the subscriber is responsible for thread switchingDROP_OLDEST — high-frequency events may be dropped if the subscriber is slowCometChatEvents) with SDK-level listeners (CometChat.addMessageListener) — they are separate systemsCometChatUIKit.sendTextMessage() / sendMediaMessage() / sendCustomMessage() automatically emit message events — do not double-emit~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.