@stream-io/react-native-callingx 0.1.0-beta.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/Callingx.podspec +23 -0
- package/LICENSE +219 -0
- package/README.md +392 -0
- package/android/bin/build/generated/source/buildConfig/debug/io/getstream/rn/callingx/BuildConfig.class +0 -0
- package/android/bin/build/generated/source/codegen/java/io/getstream/rn/callingx/NativeCallingxSpec.class +0 -0
- package/android/bin/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
- package/android/bin/build/generated/source/codegen/jni/CallingxSpec-generated.cpp +167 -0
- package/android/bin/build/generated/source/codegen/jni/CallingxSpec.h +31 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/CallingxSpecJSI-generated.cpp +196 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/CallingxSpecJSI.h +283 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ComponentDescriptors.cpp +22 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ComponentDescriptors.h +24 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/EventEmitters.cpp +16 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/EventEmitters.h +17 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/Props.cpp +19 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/Props.h +18 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ShadowNodes.cpp +17 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ShadowNodes.h +23 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/States.cpp +16 -0
- package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/States.h +20 -0
- package/android/bin/build/generated/source/codegen/schema.json +1 -0
- package/android/bin/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +33 -0
- package/android/bin/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
- package/android/bin/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
- package/android/bin/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
- package/android/bin/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/bin/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/bin/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +3 -0
- package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_phone_paused_24.xml.flat +0 -0
- package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_round_call_24.xml.flat +0 -0
- package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_user.xml.flat +0 -0
- package/android/bin/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +4 -0
- package/android/bin/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
- package/android/bin/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
- package/android/bin/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
- package/android/bin/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
- package/android/bin/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
- package/android/bin/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +5 -0
- package/android/bin/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +60 -0
- package/android/bin/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +33 -0
- package/android/bin/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
- package/android/bin/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
- package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_phone_paused_24.xml +11 -0
- package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_round_call_24.xml +11 -0
- package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_user.xml +27 -0
- package/android/bin/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
- package/android/bin/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/bin/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +4 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s +1 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/bin/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- package/android/bin/build/outputs/logs/manifest-merger-debug-report.txt +70 -0
- package/android/bin/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/bin/build/tmp/kotlin-classes/debug/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
- package/android/bin/build.gradle +81 -0
- package/android/bin/gradle.properties +5 -0
- package/android/bin/local.properties +8 -0
- package/android/bin/src/main/AndroidManifest.xml +30 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/CallService.kt +396 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/CallingxModule.kt +639 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/CallingxPackage.kt +16 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/HeadlessTaskManager.kt +164 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/ResourceUtils.kt +60 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/Utils.kt +23 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/model/Call.kt +57 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/model/CallAction.kt +36 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/CallNotificationManager.kt +215 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationChannelsManager.kt +113 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationIntentFactory.kt +105 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverActivity.kt +42 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverService.kt +56 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationsConfig.kt +116 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt +163 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/repo/LegacyCallRepository.kt +134 -0
- package/android/bin/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt +438 -0
- package/android/bin/src/main/res/drawable/ic_phone_paused_24.xml +11 -0
- package/android/bin/src/main/res/drawable/ic_round_call_24.xml +11 -0
- package/android/bin/src/main/res/drawable/ic_user.xml +27 -0
- package/android/build.gradle +81 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +30 -0
- package/android/src/main/java/io/getstream/rn/callingx/CallService.kt +396 -0
- package/android/src/main/java/io/getstream/rn/callingx/CallingxModule.kt +639 -0
- package/android/src/main/java/io/getstream/rn/callingx/CallingxPackage.kt +16 -0
- package/android/src/main/java/io/getstream/rn/callingx/HeadlessTaskManager.kt +164 -0
- package/android/src/main/java/io/getstream/rn/callingx/ResourceUtils.kt +60 -0
- package/android/src/main/java/io/getstream/rn/callingx/Utils.kt +23 -0
- package/android/src/main/java/io/getstream/rn/callingx/model/Call.kt +57 -0
- package/android/src/main/java/io/getstream/rn/callingx/model/CallAction.kt +36 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/CallNotificationManager.kt +215 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationChannelsManager.kt +113 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationIntentFactory.kt +105 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverActivity.kt +42 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverService.kt +56 -0
- package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationsConfig.kt +116 -0
- package/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt +163 -0
- package/android/src/main/java/io/getstream/rn/callingx/repo/LegacyCallRepository.kt +134 -0
- package/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt +438 -0
- package/android/src/main/res/drawable/ic_phone_paused_24.xml +11 -0
- package/android/src/main/res/drawable/ic_round_call_24.xml +11 -0
- package/android/src/main/res/drawable/ic_user.xml +27 -0
- package/dist/module/CallingxModule.js +191 -0
- package/dist/module/CallingxModule.js.map +1 -0
- package/dist/module/EventManager.js +40 -0
- package/dist/module/EventManager.js.map +1 -0
- package/dist/module/index.js +5 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/package.json +1 -0
- package/dist/module/spec/NativeCallingx.js +8 -0
- package/dist/module/spec/NativeCallingx.js.map +1 -0
- package/dist/module/types.js +4 -0
- package/dist/module/types.js.map +1 -0
- package/dist/module/utils/constants.js +48 -0
- package/dist/module/utils/constants.js.map +1 -0
- package/dist/module/utils/headlessTask.js +37 -0
- package/dist/module/utils/headlessTask.js.map +1 -0
- package/dist/module/utils/permissions.js +86 -0
- package/dist/module/utils/permissions.js.map +1 -0
- package/dist/module/utils/types.js +2 -0
- package/dist/module/utils/types.js.map +1 -0
- package/dist/module/utils/utils.js +6 -0
- package/dist/module/utils/utils.js.map +1 -0
- package/dist/typescript/package.json +1 -0
- package/dist/typescript/src/CallingxModule.d.ts +44 -0
- package/dist/typescript/src/CallingxModule.d.ts.map +1 -0
- package/dist/typescript/src/EventManager.d.ts +11 -0
- package/dist/typescript/src/EventManager.d.ts.map +1 -0
- package/dist/typescript/src/index.d.ts +3 -0
- package/dist/typescript/src/index.d.ts.map +1 -0
- package/dist/typescript/src/spec/NativeCallingx.d.ts +132 -0
- package/dist/typescript/src/spec/NativeCallingx.d.ts.map +1 -0
- package/dist/typescript/src/types.d.ts +249 -0
- package/dist/typescript/src/types.d.ts.map +1 -0
- package/dist/typescript/src/utils/constants.d.ts +8 -0
- package/dist/typescript/src/utils/constants.d.ts.map +1 -0
- package/dist/typescript/src/utils/headlessTask.d.ts +8 -0
- package/dist/typescript/src/utils/headlessTask.d.ts.map +1 -0
- package/dist/typescript/src/utils/permissions.d.ts +8 -0
- package/dist/typescript/src/utils/permissions.d.ts.map +1 -0
- package/dist/typescript/src/utils/types.d.ts +4 -0
- package/dist/typescript/src/utils/types.d.ts.map +1 -0
- package/dist/typescript/src/utils/utils.d.ts +2 -0
- package/dist/typescript/src/utils/utils.d.ts.map +1 -0
- package/ios/AudioSessionManager.swift +46 -0
- package/ios/Callingx.mm +280 -0
- package/ios/CallingxImpl.swift +744 -0
- package/ios/CallingxPublic.h +79 -0
- package/ios/Settings.swift +108 -0
- package/ios/UUIDStorage.swift +124 -0
- package/ios/VoipNotificationsManager.swift +180 -0
- package/package.json +112 -0
- package/react-native.config.js +8 -0
- package/src/CallingxModule.ts +321 -0
- package/src/EventManager.ts +61 -0
- package/src/index.ts +2 -0
- package/src/spec/NativeCallingx.ts +176 -0
- package/src/types.ts +323 -0
- package/src/utils/constants.ts +55 -0
- package/src/utils/headlessTask.ts +52 -0
- package/src/utils/permissions.ts +111 -0
- package/src/utils/types.ts +5 -0
- package/src/utils/utils.ts +6 -0
package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationIntentFactory.kt
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.notifications
|
|
2
|
+
|
|
3
|
+
import android.app.PendingIntent
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import android.os.Build
|
|
7
|
+
import io.getstream.rn.callingx.CallingxModule
|
|
8
|
+
|
|
9
|
+
object NotificationIntentFactory {
|
|
10
|
+
// Stable request codes for PendingIntents
|
|
11
|
+
private const val REQUEST_CODE_LAUNCH_ACTIVITY = 1001
|
|
12
|
+
private const val REQUEST_CODE_RECEIVER_ACTIVITY = 1002
|
|
13
|
+
private const val REQUEST_CODE_SERVICE = 1003
|
|
14
|
+
|
|
15
|
+
fun getPendingNotificationIntent(
|
|
16
|
+
context: Context,
|
|
17
|
+
action: String,
|
|
18
|
+
callId: String,
|
|
19
|
+
source: String
|
|
20
|
+
): PendingIntent {
|
|
21
|
+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
22
|
+
getReceiverActivityIntent(context, action, callId, source)
|
|
23
|
+
} else {
|
|
24
|
+
getPendingServiceIntent(context, action, callId, source)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
fun getPendingServiceIntent(context: Context, action: String, callId: String, source: String): PendingIntent {
|
|
29
|
+
val intent =
|
|
30
|
+
Intent(context, NotificationReceiverService::class.java).apply {
|
|
31
|
+
this.action = action
|
|
32
|
+
putExtra(CallingxModule.EXTRA_CALL_ID, callId)
|
|
33
|
+
putExtra(CallingxModule.EXTRA_SOURCE, source)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return PendingIntent.getService(
|
|
37
|
+
context,
|
|
38
|
+
REQUEST_CODE_SERVICE,
|
|
39
|
+
intent,
|
|
40
|
+
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
fun getReceiverActivityIntent(context: Context, action: String, callId: String, source: String): PendingIntent {
|
|
45
|
+
val receiverIntent =
|
|
46
|
+
Intent(context, NotificationReceiverActivity::class.java).apply {
|
|
47
|
+
this.action = action
|
|
48
|
+
putExtra(CallingxModule.EXTRA_CALL_ID, callId)
|
|
49
|
+
putExtra(CallingxModule.EXTRA_SOURCE, source)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
val launchActivity = context.packageManager.getLaunchIntentForPackage(context.packageName)
|
|
53
|
+
val launchActivityIntent =
|
|
54
|
+
Intent(launchActivity).apply {
|
|
55
|
+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return PendingIntent.getActivities(
|
|
59
|
+
context,
|
|
60
|
+
REQUEST_CODE_RECEIVER_ACTIVITY,
|
|
61
|
+
arrayOf(launchActivityIntent, receiverIntent),
|
|
62
|
+
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
fun getLaunchActivityIntent(context: Context, action: String, callId: String, source: String? = null): PendingIntent {
|
|
67
|
+
val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)
|
|
68
|
+
val callIntent =
|
|
69
|
+
Intent(launchIntent).apply {
|
|
70
|
+
this.action = action
|
|
71
|
+
putExtra(CallingxModule.EXTRA_CALL_ID, callId)
|
|
72
|
+
source?.let { putExtra(CallingxModule.EXTRA_SOURCE, it) }
|
|
73
|
+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return PendingIntent.getActivity(
|
|
77
|
+
context,
|
|
78
|
+
REQUEST_CODE_LAUNCH_ACTIVITY,
|
|
79
|
+
callIntent,
|
|
80
|
+
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
fun getPendingBroadcastIntent(
|
|
85
|
+
context: Context,
|
|
86
|
+
action: String,
|
|
87
|
+
callId: String,
|
|
88
|
+
addExtras: Intent.() -> Unit = {}
|
|
89
|
+
): PendingIntent {
|
|
90
|
+
val intent =
|
|
91
|
+
Intent(action).apply {
|
|
92
|
+
setPackage(context.packageName)
|
|
93
|
+
putExtra(CallingxModule.EXTRA_CALL_ID, callId)
|
|
94
|
+
addExtras(this)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Use action hashCode for unique request code per action type
|
|
98
|
+
return PendingIntent.getBroadcast(
|
|
99
|
+
context,
|
|
100
|
+
action.hashCode(),
|
|
101
|
+
intent,
|
|
102
|
+
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
}
|
package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverActivity.kt
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.notifications
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.content.Intent
|
|
5
|
+
import android.os.Bundle
|
|
6
|
+
import io.getstream.rn.callingx.CallingxModule
|
|
7
|
+
|
|
8
|
+
// For Android 12+
|
|
9
|
+
class NotificationReceiverActivity : Activity() {
|
|
10
|
+
|
|
11
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
12
|
+
super.onCreate(savedInstanceState)
|
|
13
|
+
handleIntent(intent)
|
|
14
|
+
finish()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
override fun onNewIntent(intent: Intent?) {
|
|
18
|
+
super.onNewIntent(intent)
|
|
19
|
+
handleIntent(intent)
|
|
20
|
+
finish()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//re-send intent from notification to the turbo module
|
|
24
|
+
private fun handleIntent(intent: Intent?) {
|
|
25
|
+
if (intent == null) {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//we need it only for answered call event, as for cold start case we need to send broadcast event and to launch the app
|
|
30
|
+
if (intent.action == CallingxModule.CALL_ANSWERED_ACTION) {
|
|
31
|
+
val callId = intent.getStringExtra(CallingxModule.EXTRA_CALL_ID)
|
|
32
|
+
val source = intent.getStringExtra(CallingxModule.EXTRA_SOURCE)
|
|
33
|
+
Intent(CallingxModule.CALL_ANSWERED_ACTION)
|
|
34
|
+
.apply {
|
|
35
|
+
setPackage(packageName)
|
|
36
|
+
putExtra(CallingxModule.EXTRA_CALL_ID, callId)
|
|
37
|
+
putExtra(CallingxModule.EXTRA_SOURCE, source)
|
|
38
|
+
}
|
|
39
|
+
.also { sendBroadcast(it) }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverService.kt
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.notifications
|
|
2
|
+
|
|
3
|
+
import android.app.Service
|
|
4
|
+
import android.content.Intent
|
|
5
|
+
import android.os.IBinder
|
|
6
|
+
import android.util.Log
|
|
7
|
+
import io.getstream.rn.callingx.CallingxModule
|
|
8
|
+
|
|
9
|
+
class NotificationReceiverService : Service() {
|
|
10
|
+
|
|
11
|
+
companion object {
|
|
12
|
+
const val TAG = "[Callingx] NotificationReceiverService"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
override fun onBind(intent: Intent?): IBinder? = null
|
|
16
|
+
|
|
17
|
+
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
18
|
+
val action = intent?.action
|
|
19
|
+
if (action == null) {
|
|
20
|
+
stopSelf(startId)
|
|
21
|
+
return START_NOT_STICKY
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
when (action) {
|
|
25
|
+
CallingxModule.CALL_ANSWERED_ACTION -> onCallAnswered(intent)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
stopSelf(startId)
|
|
29
|
+
return START_NOT_STICKY
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private fun onCallAnswered(intent: Intent) {
|
|
33
|
+
val callId = intent.getStringExtra(CallingxModule.EXTRA_CALL_ID)
|
|
34
|
+
val source = intent.getStringExtra(CallingxModule.EXTRA_SOURCE)
|
|
35
|
+
callId?.let {
|
|
36
|
+
try {
|
|
37
|
+
NotificationIntentFactory.getPendingBroadcastIntent(
|
|
38
|
+
applicationContext,
|
|
39
|
+
CallingxModule.CALL_ANSWERED_ACTION,
|
|
40
|
+
it
|
|
41
|
+
) { putExtra(CallingxModule.EXTRA_SOURCE, source) }
|
|
42
|
+
.send()
|
|
43
|
+
|
|
44
|
+
NotificationIntentFactory.getLaunchActivityIntent(
|
|
45
|
+
applicationContext,
|
|
46
|
+
CallingxModule.CALL_ANSWERED_ACTION,
|
|
47
|
+
it,
|
|
48
|
+
source
|
|
49
|
+
)
|
|
50
|
+
.send()
|
|
51
|
+
} catch (e: Exception) {
|
|
52
|
+
Log.e(TAG, "Error sending call answered intent", e)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.notifications
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import androidx.core.app.NotificationManagerCompat
|
|
5
|
+
import androidx.core.content.edit
|
|
6
|
+
import com.facebook.react.bridge.ReadableMap
|
|
7
|
+
import io.getstream.rn.callingx.debugLog
|
|
8
|
+
|
|
9
|
+
object NotificationsConfig {
|
|
10
|
+
private const val TAG = "[Callingx] NotificationsConfig"
|
|
11
|
+
private const val PREFS_NAME = "CallingxPrefs"
|
|
12
|
+
private const val PREFIX_IN = "incoming_"
|
|
13
|
+
private const val PREFIX_OUT = "ongoing_"
|
|
14
|
+
private const val KEY_ID = "id"
|
|
15
|
+
private const val KEY_NAME = "name"
|
|
16
|
+
private const val KEY_SOUND = "sound"
|
|
17
|
+
private const val KEY_VIBRATION = "vibration"
|
|
18
|
+
|
|
19
|
+
data class ChannelParams(
|
|
20
|
+
val id: String,
|
|
21
|
+
val name: String,
|
|
22
|
+
val sound: String?,
|
|
23
|
+
val vibration: Boolean,
|
|
24
|
+
val importance: Int,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
data class Channels(
|
|
28
|
+
val incomingChannel: ChannelParams,
|
|
29
|
+
val ongoingChannel: ChannelParams,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
fun saveNotificationsConfig(context: Context, rawConfig: ReadableMap): Channels {
|
|
33
|
+
debugLog(TAG, "saveNotificationsConfig: Saving notifications config: $rawConfig")
|
|
34
|
+
val config = extractNotificationsConfig(rawConfig)
|
|
35
|
+
val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
36
|
+
prefs.edit {
|
|
37
|
+
// Incoming channel
|
|
38
|
+
putString(PREFIX_IN + KEY_ID, config.incomingChannel.id)
|
|
39
|
+
putString(PREFIX_IN + KEY_NAME, config.incomingChannel.name)
|
|
40
|
+
putString(PREFIX_IN + KEY_SOUND, config.incomingChannel.sound)
|
|
41
|
+
putBoolean(PREFIX_IN + KEY_VIBRATION, config.incomingChannel.vibration)
|
|
42
|
+
|
|
43
|
+
// Outgoing channel
|
|
44
|
+
putString(PREFIX_OUT + KEY_ID, config.ongoingChannel.id)
|
|
45
|
+
putString(PREFIX_OUT + KEY_NAME, config.ongoingChannel.name)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return config
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
fun loadNotificationsConfig(context: Context): Channels {
|
|
52
|
+
val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
53
|
+
debugLog(
|
|
54
|
+
TAG,
|
|
55
|
+
"loadNotificationsConfig: Loading notifications config ${
|
|
56
|
+
prefs.getString(
|
|
57
|
+
PREFIX_IN + KEY_ID,
|
|
58
|
+
""
|
|
59
|
+
)
|
|
60
|
+
}"
|
|
61
|
+
)
|
|
62
|
+
return Channels(
|
|
63
|
+
incomingChannel =
|
|
64
|
+
ChannelParams(
|
|
65
|
+
id = prefs.getString(PREFIX_IN + KEY_ID, "") ?: "",
|
|
66
|
+
name = prefs.getString(PREFIX_IN + KEY_NAME, "") ?: "",
|
|
67
|
+
sound = prefs.getString(PREFIX_IN + KEY_SOUND, "") ?: "",
|
|
68
|
+
vibration = prefs.getBoolean(PREFIX_IN + KEY_VIBRATION, false),
|
|
69
|
+
importance = NotificationManagerCompat.IMPORTANCE_MAX,
|
|
70
|
+
),
|
|
71
|
+
ongoingChannel =
|
|
72
|
+
ChannelParams(
|
|
73
|
+
id = prefs.getString(PREFIX_OUT + KEY_ID, "") ?: "",
|
|
74
|
+
name = prefs.getString(PREFIX_OUT + KEY_NAME, "") ?: "",
|
|
75
|
+
importance = NotificationManagerCompat.IMPORTANCE_DEFAULT,
|
|
76
|
+
vibration = false,
|
|
77
|
+
sound = null,
|
|
78
|
+
)
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
fun extractNotificationsConfig(config: ReadableMap): Channels {
|
|
83
|
+
return Channels(
|
|
84
|
+
incomingChannel =
|
|
85
|
+
extractChannelConfig(
|
|
86
|
+
config.getMap("incomingChannel"),
|
|
87
|
+
NotificationManagerCompat.IMPORTANCE_MAX
|
|
88
|
+
),
|
|
89
|
+
ongoingChannel =
|
|
90
|
+
extractChannelConfig(
|
|
91
|
+
config.getMap("ongoingChannel"),
|
|
92
|
+
NotificationManagerCompat.IMPORTANCE_DEFAULT
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fun extractChannelConfig(channel: ReadableMap?, importance: Int): ChannelParams {
|
|
98
|
+
if (channel == null) {
|
|
99
|
+
return ChannelParams(
|
|
100
|
+
id = "",
|
|
101
|
+
name = "",
|
|
102
|
+
sound = "",
|
|
103
|
+
vibration = false,
|
|
104
|
+
importance = importance,
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return ChannelParams(
|
|
109
|
+
id = channel.getString("id") ?: "",
|
|
110
|
+
name = channel.getString("name") ?: "",
|
|
111
|
+
sound = channel.getString("sound"),
|
|
112
|
+
vibration = channel.hasKey("vibration") && channel.getBoolean("vibration") ?: false,
|
|
113
|
+
importance = importance,
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.repo
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.net.Uri
|
|
5
|
+
import android.os.Build
|
|
6
|
+
import android.os.Bundle
|
|
7
|
+
import android.telecom.DisconnectCause
|
|
8
|
+
import android.util.Log
|
|
9
|
+
import androidx.core.telecom.CallAttributesCompat
|
|
10
|
+
import io.getstream.rn.callingx.model.Call
|
|
11
|
+
import io.getstream.rn.callingx.model.CallAction
|
|
12
|
+
import io.getstream.rn.callingx.CallService
|
|
13
|
+
import io.getstream.rn.callingx.debugLog
|
|
14
|
+
import kotlinx.coroutines.CoroutineScope
|
|
15
|
+
import kotlinx.coroutines.Dispatchers
|
|
16
|
+
import kotlinx.coroutines.SupervisorJob
|
|
17
|
+
import kotlinx.coroutines.cancel
|
|
18
|
+
import kotlinx.coroutines.flow.MutableStateFlow
|
|
19
|
+
import kotlinx.coroutines.flow.StateFlow
|
|
20
|
+
import kotlinx.coroutines.flow.asStateFlow
|
|
21
|
+
import kotlinx.coroutines.flow.update
|
|
22
|
+
import kotlinx.coroutines.sync.Mutex
|
|
23
|
+
import kotlinx.coroutines.channels.Channel
|
|
24
|
+
|
|
25
|
+
abstract class CallRepository(protected val context: Context) {
|
|
26
|
+
|
|
27
|
+
enum class EventSource {
|
|
28
|
+
APP, SYS
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Listener {
|
|
32
|
+
fun onCallStateChanged(call: Call)
|
|
33
|
+
fun onIsCallAnswered(callId: String, source: EventSource)
|
|
34
|
+
fun onIsCallDisconnected(callId: String?, cause: DisconnectCause, source: EventSource)
|
|
35
|
+
fun onIsCallInactive(callId: String)
|
|
36
|
+
fun onIsCallActive(callId: String)
|
|
37
|
+
fun onCallRegistered(callId: String)
|
|
38
|
+
fun onMuteCallChanged(callId: String, isMuted: Boolean)
|
|
39
|
+
fun onCallEndpointChanged(callId: String, endpoint: String)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected val _currentCall: MutableStateFlow<Call> = MutableStateFlow(Call.None)
|
|
43
|
+
val currentCall: StateFlow<Call> = _currentCall.asStateFlow()
|
|
44
|
+
|
|
45
|
+
protected var _listener: Listener? = null
|
|
46
|
+
protected val scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
|
|
47
|
+
protected val registrationMutex: Mutex = Mutex()
|
|
48
|
+
|
|
49
|
+
abstract fun setListener(listener: Listener?)
|
|
50
|
+
abstract fun release()
|
|
51
|
+
|
|
52
|
+
abstract suspend fun registerCall(
|
|
53
|
+
callId: String,
|
|
54
|
+
displayName: String,
|
|
55
|
+
address: Uri,
|
|
56
|
+
isIncoming: Boolean,
|
|
57
|
+
isVideo: Boolean,
|
|
58
|
+
displayOptions: Bundle?,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
open fun updateCall(
|
|
62
|
+
callId: String,
|
|
63
|
+
displayName: String,
|
|
64
|
+
address: Uri,
|
|
65
|
+
isVideo: Boolean,
|
|
66
|
+
displayOptions: Bundle?,
|
|
67
|
+
) {
|
|
68
|
+
updateCurrentCall { copy(displayOptions = displayOptions) }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//this call instance is used to display call notification before the call is registered, this is needed to invoke startForeground method on the service
|
|
72
|
+
public fun getTempCall(callInfo: CallService.CallInfo, incoming: Boolean): Call.Registered {
|
|
73
|
+
val attributes = createCallAttributes(
|
|
74
|
+
displayName = callInfo.name,
|
|
75
|
+
address = callInfo.uri,
|
|
76
|
+
isIncoming = incoming,
|
|
77
|
+
isVideo = callInfo.isVideo
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
return Call.Registered(
|
|
81
|
+
id = callInfo.callId,
|
|
82
|
+
isActive = false,
|
|
83
|
+
isOnHold = false,
|
|
84
|
+
callAttributes = attributes,
|
|
85
|
+
displayOptions = callInfo.displayOptions,
|
|
86
|
+
isMuted = false,
|
|
87
|
+
errorCode = null,
|
|
88
|
+
currentCallEndpoint = null,
|
|
89
|
+
availableCallEndpoints = emptyList(),
|
|
90
|
+
actionSource = Channel<CallAction>() // Temporary channel, will be replaced by actual registration
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Update the current state of our call applying the transform lambda only if the call is
|
|
96
|
+
* registered. Otherwise keep the current state
|
|
97
|
+
*/
|
|
98
|
+
protected fun updateCurrentCall(transform: Call.Registered.() -> Call) {
|
|
99
|
+
val currentState = _currentCall.value
|
|
100
|
+
debugLog(
|
|
101
|
+
getTag(),
|
|
102
|
+
"[repository] updateCurrentCall: Current call state: ${currentState::class.simpleName}"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
_currentCall.update { call ->
|
|
106
|
+
if (call is Call.Registered) {
|
|
107
|
+
val updated = call.transform()
|
|
108
|
+
debugLog(
|
|
109
|
+
getTag(),
|
|
110
|
+
"[repository] updateCurrentCall: Call state updated to: ${updated::class.simpleName}"
|
|
111
|
+
)
|
|
112
|
+
updated
|
|
113
|
+
} else {
|
|
114
|
+
Log.w(
|
|
115
|
+
getTag(),
|
|
116
|
+
"[repository] updateCurrentCall: Call is not Registered, skipping update"
|
|
117
|
+
)
|
|
118
|
+
call
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
protected fun createCallAttributes(
|
|
124
|
+
displayName: String,
|
|
125
|
+
address: Uri,
|
|
126
|
+
isIncoming: Boolean,
|
|
127
|
+
isVideo: Boolean
|
|
128
|
+
): CallAttributesCompat {
|
|
129
|
+
return CallAttributesCompat(
|
|
130
|
+
displayName = displayName,
|
|
131
|
+
address = address,
|
|
132
|
+
direction =
|
|
133
|
+
if (isIncoming) {
|
|
134
|
+
CallAttributesCompat.DIRECTION_INCOMING
|
|
135
|
+
} else {
|
|
136
|
+
CallAttributesCompat.DIRECTION_OUTGOING
|
|
137
|
+
},
|
|
138
|
+
callType =
|
|
139
|
+
if (isVideo) {
|
|
140
|
+
CallAttributesCompat.CALL_TYPE_VIDEO_CALL
|
|
141
|
+
} else {
|
|
142
|
+
CallAttributesCompat.CALL_TYPE_AUDIO_CALL
|
|
143
|
+
},
|
|
144
|
+
callCapabilities =
|
|
145
|
+
CallAttributesCompat.SUPPORTS_SET_INACTIVE or
|
|
146
|
+
CallAttributesCompat.SUPPORTS_STREAM or
|
|
147
|
+
CallAttributesCompat.SUPPORTS_TRANSFER,
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
protected abstract fun getTag(): String
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
object CallRepositoryFactory {
|
|
155
|
+
|
|
156
|
+
fun create(context: Context): CallRepository {
|
|
157
|
+
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
158
|
+
TelecomCallRepository(context) // Your current CallRepository renamed
|
|
159
|
+
} else {
|
|
160
|
+
LegacyCallRepository(context) // Fallback implementation
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
package io.getstream.rn.callingx.repo
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.net.Uri
|
|
5
|
+
import android.os.Bundle
|
|
6
|
+
import android.util.Log
|
|
7
|
+
import androidx.core.telecom.CallAttributesCompat
|
|
8
|
+
import io.getstream.rn.callingx.model.Call
|
|
9
|
+
import io.getstream.rn.callingx.model.CallAction
|
|
10
|
+
import kotlinx.coroutines.cancel
|
|
11
|
+
import kotlinx.coroutines.channels.Channel
|
|
12
|
+
import kotlinx.coroutines.flow.consumeAsFlow
|
|
13
|
+
import kotlinx.coroutines.flow.collect
|
|
14
|
+
import kotlinx.coroutines.launch
|
|
15
|
+
import kotlinx.coroutines.sync.withLock
|
|
16
|
+
|
|
17
|
+
class LegacyCallRepository(context: Context) : CallRepository(context) {
|
|
18
|
+
|
|
19
|
+
companion object {
|
|
20
|
+
private const val TAG = "[Callingx] LegacyCallRepository"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override fun getTag(): String = TAG
|
|
24
|
+
|
|
25
|
+
override fun setListener(listener: Listener?) {
|
|
26
|
+
this._listener = listener
|
|
27
|
+
// Observe call state changes
|
|
28
|
+
scope.launch {
|
|
29
|
+
try {
|
|
30
|
+
currentCall.collect { _listener?.onCallStateChanged(it) }
|
|
31
|
+
} catch (e: Exception) {
|
|
32
|
+
Log.e(TAG, "[repository] setListener: Error collecting call state", e)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun release() {
|
|
38
|
+
_currentCall.value = Call.None
|
|
39
|
+
|
|
40
|
+
_listener = null
|
|
41
|
+
|
|
42
|
+
scope.cancel()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
override suspend fun registerCall(
|
|
46
|
+
callId: String,
|
|
47
|
+
displayName: String,
|
|
48
|
+
address: Uri,
|
|
49
|
+
isIncoming: Boolean,
|
|
50
|
+
isVideo: Boolean,
|
|
51
|
+
displayOptions: Bundle?,
|
|
52
|
+
) {
|
|
53
|
+
registrationMutex.withLock {
|
|
54
|
+
if (currentCall.value is Call.Registered) {
|
|
55
|
+
Log.w(
|
|
56
|
+
TAG,
|
|
57
|
+
"[repository] registerCall: Call already registered, ignoring new call request"
|
|
58
|
+
)
|
|
59
|
+
return@withLock
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
val attributes = createCallAttributes(displayName, address, isIncoming, isVideo)
|
|
63
|
+
val actionSource = Channel<CallAction>()
|
|
64
|
+
|
|
65
|
+
_currentCall.value =
|
|
66
|
+
Call.Registered(
|
|
67
|
+
id = callId,
|
|
68
|
+
isActive = false,
|
|
69
|
+
isOnHold = false,
|
|
70
|
+
callAttributes = attributes,
|
|
71
|
+
displayOptions = displayOptions,
|
|
72
|
+
isMuted = false,
|
|
73
|
+
errorCode = null,
|
|
74
|
+
currentCallEndpoint = null,
|
|
75
|
+
availableCallEndpoints = emptyList(),
|
|
76
|
+
actionSource = actionSource,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
_listener?.onCallRegistered(callId)
|
|
80
|
+
|
|
81
|
+
// Process actions without telecom SDK
|
|
82
|
+
scope.launch {
|
|
83
|
+
try {
|
|
84
|
+
actionSource.consumeAsFlow().collect { action -> processActionLegacy(action) }
|
|
85
|
+
} catch (e: Exception) {
|
|
86
|
+
Log.e(TAG, "[repository] registerCall: Error consuming actions", e)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
override fun updateCall(
|
|
93
|
+
callId: String,
|
|
94
|
+
displayName: String,
|
|
95
|
+
address: Uri,
|
|
96
|
+
isVideo: Boolean,
|
|
97
|
+
displayOptions: Bundle?,
|
|
98
|
+
) {
|
|
99
|
+
super.updateCall(callId, displayName, address, isVideo, displayOptions)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private fun processActionLegacy(action: CallAction) {
|
|
103
|
+
when (action) {
|
|
104
|
+
is CallAction.Answer -> {
|
|
105
|
+
updateCurrentCall { copy(isActive = true, isOnHold = false) }
|
|
106
|
+
// In legacy mode, all actions are initiated from the app
|
|
107
|
+
(currentCall.value as? Call.Registered)?.let {
|
|
108
|
+
_listener?.onIsCallAnswered(it.id, EventSource.APP)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
is CallAction.Disconnect -> {
|
|
112
|
+
val call = currentCall.value as? Call.Registered
|
|
113
|
+
if (call != null) {
|
|
114
|
+
_currentCall.value =
|
|
115
|
+
Call.Unregistered(call.id, call.callAttributes, action.cause)
|
|
116
|
+
// In legacy mode, all actions are initiated from the app
|
|
117
|
+
_listener?.onIsCallDisconnected(
|
|
118
|
+
call.id,
|
|
119
|
+
action.cause,
|
|
120
|
+
EventSource.APP
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
is CallAction.ToggleMute -> {
|
|
125
|
+
updateCurrentCall { copy(isMuted = action.isMute) }
|
|
126
|
+
}
|
|
127
|
+
// Handle other actions...
|
|
128
|
+
else -> {
|
|
129
|
+
/* No-op for unsupported actions */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|