{"id":"0bd3eaa7-fae5-40ce-92cb-a6b17834b0ab","shortId":"D5AknV","kind":"skill","title":"cometchat-android-v6-kotlin-placement","tagline":"CometChat Android UIKit v6 Kotlin Views placement — Activity, Fragment, BottomSheet, Tab, and Intent navigation patterns","description":"> **Companion skills:** cometchat-android-v6-compose-placement (Compose equivalent), cometchat-android-v6-kotlin-components, cometchat-android-v6-kotlin-theming\n\n## Purpose\n\nPlace CometChat Kotlin Views components into Activities, Fragments, BottomSheets, and Tab layouts. Patterns derived from `master-app-kotlin`.\n\n## Use this skill when\n\n- Adding CometChat Views to an Activity or Fragment\n- Setting up Intent-based navigation between chat screens\n- Building a tabbed layout with Conversations, Users, Groups, Calls tabs\n- Showing CometChat components in BottomSheets or Dialogs\n\n## Do not use this skill when\n\n- Working with Compose placement (use `cometchat-android-v6-compose-placement`)\n- Looking up component APIs (use `cometchat-android-v6-kotlin-components`)\n\n## 1. Activity-Based Placement\n\n### 1.1 Conversations Activity\n\n```kotlin\nclass ConversationsActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val conversations = CometChatConversations(this)\n        conversations.setOnItemClick { conversation ->\n            val intent = Intent(this, MessagesActivity::class.java)\n            // Pass user or group via intent extras\n            startActivity(intent)\n        }\n        setContentView(conversations)\n    }\n}\n```\n\n### 1.2 Messages Activity\n\nPattern from `master-app-kotlin/appflow/MessagesActivity.kt`:\n\n```kotlin\nclass MessagesActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_messages)\n\n        val header = findViewById<CometChatMessageHeader>(R.id.messageHeader)\n        val messageList = findViewById<CometChatMessageList>(R.id.messageList)\n        val composer = findViewById<CometChatMessageComposer>(R.id.messageComposer)\n\n        // Set user or group\n        header.setUser(user)\n        messageList.setUser(user)\n        composer.setUser(user)\n\n        // For groups:\n        // header.setGroup(group)\n        // messageList.setGroup(group)\n        // composer.setGroup(group)\n    }\n}\n```\n\nXML layout:\n\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader\n        android:id=\"@+id/messageHeader\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <com.cometchat.uikit.kotlin.presentation.messagelist.ui.CometChatMessageList\n        android:id=\"@+id/messageList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n\n    <com.cometchat.uikit.kotlin.presentation.messagecomposer.ui.CometChatMessageComposer\n        android:id=\"@+id/messageComposer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>\n```\n\n## 2. Fragment-Based Placement\n\n```kotlin\nclass ConversationsFragment : Fragment() {\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val conversations = CometChatConversations(requireContext())\n        conversations.setOnItemClick { conversation ->\n            // Navigate using FragmentManager or Navigation Component\n        }\n        return conversations\n    }\n}\n```\n\n## 3. Tabbed Layout with ViewPager2\n\n```kotlin\nclass HomeActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_home)\n\n        val tabLayout = findViewById<TabLayout>(R.id.tabLayout)\n        val viewPager = findViewById<ViewPager2>(R.id.viewPager)\n\n        viewPager.adapter = object : FragmentStateAdapter(this) {\n            override fun getItemCount() = 4\n            override fun createFragment(position: Int): Fragment = when (position) {\n                0 -> ConversationsFragment()\n                1 -> UsersFragment()\n                2 -> GroupsFragment()\n                3 -> CallLogsFragment()\n                else -> ConversationsFragment()\n            }\n        }\n\n        TabLayoutMediator(tabLayout, viewPager) { tab, position ->\n            tab.text = when (position) {\n                0 -> \"Chats\"\n                1 -> \"Users\"\n                2 -> \"Groups\"\n                3 -> \"Calls\"\n                else -> \"\"\n            }\n        }.attach()\n    }\n}\n```\n\n## 4. BottomSheet Placement\n\n```kotlin\n// Show message info in a BottomSheet\nval bottomSheet = CometChatMessageInformationBottomSheet.newInstance(message)\nbottomSheet.show(supportFragmentManager, \"messageInfo\")\n```\n\nFor custom BottomSheets:\n\n```kotlin\nclass ReactionsBottomSheet : BottomSheetDialogFragment() {\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val reactionList = CometChatReactionList(requireContext())\n        reactionList.setBaseMessage(message)\n        return reactionList\n    }\n}\n```\n\n## 5. Dialog Placement\n\n`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.\n\n```kotlin\n// Flag/report message dialog\nval dialog = CometChatFlagMessageDialog(this, message)  // (context, BaseMessage)\ndialog.show()\n```\n\n## 6. App Flow Pattern\n\nFrom `master-app-kotlin/appflow/DefaultComponentAppFlowActivity.kt` — a single Activity hosts the full chat flow with Fragment transactions:\n\n```kotlin\nclass AppFlowActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_app_flow)\n\n        // Start with conversations\n        supportFragmentManager.beginTransaction()\n            .replace(R.id.container, ConversationsFragment())\n            .commit()\n    }\n\n    fun navigateToMessages(user: User) {\n        supportFragmentManager.beginTransaction()\n            .replace(R.id.container, MessagesFragment.newInstance(user))\n            .addToBackStack(null)\n            .commit()\n    }\n}\n```\n\n## Activity theme — REQUIRED parent\n\nV6 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.\n\n**Inherit your Activity theme from `CometChatTheme.DayNight`** (or `CometChatTheme.Light` / `CometChatTheme.Dark` for fixed-mode apps). Edit `app/src/main/res/values/themes.xml`:\n\n```xml\n<resources>\n    <style name=\"Theme.YourApp\" parent=\"CometChatTheme.DayNight\" />\n</resources>\n```\n\nDo **not** use any of these as the parent — they all crash at component inflation:\n\n- `Theme.AppCompat.*` — missing Material Components style attrs (`MaterialCardView` rejects with `IllegalArgumentException: requires Theme.MaterialComponents (or descendant)`)\n- `Theme.MaterialComponents.*.Bridge` — Bridge variants drop Material widget defaults (`MaterialButton` fails with `Failed to resolve attribute at index N`)\n- `Theme.MaterialComponents.*` (without the kit) — has Material attrs but missing `cometchat*` attrs (same `Failed to resolve attribute` crash)\n- `Theme.Material3.*` — Material 3 attrs don't satisfy the kit's MaterialComponents-based widgets\n- `android:Theme.Material.*` — predates AppCompat; AppCompatActivity rejects it\n\n`CometChatTheme.DayNight` itself parents `Theme.MaterialComponents.DayNight.NoActionBar`, so it remains AppCompat-compatible while supplying every `cometchat*` attr the components reference.\n\nTo brand-customize colors, override `cometchat*` attrs in your Activity theme (see `cometchat-android-v6-kotlin-theming`), or call `CometChatTheme.setPrimaryColor(...)` programmatically.\n\n## Hard rules\n\n- ALWAYS set the user or group on messaging components (`setUser()` / `setGroup()`) before the component is displayed\n- Activity theme MUST inherit from `CometChatTheme.DayNight` / `.Light` / `.Dark` (see \"Activity theme\" section above) — vague guidance about \"include CometChat attrs\" is insufficient; use the kit's pre-configured theme\n- Ongoing calls MUST use `CometChatOngoingCallActivity.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.\n- When passing User/Group between Activities, serialize the UID/GUID and re-fetch, or use a shared cache — do NOT pass full SDK objects via Intent extras\n- Use `AppCompatActivity` (not plain `Activity`) to ensure proper theme attribute resolution","tags":["cometchat","android","kotlin","placement","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs"],"capabilities":["skill","source-cometchat","skill-cometchat-android-v6-kotlin-placement","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-kotlin-placement","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 (9,284 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.959Z","embedding":null,"createdAt":"2026-05-07T13:05:06.260Z","updatedAt":"2026-05-18T19:04:46.959Z","lastSeenAt":"2026-05-18T19:04:46.959Z","tsv":"'/appflow/defaultcomponentappflowactivity.kt':425 '/appflow/messagesactivity.kt':181 '0':305,323 '1':130,307,325 '1.1':135 '1.2':172 '2':229,309,327 '3':262,311,329 '4':296,333 '5':375 '6':416 'activ':14,51,73,132,137,174,428,472,515 'activity-bas':131 'ad':68 'addtobackstack':469 'android':3,8,26,34,40,115,126,382 'api':122 'app':62,179,417,423,450,526 'app/src/main/res/values/themes.xml':528 'appcompatact':141,185,270,440 'appflowact':439 'attach':332 'attr/cometchatbackgroundcolor01':497 'attr/cometchatprimarycolor':496 'attribut':495,512 'base':80,133,232 'basemessag':414 'bottomsheet':16,53,99,334,342,344,352 'bottomsheet.show':347 'bottomsheetdialogfrag':356 'build':85 'bundl':146,190,246,275,365,445 'call':93,330 'calllogsfrag':312 'chat':83,324,432 'class':139,183,235,268,354,438 'class.java':160 'cometchat':2,7,25,33,39,46,69,96,114,125 'cometchat-android-v6-compose-placement':24,113 'cometchat-android-v6-kotlin-components':32,124 'cometchat-android-v6-kotlin-placement':1 'cometchat-android-v6-kotlin-theming':38 'cometchatconvers':151,250,480 'cometchatflagmessagedialog':378,410 'cometchatmessageinformationbottomsheet.newinstance':345 'cometchatmessagelist':481 'cometchatreactionlist':369 'cometchattheme.dark':521 'cometchattheme.daynight':518 'cometchattheme.light':520 'commit':459,471 'companion':22 'compon':37,49,97,121,129,259,479,485 'compos':28,30,110,117,205 'composer.setgroup':224 'composer.setuser':216 'configur':506 'construct':392 'contain':243,362 'context':413 'convers':90,136,150,154,171,249,253,261,454 'conversations.setonitemclick':153,252 'conversationsact':140 'conversationsfrag':236,306,314,458 'createfrag':299 'custom':351 'deriv':58 'dialog':101,376,383,407,409 'dialog.show':415 'dialogfrag':386 'edit':527 'els':313,331 'equival':31 'etc':482,498 'everi':510 'extend':483 'extra':167 'findviewbyid':198,202,206,283,287 'fix':524 'fixed-mod':523 'flag/report':405 'flow':418,433,451 'fm':401 'fragment':15,52,75,231,237,302,435 'fragment-bas':230 'fragmentmanag':256 'fragmentstateadapt':291 'full':431 'fun':143,187,239,272,294,298,358,442,460 'getitemcount':295 'group':92,164,211,219,221,223,225,328 'groupsfrag':310 'header':197 'header.setgroup':220 'header.setuser':212 'home':280 'homeact':269 'host':429 'inflat':241,360 'info':339 'inherit':513 'int':301 'intent':19,79,156,157,166,169 'intent-bas':78 'kit':492,500 'kit-specif':491 'kotlin':5,11,36,42,47,63,128,138,180,182,234,267,336,353,404,424,437,477 'layout':56,88,227,264 'layoutinflat':242,361 'look':119 'master':61,178,422 'master-app-kotlin':60,177,421 'materi':484 'materialbutton':488 'materialcardview':487 'messag':173,195,338,346,372,388,406,412 'messageinfo':349 'messagelist':201 'messagelist.setgroup':222 'messagelist.setuser':214 'messagesact':159,184 'messagesfragment.newinstance':467 'mode':525 'navig':20,81,254,258 'navigatetomessag':461 'null':470 'object':290 'oncreat':144,188,273,443 'oncreateview':240,359 'overload':403 'overrid':142,186,238,271,293,297,357,441 'parent':475 'pass':161,390 'pattern':21,57,175,419 'place':45 'placement':6,13,29,111,118,134,233,335,377 'posit':300,304,319,322 'pre':505 'pre-configur':504 'purpos':44 'r.id.container':457,466 'r.id.messagecomposer':207 'r.id.messageheader':199 'r.id.messagelist':203 'r.id.tablayout':284 'r.id.viewpager':288 'r.layout.activity':194,279,449 'reactionlist':368,374 'reactionlist.setbasemessage':371 'reactionsbottomsheet':355 'refer':490 'regular':381 'replac':456,465 'requir':474,511 'requirecontext':251,370 'return':260,373 'savedinstancest':145,148,189,192,245,274,277,364,444,447 'screen':84 'set':76,208 'setcontentview':170,193,278,448 'setmessag':396 'setter':397 'ship':501 'show':95,337,400 'singl':427 'skill':23,66,106 'skill-cometchat-android-v6-kotlin-placement' 'source-cometchat' 'specif':493 'start':452 'startact':168 'super.oncreate':147,191,276,446 'suppli':509 'supportfragmentmanag':348 'supportfragmentmanager.begintransaction':455,464 'tab':17,55,87,94,263,318 'tab.text':320 'tablayout':282,316 'tablayoutmedi':315 'tag':402 'theme':43,473,494,507,516 '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' 'transact':436 'uikit':9 'use':64,104,112,123,255 'user':91,162,209,213,215,217,326,462,463,468 'usersfrag':308 'v6':4,10,27,35,41,116,127,476 'val':149,155,196,200,204,248,281,285,343,367,408 'via':165 'view':12,48,70,247,366,478 'viewgroup':244,363 'viewpag':286,317 'viewpager.adapter':289 'viewpager2':266 'widget':486 'work':108 'xml':226,228,529","prices":[{"id":"ad005504-34be-4239-ad09-68823e82bc3b","listingId":"0bd3eaa7-fae5-40ce-92cb-a6b17834b0ab","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:06.260Z"}],"sources":[{"listingId":"0bd3eaa7-fae5-40ce-92cb-a6b17834b0ab","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-android-v6-kotlin-placement","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-kotlin-placement","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:06.260Z","lastSeenAt":"2026-05-18T19:04:46.959Z"}],"details":{"listingId":"0bd3eaa7-fae5-40ce-92cb-a6b17834b0ab","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-android-v6-kotlin-placement","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":"772dcd4c1fe7a5312a39bd24ea7f80bf1516aa32","skill_md_path":"skills/cometchat-android-v6-kotlin-placement/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-kotlin-placement"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-android-v6-kotlin-placement","license":"MIT","description":"CometChat Android UIKit v6 Kotlin Views placement — Activity, Fragment, BottomSheet, Tab, and Intent navigation patterns","compatibility":"Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-kotlin-android:6.x"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-android-v6-kotlin-placement"},"updatedAt":"2026-05-18T19:04:46.959Z"}}