@cometchat/skills 4.0.0 → 4.2.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.
Files changed (258) hide show
  1. package/README.md +42 -2
  2. package/bin/install.js +448 -57
  3. package/package.json +1 -1
  4. package/skills/cometchat/SKILL.md +337 -80
  5. package/skills/cometchat-a11y/SKILL.md +476 -0
  6. package/skills/cometchat-android-v5/SKILL.md +1 -1
  7. package/skills/cometchat-android-v5-calls/SKILL.md +413 -0
  8. package/skills/cometchat-android-v5-calls/references/README.md +53 -0
  9. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +195 -0
  10. package/skills/cometchat-android-v5-calls/references/audio-controls.md +91 -0
  11. package/skills/cometchat-android-v5-calls/references/background-handling.md +168 -0
  12. package/skills/cometchat-android-v5-calls/references/call-layouts.md +123 -0
  13. package/skills/cometchat-android-v5-calls/references/call-logs.md +113 -0
  14. package/skills/cometchat-android-v5-calls/references/call-session.md +274 -0
  15. package/skills/cometchat-android-v5-calls/references/custom-ui.md +150 -0
  16. package/skills/cometchat-android-v5-calls/references/event-listeners.md +123 -0
  17. package/skills/cometchat-android-v5-calls/references/group-calls.md +205 -0
  18. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +111 -0
  19. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +134 -0
  20. package/skills/cometchat-android-v5-calls/references/join-session.md +120 -0
  21. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +206 -0
  22. package/skills/cometchat-android-v5-calls/references/participant-management.md +110 -0
  23. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +106 -0
  24. package/skills/cometchat-android-v5-calls/references/raise-hand.md +242 -0
  25. package/skills/cometchat-android-v5-calls/references/recording.md +101 -0
  26. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +152 -0
  27. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +82 -0
  28. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +215 -0
  29. package/skills/cometchat-android-v5-calls/references/session-settings.md +121 -0
  30. package/skills/cometchat-android-v5-calls/references/setup.md +137 -0
  31. package/skills/cometchat-android-v5-calls/references/share-invite.md +151 -0
  32. package/skills/cometchat-android-v5-calls/references/video-controls.md +87 -0
  33. package/skills/cometchat-android-v5-calls/references/voip-calling.md +526 -0
  34. package/skills/cometchat-android-v5-components/SKILL.md +1 -1
  35. package/skills/cometchat-android-v5-core/SKILL.md +1 -1
  36. package/skills/cometchat-android-v5-customization/SKILL.md +1 -1
  37. package/skills/cometchat-android-v5-extensions/SKILL.md +1 -1
  38. package/skills/cometchat-android-v5-features/SKILL.md +1 -1
  39. package/skills/cometchat-android-v5-placement/SKILL.md +1 -1
  40. package/skills/cometchat-android-v5-production/SKILL.md +1 -1
  41. package/skills/cometchat-android-v5-push/SKILL.md +1 -1
  42. package/skills/cometchat-android-v5-testing/SKILL.md +1 -1
  43. package/skills/cometchat-android-v5-theming/SKILL.md +1 -1
  44. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +1 -1
  45. package/skills/cometchat-android-v6/SKILL.md +1 -1
  46. package/skills/cometchat-android-v6-builder-settings/SKILL.md +1 -1
  47. package/skills/cometchat-android-v6-calls/SKILL.md +375 -0
  48. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +97 -0
  49. package/skills/cometchat-android-v6-calls/references/call-layouts.md +91 -0
  50. package/skills/cometchat-android-v6-calls/references/call-session.md +163 -0
  51. package/skills/cometchat-android-v6-calls/references/device-management.md +171 -0
  52. package/skills/cometchat-android-v6-calls/references/group-calls.md +191 -0
  53. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +107 -0
  54. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +136 -0
  55. package/skills/cometchat-android-v6-calls/references/raise-hand.md +186 -0
  56. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +176 -0
  57. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +127 -0
  58. package/skills/cometchat-android-v6-calls/references/share-invite.md +105 -0
  59. package/skills/cometchat-android-v6-compose-components/SKILL.md +2 -2
  60. package/skills/cometchat-android-v6-compose-customization/SKILL.md +1 -1
  61. package/skills/cometchat-android-v6-compose-placement/SKILL.md +1 -1
  62. package/skills/cometchat-android-v6-compose-theming/SKILL.md +1 -1
  63. package/skills/cometchat-android-v6-core/SKILL.md +1 -1
  64. package/skills/cometchat-android-v6-events/SKILL.md +1 -1
  65. package/skills/cometchat-android-v6-extensions/SKILL.md +1 -1
  66. package/skills/cometchat-android-v6-features/SKILL.md +1 -1
  67. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +1 -1
  68. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +1 -1
  69. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +1 -1
  70. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +1 -1
  71. package/skills/cometchat-android-v6-migration/SKILL.md +398 -0
  72. package/skills/cometchat-android-v6-production/SKILL.md +1 -1
  73. package/skills/cometchat-android-v6-push/SKILL.md +1 -1
  74. package/skills/cometchat-android-v6-testing/SKILL.md +1 -1
  75. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +1 -1
  76. package/skills/cometchat-angular-calls/SKILL.md +511 -0
  77. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +95 -0
  78. package/skills/cometchat-angular-calls/references/call-layouts.md +106 -0
  79. package/skills/cometchat-angular-calls/references/call-session.md +167 -0
  80. package/skills/cometchat-angular-calls/references/custom-ui.md +231 -0
  81. package/skills/cometchat-angular-calls/references/device-management.md +135 -0
  82. package/skills/cometchat-angular-calls/references/group-calls.md +412 -0
  83. package/skills/cometchat-angular-calls/references/idle-timeout.md +145 -0
  84. package/skills/cometchat-angular-calls/references/in-call-chat.md +148 -0
  85. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +205 -0
  86. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +53 -0
  87. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +183 -0
  88. package/skills/cometchat-angular-calls/references/picture-in-picture.md +285 -0
  89. package/skills/cometchat-angular-calls/references/raise-hand.md +167 -0
  90. package/skills/cometchat-angular-calls/references/recording-screen-share.md +267 -0
  91. package/skills/cometchat-angular-calls/references/ringing-integration.md +131 -0
  92. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +100 -0
  93. package/skills/cometchat-angular-calls/references/share-invite.md +116 -0
  94. package/skills/cometchat-angular-components/SKILL.md +1 -1
  95. package/skills/cometchat-angular-core/SKILL.md +1 -1
  96. package/skills/cometchat-angular-customization/SKILL.md +1 -1
  97. package/skills/cometchat-angular-features/SKILL.md +1 -1
  98. package/skills/cometchat-angular-patterns/SKILL.md +1 -1
  99. package/skills/cometchat-angular-placement/SKILL.md +1 -1
  100. package/skills/cometchat-angular-production/SKILL.md +1 -1
  101. package/skills/cometchat-angular-push/SKILL.md +403 -0
  102. package/skills/cometchat-angular-testing/SKILL.md +333 -0
  103. package/skills/cometchat-angular-theming/SKILL.md +1 -1
  104. package/skills/cometchat-angular-troubleshooting/SKILL.md +1 -1
  105. package/skills/cometchat-astro-patterns/SKILL.md +1 -1
  106. package/skills/cometchat-calls/SKILL.md +358 -0
  107. package/skills/cometchat-calls/references/use-case-broadcast.md +194 -0
  108. package/skills/cometchat-calls/references/use-case-marketplace.md +158 -0
  109. package/skills/cometchat-calls/references/use-case-support.md +190 -0
  110. package/skills/cometchat-calls/references/use-case-team.md +169 -0
  111. package/skills/cometchat-calls/references/use-case-telehealth.md +154 -0
  112. package/skills/cometchat-components/SKILL.md +1 -1
  113. package/skills/cometchat-core/SKILL.md +1 -1
  114. package/skills/cometchat-customization/SKILL.md +2 -2
  115. package/skills/cometchat-features/SKILL.md +2 -2
  116. package/skills/cometchat-flutter-v5/SKILL.md +1 -1
  117. package/skills/cometchat-flutter-v5-calls/SKILL.md +325 -94
  118. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +169 -0
  119. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +98 -0
  120. package/skills/cometchat-flutter-v5-calls/references/call-session.md +330 -0
  121. package/skills/cometchat-flutter-v5-calls/references/device-management.md +120 -0
  122. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +187 -0
  123. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +97 -0
  124. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +132 -0
  125. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +160 -0
  126. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +244 -0
  127. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +193 -0
  128. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +101 -0
  129. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +142 -0
  130. package/skills/cometchat-flutter-v5-conversations/SKILL.md +1 -1
  131. package/skills/cometchat-flutter-v5-core/SKILL.md +1 -1
  132. package/skills/cometchat-flutter-v5-customization/SKILL.md +1 -1
  133. package/skills/cometchat-flutter-v5-events/SKILL.md +1 -1
  134. package/skills/cometchat-flutter-v5-messages/SKILL.md +1 -1
  135. package/skills/cometchat-flutter-v5-production/SKILL.md +1 -1
  136. package/skills/cometchat-flutter-v5-push/SKILL.md +1 -1
  137. package/skills/cometchat-flutter-v5-testing/SKILL.md +390 -0
  138. package/skills/cometchat-flutter-v5-theming/SKILL.md +1 -1
  139. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +1 -1
  140. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +1 -1
  141. package/skills/cometchat-flutter-v6/SKILL.md +1 -1
  142. package/skills/cometchat-flutter-v6-calls/SKILL.md +308 -243
  143. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +134 -0
  144. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +102 -0
  145. package/skills/cometchat-flutter-v6-calls/references/call-session.md +229 -0
  146. package/skills/cometchat-flutter-v6-calls/references/device-management.md +99 -0
  147. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +190 -0
  148. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +80 -0
  149. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +122 -0
  150. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +268 -0
  151. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +171 -0
  152. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +93 -0
  153. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +102 -0
  154. package/skills/cometchat-flutter-v6-components/SKILL.md +1 -1
  155. package/skills/cometchat-flutter-v6-conversations/SKILL.md +1 -1
  156. package/skills/cometchat-flutter-v6-core/SKILL.md +1 -1
  157. package/skills/cometchat-flutter-v6-customization/SKILL.md +1 -1
  158. package/skills/cometchat-flutter-v6-events/SKILL.md +1 -1
  159. package/skills/cometchat-flutter-v6-features/SKILL.md +1 -1
  160. package/skills/cometchat-flutter-v6-messages/SKILL.md +1 -1
  161. package/skills/cometchat-flutter-v6-migration/SKILL.md +1 -1
  162. package/skills/cometchat-flutter-v6-placement/SKILL.md +1 -1
  163. package/skills/cometchat-flutter-v6-production/SKILL.md +1 -1
  164. package/skills/cometchat-flutter-v6-push/SKILL.md +452 -0
  165. package/skills/cometchat-flutter-v6-testing/SKILL.md +319 -0
  166. package/skills/cometchat-flutter-v6-theming/SKILL.md +1 -1
  167. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +1 -1
  168. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +1 -1
  169. package/skills/cometchat-i18n/SKILL.md +358 -0
  170. package/skills/cometchat-ios/SKILL.md +5 -5
  171. package/skills/cometchat-ios-calls/SKILL.md +409 -0
  172. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +172 -0
  173. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +189 -0
  174. package/skills/cometchat-ios-calls/references/call-layouts.md +136 -0
  175. package/skills/cometchat-ios-calls/references/call-session.md +221 -0
  176. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +353 -0
  177. package/skills/cometchat-ios-calls/references/custom-ui.md +322 -0
  178. package/skills/cometchat-ios-calls/references/device-management.md +171 -0
  179. package/skills/cometchat-ios-calls/references/group-calls.md +396 -0
  180. package/skills/cometchat-ios-calls/references/idle-timeout.md +185 -0
  181. package/skills/cometchat-ios-calls/references/in-call-chat.md +183 -0
  182. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +138 -0
  183. package/skills/cometchat-ios-calls/references/picture-in-picture.md +246 -0
  184. package/skills/cometchat-ios-calls/references/raise-hand.md +239 -0
  185. package/skills/cometchat-ios-calls/references/recording-screen-share.md +339 -0
  186. package/skills/cometchat-ios-calls/references/ringing-integration.md +142 -0
  187. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +267 -0
  188. package/skills/cometchat-ios-calls/references/share-invite.md +152 -0
  189. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +246 -0
  190. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +166 -0
  191. package/skills/cometchat-ios-components/SKILL.md +1 -1
  192. package/skills/cometchat-ios-core/SKILL.md +1 -1
  193. package/skills/cometchat-ios-customization/SKILL.md +1 -1
  194. package/skills/cometchat-ios-features/SKILL.md +1 -1
  195. package/skills/cometchat-ios-placement/SKILL.md +1 -1
  196. package/skills/cometchat-ios-production/SKILL.md +1 -1
  197. package/skills/cometchat-ios-push/SKILL.md +1 -1
  198. package/skills/cometchat-ios-testing/SKILL.md +371 -0
  199. package/skills/cometchat-ios-theming/SKILL.md +1 -1
  200. package/skills/cometchat-ios-troubleshooting/SKILL.md +1 -1
  201. package/skills/cometchat-native-bare-patterns/SKILL.md +45 -3
  202. package/skills/cometchat-native-calls/SKILL.md +599 -0
  203. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +203 -0
  204. package/skills/cometchat-native-calls/references/call-layouts.md +124 -0
  205. package/skills/cometchat-native-calls/references/call-session.md +182 -0
  206. package/skills/cometchat-native-calls/references/custom-ui.md +250 -0
  207. package/skills/cometchat-native-calls/references/device-management.md +135 -0
  208. package/skills/cometchat-native-calls/references/expo-vs-bare.md +179 -0
  209. package/skills/cometchat-native-calls/references/group-calls.md +291 -0
  210. package/skills/cometchat-native-calls/references/idle-timeout.md +128 -0
  211. package/skills/cometchat-native-calls/references/in-call-chat.md +143 -0
  212. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +72 -0
  213. package/skills/cometchat-native-calls/references/picture-in-picture.md +276 -0
  214. package/skills/cometchat-native-calls/references/raise-hand.md +203 -0
  215. package/skills/cometchat-native-calls/references/recording-screen-share.md +290 -0
  216. package/skills/cometchat-native-calls/references/ringing-integration.md +118 -0
  217. package/skills/cometchat-native-calls/references/server-push-bridge.md +135 -0
  218. package/skills/cometchat-native-calls/references/server-push-payloads.md +193 -0
  219. package/skills/cometchat-native-calls/references/share-invite.md +144 -0
  220. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +317 -0
  221. package/skills/cometchat-native-components/SKILL.md +1 -1
  222. package/skills/cometchat-native-core/SKILL.md +1 -1
  223. package/skills/cometchat-native-customization/SKILL.md +1 -1
  224. package/skills/cometchat-native-expo-patterns/SKILL.md +18 -1
  225. package/skills/cometchat-native-features/SKILL.md +1 -1
  226. package/skills/cometchat-native-placement/SKILL.md +1 -1
  227. package/skills/cometchat-native-production/SKILL.md +1 -1
  228. package/skills/cometchat-native-push/SKILL.md +1 -1
  229. package/skills/cometchat-native-testing/SKILL.md +1 -1
  230. package/skills/cometchat-native-theming/SKILL.md +1 -1
  231. package/skills/cometchat-native-troubleshooting/SKILL.md +1 -1
  232. package/skills/cometchat-nextjs-patterns/SKILL.md +1 -1
  233. package/skills/cometchat-placement/SKILL.md +29 -1
  234. package/skills/cometchat-production/SKILL.md +1 -1
  235. package/skills/cometchat-react-calls/SKILL.md +539 -0
  236. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +145 -0
  237. package/skills/cometchat-react-calls/references/call-layouts.md +161 -0
  238. package/skills/cometchat-react-calls/references/call-session.md +235 -0
  239. package/skills/cometchat-react-calls/references/custom-ui.md +201 -0
  240. package/skills/cometchat-react-calls/references/device-management.md +206 -0
  241. package/skills/cometchat-react-calls/references/group-calls.md +262 -0
  242. package/skills/cometchat-react-calls/references/idle-timeout.md +175 -0
  243. package/skills/cometchat-react-calls/references/in-call-chat.md +212 -0
  244. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +172 -0
  245. package/skills/cometchat-react-calls/references/picture-in-picture.md +245 -0
  246. package/skills/cometchat-react-calls/references/raise-hand.md +238 -0
  247. package/skills/cometchat-react-calls/references/recording-screen-share.md +143 -0
  248. package/skills/cometchat-react-calls/references/ringing-integration.md +255 -0
  249. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +241 -0
  250. package/skills/cometchat-react-calls/references/share-invite.md +176 -0
  251. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +198 -0
  252. package/skills/cometchat-react-calls/references/voip-and-web-push.md +165 -0
  253. package/skills/cometchat-react-patterns/SKILL.md +56 -8
  254. package/skills/cometchat-react-push/SKILL.md +448 -0
  255. package/skills/cometchat-react-router-patterns/SKILL.md +1 -1
  256. package/skills/cometchat-react-testing/SKILL.md +404 -0
  257. package/skills/cometchat-theming/SKILL.md +3 -3
  258. package/skills/cometchat-troubleshooting/SKILL.md +2 -2
