@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.
Files changed (256) hide show
  1. package/Callingx.podspec +23 -0
  2. package/LICENSE +219 -0
  3. package/README.md +392 -0
  4. package/android/bin/build/generated/source/buildConfig/debug/io/getstream/rn/callingx/BuildConfig.class +0 -0
  5. package/android/bin/build/generated/source/codegen/java/io/getstream/rn/callingx/NativeCallingxSpec.class +0 -0
  6. package/android/bin/build/generated/source/codegen/jni/CMakeLists.txt +28 -0
  7. package/android/bin/build/generated/source/codegen/jni/CallingxSpec-generated.cpp +167 -0
  8. package/android/bin/build/generated/source/codegen/jni/CallingxSpec.h +31 -0
  9. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/CallingxSpecJSI-generated.cpp +196 -0
  10. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/CallingxSpecJSI.h +283 -0
  11. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ComponentDescriptors.cpp +22 -0
  12. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ComponentDescriptors.h +24 -0
  13. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/EventEmitters.cpp +16 -0
  14. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/EventEmitters.h +17 -0
  15. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/Props.cpp +19 -0
  16. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/Props.h +18 -0
  17. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ShadowNodes.cpp +17 -0
  18. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/ShadowNodes.h +23 -0
  19. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/States.cpp +16 -0
  20. package/android/bin/build/generated/source/codegen/jni/react/renderer/components/CallingxSpec/States.h +20 -0
  21. package/android/bin/build/generated/source/codegen/schema.json +1 -0
  22. package/android/bin/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +33 -0
  23. package/android/bin/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  24. package/android/bin/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  25. package/android/bin/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  26. package/android/bin/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  27. package/android/bin/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  28. package/android/bin/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +3 -0
  29. package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_phone_paused_24.xml.flat +0 -0
  30. package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_round_call_24.xml.flat +0 -0
  31. package/android/bin/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable_ic_user.xml.flat +0 -0
  32. package/android/bin/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +4 -0
  33. package/android/bin/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  34. package/android/bin/build/intermediates/incremental/mergeDebugAssets/merger.xml +2 -0
  35. package/android/bin/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  36. package/android/bin/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  37. package/android/bin/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
  38. package/android/bin/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +5 -0
  39. package/android/bin/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +60 -0
  40. package/android/bin/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +33 -0
  41. package/android/bin/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  42. package/android/bin/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  43. package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_phone_paused_24.xml +11 -0
  44. package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_round_call_24.xml +11 -0
  45. package/android/bin/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_user.xml +27 -0
  46. package/android/bin/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
  47. package/android/bin/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  48. package/android/bin/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +4 -0
  49. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  50. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  51. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  52. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  53. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  54. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  55. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  56. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  57. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  58. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  59. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  60. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  61. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  62. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  63. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  64. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  65. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  66. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  67. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  68. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  69. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  70. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  71. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  72. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  73. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  74. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  75. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  76. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  77. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  78. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  79. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  80. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  81. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  82. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  83. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  84. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
  85. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
  86. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
  87. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
  88. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
  89. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
  90. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
  91. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  92. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  93. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  94. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  95. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values +0 -0
  96. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  97. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s +1 -0
  98. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  99. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  100. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  101. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  102. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  103. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  104. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  105. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  106. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  107. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  108. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  109. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  110. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  111. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  112. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  113. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  114. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  115. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  116. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  117. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  118. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  119. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  120. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  121. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
  122. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  123. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  124. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  125. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  126. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  127. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  128. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  129. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  130. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  131. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  132. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  133. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  134. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  135. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  136. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  137. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  138. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  139. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  140. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  141. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  142. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  143. package/android/bin/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  144. package/android/bin/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  145. package/android/bin/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  146. package/android/bin/build/outputs/logs/manifest-merger-debug-report.txt +70 -0
  147. package/android/bin/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  148. package/android/bin/build/tmp/kotlin-classes/debug/META-INF/stream-io_react-native-callingx_debug.kotlin_module +0 -0
  149. package/android/bin/build.gradle +81 -0
  150. package/android/bin/gradle.properties +5 -0
  151. package/android/bin/local.properties +8 -0
  152. package/android/bin/src/main/AndroidManifest.xml +30 -0
  153. package/android/bin/src/main/java/io/getstream/rn/callingx/CallService.kt +396 -0
  154. package/android/bin/src/main/java/io/getstream/rn/callingx/CallingxModule.kt +639 -0
  155. package/android/bin/src/main/java/io/getstream/rn/callingx/CallingxPackage.kt +16 -0
  156. package/android/bin/src/main/java/io/getstream/rn/callingx/HeadlessTaskManager.kt +164 -0
  157. package/android/bin/src/main/java/io/getstream/rn/callingx/ResourceUtils.kt +60 -0
  158. package/android/bin/src/main/java/io/getstream/rn/callingx/Utils.kt +23 -0
  159. package/android/bin/src/main/java/io/getstream/rn/callingx/model/Call.kt +57 -0
  160. package/android/bin/src/main/java/io/getstream/rn/callingx/model/CallAction.kt +36 -0
  161. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/CallNotificationManager.kt +215 -0
  162. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationChannelsManager.kt +113 -0
  163. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationIntentFactory.kt +105 -0
  164. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverActivity.kt +42 -0
  165. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverService.kt +56 -0
  166. package/android/bin/src/main/java/io/getstream/rn/callingx/notifications/NotificationsConfig.kt +116 -0
  167. package/android/bin/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt +163 -0
  168. package/android/bin/src/main/java/io/getstream/rn/callingx/repo/LegacyCallRepository.kt +134 -0
  169. package/android/bin/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt +438 -0
  170. package/android/bin/src/main/res/drawable/ic_phone_paused_24.xml +11 -0
  171. package/android/bin/src/main/res/drawable/ic_round_call_24.xml +11 -0
  172. package/android/bin/src/main/res/drawable/ic_user.xml +27 -0
  173. package/android/build.gradle +81 -0
  174. package/android/gradle.properties +5 -0
  175. package/android/src/main/AndroidManifest.xml +30 -0
  176. package/android/src/main/java/io/getstream/rn/callingx/CallService.kt +396 -0
  177. package/android/src/main/java/io/getstream/rn/callingx/CallingxModule.kt +639 -0
  178. package/android/src/main/java/io/getstream/rn/callingx/CallingxPackage.kt +16 -0
  179. package/android/src/main/java/io/getstream/rn/callingx/HeadlessTaskManager.kt +164 -0
  180. package/android/src/main/java/io/getstream/rn/callingx/ResourceUtils.kt +60 -0
  181. package/android/src/main/java/io/getstream/rn/callingx/Utils.kt +23 -0
  182. package/android/src/main/java/io/getstream/rn/callingx/model/Call.kt +57 -0
  183. package/android/src/main/java/io/getstream/rn/callingx/model/CallAction.kt +36 -0
  184. package/android/src/main/java/io/getstream/rn/callingx/notifications/CallNotificationManager.kt +215 -0
  185. package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationChannelsManager.kt +113 -0
  186. package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationIntentFactory.kt +105 -0
  187. package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverActivity.kt +42 -0
  188. package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationReceiverService.kt +56 -0
  189. package/android/src/main/java/io/getstream/rn/callingx/notifications/NotificationsConfig.kt +116 -0
  190. package/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt +163 -0
  191. package/android/src/main/java/io/getstream/rn/callingx/repo/LegacyCallRepository.kt +134 -0
  192. package/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt +438 -0
  193. package/android/src/main/res/drawable/ic_phone_paused_24.xml +11 -0
  194. package/android/src/main/res/drawable/ic_round_call_24.xml +11 -0
  195. package/android/src/main/res/drawable/ic_user.xml +27 -0
  196. package/dist/module/CallingxModule.js +191 -0
  197. package/dist/module/CallingxModule.js.map +1 -0
  198. package/dist/module/EventManager.js +40 -0
  199. package/dist/module/EventManager.js.map +1 -0
  200. package/dist/module/index.js +5 -0
  201. package/dist/module/index.js.map +1 -0
  202. package/dist/module/package.json +1 -0
  203. package/dist/module/spec/NativeCallingx.js +8 -0
  204. package/dist/module/spec/NativeCallingx.js.map +1 -0
  205. package/dist/module/types.js +4 -0
  206. package/dist/module/types.js.map +1 -0
  207. package/dist/module/utils/constants.js +48 -0
  208. package/dist/module/utils/constants.js.map +1 -0
  209. package/dist/module/utils/headlessTask.js +37 -0
  210. package/dist/module/utils/headlessTask.js.map +1 -0
  211. package/dist/module/utils/permissions.js +86 -0
  212. package/dist/module/utils/permissions.js.map +1 -0
  213. package/dist/module/utils/types.js +2 -0
  214. package/dist/module/utils/types.js.map +1 -0
  215. package/dist/module/utils/utils.js +6 -0
  216. package/dist/module/utils/utils.js.map +1 -0
  217. package/dist/typescript/package.json +1 -0
  218. package/dist/typescript/src/CallingxModule.d.ts +44 -0
  219. package/dist/typescript/src/CallingxModule.d.ts.map +1 -0
  220. package/dist/typescript/src/EventManager.d.ts +11 -0
  221. package/dist/typescript/src/EventManager.d.ts.map +1 -0
  222. package/dist/typescript/src/index.d.ts +3 -0
  223. package/dist/typescript/src/index.d.ts.map +1 -0
  224. package/dist/typescript/src/spec/NativeCallingx.d.ts +132 -0
  225. package/dist/typescript/src/spec/NativeCallingx.d.ts.map +1 -0
  226. package/dist/typescript/src/types.d.ts +249 -0
  227. package/dist/typescript/src/types.d.ts.map +1 -0
  228. package/dist/typescript/src/utils/constants.d.ts +8 -0
  229. package/dist/typescript/src/utils/constants.d.ts.map +1 -0
  230. package/dist/typescript/src/utils/headlessTask.d.ts +8 -0
  231. package/dist/typescript/src/utils/headlessTask.d.ts.map +1 -0
  232. package/dist/typescript/src/utils/permissions.d.ts +8 -0
  233. package/dist/typescript/src/utils/permissions.d.ts.map +1 -0
  234. package/dist/typescript/src/utils/types.d.ts +4 -0
  235. package/dist/typescript/src/utils/types.d.ts.map +1 -0
  236. package/dist/typescript/src/utils/utils.d.ts +2 -0
  237. package/dist/typescript/src/utils/utils.d.ts.map +1 -0
  238. package/ios/AudioSessionManager.swift +46 -0
  239. package/ios/Callingx.mm +280 -0
  240. package/ios/CallingxImpl.swift +744 -0
  241. package/ios/CallingxPublic.h +79 -0
  242. package/ios/Settings.swift +108 -0
  243. package/ios/UUIDStorage.swift +124 -0
  244. package/ios/VoipNotificationsManager.swift +180 -0
  245. package/package.json +112 -0
  246. package/react-native.config.js +8 -0
  247. package/src/CallingxModule.ts +321 -0
  248. package/src/EventManager.ts +61 -0
  249. package/src/index.ts +2 -0
  250. package/src/spec/NativeCallingx.ts +176 -0
  251. package/src/types.ts +323 -0
  252. package/src/utils/constants.ts +55 -0
  253. package/src/utils/headlessTask.ts +52 -0
  254. package/src/utils/permissions.ts +111 -0
  255. package/src/utils/types.ts +5 -0
  256. package/src/utils/utils.ts +6 -0
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }