@cometchat/skills 4.4.2 → 5.0.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/.claude-plugin/marketplace.json +55 -0
- package/.claude-plugin/plugin.json +14 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +41 -163
- package/RULES.md +114 -0
- package/bin/cometchat-skills.mjs +1180 -0
- package/bin/legacy-skills.json +95 -0
- package/catalogs/android-v6.json +1646 -0
- package/catalogs/flutter-v6.json +651 -0
- package/catalogs/ios-v5.json +1383 -0
- package/catalogs/rn-calls-v5.json +134 -0
- package/catalogs/rn-calls-v5.symbols.txt +58 -0
- package/catalogs/rn-sdk-v4.json +672 -0
- package/catalogs/rn-v5.json +449 -0
- package/catalogs/rn-v5.symbols.txt +216 -0
- package/catalogs/sdk-android-v5.json +514 -0
- package/contracts.android-calls-v5.json +122 -0
- package/contracts.android-v6.json +135 -0
- package/contracts.angular-v5.json +694 -0
- package/contracts.flutter-calls-v5.json +77 -0
- package/contracts.flutter-v6.json +126 -0
- package/contracts.ios-calls-v5.json +67 -0
- package/contracts.ios-v5.json +436 -0
- package/contracts.json +82 -0
- package/contracts.rn-calls-v5.json +77 -0
- package/contracts.rn-v5.json +727 -0
- package/contracts.sdk-android-v5.json +15 -0
- package/contracts.web-calls-v5.json +45 -0
- package/features.android-calls-v5.json +246 -0
- package/features.android-v6.json +65 -0
- package/features.angular-v5.json +521 -0
- package/features.flutter-calls-v5.json +286 -0
- package/features.flutter-v6.json +484 -0
- package/features.ios-calls-v5.json +236 -0
- package/features.ios-v5.json +573 -0
- package/features.json +61 -0
- package/features.rn-calls-v5.json +187 -0
- package/features.rn-v5.json +614 -0
- package/features.sdk-android-v5.json +40 -0
- package/features.sdk-jsv4.json +24 -0
- package/features.web-calls-v5.json +108 -0
- package/package.json +151 -74
- package/peers.yaml +312 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +54 -0
- package/registry/android-v6.json +137 -0
- package/registry/angular-v5.json +114 -0
- package/registry/flutter-calls-v5.json +54 -0
- package/registry/flutter-v6.json +119 -0
- package/registry/ios-calls-v5.json +59 -0
- package/registry/ios-v5.json +97 -0
- package/registry/rn-calls-v5.json +59 -0
- package/registry/rn-v5.json +129 -0
- package/registry/sdk-android-v5.json +53 -0
- package/registry/sdk-jsv4.json +53 -0
- package/registry/web-calls-v5.json +54 -0
- package/registry/web-v7.json +99 -0
- package/skills/cometchat/SKILL.md +42 -2096
- package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
- package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
- package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
- package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
- package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
- package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
- package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
- package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
- package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
- package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
- package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
- package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
- package/skills/cometchat-android-v6-core/SKILL.md +236 -672
- package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
- package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
- package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
- package/skills/cometchat-android-v6-core/references/layout.md +112 -0
- package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
- package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
- package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
- package/skills/cometchat-android-v6-events/SKILL.md +46 -184
- package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
- package/skills/cometchat-android-v6-features/SKILL.md +74 -143
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
- package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
- package/skills/cometchat-android-v6-production/SKILL.md +40 -179
- package/skills/cometchat-android-v6-push/SKILL.md +39 -289
- package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
- package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
- package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
- package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
- package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
- package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
- package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
- package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
- package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
- package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
- package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
- package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
- package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
- package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
- package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
- package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
- package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
- package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
- package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
- package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
- package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
- package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
- package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
- package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
- package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
- package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
- package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
- package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
- package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
- package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
- package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
- package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
- package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
- package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
- package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
- package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
- package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
- package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
- package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
- package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
- package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
- package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
- package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
- package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
- package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
- package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
- package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
- package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
- package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
- package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
- package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
- package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
- package/skills/cometchat-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +181 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
- package/skills/cometchat-ios-core/references/docs-map.md +123 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +186 -0
- package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
- package/skills/cometchat-ios-core/references/swiftui.md +91 -0
- package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
- package/skills/cometchat-ios-customization/SKILL.md +33 -968
- package/skills/cometchat-ios-features/SKILL.md +29 -738
- package/skills/cometchat-ios-migration/SKILL.md +39 -0
- package/skills/cometchat-ios-placement/SKILL.md +51 -729
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
- package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
- package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
- package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
- package/skills/cometchat-onboarding/SKILL.md +89 -0
- package/skills/cometchat-onboarding/references/archetypes.md +51 -0
- package/skills/cometchat-onboarding/references/calling-first.md +77 -0
- package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
- package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
- package/skills/cometchat-onboarding/references/platforms.md +90 -0
- package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
- package/skills/cometchat-react-native-calls/SKILL.md +200 -0
- package/skills/cometchat-react-native-components/SKILL.md +142 -0
- package/skills/cometchat-react-native-core/SKILL.md +313 -0
- package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
- package/skills/cometchat-react-native-core/references/component-props.md +105 -0
- package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
- package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
- package/skills/cometchat-react-native-core/references/layout.md +61 -0
- package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
- package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
- package/skills/cometchat-react-native-customization/SKILL.md +198 -0
- package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
- package/skills/cometchat-react-native-features/SKILL.md +122 -0
- package/skills/cometchat-react-native-migration/SKILL.md +103 -0
- package/skills/cometchat-react-native-placement/SKILL.md +158 -0
- package/skills/cometchat-react-native-production/SKILL.md +78 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
- package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
- package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
- package/skills/cometchat-react-native-testing/SKILL.md +94 -0
- package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
- package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
- package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
- package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
- package/skills/cometchat-react-v7-components/SKILL.md +72 -0
- package/skills/cometchat-react-v7-core/SKILL.md +101 -0
- package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
- package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
- package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
- package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
- package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
- package/skills/cometchat-react-v7-core/references/layout.md +158 -0
- package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
- package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
- package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
- package/skills/cometchat-react-v7-core/references/theming.md +52 -0
- package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
- package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
- package/skills/cometchat-react-v7-features/SKILL.md +92 -0
- package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
- package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
- package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
- package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
- package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/test-suite/README.md +70 -0
- package/test-suite/catalogs/android-calls-v5.json +830 -0
- package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
- package/test-suite/catalogs/android-v6.json +1646 -0
- package/test-suite/catalogs/android-v6.symbols.txt +298 -0
- package/test-suite/catalogs/angular-v5.json +7587 -0
- package/test-suite/catalogs/flutter-calls-v5.json +196 -0
- package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
- package/test-suite/catalogs/flutter-v6.json +651 -0
- package/test-suite/catalogs/ios-calls-v5.json +158 -0
- package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
- package/test-suite/catalogs/ios-v5.json +1383 -0
- package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
- package/test-suite/catalogs/rn-calls-v5.json +134 -0
- package/test-suite/catalogs/rn-sdk-v4.json +672 -0
- package/test-suite/catalogs/rn-v5.json +449 -0
- package/test-suite/catalogs/sdk-android-v5.json +514 -0
- package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
- package/test-suite/catalogs/sdk-jsv4.json +800 -0
- package/test-suite/catalogs/web-calls-v5.json +195 -0
- package/test-suite/catalogs/web-v7.json +1243 -0
- package/test-suite/scripts/build-registry.mjs +113 -0
- package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
- package/test-suite/scripts/catalog-refresh.mjs +100 -0
- package/test-suite/scripts/lint-skills.mjs +909 -0
- package/test-suite/scripts/measure-tokens.mjs +169 -0
- package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
- package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
- package/test-suite/scripts/typecheck-fences.mjs +206 -0
- package/test-suite/scripts/verify-catalog.mjs +242 -0
- package/test-suite/scripts/verify-contract-fences.mjs +94 -0
- package/test-suite/scripts/verify-detection.mjs +178 -0
- package/test-suite/scripts/verify-docs-base.mjs +91 -0
- package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
- package/test-suite/scripts/verify-golden-path.mjs +138 -0
- package/test-suite/scripts/verify-oracle-components.mjs +133 -0
- package/test-suite/scripts/verify-template-bindings.mjs +148 -0
- package/test-suite/typecheck/angular-v5/package.json +21 -0
- package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
- package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
- package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
- package/test-suite/typecheck/web-v7/package.json +18 -0
- package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
- package/bin/install.js +0 -1003
- package/skills/.claude-plugin/marketplace.json +0 -86
- package/skills/cometchat/references/asking-questions.md +0 -48
- package/skills/cometchat-a11y/SKILL.md +0 -477
- package/skills/cometchat-android-v5/SKILL.md +0 -121
- package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
- package/skills/cometchat-android-v5-calls/references/README.md +0 -53
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
- package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
- package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
- package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
- package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
- package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
- package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
- package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
- package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
- package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
- package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
- package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
- package/skills/cometchat-android-v5-components/SKILL.md +0 -431
- package/skills/cometchat-android-v5-core/SKILL.md +0 -486
- package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
- package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
- package/skills/cometchat-android-v5-features/SKILL.md +0 -131
- package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
- package/skills/cometchat-android-v5-production/SKILL.md +0 -95
- package/skills/cometchat-android-v5-push/SKILL.md +0 -619
- package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
- package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
- package/skills/cometchat-android-v6/SKILL.md +0 -108
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
- package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
- package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
- package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
- package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
- package/skills/cometchat-angular-calls/SKILL.md +0 -380
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
- package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
- package/skills/cometchat-angular-calls/references/call-session.md +0 -167
- package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
- package/skills/cometchat-angular-calls/references/device-management.md +0 -154
- package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
- package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
- package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
- package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
- package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
- package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
- package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
- package/skills/cometchat-angular-components/SKILL.md +0 -235
- package/skills/cometchat-angular-core/SKILL.md +0 -386
- package/skills/cometchat-angular-customization/SKILL.md +0 -616
- package/skills/cometchat-angular-features/SKILL.md +0 -329
- package/skills/cometchat-angular-patterns/SKILL.md +0 -256
- package/skills/cometchat-angular-placement/SKILL.md +0 -314
- package/skills/cometchat-angular-production/SKILL.md +0 -564
- package/skills/cometchat-angular-push/SKILL.md +0 -389
- package/skills/cometchat-angular-testing/SKILL.md +0 -605
- package/skills/cometchat-angular-theming/SKILL.md +0 -290
- package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
- package/skills/cometchat-astro-patterns/SKILL.md +0 -708
- package/skills/cometchat-calls/SKILL.md +0 -364
- package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
- package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
- package/skills/cometchat-calls/references/use-case-support.md +0 -189
- package/skills/cometchat-calls/references/use-case-team.md +0 -180
- package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
- package/skills/cometchat-components/SKILL.md +0 -1142
- package/skills/cometchat-core/SKILL.md +0 -1048
- package/skills/cometchat-customization/SKILL.md +0 -580
- package/skills/cometchat-customization/references/component-catalog.md +0 -236
- package/skills/cometchat-features/SKILL.md +0 -861
- package/skills/cometchat-flutter-v5/SKILL.md +0 -173
- package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
- package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
- package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
- package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
- package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
- package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
- package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
- package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
- package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
- package/skills/cometchat-flutter-v6/SKILL.md +0 -446
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
- package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
- package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
- package/skills/cometchat-i18n/SKILL.md +0 -419
- package/skills/cometchat-ios/SKILL.md +0 -325
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
- package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
- package/skills/cometchat-ios-calls/references/call-session.md +0 -218
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
- package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
- package/skills/cometchat-ios-calls/references/device-management.md +0 -171
- package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
- package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
- package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
- package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
- package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
- package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
- package/skills/cometchat-ios-production/SKILL.md +0 -738
- package/skills/cometchat-ios-testing/SKILL.md +0 -376
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
- package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
- package/skills/cometchat-native-calls/SKILL.md +0 -671
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
- package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
- package/skills/cometchat-native-calls/references/call-session.md +0 -182
- package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
- package/skills/cometchat-native-calls/references/device-management.md +0 -158
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
- package/skills/cometchat-native-calls/references/group-calls.md +0 -296
- package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
- package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
- package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
- package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
- package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
- package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
- package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
- package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
- package/skills/cometchat-native-calls/references/share-invite.md +0 -146
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
- package/skills/cometchat-native-components/SKILL.md +0 -628
- package/skills/cometchat-native-core/SKILL.md +0 -679
- package/skills/cometchat-native-customization/SKILL.md +0 -716
- package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
- package/skills/cometchat-native-features/SKILL.md +0 -638
- package/skills/cometchat-native-placement/SKILL.md +0 -509
- package/skills/cometchat-native-production/SKILL.md +0 -700
- package/skills/cometchat-native-push/SKILL.md +0 -594
- package/skills/cometchat-native-testing/SKILL.md +0 -582
- package/skills/cometchat-native-theming/SKILL.md +0 -681
- package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
- package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
- package/skills/cometchat-placement/SKILL.md +0 -1360
- package/skills/cometchat-production/SKILL.md +0 -1027
- package/skills/cometchat-react-calls/SKILL.md +0 -752
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
- package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
- package/skills/cometchat-react-calls/references/call-session.md +0 -235
- package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
- package/skills/cometchat-react-calls/references/device-management.md +0 -210
- package/skills/cometchat-react-calls/references/group-calls.md +0 -257
- package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
- package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
- package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
- package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
- package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
- package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
- package/skills/cometchat-react-calls/references/share-invite.md +0 -175
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
- package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
- package/skills/cometchat-react-patterns/SKILL.md +0 -628
- package/skills/cometchat-react-push/SKILL.md +0 -634
- package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
- package/skills/cometchat-react-testing/SKILL.md +0 -413
- package/skills/cometchat-theming/SKILL.md +0 -498
- package/skills/cometchat-troubleshooting/SKILL.md +0 -294
|
@@ -1,526 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: voip-calling
|
|
3
|
-
description: Implement native VoIP calling with ConnectionService, PhoneAccount, FCM push, and system call UI. Use when receiving calls in background/killed state, lock screen calls, or Telecom framework integration. Triggers on "VoIP", "voip calling", "ConnectionService", "PhoneAccount", "push notification call", "background call".
|
|
4
|
-
inclusion: manual
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# CometChat Calls SDK v5 — VoIP Calling
|
|
8
|
-
|
|
9
|
-
## Overview
|
|
10
|
-
|
|
11
|
-
Native VoIP calling using Android's Telecom framework (`ConnectionService`). Shows system call UI on lock screen, works when app is killed, integrates with Bluetooth/car systems. Requires FCM push notifications. Falls back to a high-priority notification when TelecomManager is unavailable.
|
|
12
|
-
|
|
13
|
-
## Prerequisites
|
|
14
|
-
|
|
15
|
-
- Chat SDK v4 (`com.cometchat:chat-sdk-android:4.0.+`) + Calls SDK v5 (`com.cometchat:calls-sdk-android:5.0.+`) integrated
|
|
16
|
-
- Firebase Cloud Messaging (FCM) configured with `com.google.gms.google-services` plugin
|
|
17
|
-
- Push notifications enabled in CometChat Dashboard
|
|
18
|
-
- Android 8.0+ (API 26+), compileSdk 35
|
|
19
|
-
|
|
20
|
-
## Key Components
|
|
21
|
-
|
|
22
|
-
| Component | Purpose |
|
|
23
|
-
|-----------|---------|
|
|
24
|
-
| `CallFirebaseMessagingService` | Receives FCM push for incoming calls, parses payload, routes to CallNotificationManager |
|
|
25
|
-
| `CallConnectionService` | Bridges app with Android Telecom, creates CallConnection instances |
|
|
26
|
-
| `PhoneAccountManager` | Registers app as self-managed VoIP calling provider |
|
|
27
|
-
| `CallConnection` | Represents individual call (accept/reject/hold) in Telecom framework |
|
|
28
|
-
| `CallNotificationManager` | Routes calls to TelecomManager with fallback to high-priority notification |
|
|
29
|
-
| `CallActionReceiver` | Handles accept/decline from fallback notification |
|
|
30
|
-
| `CallConnectionHolder` | Singleton for cross-component access to active CallConnection |
|
|
31
|
-
| `CallData` | Parcelable call metadata passed between components |
|
|
32
|
-
| `VoIPApplication` | Application subclass tracking foreground state, global CallListener |
|
|
33
|
-
|
|
34
|
-
## Dual Incoming Call Path
|
|
35
|
-
|
|
36
|
-
| App State | Trigger | Handler | UI |
|
|
37
|
-
|-----------|---------|---------|-----|
|
|
38
|
-
| Foreground | `CometChat.CallListener` | `VoIPApplication` global listener | `IncomingCallActivity` |
|
|
39
|
-
| Background | FCM push | `CallFirebaseMessagingService` → `CallNotificationManager` → `TelecomManager` | System call UI |
|
|
40
|
-
| Killed | FCM push | `CallFirebaseMessagingService` → `CallNotificationManager` → `TelecomManager` | System call UI |
|
|
41
|
-
| Background/Killed (fallback) | FCM push | `CallNotificationManager` → high-priority notification | `IncomingCallActivity` via full-screen intent |
|
|
42
|
-
|
|
43
|
-
## Implementation
|
|
44
|
-
|
|
45
|
-
### 1. CallData Parcelable Model
|
|
46
|
-
|
|
47
|
-
```kotlin
|
|
48
|
-
package com.cometchat.samplecallsvoip.data.model
|
|
49
|
-
|
|
50
|
-
import android.os.Parcelable
|
|
51
|
-
import kotlinx.parcelize.Parcelize
|
|
52
|
-
|
|
53
|
-
@Parcelize
|
|
54
|
-
data class CallData(
|
|
55
|
-
val sessionId: String,
|
|
56
|
-
val callerName: String,
|
|
57
|
-
val callerUid: String,
|
|
58
|
-
val callType: String, // "audio" or "video"
|
|
59
|
-
val callerAvatar: String?
|
|
60
|
-
) : Parcelable
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 2. FCM Payload Structure
|
|
64
|
-
|
|
65
|
-
The FCM push payload for incoming calls:
|
|
66
|
-
|
|
67
|
-
```json
|
|
68
|
-
{
|
|
69
|
-
"type": "call",
|
|
70
|
-
"sessionId": "v1.us.xxx",
|
|
71
|
-
"senderName": "John Doe",
|
|
72
|
-
"senderUid": "john_doe",
|
|
73
|
-
"callType": "video",
|
|
74
|
-
"senderAvatar": "https://..."
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 3. FCM Service
|
|
79
|
-
|
|
80
|
-
```kotlin
|
|
81
|
-
class CallFirebaseMessagingService : FirebaseMessagingService() {
|
|
82
|
-
|
|
83
|
-
companion object {
|
|
84
|
-
private const val TAG = "CallFCMService"
|
|
85
|
-
private const val KEY_TYPE = "type"
|
|
86
|
-
private const val KEY_SESSION_ID = "sessionId"
|
|
87
|
-
private const val KEY_SENDER_NAME = "senderName"
|
|
88
|
-
private const val KEY_SENDER_UID = "senderUid"
|
|
89
|
-
private const val KEY_CALL_TYPE = "callType"
|
|
90
|
-
private const val KEY_SENDER_AVATAR = "senderAvatar"
|
|
91
|
-
private const val TYPE_CALL = "call"
|
|
92
|
-
|
|
93
|
-
/** Parses FCM data payload into CallData. Returns null if not a call or missing required fields. */
|
|
94
|
-
fun parseCallData(data: Map<String, String>): CallData? {
|
|
95
|
-
if (data[KEY_TYPE] != TYPE_CALL) return null
|
|
96
|
-
val sessionId = data[KEY_SESSION_ID]
|
|
97
|
-
val senderUid = data[KEY_SENDER_UID]
|
|
98
|
-
if (sessionId.isNullOrEmpty() || senderUid.isNullOrEmpty()) return null
|
|
99
|
-
return CallData(
|
|
100
|
-
sessionId = sessionId,
|
|
101
|
-
callerName = data[KEY_SENDER_NAME] ?: "",
|
|
102
|
-
callerUid = senderUid,
|
|
103
|
-
callType = data[KEY_CALL_TYPE] ?: "audio",
|
|
104
|
-
callerAvatar = data[KEY_SENDER_AVATAR]
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Returns true when push should be handled (background/killed), false when ignored (foreground). */
|
|
109
|
-
fun shouldHandlePush(isAppInForeground: Boolean): Boolean = !isAppInForeground
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
override fun onMessageReceived(remoteMessage: RemoteMessage) {
|
|
113
|
-
val callData = parseCallData(remoteMessage.data) ?: return
|
|
114
|
-
if (isAppInForeground()) return
|
|
115
|
-
CallNotificationManager.showIncomingCall(this, callData)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
override fun onNewToken(token: String) {
|
|
119
|
-
CometChat.registerTokenForPushNotification(token, object : CometChat.CallbackListener<String>() {
|
|
120
|
-
override fun onSuccess(message: String) { Log.d(TAG, "FCM token registered") }
|
|
121
|
-
override fun onError(e: CometChatException) { Log.w(TAG, "Failed to register FCM token: ${e.message}") }
|
|
122
|
-
})
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
private fun isAppInForeground(): Boolean {
|
|
126
|
-
val app = application
|
|
127
|
-
if (app is VoIPApplication) return app.isInForeground
|
|
128
|
-
return ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 4. Register PhoneAccount
|
|
134
|
-
|
|
135
|
-
```kotlin
|
|
136
|
-
object PhoneAccountManager {
|
|
137
|
-
private const val ACCOUNT_ID = "cometchat_voip_account"
|
|
138
|
-
private const val ACCOUNT_LABEL = "CometChat Calls VoIP"
|
|
139
|
-
|
|
140
|
-
fun register(context: Context) {
|
|
141
|
-
val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
|
|
142
|
-
val handle = getPhoneAccountHandle(context)
|
|
143
|
-
val phoneAccount = PhoneAccount.builder(handle, ACCOUNT_LABEL)
|
|
144
|
-
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER or PhoneAccount.CAPABILITY_SELF_MANAGED)
|
|
145
|
-
.build()
|
|
146
|
-
telecomManager.registerPhoneAccount(phoneAccount)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
fun getPhoneAccountHandle(context: Context): PhoneAccountHandle {
|
|
150
|
-
val componentName = ComponentName(context, CallConnectionService::class.java)
|
|
151
|
-
return PhoneAccountHandle(componentName, ACCOUNT_ID)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
fun isPhoneAccountEnabled(context: Context): Boolean {
|
|
155
|
-
val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
|
|
156
|
-
val account = telecomManager.getPhoneAccount(getPhoneAccountHandle(context))
|
|
157
|
-
return account?.isEnabled == true
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
fun openPhoneAccountSettings(context: Context) {
|
|
161
|
-
val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
162
|
-
Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS)
|
|
163
|
-
} else {
|
|
164
|
-
Intent("android.telecom.action.CHANGE_PHONE_ACCOUNTS")
|
|
165
|
-
}
|
|
166
|
-
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
167
|
-
context.startActivity(intent)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
// Call PhoneAccountManager.register() in Application.onCreate() or SplashActivity
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 5. CallNotificationManager (TelecomManager + Fallback)
|
|
174
|
-
|
|
175
|
-
```kotlin
|
|
176
|
-
object CallNotificationManager {
|
|
177
|
-
const val NOTIFICATION_ID = 1001
|
|
178
|
-
const val CHANNEL_ID = "voip_call_channel"
|
|
179
|
-
const val ACTION_ACCEPT = "ACTION_ACCEPT"
|
|
180
|
-
const val ACTION_DECLINE = "ACTION_DECLINE"
|
|
181
|
-
const val EXTRA_CALL_DATA = "call_data"
|
|
182
|
-
|
|
183
|
-
fun showIncomingCall(context: Context, callData: CallData) {
|
|
184
|
-
// Check PhoneAccount first — if not enabled, go straight to fallback
|
|
185
|
-
if (!PhoneAccountManager.isPhoneAccountEnabled(context)) {
|
|
186
|
-
showFallbackNotification(context, callData)
|
|
187
|
-
return
|
|
188
|
-
}
|
|
189
|
-
try {
|
|
190
|
-
val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
|
|
191
|
-
val extras = Bundle().apply { putParcelable("call_data", callData) }
|
|
192
|
-
telecomManager.addNewIncomingCall(PhoneAccountManager.getPhoneAccountHandle(context), extras)
|
|
193
|
-
} catch (e: SecurityException) {
|
|
194
|
-
showFallbackNotification(context, callData)
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
fun cancelNotification(context: Context) {
|
|
199
|
-
val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
200
|
-
nm.cancel(NOTIFICATION_ID)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private fun showFallbackNotification(context: Context, callData: CallData) {
|
|
204
|
-
val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
205
|
-
nm.createNotificationChannel(
|
|
206
|
-
NotificationChannel(CHANNEL_ID, "Incoming Calls", NotificationManager.IMPORTANCE_HIGH)
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
// Full-screen intent → IncomingCallActivity
|
|
210
|
-
val fullScreenIntent = Intent().apply {
|
|
211
|
-
setClassName(context, "com.cometchat.samplecallsvoip.ui.activity.IncomingCallActivity")
|
|
212
|
-
putExtra(EXTRA_CALL_DATA, callData)
|
|
213
|
-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
214
|
-
}
|
|
215
|
-
val fullScreenPI = PendingIntent.getActivity(context, 0, fullScreenIntent,
|
|
216
|
-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
|
|
217
|
-
|
|
218
|
-
// Accept/Decline actions → CallActionReceiver
|
|
219
|
-
val acceptPI = PendingIntent.getBroadcast(context, 1,
|
|
220
|
-
Intent(context, CallActionReceiver::class.java).apply {
|
|
221
|
-
action = ACTION_ACCEPT; putExtra(EXTRA_CALL_DATA, callData)
|
|
222
|
-
}, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
|
|
223
|
-
|
|
224
|
-
val declinePI = PendingIntent.getBroadcast(context, 2,
|
|
225
|
-
Intent(context, CallActionReceiver::class.java).apply {
|
|
226
|
-
action = ACTION_DECLINE; putExtra(EXTRA_CALL_DATA, callData)
|
|
227
|
-
}, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
|
|
228
|
-
|
|
229
|
-
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
|
|
230
|
-
.setSmallIcon(R.drawable.ic_cometchat_logo)
|
|
231
|
-
.setContentTitle("${if (callData.callType == "audio") "Voice" else "Video"} Call")
|
|
232
|
-
.setContentText("${callData.callerName.ifEmpty { "Unknown" }} is calling…")
|
|
233
|
-
.setPriority(NotificationCompat.PRIORITY_MAX)
|
|
234
|
-
.setCategory(NotificationCompat.CATEGORY_CALL)
|
|
235
|
-
.setOngoing(true)
|
|
236
|
-
.setFullScreenIntent(fullScreenPI, true)
|
|
237
|
-
.addAction(0, "Accept", acceptPI)
|
|
238
|
-
.addAction(0, "Decline", declinePI)
|
|
239
|
-
.build()
|
|
240
|
-
|
|
241
|
-
nm.notify(NOTIFICATION_ID, notification)
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
### 6. ConnectionService
|
|
247
|
-
|
|
248
|
-
```kotlin
|
|
249
|
-
class CallConnectionService : ConnectionService() {
|
|
250
|
-
override fun onCreateIncomingConnection(
|
|
251
|
-
connectionManagerPhoneAccount: PhoneAccountHandle?,
|
|
252
|
-
request: ConnectionRequest?
|
|
253
|
-
): Connection {
|
|
254
|
-
val callData: CallData? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
255
|
-
request?.extras?.getParcelable("call_data", CallData::class.java)
|
|
256
|
-
} else {
|
|
257
|
-
@Suppress("DEPRECATION")
|
|
258
|
-
request?.extras?.getParcelable("call_data")
|
|
259
|
-
}
|
|
260
|
-
val connection = CallConnection(applicationContext, callData)
|
|
261
|
-
CallConnectionHolder.set(connection)
|
|
262
|
-
return connection
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### 7. CallConnection (Accept/Reject)
|
|
268
|
-
|
|
269
|
-
```kotlin
|
|
270
|
-
class CallConnection(
|
|
271
|
-
private val context: Context,
|
|
272
|
-
private val callData: CallData?
|
|
273
|
-
) : Connection() {
|
|
274
|
-
|
|
275
|
-
companion object {
|
|
276
|
-
const val EXTRA_SESSION_ID = "session_id"
|
|
277
|
-
const val EXTRA_CALL_TYPE = "call_type"
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
init {
|
|
281
|
-
connectionProperties = PROPERTY_SELF_MANAGED
|
|
282
|
-
connectionCapabilities = CAPABILITY_HOLD or CAPABILITY_SUPPORT_HOLD
|
|
283
|
-
audioModeIsVoip = true
|
|
284
|
-
callData?.let {
|
|
285
|
-
setCallerDisplayName(it.callerName, TelecomManager.PRESENTATION_ALLOWED)
|
|
286
|
-
setAddress(Uri.fromParts("tel", it.callerUid, null), TelecomManager.PRESENTATION_ALLOWED)
|
|
287
|
-
}
|
|
288
|
-
setInitializing()
|
|
289
|
-
setRinging()
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
override fun onAnswer() {
|
|
293
|
-
val sessionId = callData?.sessionId ?: run {
|
|
294
|
-
setDisconnected(DisconnectCause(DisconnectCause.ERROR)); destroy(); return
|
|
295
|
-
}
|
|
296
|
-
CometChat.acceptCall(sessionId, object : CometChat.CallbackListener<Call>() {
|
|
297
|
-
override fun onSuccess(call: Call) {
|
|
298
|
-
setActive()
|
|
299
|
-
launchCallActivity(sessionId)
|
|
300
|
-
CallNotificationManager.cancelNotification(context)
|
|
301
|
-
}
|
|
302
|
-
override fun onError(e: CometChatException) {
|
|
303
|
-
setDisconnected(DisconnectCause(DisconnectCause.ERROR)); destroy()
|
|
304
|
-
}
|
|
305
|
-
})
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
override fun onReject() {
|
|
309
|
-
val sessionId = callData?.sessionId
|
|
310
|
-
if (!sessionId.isNullOrEmpty()) {
|
|
311
|
-
CometChat.rejectCall(sessionId, CometChatConstants.CALL_STATUS_REJECTED,
|
|
312
|
-
object : CometChat.CallbackListener<Call>() {
|
|
313
|
-
override fun onSuccess(call: Call) {}
|
|
314
|
-
override fun onError(e: CometChatException) {}
|
|
315
|
-
})
|
|
316
|
-
}
|
|
317
|
-
setDisconnected(DisconnectCause(DisconnectCause.REJECTED))
|
|
318
|
-
destroy()
|
|
319
|
-
CallNotificationManager.cancelNotification(context)
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
override fun onDisconnect() {
|
|
323
|
-
setDisconnected(DisconnectCause(DisconnectCause.LOCAL))
|
|
324
|
-
destroy()
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
private fun launchCallActivity(sessionId: String) {
|
|
328
|
-
val intent = Intent().apply {
|
|
329
|
-
setClassName(context, "com.cometchat.samplecallsvoip.ui.activity.CallActivity")
|
|
330
|
-
putExtra(EXTRA_SESSION_ID, sessionId)
|
|
331
|
-
putExtra(EXTRA_CALL_TYPE, callData?.callType ?: CometChatConstants.CALL_TYPE_VIDEO)
|
|
332
|
-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
333
|
-
}
|
|
334
|
-
context.startActivity(intent)
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### 8. CallActionReceiver (Fallback Notification Actions)
|
|
340
|
-
|
|
341
|
-
```kotlin
|
|
342
|
-
class CallActionReceiver : BroadcastReceiver() {
|
|
343
|
-
override fun onReceive(context: Context, intent: Intent) {
|
|
344
|
-
val callData = intent.getParcelableExtra<CallData>(CallNotificationManager.EXTRA_CALL_DATA)
|
|
345
|
-
val sessionId = callData?.sessionId ?: return
|
|
346
|
-
|
|
347
|
-
when (intent.action) {
|
|
348
|
-
CallNotificationManager.ACTION_ACCEPT -> {
|
|
349
|
-
CometChat.acceptCall(sessionId, object : CometChat.CallbackListener<Call>() {
|
|
350
|
-
override fun onSuccess(call: Call) {
|
|
351
|
-
val launchIntent = Intent().apply {
|
|
352
|
-
setClassName(context, "com.cometchat.samplecallsvoip.ui.activity.CallActivity")
|
|
353
|
-
putExtra(CallConnection.EXTRA_SESSION_ID, sessionId)
|
|
354
|
-
putExtra(CallConnection.EXTRA_CALL_TYPE, callData?.callType ?: CometChatConstants.CALL_TYPE_VIDEO)
|
|
355
|
-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
356
|
-
}
|
|
357
|
-
context.startActivity(launchIntent)
|
|
358
|
-
CallNotificationManager.cancelNotification(context)
|
|
359
|
-
}
|
|
360
|
-
override fun onError(e: CometChatException) {
|
|
361
|
-
CallNotificationManager.cancelNotification(context)
|
|
362
|
-
}
|
|
363
|
-
})
|
|
364
|
-
}
|
|
365
|
-
CallNotificationManager.ACTION_DECLINE -> {
|
|
366
|
-
CometChat.rejectCall(sessionId, CometChatConstants.CALL_STATUS_REJECTED,
|
|
367
|
-
object : CometChat.CallbackListener<Call>() {
|
|
368
|
-
override fun onSuccess(call: Call) {}
|
|
369
|
-
override fun onError(e: CometChatException) {}
|
|
370
|
-
})
|
|
371
|
-
CallNotificationManager.cancelNotification(context)
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
### 9. CallConnectionHolder
|
|
379
|
-
|
|
380
|
-
```kotlin
|
|
381
|
-
object CallConnectionHolder {
|
|
382
|
-
private var activeConnection: Connection? = null
|
|
383
|
-
|
|
384
|
-
fun set(connection: Connection) { activeConnection = connection }
|
|
385
|
-
fun get(): Connection? = activeConnection
|
|
386
|
-
fun clear() { activeConnection = null }
|
|
387
|
-
|
|
388
|
-
/** Ends the active call by calling onDisconnect() and clears the reference. */
|
|
389
|
-
fun endCall() {
|
|
390
|
-
activeConnection?.onDisconnect()
|
|
391
|
-
clear()
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
### 10. VoIPApplication (Foreground State + Global CallListener)
|
|
397
|
-
|
|
398
|
-
```kotlin
|
|
399
|
-
class VoIPApplication : Application(), DefaultLifecycleObserver {
|
|
400
|
-
var isInForeground: Boolean = false
|
|
401
|
-
private set
|
|
402
|
-
|
|
403
|
-
override fun onCreate() {
|
|
404
|
-
super<Application>.onCreate()
|
|
405
|
-
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
override fun onStart(owner: LifecycleOwner) { isInForeground = true }
|
|
409
|
-
override fun onStop(owner: LifecycleOwner) { isInForeground = false }
|
|
410
|
-
|
|
411
|
-
/** Register after SDK init + user login. Launches IncomingCallActivity for foreground calls. */
|
|
412
|
-
fun registerCallListener() {
|
|
413
|
-
CometChat.addCallListener("voip_app_call_listener", object : CometChat.CallListener() {
|
|
414
|
-
override fun onIncomingCallReceived(call: Call?) {
|
|
415
|
-
if (call == null || !isInForeground) return
|
|
416
|
-
val caller = call.callInitiator as? User
|
|
417
|
-
val intent = Intent(this@VoIPApplication, IncomingCallActivity::class.java).apply {
|
|
418
|
-
putExtra("session_id", call.sessionId)
|
|
419
|
-
putExtra("caller_name", caller?.name ?: "Unknown")
|
|
420
|
-
putExtra("caller_avatar", caller?.avatar ?: "")
|
|
421
|
-
putExtra("call_type", call.type)
|
|
422
|
-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
423
|
-
}
|
|
424
|
-
startActivity(intent)
|
|
425
|
-
}
|
|
426
|
-
override fun onOutgoingCallAccepted(call: Call?) {}
|
|
427
|
-
override fun onOutgoingCallRejected(call: Call?) {}
|
|
428
|
-
override fun onIncomingCallCancelled(call: Call?) {}
|
|
429
|
-
override fun onCallEndedMessageReceived(call: Call?) {}
|
|
430
|
-
})
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
fun unregisterCallListener() {
|
|
434
|
-
CometChat.removeCallListener("voip_app_call_listener")
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
### 11. Manifest
|
|
440
|
-
|
|
441
|
-
```xml
|
|
442
|
-
<!-- Permissions -->
|
|
443
|
-
<uses-permission android:name="android.permission.INTERNET" />
|
|
444
|
-
<uses-permission android:name="android.permission.CAMERA" />
|
|
445
|
-
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
446
|
-
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
447
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
448
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
|
|
449
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
|
|
450
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
|
|
451
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
|
|
452
|
-
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
|
|
453
|
-
|
|
454
|
-
<!-- VoIP ConnectionService -->
|
|
455
|
-
<service android:name=".voip.CallConnectionService"
|
|
456
|
-
android:exported="true"
|
|
457
|
-
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
|
|
458
|
-
<intent-filter>
|
|
459
|
-
<action android:name="android.telecom.ConnectionService" />
|
|
460
|
-
</intent-filter>
|
|
461
|
-
</service>
|
|
462
|
-
|
|
463
|
-
<!-- FCM Service -->
|
|
464
|
-
<service android:name=".voip.CallFirebaseMessagingService" android:exported="false">
|
|
465
|
-
<intent-filter>
|
|
466
|
-
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
|
467
|
-
</intent-filter>
|
|
468
|
-
</service>
|
|
469
|
-
|
|
470
|
-
<!-- Fallback notification action receiver -->
|
|
471
|
-
<receiver android:name=".voip.CallActionReceiver" android:exported="false" />
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
## Call Session Integration
|
|
475
|
-
|
|
476
|
-
When a call is accepted (via ConnectionService or fallback notification), launch `CallActivity` which joins the session:
|
|
477
|
-
|
|
478
|
-
```kotlin
|
|
479
|
-
// Build SessionSettings based on call type
|
|
480
|
-
val isVoiceOnly = callType == CometChatConstants.CALL_TYPE_AUDIO
|
|
481
|
-
val settings = CometChatCalls.SessionSettingsBuilder()
|
|
482
|
-
.setTitle("CometChat Call")
|
|
483
|
-
.setSessionType(if (isVoiceOnly) SessionType.VOICE else SessionType.VIDEO)
|
|
484
|
-
.setLayout(if (isVoiceOnly) LayoutType.SPOTLIGHT else LayoutType.TILE)
|
|
485
|
-
.setAudioMode(if (isVoiceOnly) AudioMode.EARPIECE else AudioMode.SPEAKER)
|
|
486
|
-
.startVideoPaused(isVoiceOnly)
|
|
487
|
-
.startAudioMuted(false)
|
|
488
|
-
.build()
|
|
489
|
-
|
|
490
|
-
CometChatCalls.joinSession(sessionId, settings, callContainer, listener)
|
|
491
|
-
|
|
492
|
-
// On session joined → start foreground service
|
|
493
|
-
CometChatOngoingCallService.launch(activity)
|
|
494
|
-
|
|
495
|
-
// On session end → clean up
|
|
496
|
-
CometChatOngoingCallService.abort(activity)
|
|
497
|
-
CallConnectionHolder.endCall()
|
|
498
|
-
CallNotificationManager.cancelNotification(activity)
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
## Gotchas
|
|
502
|
-
|
|
503
|
-
- `CAPABILITY_SELF_MANAGED` is required for VoIP apps that manage their own UI
|
|
504
|
-
- Some devices require users to manually enable the PhoneAccount in Settings — use `PhoneAccountManager.isPhoneAccountEnabled()` to check and `openPhoneAccountSettings()` to redirect
|
|
505
|
-
- If app is in foreground, let `CometChat.CallListener` handle it instead of ConnectionService — the FCM service checks `isAppInForeground()` and skips
|
|
506
|
-
- `CallData` must implement `Parcelable` to pass between components (Services, Activities, BroadcastReceivers)
|
|
507
|
-
- Always register PhoneAccount in `Application.onCreate()` or `SplashActivity` before any calls arrive
|
|
508
|
-
- On API 33+ use the typed `getParcelable(key, Class)` overload in `ConnectionService.onCreateIncomingConnection()`
|
|
509
|
-
- Always cancel the fallback notification on terminal call states (answered, rejected, cancelled) via `CallNotificationManager.cancelNotification()`
|
|
510
|
-
- Always disconnect the `CallConnection` via `CallConnectionHolder.endCall()` when the call session ends
|
|
511
|
-
- The fallback notification uses `PRIORITY_MAX`, `CATEGORY_CALL`, `ongoing=true`, and a full-screen intent for lock screen display
|
|
512
|
-
- This builds on top of the basic ringing integration — understand that first
|
|
513
|
-
|
|
514
|
-
## Sample App Reference
|
|
515
|
-
|
|
516
|
-
- `samples/sample-app-voip/` — Complete working VoIP sample app demonstrating all patterns above
|
|
517
|
-
- `voip/CallFirebaseMessagingService.kt` — FCM push handling with payload parsing
|
|
518
|
-
- `voip/PhoneAccountManager.kt` — PhoneAccount registration and status checks
|
|
519
|
-
- `voip/CallConnectionService.kt` — ConnectionService bridging Telecom framework
|
|
520
|
-
- `voip/CallConnection.kt` — Individual call representation (accept/reject/disconnect)
|
|
521
|
-
- `voip/CallNotificationManager.kt` — TelecomManager routing with fallback notification
|
|
522
|
-
- `voip/CallActionReceiver.kt` — Fallback notification accept/decline handler
|
|
523
|
-
- `voip/CallConnectionHolder.kt` — Singleton for active connection access
|
|
524
|
-
- `data/model/CallData.kt` — Parcelable call metadata
|
|
525
|
-
- `VoIPApplication.kt` — Application class with foreground tracking and global CallListener
|
|
526
|
-
- `ui/activity/CallActivity.kt` — Call session with SessionSettings mapping
|