@@ -0,0 +1,206 @@
1
+ # CometChat Calls Android SDK v4 → v5 migration
2
+
3
+ `com.cometchat:calls-sdk-android:5.+` is a drop-in upgrade for v4 — bump the Gradle dependency, existing code still compiles thanks to deprecated method shims.
4
+
5
+ **Canonical docs:** https://www.cometchat.com/docs/calls/android/migration-guide-v5
6
+
7
+ **Important:** This is the migration for the **Calls SDK** (v4 → v5 of the calls dependency). It is NOT the same as the **UI Kit cohort migration** (V5 cohort → V6 Compose cohort), which is documented in `cometchat-android-v6-migration`. You can be on UI Kit V5 cohort with Calls SDK v5 — they version independently.
8
+
9
+ ---
10
+
11
+ ## Step 1 — Bump the Gradle dependency
12
+
13
+ ```kotlin
14
+ // app/build.gradle.kts
15
+ dependencies {
16
+ implementation("com.cometchat:calls-sdk-android:5.+")
17
+ }
18
+ ```
19
+
20
+ ```bash
21
+ ./gradlew :app:dependencies | grep calls-sdk
22
+ ```
23
+
24
+ Should show `com.cometchat:calls-sdk-android:5.x.x`.
25
+
26
+ ---
27
+
28
+ ## Step 2 — Migrate init to plain config
29
+
30
+ ```diff
31
+ - val callAppSettings = CallAppSettings.Builder()
32
+ - .setAppId("APP_ID")
33
+ - .setRegion("REGION")
34
+ - .build()
35
+ - CometChatCalls.init(callAppSettings, object : CometChatCalls.CallbackListener<String>() {
36
+ - override fun onSuccess(s: String) { /* ... */ }
37
+ - override fun onError(e: CometChatException) { /* ... */ }
38
+ - })
39
+
40
+ + val settings = CallAppSettings(appId = "APP_ID", region = "REGION")
41
+ + CometChatCalls.init(settings, object : CometChatCalls.CallbackListener<String>() {
42
+ + override fun onSuccess(s: String) { /* ... */ }
43
+ + override fun onError(e: CometChatException) { /* ... */ }
44
+ + })
45
+ ```
46
+
47
+ (V5 also supports coroutine-suspend `init` via `kotlinx.coroutines` extensions, if you've enabled them.)
48
+
49
+ ---
50
+
51
+ ## Step 3 — Add Calls SDK login (mandatory)
52
+
53
+ In v5 the Calls SDK has its own auth state, separate from the Chat SDK. Without a Calls SDK login step, the FIRST calls API call (initiate, join, generateToken) throws **"auth token cannot be null"**.
54
+
55
+ The Android v5 Calls SDK exposes two `CometChatCalls.login` overloads — match the API exactly:
56
+
57
+ ```kotlin
58
+ import com.cometchat.calls.core.CometChatCalls
59
+ import com.cometchat.calls.exceptions.CometChatException as CallsException
60
+ import com.cometchat.calls.model.CallUser // ← callback returns CallUser, NOT User
61
+
62
+ // Dev mode (Auth Key)
63
+ CometChatCalls.login(uid, AUTH_KEY,
64
+ object : CometChatCalls.CallbackListener<CallUser>() {
65
+ override fun onSuccess(callUser: CallUser) {
66
+ // calls SDK is now ready
67
+ }
68
+ override fun onError(e: CallsException) {
69
+ // surface to user — common cause: typo in app id / auth key
70
+ }
71
+ })
72
+
73
+ // Production mode (server-minted auth token)
74
+ CometChatCalls.login(authToken,
75
+ object : CometChatCalls.CallbackListener<CallUser>() { /* … */ })
76
+ ```
77
+
78
+ **Hard rules:**
79
+
80
+ 1. **Call this AFTER `CometChat.login()` succeeds** — the Calls SDK login won't work until the Chat SDK has a valid session.
81
+ 2. **The callback receives `com.cometchat.calls.model.CallUser`**, not `com.cometchat.chat.models.User`. Importing the wrong type produces "Type mismatch" at compile time.
82
+ 3. **Re-login on every cold start** — the Chat SDK persists login across launches via Shared Prefs; the Calls SDK does NOT. Each app launch where `CometChat.getLoggedInUser()` returns non-null still needs a fresh `CometChatCalls.login` call.
83
+ 4. **Don't try `user.authToken`** — `com.cometchat.chat.models.User` does NOT expose `authToken` as a Kotlin property or Java getter on Android. Use the (uid, apiKey) overload for dev, or fetch the auth token from your backend for production. *(This trapped a real smoke run — the chat-side User object hides the auth token.)*
84
+
85
+ After this step, `generateToken()` no longer needs the authToken parameter — the Calls SDK uses its internal session.
86
+
87
+ ---
88
+
89
+ ## Step 4 — Migrate CallSettings.Builder to SessionSettings
90
+
91
+ ```diff
92
+ - val callSettings = CallSettings.Builder(activity)
93
+ - .setSessionType(SessionType.VIDEO)
94
+ - .startWithAudioMuted(false)
95
+ - .showRecordingButton(true)
96
+ - .build()
97
+
98
+ + val sessionSettings = SessionSettings(
99
+ + sessionType = SessionType.VIDEO,
100
+ + startAudioMuted = false,
101
+ + hideRecordingButton = false, // INVERTED
102
+ + layout = LayoutType.TILE,
103
+ + )
104
+ ```
105
+
106
+ ---
107
+
108
+ ## Step 5 — Migrate listener interface to event listeners
109
+
110
+ ```diff
111
+ - class MyCallEvents : CometChatCallsEventsListener {
112
+ - override fun onCallEnded() { /* ... */ }
113
+ - override fun onUserJoined(user: User) { /* ... */ }
114
+ - override fun onUserLeft(user: User) { /* ... */ }
115
+ - override fun onError(error: CometChatException) { /* ... */ }
116
+ - }
117
+
118
+ + // Granular event subscriptions
119
+ + val unsub1 = CometChatCalls.addEventListener(CallEvent.SESSION_LEFT) { /* ... */ }
120
+ + val unsub2 = CometChatCalls.addEventListener(CallEvent.PARTICIPANT_JOINED) { participant -> /* ... */ }
121
+ + val unsub3 = CometChatCalls.addEventListener(CallEvent.PARTICIPANT_LEFT) { participant -> /* ... */ }
122
+ +
123
+ + // Cleanup in onDestroy or scope cancellation
124
+ + override fun onDestroy() {
125
+ + unsub1.invoke()
126
+ + unsub2.invoke()
127
+ + unsub3.invoke()
128
+ + }
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Step 6 — Method renames + receiver shift (Android-specific)
134
+
135
+ v5 moved most call-control APIs from static methods on `CometChatCalls` to **instance methods on `CallSession`** (the object returned by `joinSession`'s callback). The static `endSession()` is the only one preserved as a deprecated shim — the others throw "method not found" if you keep the v4 receiver.
136
+
137
+ ```diff
138
+ // session lifecycle — receiver changes from CometChatCalls (static) to CallSession (instance)
139
+ - CometChatCalls.endSession()
140
+ + callSession.leaveSession() // call on the CallSession from joinSession's onSuccess
141
+ + // OR if you don't have the reference handy:
142
+ + CallSession.getInstance().leaveSession()
143
+
144
+ // media controls — same receiver shift
145
+ - CometChatCalls.muteAudio(true)
146
+ + callSession.muteAudio()
147
+ - CometChatCalls.muteAudio(false)
148
+ + callSession.unmuteAudio()
149
+
150
+ - CometChatCalls.pauseVideo(true)
151
+ + callSession.pauseVideo()
152
+ - CometChatCalls.pauseVideo(false)
153
+ + callSession.resumeVideo()
154
+
155
+ - CometChatCalls.startScreenShare()
156
+ + callSession.startScreenShare()
157
+ - CometChatCalls.stopScreenShare()
158
+ + callSession.stopScreenShare()
159
+
160
+ // layout — static on CometChatCalls in v5 (different from session methods)
161
+ - CometChatCalls.setMode(mode)
162
+ + CometChatCalls.setLayout(layout)
163
+ ```
164
+
165
+ **Hold onto the `CallSession` reference** returned by `joinSession`'s `onSuccess(callSession: CallSession)` callback — most v5 in-call APIs live there. Stashing it in an Activity field or ViewModel is the canonical pattern; the SDK also exposes `CallSession.getInstance()` as a fallback if you've lost the reference.
166
+
167
+ ---
168
+
169
+ ## Step 7 — Compose call surface unchanged
170
+
171
+ If you're using XML `CometChatCallActivity`, no changes. If you've embedded the call surface via `CometChatOngoingCallView`, the v5 SDK's view component takes `SessionSettings` directly:
172
+
173
+ ```diff
174
+ - callView.startCall(callSettings)
175
+ + callView.joinSession(sessionSettings)
176
+ ```
177
+
178
+ ---
179
+
180
+ ## ConnectionService + ForegroundServiceType (no v5 changes)
181
+
182
+ The seven hard rules from `cometchat-android-v5-calls/SKILL.md` still apply post-v5:
183
+ - ConnectionService for incoming calls
184
+ - `foregroundServiceType="microphone"` (or `camera|microphone`) for active calls
185
+ - Hangup teardown sequence
186
+
187
+ ---
188
+
189
+ ## Verification checklist
190
+
191
+ - [ ] `app/build.gradle.kts` lists calls-sdk-android v5+
192
+ - [ ] `./gradlew :app:dependencies` shows v5 resolved
193
+ - [ ] `CometChatCalls.login(authToken)` called after `CometChat.login`
194
+ - [ ] `CometChatCallsEventsListener` replaced with `addEventListener`
195
+ - [ ] `CallSettings.Builder` replaced with `SessionSettings`
196
+ - [ ] Method renames applied
197
+ - [ ] FCM VoIP push still arrives + ConnectionService still surfaces UI
198
+ - [ ] Real-device smoke: 2 phones, foreground + backgrounded recipient, mic/camera/screenshare/end
199
+
200
+ ---
201
+
202
+ ## Pointers
203
+
204
+ - Canonical migration: https://www.cometchat.com/docs/calls/android/migration-guide-v5
205
+ - `cometchat-android-v5-calls/SKILL.md` — seven hard rules (unchanged in v5)
206
+ - `cometchat-android-v5-calls/references/server-fcm-voip.md` — FCM (unchanged in v5)
@@ -0,0 +1,110 @@
1
+ ---
2
+ name: participant-management
3
+ description: Manage call participants — mute, pause video, pin/unpin, raise hand, view participant list. Use when implementing moderation, participant actions, or custom participant UI. Triggers on "mute participant", "pin participant", "participant list", "raise hand", "kick participant", "participant management".
4
+ inclusion: manual
5
+ ---
6
+
7
+ # CometChat Calls SDK v5 — Participant Management
8
+
9
+ ## Overview
10
+
11
+ Control other participants during calls: mute their audio, pause their video, pin/unpin in layout. Monitor participant state via `ParticipantEventListener`. Raise hand is available for self.
12
+
13
+ ## Key Imports
14
+
15
+ ```kotlin
16
+ import com.cometchat.calls.core.CallSession
17
+ import com.cometchat.calls.listeners.ParticipantEventListener
18
+ import com.cometchat.calls.model.Participant
19
+ ```
20
+
21
+ ## Implementation
22
+
23
+ ### Participant Actions
24
+
25
+ ```kotlin
26
+ val callSession = CallSession.getInstance()
27
+
28
+ // Mute a participant's audio
29
+ callSession.muteParticipant(participant.uid)
30
+
31
+ // Pause a participant's video
32
+ callSession.pauseParticipantVideo(participant.uid)
33
+
34
+ // Pin a participant (keeps them prominent in layout)
35
+ callSession.pinParticipant(participant.uid)
36
+
37
+ // Unpin (return to automatic speaker highlighting)
38
+ callSession.unPinParticipant()
39
+ ```
40
+
41
+ ### Raise Hand (Self)
42
+
43
+ Raise hand is controlled via the built-in UI button. Listen for it:
44
+
45
+ ```kotlin
46
+ callSession.addButtonClickListener(this, object : ButtonClickListener() {
47
+ override fun onRaiseHandButtonClicked() {
48
+ Log.d(TAG, "Hand raised/lowered")
49
+ }
50
+ // ... other overrides
51
+ })
52
+ ```
53
+
54
+ ### Listen for Participant Events
55
+
56
+ ```kotlin
57
+ callSession.addParticipantEventListener(this, object : ParticipantEventListener() {
58
+ override fun onParticipantJoined(participant: Participant) {}
59
+ override fun onParticipantLeft(participant: Participant) {}
60
+ override fun onParticipantListChanged(participants: List<Participant>) {
61
+ // Full participant list — use for UI updates
62
+ }
63
+ override fun onParticipantAudioMuted(participant: Participant) {}
64
+ override fun onParticipantAudioUnmuted(participant: Participant) {}
65
+ override fun onParticipantVideoPaused(participant: Participant) {}
66
+ override fun onParticipantVideoResumed(participant: Participant) {}
67
+ override fun onParticipantHandRaised(participant: Participant) {}
68
+ override fun onParticipantHandLowered(participant: Participant) {}
69
+ override fun onDominantSpeakerChanged(participant: Participant) {}
70
+ override fun onParticipantStartedScreenShare(participant: Participant) {}
71
+ override fun onParticipantStoppedScreenShare(participant: Participant) {}
72
+ override fun onParticipantStartedRecording(participant: Participant) {}
73
+ override fun onParticipantStoppedRecording(participant: Participant) {}
74
+ })
75
+ ```
76
+
77
+ ### Participant Object Properties
78
+
79
+ | Property | Type | Description |
80
+ |----------|------|-------------|
81
+ | `uid` | String | CometChat user ID |
82
+ | `name` | String | Display name |
83
+ | `avatar` | String | Avatar URL |
84
+ | `isAudioMuted` | Boolean | Audio muted? |
85
+ | `isVideoPaused` | Boolean | Video paused? |
86
+ | `isPinned` | Boolean | Pinned in layout? |
87
+ | `isPresenting` | Boolean | Screen sharing? |
88
+ | `raisedHandTimestamp` | Long | 0 if not raised |
89
+
90
+ ### Show/Hide Participant List Button
91
+
92
+ ```kotlin
93
+ val sessionSettings = CometChatCalls.SessionSettingsBuilder()
94
+ .hideParticipantListButton(false) // show participant list
95
+ .hideRaiseHandButton(false) // show raise hand
96
+ .build()
97
+ ```
98
+
99
+ ## Gotchas
100
+
101
+ - By default, **all participants** have moderator access (can mute/pause others)
102
+ - Implement role-based restrictions in your app logic if needed
103
+ - Pinning only affects **your local view** — other participants can pin independently
104
+ - `unPinParticipant()` takes no arguments — unpins whoever is currently pinned
105
+ - `raisedHandTimestamp > 0` means hand is raised
106
+ - There is no "kick" API — only mute and pause video
107
+
108
+ ## Sample App Reference
109
+
110
+ - `CallActivity.kt` — `setupCallListeners()` with `ButtonClickListener`
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: picture-in-picture
3
+ description: Enable Picture-in-Picture mode for calls. Use when implementing PiP, floating call window, auto-PiP on home press, or PiP layout events. Triggers on "picture in picture", "PiP", "pip mode", "floating window".
4
+ inclusion: manual
5
+ ---
6
+
7
+ # CometChat Calls SDK v5 — Picture-in-Picture
8
+
9
+ ## Overview
10
+
11
+ PiP lets users continue calls in a floating window while using other apps. Your app manages Android's PiP APIs; the Calls SDK adjusts the call UI layout to fit the smaller window.
12
+
13
+ ## Prerequisites
14
+
15
+ - Android 8.0+ (API 26+)
16
+ - Active call session
17
+
18
+ ## Key Imports
19
+
20
+ ```kotlin
21
+ import android.app.PictureInPictureParams
22
+ import android.util.Rational
23
+ import com.cometchat.calls.core.CallSession
24
+ import com.cometchat.calls.listeners.LayoutListener
25
+ import com.cometchat.calls.model.LayoutType
26
+ ```
27
+
28
+ ## Implementation
29
+
30
+ ### Manifest Configuration
31
+
32
+ ```xml
33
+ <activity
34
+ android:name=".CallActivity"
35
+ android:supportsPictureInPicture="true"
36
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
37
+ ```
38
+
39
+ ### Enable/Disable PiP Layout
40
+
41
+ ```kotlin
42
+ val callSession = CallSession.getInstance()
43
+
44
+ // Tell SDK to adjust UI for PiP
45
+ callSession.enablePictureInPictureLayout()
46
+
47
+ // Restore full UI
48
+ callSession.disablePictureInPictureLayout()
49
+ ```
50
+
51
+ ### Auto-Enter PiP on Home Press
52
+
53
+ ```kotlin
54
+ override fun onUserLeaveHint() {
55
+ super.onUserLeaveHint()
56
+ if (CallSession.getInstance().isSessionActive) {
57
+ enterPictureInPictureMode(
58
+ PictureInPictureParams.Builder()
59
+ .setAspectRatio(Rational(16, 9))
60
+ .build()
61
+ )
62
+ CallSession.getInstance().enablePictureInPictureLayout()
63
+ }
64
+ }
65
+ ```
66
+
67
+ ### Handle PiP Mode Changes
68
+
69
+ ```kotlin
70
+ override fun onPictureInPictureModeChanged(isInPiPMode: Boolean, config: Configuration) {
71
+ super.onPictureInPictureModeChanged(isInPiPMode, config)
72
+ if (isInPiPMode) {
73
+ CallSession.getInstance().enablePictureInPictureLayout()
74
+ } else {
75
+ CallSession.getInstance().disablePictureInPictureLayout()
76
+ }
77
+ }
78
+ ```
79
+
80
+ ### Listen for PiP Events
81
+
82
+ ```kotlin
83
+ callSession.addLayoutListener(this, object : LayoutListener() {
84
+ override fun onPictureInPictureLayoutEnabled() {
85
+ // Hide custom overlays/controls
86
+ }
87
+ override fun onPictureInPictureLayoutDisabled() {
88
+ // Show custom overlays/controls
89
+ }
90
+ override fun onCallLayoutChanged(layoutType: LayoutType) {}
91
+ override fun onParticipantListVisible() {}
92
+ override fun onParticipantListHidden() {}
93
+ })
94
+ ```
95
+
96
+ ## Gotchas
97
+
98
+ - The SDK only adjusts the **call UI layout** — your app must call `enterPictureInPictureMode()` itself
99
+ - `configChanges` in manifest prevents activity restart during PiP transitions
100
+ - PiP has no effect on Android < 8.0
101
+ - Hide custom controls in PiP mode — they won't be usable in the small window
102
+ - Use `isSessionActive` check before entering PiP to avoid errors
103
+
104
+ ## Sample App Reference
105
+
106
+ - `CallActivity.kt` — Call activity that could be extended with PiP support
@@ -0,0 +1,242 @@
1
+ # Raise hand on Android V5 (Java + Kotlin Views)
2
+
3
+ Native CometChat Calls SDK for Android. The shape mirrors web (raise/lower + listener events + button-hide flag); Android-specific is the listener attachment lifecycle (Activity/Fragment) + accessibility via `View.announceForAccessibility`.
4
+
5
+ **Canonical docs:** https://www.cometchat.com/docs/calls/android/raise-hand
6
+ **Read first:** `cometchat-react-calls/references/raise-hand.md` — UX shape + anti-patterns.
7
+
8
+ ---
9
+
10
+ ## SDK API
11
+
12
+ ```kotlin
13
+ import com.cometchat.calls.core.CometChatCalls
14
+ import com.cometchat.calls.listeners.CometChatCallsEventsListener
15
+ import com.cometchat.calls.model.Participant
16
+
17
+ // Local user
18
+ CometChatCalls.raiseHand()
19
+ CometChatCalls.lowerHand()
20
+
21
+ // Listener — attached at session start
22
+ val listener = object : CometChatCallsEventsListener {
23
+ override fun onParticipantHandRaised(participant: Participant) {
24
+ // participant.uid, participant.name
25
+ }
26
+
27
+ override fun onParticipantHandLowered(participant: Participant) {
28
+ // ...
29
+ }
30
+ // ... other event handlers
31
+ }
32
+
33
+ // Settings flag
34
+ val settings = SessionSettingsBuilder(context, callContainer)
35
+ .setSessionType(SessionType.VIDEO)
36
+ .hideRaiseHandButton(true)
37
+ .build()
38
+ ```
39
+
40
+ For **Java**:
41
+
42
+ ```java
43
+ CometChatCalls.raiseHand();
44
+ CometChatCalls.lowerHand();
45
+
46
+ CometChatCallsEventsListener listener = new CometChatCallsEventsListener() {
47
+ @Override
48
+ public void onParticipantHandRaised(Participant participant) { /* ... */ }
49
+
50
+ @Override
51
+ public void onParticipantHandLowered(Participant participant) { /* ... */ }
52
+ // ...
53
+ };
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Lifecycle: where to attach the listener
59
+
60
+ For a single-Activity call surface:
61
+
62
+ ```kotlin
63
+ class CallActivity : AppCompatActivity() {
64
+
65
+ private lateinit var raiseHandViewModel: RaiseHandViewModel
66
+ private val callListener = object : CometChatCallsEventsListener {
67
+ override fun onParticipantHandRaised(p: Participant) {
68
+ raiseHandViewModel.onRaised(p)
69
+ }
70
+ override fun onParticipantHandLowered(p: Participant) {
71
+ raiseHandViewModel.onLowered(p)
72
+ }
73
+ // ...
74
+ }
75
+
76
+ override fun onCreate(savedInstanceState: Bundle?) {
77
+ super.onCreate(savedInstanceState)
78
+ raiseHandViewModel = ViewModelProvider(this)[RaiseHandViewModel::class.java]
79
+ // Listener attached when session starts (rule 1.7 in cometchat-android-v5-calls)
80
+ }
81
+
82
+ override fun onDestroy() {
83
+ super.onDestroy()
84
+ // Listener cleanup happens in CometChatCalls.endSession
85
+ }
86
+ }
87
+ ```
88
+
89
+ For Fragment-hosted calls, attach in `onViewCreated`, detach in `onDestroyView`.
90
+
91
+ ---
92
+
93
+ ## ViewModel pattern (Kotlin coroutines + StateFlow)
94
+
95
+ ```kotlin
96
+ data class RaisedParticipant(val uid: String, val name: String, val raisedAt: Long)
97
+
98
+ data class RaiseHandUiState(
99
+ val localRaised: Boolean = false,
100
+ val raised: List<RaisedParticipant> = emptyList(),
101
+ )
102
+
103
+ class RaiseHandViewModel : ViewModel() {
104
+ private val _state = MutableStateFlow(RaiseHandUiState())
105
+ val state: StateFlow<RaiseHandUiState> = _state
106
+
107
+ fun toggle() {
108
+ if (_state.value.localRaised) {
109
+ CometChatCalls.lowerHand()
110
+ } else {
111
+ CometChatCalls.raiseHand()
112
+ }
113
+ _state.update { it.copy(localRaised = !it.localRaised) }
114
+ }
115
+
116
+ fun onRaised(p: Participant) {
117
+ val entry = RaisedParticipant(p.uid, p.name, System.currentTimeMillis())
118
+ _state.update { state ->
119
+ val next = state.raised.filter { it.uid != p.uid } + entry
120
+ state.copy(raised = next.sortedBy { it.raisedAt })
121
+ }
122
+ }
123
+
124
+ fun onLowered(p: Participant) {
125
+ _state.update { state ->
126
+ state.copy(raised = state.raised.filter { it.uid != p.uid })
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ `StateFlow` is the canonical Android single-source-of-truth pattern. Activities collect via `viewLifecycleOwner.lifecycleScope.launch` + `repeatOnLifecycle(STARTED)`.
133
+
134
+ ---
135
+
136
+ ## Toggle button
137
+
138
+ ```kotlin
139
+ class RaiseHandButton @JvmOverloads constructor(
140
+ context: Context,
141
+ attrs: AttributeSet? = null,
142
+ ) : MaterialButton(context, attrs) {
143
+
144
+ init {
145
+ setOnClickListener {
146
+ val raised = (tag as? Boolean) ?: false
147
+ tag = !raised
148
+ // VM toggle handled by Activity wiring — see below
149
+ }
150
+ }
151
+
152
+ fun bind(viewModel: RaiseHandViewModel, lifecycleOwner: LifecycleOwner) {
153
+ setOnClickListener {
154
+ viewModel.toggle()
155
+ }
156
+
157
+ lifecycleOwner.lifecycleScope.launch {
158
+ lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
159
+ viewModel.state.collect { state ->
160
+ text = if (state.localRaised) "Lower" else "Raise"
161
+ icon = ContextCompat.getDrawable(context,
162
+ if (state.localRaised) R.drawable.ic_hand_raised_filled
163
+ else R.drawable.ic_hand_raised)
164
+ contentDescription = if (state.localRaised) "Lower hand" else "Raise hand"
165
+ // a11y announcement on state change
166
+ announceForAccessibility(if (state.localRaised) "Hand raised" else "Hand lowered")
167
+ isSelected = state.localRaised
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
175
+ `announceForAccessibility` is the Android equivalent of web's `aria-live` and iOS's `UIAccessibility.post(.announcement, ...)`. TalkBack picks it up.
176
+
177
+ ---
178
+
179
+ ## Raised-hands BottomSheet
180
+
181
+ ```kotlin
182
+ class RaisedHandsBottomSheet : BottomSheetDialogFragment() {
183
+
184
+ private val viewModel: RaiseHandViewModel by activityViewModels()
185
+
186
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
187
+ val view = inflater.inflate(R.layout.bottomsheet_raised_hands, container, false)
188
+ val recyclerView = view.findViewById<RecyclerView>(R.id.raised_hands_list)
189
+ val adapter = RaisedHandsAdapter()
190
+ recyclerView.adapter = adapter
191
+
192
+ viewLifecycleOwner.lifecycleScope.launch {
193
+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
194
+ viewModel.state.collect { state ->
195
+ adapter.submitList(state.raised)
196
+ }
197
+ }
198
+ }
199
+
200
+ return view
201
+ }
202
+ }
203
+ ```
204
+
205
+ Use `BottomSheetDialogFragment` from `com.google.android.material.bottomsheet` — the canonical Material Design pattern for raised-hands roster on phones.
206
+
207
+ ---
208
+
209
+ ## Anti-patterns
210
+
211
+ Web sister reference rules apply, plus Android-specific:
212
+
213
+ 1. **Listener in `init { }` of an Activity.** Activity init runs before `onCreate`; SDK might not be ready. Attach in `onCreate` or later.
214
+ 2. **Skipping `repeatOnLifecycle(STARTED)`.** Without it, `StateFlow.collect` runs even when Activity is paused — burns CPU during background.
215
+ 3. **Forgetting `lifecycleScope`.** Detached coroutines leak across activity destruction.
216
+ 4. **`MutableStateFlow.value = ...` from background thread without `_state.update`.** Race conditions on the list. Always use `update { ... }` for atomic state transitions.
217
+ 5. **`announceForAccessibility` from `setOnClickListener`** before the visual state has changed. Order matters — update the View first, then announce.
218
+
219
+ ---
220
+
221
+ ## Verification checklist
222
+
223
+ - [ ] `RaiseHandViewModel` uses `StateFlow` (not LiveData) for the call state
224
+ - [ ] Listener attached at session start, detached on `endSession`
225
+ - [ ] `repeatOnLifecycle(Lifecycle.State.STARTED)` wraps every collect
226
+ - [ ] Toggle button has `contentDescription` + `isSelected` set
227
+ - [ ] `announceForAccessibility` on state change
228
+ - [ ] `hideRaiseHandButton(true)` in SessionSettingsBuilder if custom UI
229
+ - [ ] BottomSheetDialogFragment for raised-hands roster (phones) OR side panel (tablets)
230
+ - [ ] Real-device smoke: 3 Android phones in same call, 2 raise → host's sheet shows both
231
+ - [ ] TalkBack smoke: hand raise + lower announces correctly
232
+
233
+ ---
234
+
235
+ ## Pointers
236
+
237
+ - `cometchat-react-calls/references/raise-hand.md` — sister reference (UX shape)
238
+ - `cometchat-android-v5-calls` SKILL.md — V5 hard rules
239
+ - `references/participant-management.md` — group call moderation patterns
240
+ - `references/custom-ui.md` — Android custom call UI
241
+ - Canonical docs: https://www.cometchat.com/docs/calls/android/raise-hand
242
+ - For V6 (Compose / Kotlin Views split): `cometchat-android-v6-calls/references/raise-hand.md`