@cometchat/skills 4.2.1 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +33 -12
- package/bin/install.js +59 -4
- package/package.json +14 -1
- package/skills/cometchat/SKILL.md +460 -77
- package/skills/cometchat/references/asking-questions.md +48 -0
- package/skills/cometchat-a11y/SKILL.md +3 -2
- package/skills/cometchat-android-v5/SKILL.md +2 -1
- package/skills/cometchat-android-v5-calls/SKILL.md +36 -22
- package/skills/cometchat-android-v5-calls/references/README.md +1 -1
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +7 -5
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +4 -4
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +33 -25
- package/skills/cometchat-android-v5-calls/references/call-session.md +2 -2
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +5 -5
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +2 -2
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +20 -14
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +1 -1
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +43 -27
- package/skills/cometchat-android-v5-calls/references/participant-management.md +3 -3
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +25 -19
- package/skills/cometchat-android-v5-calls/references/recording.md +2 -2
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +1 -1
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +5 -9
- package/skills/cometchat-android-v5-calls/references/session-settings.md +3 -3
- package/skills/cometchat-android-v5-calls/references/setup.md +1 -1
- package/skills/cometchat-android-v5-calls/references/share-invite.md +9 -4
- package/skills/cometchat-android-v5-calls/references/video-controls.md +4 -4
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +2 -2
- package/skills/cometchat-android-v5-components/SKILL.md +4 -3
- package/skills/cometchat-android-v5-core/SKILL.md +20 -2
- package/skills/cometchat-android-v5-customization/SKILL.md +171 -7
- package/skills/cometchat-android-v5-extensions/SKILL.md +7 -4
- package/skills/cometchat-android-v5-features/SKILL.md +5 -4
- package/skills/cometchat-android-v5-placement/SKILL.md +2 -1
- package/skills/cometchat-android-v5-production/SKILL.md +2 -1
- package/skills/cometchat-android-v5-push/SKILL.md +2 -3
- package/skills/cometchat-android-v5-testing/SKILL.md +2 -1
- package/skills/cometchat-android-v5-theming/SKILL.md +2 -1
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +3 -2
- package/skills/cometchat-android-v6/SKILL.md +2 -1
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +11 -7
- package/skills/cometchat-android-v6-calls/SKILL.md +79 -18
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +87 -0
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +24 -15
- package/skills/cometchat-android-v6-calls/references/call-session.md +2 -2
- package/skills/cometchat-android-v6-calls/references/device-management.md +17 -16
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +7 -4
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +13 -8
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +6 -4
- package/skills/cometchat-android-v6-compose-components/SKILL.md +52 -29
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +156 -1
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +129 -40
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +27 -1
- package/skills/cometchat-android-v6-core/SKILL.md +389 -9
- package/skills/cometchat-android-v6-events/SKILL.md +4 -1
- package/skills/cometchat-android-v6-extensions/SKILL.md +2 -1
- package/skills/cometchat-android-v6-features/SKILL.md +26 -2
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +31 -1
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +172 -1
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +20 -5
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +36 -5
- package/skills/cometchat-android-v6-migration/SKILL.md +44 -42
- package/skills/cometchat-android-v6-production/SKILL.md +6 -3
- package/skills/cometchat-android-v6-push/SKILL.md +43 -2
- package/skills/cometchat-android-v6-testing/SKILL.md +11 -8
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +26 -5
- package/skills/cometchat-angular-calls/SKILL.md +256 -389
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +3 -2
- package/skills/cometchat-angular-calls/references/call-layouts.md +29 -12
- package/skills/cometchat-angular-calls/references/call-session.md +2 -2
- package/skills/cometchat-angular-calls/references/custom-ui.md +18 -10
- package/skills/cometchat-angular-calls/references/device-management.md +53 -34
- package/skills/cometchat-angular-calls/references/group-calls.md +45 -24
- package/skills/cometchat-angular-calls/references/idle-timeout.md +31 -15
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +7 -6
- package/skills/cometchat-angular-calls/references/raise-hand.md +9 -4
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +32 -39
- package/skills/cometchat-angular-calls/references/ringing-integration.md +3 -1
- package/skills/cometchat-angular-calls/references/share-invite.md +11 -5
- package/skills/cometchat-angular-calls/references/virtual-background.md +29 -0
- package/skills/cometchat-angular-components/SKILL.md +149 -620
- package/skills/cometchat-angular-core/SKILL.md +235 -293
- package/skills/cometchat-angular-customization/SKILL.md +415 -223
- package/skills/cometchat-angular-features/SKILL.md +216 -334
- package/skills/cometchat-angular-patterns/SKILL.md +168 -359
- package/skills/cometchat-angular-placement/SKILL.md +189 -560
- package/skills/cometchat-angular-production/SKILL.md +241 -92
- package/skills/cometchat-angular-push/SKILL.md +280 -294
- package/skills/cometchat-angular-testing/SKILL.md +430 -158
- package/skills/cometchat-angular-theming/SKILL.md +190 -265
- package/skills/cometchat-angular-troubleshooting/SKILL.md +192 -157
- package/skills/cometchat-astro-patterns/SKILL.md +22 -1
- package/skills/cometchat-calls/SKILL.md +25 -19
- package/skills/cometchat-calls/references/use-case-broadcast.md +15 -10
- package/skills/cometchat-calls/references/use-case-marketplace.md +2 -3
- package/skills/cometchat-calls/references/use-case-support.md +3 -4
- package/skills/cometchat-calls/references/use-case-team.md +23 -12
- package/skills/cometchat-calls/references/use-case-telehealth.md +3 -4
- package/skills/cometchat-components/SKILL.md +163 -25
- package/skills/cometchat-core/SKILL.md +412 -13
- package/skills/cometchat-customization/SKILL.md +50 -25
- package/skills/cometchat-features/SKILL.md +313 -34
- package/skills/cometchat-flutter-v5/SKILL.md +10 -4
- package/skills/cometchat-flutter-v5-calls/SKILL.md +188 -158
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +48 -24
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +20 -15
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +100 -145
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +12 -8
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +30 -36
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +15 -13
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +12 -9
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +115 -65
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +41 -30
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +17 -14
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +8 -2
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-core/SKILL.md +20 -2
- package/skills/cometchat-flutter-v5-customization/SKILL.md +136 -5
- package/skills/cometchat-flutter-v5-events/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-messages/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-production/SKILL.md +15 -6
- package/skills/cometchat-flutter-v5-push/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-testing/SKILL.md +17 -6
- package/skills/cometchat-flutter-v5-theming/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +7 -6
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +3 -2
- package/skills/cometchat-flutter-v6/SKILL.md +17 -16
- package/skills/cometchat-flutter-v6-calls/SKILL.md +78 -63
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +8 -6
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +89 -0
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +15 -12
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +2 -2
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +9 -3
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +10 -10
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +15 -7
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +6 -3
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +23 -16
- package/skills/cometchat-flutter-v6-components/SKILL.md +32 -11
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +39 -11
- package/skills/cometchat-flutter-v6-core/SKILL.md +348 -10
- package/skills/cometchat-flutter-v6-customization/SKILL.md +97 -25
- package/skills/cometchat-flutter-v6-events/SKILL.md +3 -2
- package/skills/cometchat-flutter-v6-features/SKILL.md +15 -6
- package/skills/cometchat-flutter-v6-messages/SKILL.md +111 -60
- package/skills/cometchat-flutter-v6-migration/SKILL.md +18 -25
- package/skills/cometchat-flutter-v6-placement/SKILL.md +79 -50
- package/skills/cometchat-flutter-v6-production/SKILL.md +13 -12
- package/skills/cometchat-flutter-v6-push/SKILL.md +43 -21
- package/skills/cometchat-flutter-v6-testing/SKILL.md +6 -6
- package/skills/cometchat-flutter-v6-theming/SKILL.md +38 -5
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +182 -17
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +12 -4
- package/skills/cometchat-i18n/SKILL.md +139 -78
- package/skills/cometchat-ios/SKILL.md +4 -2
- package/skills/cometchat-ios-calls/SKILL.md +225 -95
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +11 -9
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +45 -0
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +6 -7
- package/skills/cometchat-ios-calls/references/call-layouts.md +31 -91
- package/skills/cometchat-ios-calls/references/call-session.md +51 -54
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +33 -29
- package/skills/cometchat-ios-calls/references/custom-ui.md +38 -38
- package/skills/cometchat-ios-calls/references/group-calls.md +33 -70
- package/skills/cometchat-ios-calls/references/idle-timeout.md +24 -25
- package/skills/cometchat-ios-calls/references/in-call-chat.md +19 -23
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +128 -70
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +20 -20
- package/skills/cometchat-ios-calls/references/raise-hand.md +14 -227
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +35 -122
- package/skills/cometchat-ios-calls/references/ringing-integration.md +17 -16
- package/skills/cometchat-ios-calls/references/share-invite.md +8 -12
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +4 -4
- package/skills/cometchat-ios-components/SKILL.md +200 -12
- package/skills/cometchat-ios-core/SKILL.md +281 -11
- package/skills/cometchat-ios-customization/SKILL.md +276 -110
- package/skills/cometchat-ios-features/SKILL.md +64 -36
- package/skills/cometchat-ios-placement/SKILL.md +15 -12
- package/skills/cometchat-ios-production/SKILL.md +12 -4
- package/skills/cometchat-ios-push/SKILL.md +53 -19
- package/skills/cometchat-ios-testing/SKILL.md +14 -9
- package/skills/cometchat-ios-theming/SKILL.md +39 -3
- package/skills/cometchat-ios-troubleshooting/SKILL.md +41 -21
- package/skills/cometchat-native-bare-patterns/SKILL.md +56 -18
- package/skills/cometchat-native-calls/SKILL.md +89 -19
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +2 -2
- package/skills/cometchat-native-calls/references/call-layouts.md +15 -14
- package/skills/cometchat-native-calls/references/call-session.md +2 -2
- package/skills/cometchat-native-calls/references/custom-ui.md +12 -8
- package/skills/cometchat-native-calls/references/device-management.md +53 -30
- package/skills/cometchat-native-calls/references/group-calls.md +35 -30
- package/skills/cometchat-native-calls/references/idle-timeout.md +6 -6
- package/skills/cometchat-native-calls/references/in-call-chat.md +10 -8
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +2 -2
- package/skills/cometchat-native-calls/references/raise-hand.md +15 -13
- package/skills/cometchat-native-calls/references/recording-screen-share.md +49 -170
- package/skills/cometchat-native-calls/references/share-invite.md +7 -5
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +4 -2
- package/skills/cometchat-native-components/SKILL.md +91 -57
- package/skills/cometchat-native-core/SKILL.md +281 -9
- package/skills/cometchat-native-customization/SKILL.md +150 -28
- package/skills/cometchat-native-expo-patterns/SKILL.md +77 -27
- package/skills/cometchat-native-features/SKILL.md +79 -49
- package/skills/cometchat-native-placement/SKILL.md +19 -10
- package/skills/cometchat-native-production/SKILL.md +9 -3
- package/skills/cometchat-native-push/SKILL.md +2 -1
- package/skills/cometchat-native-testing/SKILL.md +1 -2
- package/skills/cometchat-native-theming/SKILL.md +54 -29
- package/skills/cometchat-native-troubleshooting/SKILL.md +71 -3
- package/skills/cometchat-nextjs-patterns/SKILL.md +48 -6
- package/skills/cometchat-placement/SKILL.md +42 -3
- package/skills/cometchat-production/SKILL.md +12 -5
- package/skills/cometchat-react-calls/SKILL.md +220 -10
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +4 -3
- package/skills/cometchat-react-calls/references/call-layouts.md +5 -6
- package/skills/cometchat-react-calls/references/call-session.md +1 -1
- package/skills/cometchat-react-calls/references/custom-ui.md +61 -15
- package/skills/cometchat-react-calls/references/device-management.md +55 -51
- package/skills/cometchat-react-calls/references/group-calls.md +18 -23
- package/skills/cometchat-react-calls/references/idle-timeout.md +25 -12
- package/skills/cometchat-react-calls/references/in-call-chat.md +7 -7
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +9 -11
- package/skills/cometchat-react-calls/references/raise-hand.md +14 -14
- package/skills/cometchat-react-calls/references/recording-screen-share.md +39 -38
- package/skills/cometchat-react-calls/references/ringing-integration.md +2 -2
- package/skills/cometchat-react-calls/references/share-invite.md +4 -5
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +20 -2
- package/skills/cometchat-react-calls/references/virtual-background.md +32 -0
- package/skills/cometchat-react-patterns/SKILL.md +57 -4
- package/skills/cometchat-react-push/SKILL.md +258 -72
- package/skills/cometchat-react-router-patterns/SKILL.md +43 -4
- package/skills/cometchat-react-testing/SKILL.md +14 -5
- package/skills/cometchat-theming/SKILL.md +181 -18
- package/skills/cometchat-troubleshooting/SKILL.md +40 -20
|
@@ -3,13 +3,14 @@ name: cometchat-android-v6-kotlin-components
|
|
|
3
3
|
description: "CometChat Android UIKit v6 Kotlin Views component catalog — all custom View chat UI components, their properties, styles, and usage"
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-kotlin-android:6.x"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.1"
|
|
10
9
|
tags: "cometchat, android, kotlin-views, components, conversations, messages, users, groups, calls"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **Ground truth:** `com.cometchat:chatuikit-kotlin-android:6.x` component catalog (javap the AAR) + `docs/ui-kit/android/v6`. **Official docs:** https://www.cometchat.com/docs/ui-kit/android/v6/components-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.
|
|
13
|
+
|
|
13
14
|
> **Companion skills:** cometchat-android-v6-compose-components (Compose equivalent), cometchat-android-v6-kotlin-theming, cometchat-android-v6-kotlin-customization, cometchat-android-v6-kotlin-placement
|
|
14
15
|
|
|
15
16
|
## Purpose
|
|
@@ -31,6 +32,8 @@ Complete catalog of all Kotlin Views components in CometChat UIKit v6. Each comp
|
|
|
31
32
|
|
|
32
33
|
## 1. Component Catalog
|
|
33
34
|
|
|
35
|
+
> ⛔ **Only the components in THIS catalog exist — do not invent or recall names from v4/older memory.** Before emitting any `CometChat*` view, confirm it's listed below; if it's not here, it doesn't exist (→ "unresolved reference" compile error). **There is no all-in-one component:** the v4-era composites `CometChatConversationsWithMessages` / `CometChatUsersWithMessages` / `CometChatGroupsWithMessages` / `CometChatMessages` and the `CometChatUI` god-view are **absent in the v6 Kotlin-Views kit** (verified against the published `chatuikit-kotlin-android:6.0.1` AAR — the only top-level `CometChat*` views are `CometChatConversations`, `CometChatMessageHeader`, `CometChatMessageList`, `CometChatMessageComposer`, `CometChatMessageInformation`, `CometChatUsers`, `CometChatGroups`). Compose a two-pane experience yourself: `CometChatConversations` (list) → on item-click, host `CometChatMessageHeader` + `CometChatMessageList` + `CometChatMessageComposer` for the selected `User`/`Group`.
|
|
36
|
+
|
|
34
37
|
### 1.1 List Components
|
|
35
38
|
|
|
36
39
|
| Component | Package | Type | Purpose |
|
|
@@ -43,6 +46,8 @@ Complete catalog of all Kotlin Views components in CometChat UIKit v6. Each comp
|
|
|
43
46
|
|
|
44
47
|
### 1.2 Messaging Components
|
|
45
48
|
|
|
49
|
+
> ⚠️ **There is NO combined `CometChatMessages` View on Android v6 Kotlin-Views either.** Like the Compose surface, v6 Kotlin-Views ships the pieces separately — compose the chat screen manually as `CometChatMessageHeader + CometChatMessageList + CometChatMessageComposer` (see §2.4). No `com.cometchat.uikit.kotlin.presentation.cometchatmessages.CometChatMessages` exists on either surface.
|
|
50
|
+
|
|
46
51
|
| Component | Package | Type | Purpose |
|
|
47
52
|
|---|---|---|---|
|
|
48
53
|
| `CometChatMessageList` | `presentation.messagelist.ui` | View | Message list with bubbles |
|
|
@@ -70,6 +75,8 @@ Complete catalog of all Kotlin Views components in CometChat UIKit v6. Each comp
|
|
|
70
75
|
| `CometChatEmojiKeyboard` | `presentation.emojikeyboard.ui` | View | Emoji picker |
|
|
71
76
|
| `CometChatStickerKeyboard` | `presentation.stickerkeyboard.ui` | View | Sticker picker |
|
|
72
77
|
| `CometChatFlagMessageDialog` | `presentation.report` | Dialog | Report/flag message |
|
|
78
|
+
| `CometChatAIAssistantChatHistory` | `presentation.aiassistantchathistory.ui` | View | AI chat history (extends `MaterialCardView`) |
|
|
79
|
+
| `CometChatNotificationFeed` | `presentation.notificationfeed.ui` | View | Full-screen notification feed (category filter chips, timestamp grouping, rich cards, real-time updates) — extends `FrameLayout` |
|
|
73
80
|
|
|
74
81
|
### 1.5 Shared Elements
|
|
75
82
|
|
|
@@ -182,6 +189,8 @@ Every component has a corresponding style class in its `style/` subpackage:
|
|
|
182
189
|
| `CometChatMessageHeader` | `CometChatMessageHeaderStyle` |
|
|
183
190
|
| `CometChatCallLogs` | `CometChatCallLogsStyle` |
|
|
184
191
|
| `CometChatThreadHeader` | `CometChatThreadHeaderStyle` |
|
|
192
|
+
| `CometChatNotificationFeed` | `CometChatNotificationFeedStyle` (`@ColorInt` Int props; `.default()` factory; `setStyle(style)`) |
|
|
193
|
+
| `CometChatAIAssistantChatHistory` | `CometChatAIAssistantChatHistoryStyle` (`.default(context)`) |
|
|
185
194
|
|
|
186
195
|
Style classes resolve defaults from XML theme attributes and `CometChatTheme` singleton.
|
|
187
196
|
|
|
@@ -189,6 +198,27 @@ Style classes resolve defaults from XML theme attributes and `CometChatTheme` si
|
|
|
189
198
|
|
|
190
199
|
Each component creates its own ViewModel internally via factories from `chatuikit-core`. ViewModels are shared with the Compose stack — the same `CometChatConversationsViewModel` powers both `CometChatConversations` (View) and `CometChatConversations` (@Composable).
|
|
191
200
|
|
|
201
|
+
## 5. Custom State Views (empty / error / loading)
|
|
202
|
+
|
|
203
|
+
The list/data components expose three setters to replace the built-in empty, error, and loading states with your own `View`:
|
|
204
|
+
|
|
205
|
+
```kotlin
|
|
206
|
+
fun setEmptyView(view: View?)
|
|
207
|
+
fun setErrorView(view: View?)
|
|
208
|
+
fun setLoadingView(view: View?)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Verified present on `CometChatConversations`, `CometChatUsers`, `CometChatGroups`, `CometChatGroupMembers`, `CometChatCallLogs`, and `CometChatSearch` (e.g. `CometChatConversations.kt:1045/1052/1059`, `CometChatUsers.kt:735/742/749`). Pass `null` to fall back to the default state view.
|
|
212
|
+
|
|
213
|
+
```kotlin
|
|
214
|
+
val users = findViewById<CometChatUsers>(R.id.users)
|
|
215
|
+
users.setEmptyView(layoutInflater.inflate(R.layout.my_empty_state, null))
|
|
216
|
+
users.setErrorView(layoutInflater.inflate(R.layout.my_error_state, null))
|
|
217
|
+
users.setLoadingView(layoutInflater.inflate(R.layout.my_loading_state, null))
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
> `CometChatMessageList` does NOT expose these `set*View` state setters — customize its empty/error/loading states through styling/bubble customization instead (see `cometchat-android-v6-kotlin-customization`). `CometChatNotificationFeed` instead takes its own programmatic empty/error/loading rendering internally (see §1.4).
|
|
221
|
+
|
|
192
222
|
## Hard rules
|
|
193
223
|
|
|
194
224
|
- Activity theme MUST inherit from `CometChatTheme.DayNight` (or `.Light` / `.Dark`) — `Theme.AppCompat.*`, `Theme.MaterialComponents.*.Bridge`, plain `Theme.MaterialComponents.*`, and `Theme.Material3.*` all crash at component inflation. See `cometchat-android-v6-kotlin-placement` "Activity theme" section.
|
|
@@ -3,13 +3,14 @@ name: cometchat-android-v6-kotlin-customization
|
|
|
3
3
|
description: "CometChat Android UIKit v6 Kotlin Views customization — BubbleFactory abstract class, BubbleViewProvider, style classes, and per-slot overrides"
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-kotlin-android:6.x"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.0"
|
|
10
9
|
tags: "cometchat, android, kotlin-views, customization, bubble-factory, bubble-view-provider, style"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **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.
|
|
13
|
+
|
|
13
14
|
> **Companion skills:** cometchat-android-v6-compose-customization (Compose equivalent), cometchat-android-v6-kotlin-components, cometchat-android-v6-kotlin-theming, cometchat-android-v6-extensions (DataSource layer), cometchat-android-v6-events
|
|
14
15
|
|
|
15
16
|
## Purpose
|
|
@@ -156,6 +157,157 @@ val key = BubbleFactory.getFactoryKey(message) // "category_type" or "deleted"
|
|
|
156
157
|
val key = BubbleFactory.getKey("custom", "location") // "custom_location"
|
|
157
158
|
```
|
|
158
159
|
|
|
160
|
+
### 1.8 Registering a factory is already additive — built-ins are NOT in the map
|
|
161
|
+
|
|
162
|
+
`CometChatMessageList` exposes exactly two factory APIs (`CometChatMessageList.kt:3376 / :3395`):
|
|
163
|
+
|
|
164
|
+
- `setBubbleFactories(factories: List<BubbleFactory>)` — sets the custom factory map
|
|
165
|
+
- `getBubbleFactories(): Map<String, BubbleFactory>` — returns an immutable copy
|
|
166
|
+
|
|
167
|
+
There is **NO** settable `bubbleFactories` property and **NO** `removeBubbleFactory(...)` on `CometChatMessageList` (`removeBubbleFactory` exists only on the internal `MessageAdapter`, `MessageAdapter.kt:1534` — not public API).
|
|
168
|
+
|
|
169
|
+
`setBubbleFactories` does NOT wipe built-in bubbles, because **built-in types are never stored as factory entries.** The adapter starts with an empty factory map (`MessageAdapter.kt:153` "The adapter starts with an empty bubbleFactories map"); when a message's `"category_type"` key has no factory, the bubble falls back to `InternalContentRenderer`. So passing only your custom factories is correct and safe:
|
|
170
|
+
|
|
171
|
+
```kotlin
|
|
172
|
+
messageList.setBubbleFactories(listOf(
|
|
173
|
+
LocationBubbleFactory(), // custom_location
|
|
174
|
+
PaymentBubbleFactory() // custom_payment
|
|
175
|
+
))
|
|
176
|
+
// text/image/video/etc. still render via InternalContentRenderer — untouched
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`setBubbleFactories` replaces the *custom* factory set, so include every custom factory you want active in the single list. `BubbleFactory.getKey(category, type)` and `BubbleFactory.getFactoryKey(message)` (companion, `BubbleFactory.kt:441 / :425`) are still available if you need the key string.
|
|
180
|
+
|
|
181
|
+
### 1.9 Custom attachment options (Scenario 3)
|
|
182
|
+
|
|
183
|
+
`CometChatMessageComposer` exposes `addAttachmentOption(action)` (append one) and `setAttachmentOptions(list)` (set the custom list) — `CometChatMessageComposer.kt:4951 / :4930`, both delegate to the shared `CometChatMessageComposerViewModel`.
|
|
184
|
+
|
|
185
|
+
**Neither call drops the built-in options.** Both touch only the *custom* options list (`_customAttachmentOptions`); the defaults (camera/image/video/audio/document/poll/collab-doc/collab-whiteboard) are rebuilt every time by `getDefaultAttachmentOptions(...)` and the custom ones are appended at the end (`CometChatMessageComposerViewModel.kt:646-649`). So `setAttachmentOptions(listOf(location))` keeps the defaults too — it just replaces any *previously-set custom* options. Use `addAttachmentOption` to add one without disturbing other custom options:
|
|
186
|
+
|
|
187
|
+
```kotlin
|
|
188
|
+
val location = CometChatMessageComposerAction(
|
|
189
|
+
id = "location",
|
|
190
|
+
title = "Send Location",
|
|
191
|
+
icon = R.drawable.ic_location,
|
|
192
|
+
onClick = OnClick { /* pick + send (see 1.10) */ }
|
|
193
|
+
)
|
|
194
|
+
messageComposer.addAttachmentOption(location) // appends one custom option
|
|
195
|
+
// setAttachmentOptions(listOf(location)) also keeps camera/image/etc. — it only resets the custom list
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
> To hide a built-in option, use the composer visibility setters (e.g. `setPollOptionVisibility(View.GONE)`), which flip the `_show*Option` flags `getDefaultAttachmentOptions` checks. The built-in IDs are constants on `CometChatMessageComposerAction` (`ID_CAMERA`…`ID_COLLABORATIVE_WHITEBOARD`, `CometChatMessageComposerAction.kt:42-49`).
|
|
199
|
+
|
|
200
|
+
### 1.10 Sending a custom message — use the UIKit path, not the raw SDK
|
|
201
|
+
|
|
202
|
+
```kotlin
|
|
203
|
+
val message = CustomMessage(
|
|
204
|
+
receiverId,
|
|
205
|
+
CometChatConstants.RECEIVER_TYPE_USER, // or RECEIVER_TYPE_GROUP
|
|
206
|
+
"location", // matches the BubbleFactory type
|
|
207
|
+
customData // org.json.JSONObject
|
|
208
|
+
)
|
|
209
|
+
// ✅ kit path — sets muid + sender, fires ccMessageSent → list APPENDS
|
|
210
|
+
CometChatUIKit.sendCustomMessage(message, object : CometChat.CallbackListener<CustomMessage>() {
|
|
211
|
+
override fun onSuccess(p0: CustomMessage) {}
|
|
212
|
+
override fun onError(p0: CometChatException) {}
|
|
213
|
+
})
|
|
214
|
+
// ❌ CometChat.sendCustomMessage(...) — no muid/sender/event → recipient error + realtime replace
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Verified (v6 Kotlin Views): `CometChatMessageList.setBubbleFactories(List) / getBubbleFactories(): Map` (`CometChatMessageList.kt:3376 / :3395`), `CometChatMessageComposer.addAttachmentOption / setAttachmentOptions` (`:4951 / :4930`), `CometChatUIKit.sendCustomMessage(CustomMessage, CallbackListener)` (`CometChatUIKit.kt:472`). Note: `messageList.bubbleFactories = …` (property) and `CometChatMessageList.removeBubbleFactory(...)` are NOT public — do not use.
|
|
218
|
+
|
|
219
|
+
### 1.11 Override an EXISTING type's bubble (Scenario 2)
|
|
220
|
+
|
|
221
|
+
To replace a built-in type's rendering, subclass `BubbleFactory` with `getCategory()`/`getType()` set to the built-in identifiers, then register it. As in §1.8, built-ins are not factory entries — a matching factory simply takes priority over `InternalContentRenderer`.
|
|
222
|
+
|
|
223
|
+
```kotlin
|
|
224
|
+
import com.cometchat.chat.constants.CometChatConstants
|
|
225
|
+
|
|
226
|
+
class MyTextBubbleFactory : BubbleFactory() {
|
|
227
|
+
override fun getCategory(): String = CometChatConstants.CATEGORY_MESSAGE // "message"
|
|
228
|
+
override fun getType(): String = CometChatConstants.MESSAGE_TYPE_TEXT // "text"
|
|
229
|
+
|
|
230
|
+
override fun createContentView(context: Context): View = MyTextContentView(context)
|
|
231
|
+
|
|
232
|
+
override fun bindContentView(
|
|
233
|
+
view: View,
|
|
234
|
+
message: BaseMessage,
|
|
235
|
+
alignment: UIKitConstants.MessageBubbleAlignment,
|
|
236
|
+
holder: RecyclerView.ViewHolder?,
|
|
237
|
+
position: Int
|
|
238
|
+
) {
|
|
239
|
+
(view as MyTextContentView).bind(message as TextMessage)
|
|
240
|
+
}
|
|
241
|
+
// …or override createBubbleView()/bindBubbleView() (see 1.3) to replace the whole bubble
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
messageList.setBubbleFactories(listOf(MyTextBubbleFactory()))
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Only `message_text` is overridden; other types keep their internal rendering.
|
|
248
|
+
|
|
249
|
+
### 1.12 Add a long-press message option (Scenario 4 — Forward-style)
|
|
250
|
+
|
|
251
|
+
`CometChatMessageList` resolves the long-press option sheet through the shared view model. Two public setters control it (`CometChatMessageList.kt:3697 / :3709`):
|
|
252
|
+
|
|
253
|
+
- `setOptions(callback: (BaseMessage) -> List<CometChatMessageOption>?)` — **replaces** defaults when the callback returns non-null (return `null` to keep them); takes precedence over `addOptions`.
|
|
254
|
+
- `addOptions(callback: (BaseMessage) -> List<CometChatMessageOption>)` — **appends** after the defaults; invoked only when `setOptions` is unset or returns `null`.
|
|
255
|
+
|
|
256
|
+
Use `addOptions` so the built-in Reply/Copy/Edit/Delete survive:
|
|
257
|
+
|
|
258
|
+
```kotlin
|
|
259
|
+
import com.cometchat.uikit.core.domain.model.CometChatMessageOption
|
|
260
|
+
|
|
261
|
+
messageList.addOptions { message -> // ✅ appended to defaults
|
|
262
|
+
listOf(
|
|
263
|
+
CometChatMessageOption(
|
|
264
|
+
id = "forward",
|
|
265
|
+
title = "Forward",
|
|
266
|
+
icon = R.drawable.ic_forward,
|
|
267
|
+
onClick = { /* open forward picker for `message` */ }
|
|
268
|
+
)
|
|
269
|
+
)
|
|
270
|
+
}
|
|
271
|
+
// ❌ messageList.setOptions { listOf(forward) } // would DROP reply/copy/edit/delete
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
For the click handler use `setMessageOptionClickListener(MessageOptionClickListener)` (`CometChatMessageList.kt:3671`). Resolution order verified in `CometChatMessageListViewModel.resolveMessageOptions` (`:817-827`): `setOptions` non-null wins, else `defaultOptions + addOptions`. `CometChatMessageOption(id, title, …, onClick)` is a data class at `CometChatMessageOption.kt:21`.
|
|
275
|
+
|
|
276
|
+
### 1.13 MessageTemplate via the DataSource (docs-taught alternative to BubbleFactory)
|
|
277
|
+
|
|
278
|
+
> ⚠️ **Verify before using — symbols not found in the GA v6 Kotlin-Views source.** `CometChatUIKit.getDataSource()`, `getMessageTemplates()`, `CometChatMessageTemplate`, `setTemplates(...)`, and `MessagesViewHolderListener` appear in the Android **docs** but are **absent from the verified `com.cometchat.uikit.kotlin` / `chatuikit-core` GA source** (they're the legacy `com.cometchat.chatuikit` v5-shaped API). Treat this section as a docs reference that may not compile against your installed v6 kit — **prefer `BubbleFactory` / `BubbleViewProvider` (the confirmed v6-native path) for all new code.**
|
|
279
|
+
|
|
280
|
+
The `BubbleFactory` / `BubbleViewProvider` surface above is the primary v6 customization path. The Android docs also teach a **`MessageTemplate`** path through the data source ([message-template](https://www.cometchat.com/docs/ui-kit/android/v6/message-template)) — fetch the existing templates, mutate the one you want via the `MessagesViewHolderListener` create/bind pair, then re-apply with `setTemplates(...)` (append, never replace with a single-item list):
|
|
281
|
+
|
|
282
|
+
```kotlin
|
|
283
|
+
// 1. fetch existing templates from the data source
|
|
284
|
+
val templates = CometChatUIKit.getDataSource()
|
|
285
|
+
.getMessageTemplates(messageList.additionParameter)
|
|
286
|
+
.toMutableList()
|
|
287
|
+
|
|
288
|
+
// 2. mutate the matched template (or build a new one for a custom type)
|
|
289
|
+
templates.find { it.type == UIKitConstants.MessageType.TEXT }
|
|
290
|
+
?.setContentView(object : MessagesViewHolderListener() {
|
|
291
|
+
override fun createView(context: Context, bubble: CometChatMessageBubble,
|
|
292
|
+
alignment: UIKitConstants.MessageBubbleAlignment): View =
|
|
293
|
+
LayoutInflater.from(context).inflate(R.layout.your_custom_layout, null)
|
|
294
|
+
override fun bindView(context: Context, view: View, message: BaseMessage,
|
|
295
|
+
alignment: UIKitConstants.MessageBubbleAlignment,
|
|
296
|
+
viewHolder: RecyclerView.ViewHolder, list: List<BaseMessage>, i: Int) { /* bind */ }
|
|
297
|
+
})
|
|
298
|
+
// new custom type:
|
|
299
|
+
val contact = CometChatMessageTemplate().apply {
|
|
300
|
+
setType("contact"); setCategory(UIKitConstants.MessageCategory.CUSTOM)
|
|
301
|
+
setContentView(/* MessagesViewHolderListener */)
|
|
302
|
+
}
|
|
303
|
+
templates.add(contact)
|
|
304
|
+
|
|
305
|
+
// 3. re-apply — Views uses setTemplates(...)
|
|
306
|
+
messageList.setTemplates(templates)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Views templates expose listener-based slot setters (`setContentView`, `setHeaderView`, `setFooterView`, `setBottomView`, `setStatusInfoView`, `setBubbleView`, `setOptions`) mirroring §1.4's slots. Prefer `BubbleFactory` for new code; use `getMessageTemplates(...)` + `setTemplates(...)` when you want to start from the kit's defaults and tweak one type. (This overlaps the custom-message topic.)
|
|
310
|
+
|
|
159
311
|
## 2. BubbleViewProvider (Per-Slot Overrides)
|
|
160
312
|
|
|
161
313
|
`BubbleViewProvider` is a simpler interface for overriding individual slots across ALL message types.
|
|
@@ -257,6 +409,21 @@ messageList.setStyle(style)
|
|
|
257
409
|
| No bubble replacement | `createBubbleView()` for complete replacement |
|
|
258
410
|
| Theme-level styling only | Per-factory `getBubbleStyle()` |
|
|
259
411
|
|
|
412
|
+
## Text formatters (inline mentions / URLs / custom tokens)
|
|
413
|
+
|
|
414
|
+
Style/transform message text inline via `setTextFormatters(...)` on the composer and message list. The kit ships `CometChatMentionsFormatter` + `CometChatRichTextFormatter` (subclasses of the abstract `CometChatTextFormatter`) in `com.cometchat.uikit.kotlin.shared.formatters`. To ADD a custom one, include the defaults too (a bare list replaces them).
|
|
415
|
+
|
|
416
|
+
```kotlin
|
|
417
|
+
import com.cometchat.uikit.kotlin.shared.formatters.CometChatMentionsFormatter
|
|
418
|
+
import com.cometchat.uikit.kotlin.shared.formatters.CometChatTextFormatter
|
|
419
|
+
|
|
420
|
+
val formatters = listOf<CometChatTextFormatter>(CometChatMentionsFormatter(context) /* , YourFormatter(context) */)
|
|
421
|
+
composer.setTextFormatters(formatters) // fun setTextFormatters(List<CometChatTextFormatter>?)
|
|
422
|
+
messageList.setTextFormatters(formatters)
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
For a custom @/#/! token: subclass `CometChatTextFormatter(trackingCharacter)` and implement its `search()` + view hooks (the kit's `shared/formatters/README.md` shows the mentions example: `setMentionLimit` / `setMentionsType` / `setOnMentionClick` / `setMentionStyle`).
|
|
426
|
+
|
|
260
427
|
## Hard rules
|
|
261
428
|
|
|
262
429
|
- BubbleFactory is an `abstract class` — extend it with `BubbleFactory()`
|
|
@@ -266,3 +433,7 @@ messageList.setStyle(style)
|
|
|
266
433
|
- For per-type content customization, use BubbleFactory. For cross-type slot overrides, use BubbleViewProvider
|
|
267
434
|
- `onViewRecycled()` is critical for cleaning up image loads, animations, or media playback
|
|
268
435
|
- Do NOT confuse BubbleFactory (UI rendering) with DataSource (data fetching) — they are separate layers
|
|
436
|
+
|
|
437
|
+
## Sound (in-app message + call sounds)
|
|
438
|
+
|
|
439
|
+
Sound is a customization sub-dimension. The UI Kit plays incoming/outgoing message + call sounds via `CometChatSoundManager` — mute it, swap custom audio, or play a specific sound. The full API + recipe lives in **`cometchat-android-v6-kotlin-theming`** (Sound section). Verify the access path against the installed kit before relying on it.
|
|
@@ -3,18 +3,19 @@ name: cometchat-android-v6-kotlin-placement
|
|
|
3
3
|
description: "CometChat Android UIKit v6 Kotlin Views placement — Activity, Fragment, BottomSheet, Tab, and Intent navigation patterns"
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-kotlin-android:6.x"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.1"
|
|
10
9
|
tags: "cometchat, android, kotlin-views, placement, activity, fragment, navigation, tabs"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **Ground truth:** `com.cometchat:chatuikit-kotlin-android:6.x` Views + `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.
|
|
13
|
+
|
|
13
14
|
> **Companion skills:** cometchat-android-v6-compose-placement (Compose equivalent), cometchat-android-v6-kotlin-components, cometchat-android-v6-kotlin-theming
|
|
14
15
|
|
|
15
16
|
## Purpose
|
|
16
17
|
|
|
17
|
-
Place CometChat Kotlin Views components into Activities, Fragments, BottomSheets, and Tab layouts. Patterns derived from `
|
|
18
|
+
Place CometChat Kotlin Views components into Activities, Fragments, BottomSheets, and Tab layouts. Patterns derived from `sample-app-kotlin`.
|
|
18
19
|
|
|
19
20
|
## Use this skill when
|
|
20
21
|
|
|
@@ -50,7 +51,7 @@ class ConversationsActivity : AppCompatActivity() {
|
|
|
50
51
|
|
|
51
52
|
### 1.2 Messages Activity
|
|
52
53
|
|
|
53
|
-
Pattern from `
|
|
54
|
+
Pattern from `sample-app-kotlin/.../ui/messages/MessagesActivity.kt`:
|
|
54
55
|
|
|
55
56
|
```kotlin
|
|
56
57
|
class MessagesActivity : AppCompatActivity() {
|
|
@@ -58,10 +59,21 @@ class MessagesActivity : AppCompatActivity() {
|
|
|
58
59
|
super.onCreate(savedInstanceState)
|
|
59
60
|
setContentView(R.layout.activity_messages)
|
|
60
61
|
|
|
62
|
+
// Pad the root for the status/navigation bars (root has fitsSystemWindows="true").
|
|
63
|
+
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.parent_view)) { view, insets ->
|
|
64
|
+
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
65
|
+
view.setPadding(systemBars.left, systemBars.top, systemBars.right, 0)
|
|
66
|
+
insets
|
|
67
|
+
}
|
|
68
|
+
|
|
61
69
|
val header = findViewById<CometChatMessageHeader>(R.id.messageHeader)
|
|
62
70
|
val messageList = findViewById<CometChatMessageList>(R.id.messageList)
|
|
63
71
|
val composer = findViewById<CometChatMessageComposer>(R.id.messageComposer)
|
|
64
72
|
|
|
73
|
+
// Show + wire the back button (the kit does not finish the Activity for you).
|
|
74
|
+
header.setBackButtonVisibility(View.VISIBLE)
|
|
75
|
+
header.setOnBackPress { finish() }
|
|
76
|
+
|
|
65
77
|
// Set user or group
|
|
66
78
|
header.setUser(user)
|
|
67
79
|
messageList.setUser(user)
|
|
@@ -75,13 +87,16 @@ class MessagesActivity : AppCompatActivity() {
|
|
|
75
87
|
}
|
|
76
88
|
```
|
|
77
89
|
|
|
78
|
-
XML layout:
|
|
90
|
+
XML layout — the root carries `android:fitsSystemWindows="true"` (so the inset listener above receives system-bar insets) and `?attr/cometchatBackgroundColor1`:
|
|
79
91
|
|
|
80
92
|
```xml
|
|
81
93
|
<?xml version="1.0" encoding="utf-8"?>
|
|
82
94
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
95
|
+
android:id="@+id/parent_view"
|
|
83
96
|
android:layout_width="match_parent"
|
|
84
97
|
android:layout_height="match_parent"
|
|
98
|
+
android:background="?attr/cometchatBackgroundColor1"
|
|
99
|
+
android:fitsSystemWindows="true"
|
|
85
100
|
android:orientation="vertical">
|
|
86
101
|
|
|
87
102
|
<com.cometchat.uikit.kotlin.presentation.messageheader.ui.CometChatMessageHeader
|
|
@@ -192,7 +207,7 @@ dialog.show()
|
|
|
192
207
|
|
|
193
208
|
## 6. App Flow Pattern
|
|
194
209
|
|
|
195
|
-
|
|
210
|
+
Pattern from `sample-app-kotlin/.../ui/home/HomeActivity.kt` — a single Activity hosts the chat flow via Fragment transactions:
|
|
196
211
|
|
|
197
212
|
```kotlin
|
|
198
213
|
class AppFlowActivity : AppCompatActivity() {
|
|
@@ -3,13 +3,14 @@ name: cometchat-android-v6-kotlin-theming
|
|
|
3
3
|
description: "CometChat Android UIKit v6 Kotlin Views theming — CometChatTheme singleton, XML attributes, programmatic overrides, typography, and dark mode"
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Android 9.0+ (API 28); Kotlin 1.9+; com.cometchat:chatuikit-kotlin-android:6.x"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.0"
|
|
10
9
|
tags: "cometchat, android, kotlin-views, theming, xml-attrs, colors, typography, dark-mode"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **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.
|
|
13
|
+
|
|
13
14
|
> **Companion skills:** cometchat-android-v6-compose-theming (Compose equivalent), cometchat-android-v6-kotlin-components, cometchat-android-v6-kotlin-customization
|
|
14
15
|
|
|
15
16
|
## Purpose
|
|
@@ -47,10 +48,14 @@ CometChatTheme.setErrorColor(Color.RED)
|
|
|
47
48
|
|
|
48
49
|
## 2. XML Theme Attributes
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
> **The app/activity theme MUST extend `CometChatTheme.DayNight` (required — components crash without it).** The kit ships `CometChatTheme.DayNight` (parent `Theme.MaterialComponents.DayNight.NoActionBar`), which defines every `cometchat*` theme attribute the component layouts reference. Parenting a plain `Theme.MaterialComponents` / `Theme.Material3` / `Theme.AppCompat` instead leaves those attrs unresolved and the **first component inflate crashes** — e.g. `CometChatConversations` (which inflates a `MaterialButton`/`MaterialCardView`) throws `java.lang.UnsupportedOperationException: Failed to resolve attribute …` or `IllegalArgumentException: requires your app theme to be Theme.MaterialComponents`. Set it in `AndroidManifest.xml` via `android:theme="@style/AppTheme"` (or `android:theme="@style/CometChatTheme.DayNight"` directly). Verified by building + running on-device, 2026-06-11.
|
|
52
|
+
|
|
53
|
+
Define theme colors in your app's `styles.xml` or `themes.xml`, parenting the kit theme:
|
|
51
54
|
|
|
52
55
|
```xml
|
|
53
|
-
|
|
56
|
+
<!-- parent MUST be CometChatTheme.DayNight (or a descendant) -->
|
|
57
|
+
<style name="AppTheme" parent="CometChatTheme.DayNight">
|
|
58
|
+
<!-- Override only what you want; the parent supplies all defaults. -->
|
|
54
59
|
<!-- Primary -->
|
|
55
60
|
<item name="cometchatPrimaryColor">#6851D6</item>
|
|
56
61
|
|
|
@@ -129,7 +134,7 @@ Extended primary colors auto-generate by blending primary with white (day) or bl
|
|
|
129
134
|
|
|
130
135
|
All follow the same pattern: `get{Token}(ctx)` / `set{Token}(color)` / `cometchat{Token}` XML attr. Defaults fall back to neutral scale values if not explicitly set.
|
|
131
136
|
|
|
132
|
-
Border color aliases: `getBorderColorLight()` = `getStrokeColorLight()`,
|
|
137
|
+
Border color aliases: `getBorderColorLight()` = `getStrokeColorLight()`, `getBorderColorDefault()` = `getStrokeColorDefault()`, `getBorderColorDark()` = `getStrokeColorDark()`. Note: `StrokeColor` also has a `Highlight` variant (`getStrokeColorHighlight()`); there is **no** `getBorderColorHighlight()`.
|
|
133
138
|
|
|
134
139
|
## 4. Typography
|
|
135
140
|
|
|
@@ -138,7 +143,8 @@ Border color aliases: `getBorderColorLight()` = `getStrokeColorLight()`, etc.
|
|
|
138
143
|
val titleBold: Int = CometChatTheme.getTextAppearanceTitleBold(context)
|
|
139
144
|
val bodyRegular: Int = CometChatTheme.getTextAppearanceBodyRegular(context)
|
|
140
145
|
val heading1Medium: Int = CometChatTheme.getTextAppearanceHeading1Medium(context)
|
|
141
|
-
// ...
|
|
146
|
+
// ... combinations: Title, Heading1-4, Body, Caption1-2, Button each have Regular/Medium/Bold.
|
|
147
|
+
// Link is the exception — only getTextAppearanceLinkRegular(context) exists (no Medium/Bold).
|
|
142
148
|
|
|
143
149
|
// Get font resource IDs
|
|
144
150
|
val regularFont: Int = CometChatTheme.getFontRegular(context)
|
|
@@ -193,6 +199,31 @@ val black: Int = CometChatTheme.getColorBlack(context)
|
|
|
193
199
|
val transparent: Int = CometChatTheme.getColorTransparent(context)
|
|
194
200
|
```
|
|
195
201
|
|
|
202
|
+
## Localization
|
|
203
|
+
|
|
204
|
+
To translate the UI, switch the active language, or override individual strings, route to the dedicated **`cometchat-i18n`** skill — the canonical cross-family localization reference. Android uses `CometChatLocalize.setLocale(context, Language.Code.<lang>)` / `getLocale(context)` (a separate method, **not** an `init` object — unlike web/RN). `cometchat-i18n` covers bundled languages, custom translations, and RTL. Docs: https://www.cometchat.com/docs/ui-kit/android/localize
|
|
205
|
+
|
|
206
|
+
## Sound Manager — custom notification & call sounds
|
|
207
|
+
|
|
208
|
+
Sounds are a **behavioral** customization — driven by `CometChatSoundManager`, an **instance** class that needs a `Context`. The UI Kit plays the built-in cues automatically; use this to override a cue with your own raw resource. V6 package (NOT the V5 `com.cometchat.chatuikit.*` path):
|
|
209
|
+
|
|
210
|
+
```kotlin
|
|
211
|
+
import com.cometchat.uikit.core.resources.soundmanager.CometChatSoundManager
|
|
212
|
+
import com.cometchat.uikit.core.resources.soundmanager.Sound
|
|
213
|
+
|
|
214
|
+
val soundManager = CometChatSoundManager(context)
|
|
215
|
+
|
|
216
|
+
// Play a default cue — Sound enum is SCREAMING_SNAKE_CASE: INCOMING_CALL |
|
|
217
|
+
// OUTGOING_CALL | INCOMING_MESSAGE | INCOMING_MESSAGE_FROM_OTHER | OUTGOING_MESSAGE
|
|
218
|
+
soundManager.play(Sound.INCOMING_CALL)
|
|
219
|
+
|
|
220
|
+
// Override with your own raw resource (R.raw.*)
|
|
221
|
+
soundManager.play(Sound.INCOMING_MESSAGE, R.raw.my_ping)
|
|
222
|
+
|
|
223
|
+
// Stop whatever is playing
|
|
224
|
+
soundManager.pause()
|
|
225
|
+
```
|
|
226
|
+
|
|
196
227
|
## Hard rules
|
|
197
228
|
|
|
198
229
|
- ALWAYS pass a valid `Context` to getter methods — they resolve XML attributes from the theme
|