cometchat-android-v6-kotlin-placement — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cometchat-android-v6-kotlin-placement (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-kotlin-android:6.xViews +docs/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-compose-placement (Compose equivalent), cometchat-android-v6-kotlin-components, cometchat-android-v6-kotlin-theming
Place CometChat Kotlin Views components into Activities, Fragments, BottomSheets, and Tab layouts. Patterns derived from sample-app-kotlin.
cometchat-android-v6-compose-placement)cometchat-android-v6-kotlin-components)class ConversationsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val conversations = CometChatConversations(this)
conversations.setOnItemClick { conversation ->
val intent = Intent(this, MessagesActivity::class.java)
// Pass user or group via intent extras
startActivity(intent)
}
setContentView(conversations)
}
}Pattern from sample-app-kotlin/.../ui/messages/MessagesActivity.kt:
class MessagesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_messages)
// Pad the root for the status/navigation bars (root has fitsSystemWindows="true").
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.parent_view)) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.setPadding(systemBars.left, systemBars.top, systemBars.right, 0)
insets
}
val header = findViewById<CometChatMessageHeader>(R.id.messageHeader)
val messageList = findViewById<CometChatMessageList>(R.id.messageList)
val composer = findViewById<CometChatMessageComposer>(R.id.messageComposer)
// Show + wire the back button (the kit does not finish the Activity for you).
header.setBackButtonVisibility(View.VISIBLE)
header.setOnBackPress { finish() }
// Set user or group
header.setUser(user)
messageList.setUser(user)
composer.setUser(user)
// For groups:
// header.setGroup(group)
// messageList.setGroup(group)
// composer.setGroup(group)
}
}XML layout — the root carries android:fitsSystemWindows="true" (so the inset listener above receives system-bar insets) and ?attr/cometchatBackgroundColor1:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/cometchatBackgroundColor1"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
android:id="@+id/messageHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.cometchat.uikit.kotlin.presentation.messagelist.ui.CometChatMessageList
android:id="@+id/messageList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.cometchat.uikit.kotlin.presentation.messagecomposer.ui.CometChatMessageComposer
android:id="@+id/messageComposer"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>class ConversationsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val conversations = CometChatConversations(requireContext())
conversations.setOnItemClick { conversation ->
// Navigate using FragmentManager or Navigation Component
}
return conversations
}
}class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)
val viewPager = findViewById<ViewPager2>(R.id.viewPager)
viewPager.adapter = object : FragmentStateAdapter(this) {
override fun getItemCount() = 4
override fun createFragment(position: Int): Fragment = when (position) {
0 -> ConversationsFragment()
1 -> UsersFragment()
2 -> GroupsFragment()
3 -> CallLogsFragment()
else -> ConversationsFragment()
}
}
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = when (position) {
0 -> "Chats"
1 -> "Users"
2 -> "Groups"
3 -> "Calls"
else -> ""
}
}.attach()
}
}// Show message info in a BottomSheet
val bottomSheet = CometChatMessageInformationBottomSheet.newInstance(message)
bottomSheet.show(supportFragmentManager, "messageInfo")For custom BottomSheets:
class ReactionsBottomSheet : BottomSheetDialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val reactionList = CometChatReactionList(requireContext())
reactionList.setBaseMessage(message)
return reactionList
}
}CometChatFlagMessageDialog is a regular Android Dialog (NOT a DialogFragment). The message is passed at construction; there is no setMessage setter and no show(fm, tag) overload.
// Flag/report message dialog
val dialog = CometChatFlagMessageDialog(this, message) // (context, BaseMessage)
dialog.show()Pattern from sample-app-kotlin/.../ui/home/HomeActivity.kt — a single Activity hosts the chat flow via Fragment transactions:
class AppFlowActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app_flow)
// Start with conversations
supportFragmentManager.beginTransaction()
.replace(R.id.container, ConversationsFragment())
.commit()
}
fun navigateToMessages(user: User) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, MessagesFragment.newInstance(user))
.addToBackStack(null)
.commit()
}
}V6 Kotlin Views components (CometChatConversations, CometChatMessageList, etc.) extend Material Components widgets (MaterialCardView, MaterialButton) and reference kit-specific theme attributes (?attr/cometchatPrimaryColor, ?attr/cometchatBackgroundColor01, etc.). The kit ships its own pre-configured theme that supplies every required attribute.
Inherit your Activity theme from `CometChatTheme.DayNight` (or CometChatTheme.Light / CometChatTheme.Dark for fixed-mode apps). Edit app/src/main/res/values/themes.xml:
<resources>
<style name="Theme.YourApp" parent="CometChatTheme.DayNight" />
</resources>Do not use any of these as the parent — they all crash at component inflation:
Theme.AppCompat.* — missing Material Components style attrs (MaterialCardView rejects with IllegalArgumentException: requires Theme.MaterialComponents (or descendant))Theme.MaterialComponents.*.Bridge — Bridge variants drop Material widget defaults (MaterialButton fails with Failed to resolve attribute at index N)Theme.MaterialComponents.* (without the kit) — has Material attrs but missing cometchat* attrs (same Failed to resolve attribute crash)Theme.Material3.* — Material 3 attrs don't satisfy the kit's MaterialComponents-based widgetsandroid:Theme.Material.* — predates AppCompat; AppCompatActivity rejects itCometChatTheme.DayNight itself parents Theme.MaterialComponents.DayNight.NoActionBar, so it remains AppCompat-compatible while supplying every cometchat* attr the components reference.
To brand-customize colors, override cometchat* attrs in your Activity theme (see cometchat-android-v6-kotlin-theming), or call CometChatTheme.setPrimaryColor(...) programmatically.
setUser() / setGroup()) before the component is displayedCometChatTheme.DayNight / .Light / .Dark (see "Activity theme" section above) — vague guidance about "include CometChat attrs" is insufficient; use the kit's pre-configured themeCometChatOngoingCallActivity.launchOngoingCallActivity(context, ...) (in com.cometchat.uikit.kotlin.presentation.ongoingcall.ui) — they need a separate Activity for proper lifecycle / PiP management. CometChatCallActivity (in com.cometchat.uikit.kotlin.calls) handles outgoing/incoming/conference launches via launchOutgoingCallScreen / launchIncomingCallScreen / launchConferenceCallScreen — it has no launchOngoingCallActivity method.AppCompatActivity (not plain Activity) to ensure proper theme attribute resolution~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.