@100mslive/react-native-hms 0.9.7 → 0.9.91

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 (170) hide show
  1. package/README.md +63 -44
  2. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  3. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  4. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  5. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  6. package/android/.gradle/checksums/checksums.lock +0 -0
  7. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  8. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  9. package/android/.idea/compiler.xml +6 -0
  10. package/android/.idea/gradle.xml +6 -1
  11. package/android/.idea/jarRepositories.xml +40 -0
  12. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml +16 -0
  13. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml +11 -0
  14. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml +13 -0
  15. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml +16 -0
  16. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml +13 -0
  17. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +11 -0
  18. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +13 -0
  19. package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +16 -0
  20. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +11 -0
  21. package/android/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_1_3_aar.xml +13 -0
  22. package/android/.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml +16 -0
  23. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +13 -0
  24. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +13 -0
  25. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +16 -0
  26. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml +16 -0
  27. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +13 -0
  28. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml +11 -0
  29. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +13 -0
  30. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +13 -0
  31. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml +13 -0
  32. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +13 -0
  33. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +13 -0
  34. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +13 -0
  35. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +13 -0
  36. package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +16 -0
  37. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +13 -0
  38. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +13 -0
  39. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +13 -0
  40. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +13 -0
  41. package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_java_only_0_2_2.xml +13 -0
  42. package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +15 -0
  43. package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +18 -0
  44. package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +18 -0
  45. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +18 -0
  46. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +18 -0
  47. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +15 -0
  48. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +15 -0
  49. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +15 -0
  50. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +15 -0
  51. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +15 -0
  52. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +15 -0
  53. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +15 -0
  54. package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +15 -0
  55. package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml +13 -0
  56. package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_69_1_debug_aar.xml +14 -0
  57. package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_3.xml +13 -0
  58. package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_3.xml +13 -0
  59. package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_3_aar.xml +15 -0
  60. package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +13 -0
  61. package/android/.idea/libraries/Gradle__com_github_100mslive_android_sdk_lib_2_4_7_aar.xml +11 -0
  62. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m97_hms_1_1_aar.xml +11 -0
  63. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml +13 -0
  64. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_2.xml +13 -0
  65. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_2.xml +13 -0
  66. package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +13 -0
  67. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +13 -0
  68. package/android/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml +13 -0
  69. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +13 -0
  70. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_10.xml +13 -0
  71. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_10.xml +13 -0
  72. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_10.xml +13 -0
  73. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_10.xml +13 -0
  74. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_6_0.xml +13 -0
  75. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_6_0.xml +13 -0
  76. package/android/.idea/misc.xml +1 -1
  77. package/android/.idea/modules/android.androidTest.iml +201 -0
  78. package/android/.idea/modules/android.iml +28 -6
  79. package/android/.idea/modules/android.main.iml +196 -0
  80. package/android/.idea/modules/android.unitTest.iml +195 -0
  81. package/android/.idea/modules.xml +3 -0
  82. package/android/build.gradle +2 -2
  83. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +84 -0
  84. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +79 -10
  85. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +130 -27
  86. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +88 -2
  87. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +307 -82
  88. package/ios/HMSDecoder.swift +9 -8
  89. package/ios/HMSHelper.swift +18 -8
  90. package/ios/HMSManager.m +1 -1
  91. package/ios/HMSManager.swift +7 -6
  92. package/ios/HMSRNSDK.swift +198 -173
  93. package/lib/commonjs/classes/HMSAudioDevice.js +17 -0
  94. package/lib/commonjs/classes/HMSAudioDevice.js.map +1 -0
  95. package/lib/commonjs/classes/HMSAudioMixingMode.js +15 -0
  96. package/lib/commonjs/classes/HMSAudioMixingMode.js.map +1 -0
  97. package/lib/commonjs/classes/HMSAudioMode.js +17 -0
  98. package/lib/commonjs/classes/HMSAudioMode.js.map +1 -0
  99. package/lib/commonjs/classes/HMSEncoder.js +15 -0
  100. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  101. package/lib/commonjs/classes/HMSException.js +18 -13
  102. package/lib/commonjs/classes/HMSException.js.map +1 -1
  103. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -1
  104. package/lib/commonjs/classes/HMSLogger.js +2 -2
  105. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  106. package/lib/commonjs/classes/HMSPermissions.js +7 -4
  107. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  108. package/lib/commonjs/classes/HMSRTMPConfig.js +3 -0
  109. package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -1
  110. package/lib/commonjs/classes/HMSRtmpVideoResolution.js +23 -0
  111. package/lib/commonjs/classes/HMSRtmpVideoResolution.js.map +1 -0
  112. package/lib/commonjs/classes/HMSSDK.js +268 -48
  113. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  114. package/lib/commonjs/classes/HMSUpdateListenerActions.js +1 -0
  115. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  116. package/lib/commonjs/index.js +56 -0
  117. package/lib/commonjs/index.js.map +1 -1
  118. package/lib/module/classes/HMSAudioDevice.js +10 -0
  119. package/lib/module/classes/HMSAudioDevice.js.map +1 -0
  120. package/lib/module/classes/HMSAudioMixingMode.js +8 -0
  121. package/lib/module/classes/HMSAudioMixingMode.js.map +1 -0
  122. package/lib/module/classes/HMSAudioMode.js +10 -0
  123. package/lib/module/classes/HMSAudioMode.js.map +1 -0
  124. package/lib/module/classes/HMSEncoder.js +14 -0
  125. package/lib/module/classes/HMSEncoder.js.map +1 -1
  126. package/lib/module/classes/HMSException.js +18 -13
  127. package/lib/module/classes/HMSException.js.map +1 -1
  128. package/lib/module/classes/HMSHLSConfig.js.map +1 -1
  129. package/lib/module/classes/HMSLogger.js +2 -2
  130. package/lib/module/classes/HMSLogger.js.map +1 -1
  131. package/lib/module/classes/HMSPermissions.js +7 -4
  132. package/lib/module/classes/HMSPermissions.js.map +1 -1
  133. package/lib/module/classes/HMSRTMPConfig.js +3 -0
  134. package/lib/module/classes/HMSRTMPConfig.js.map +1 -1
  135. package/lib/module/classes/HMSRtmpVideoResolution.js +14 -0
  136. package/lib/module/classes/HMSRtmpVideoResolution.js.map +1 -0
  137. package/lib/module/classes/HMSSDK.js +267 -42
  138. package/lib/module/classes/HMSSDK.js.map +1 -1
  139. package/lib/module/classes/HMSUpdateListenerActions.js +1 -0
  140. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  141. package/lib/module/index.js +4 -0
  142. package/lib/module/index.js.map +1 -1
  143. package/lib/typescript/classes/HMSAudioDevice.d.ts +7 -0
  144. package/lib/typescript/classes/HMSAudioMixingMode.d.ts +5 -0
  145. package/lib/typescript/classes/HMSAudioMode.d.ts +7 -0
  146. package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
  147. package/lib/typescript/classes/HMSException.d.ts +8 -14
  148. package/lib/typescript/classes/HMSHLSConfig.d.ts +2 -2
  149. package/lib/typescript/classes/HMSLogger.d.ts +1 -1
  150. package/lib/typescript/classes/HMSPermissions.d.ts +6 -4
  151. package/lib/typescript/classes/HMSRTMPConfig.d.ts +3 -0
  152. package/lib/typescript/classes/HMSRtmpVideoResolution.d.ts +8 -0
  153. package/lib/typescript/classes/HMSSDK.d.ts +109 -11
  154. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +2 -1
  155. package/lib/typescript/index.d.ts +4 -0
  156. package/package.json +1 -19
  157. package/react-native-hms.podspec +1 -1
  158. package/src/classes/HMSAudioDevice.ts +7 -0
  159. package/src/classes/HMSAudioMixingMode.ts +5 -0
  160. package/src/classes/HMSAudioMode.ts +7 -0
  161. package/src/classes/HMSEncoder.ts +12 -0
  162. package/src/classes/HMSException.ts +15 -24
  163. package/src/classes/HMSHLSConfig.ts +2 -2
  164. package/src/classes/HMSLogger.ts +2 -2
  165. package/src/classes/HMSPermissions.ts +9 -6
  166. package/src/classes/HMSRTMPConfig.ts +5 -0
  167. package/src/classes/HMSRtmpVideoResolution.ts +9 -0
  168. package/src/classes/HMSSDK.tsx +341 -49
  169. package/src/classes/HMSUpdateListenerActions.ts +1 -0
  170. package/src/index.ts +4 -0
@@ -1,6 +1,7 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
3
  import com.facebook.react.bridge.*
4
+ import live.hms.video.connection.stats.*
4
5
  import live.hms.video.connection.stats.quality.HMSNetworkQuality
5
6
  import live.hms.video.error.HMSException
6
7
  import live.hms.video.media.settings.HMSAudioTrackSettings
@@ -125,10 +126,10 @@ object HMSDecoder {
125
126
  permissions.putBoolean("endRoom", hmsPermissions.endRoom)
126
127
  permissions.putBoolean("removeOthers", hmsPermissions.removeOthers)
127
128
  permissions.putBoolean("mute", hmsPermissions.mute)
128
- permissions.putBoolean("changeRoleForce", hmsPermissions.changeRoleForce)
129
+ permissions.putBoolean("browserRecording", hmsPermissions.browserRecording)
129
130
  permissions.putBoolean("unmute", hmsPermissions.unmute)
130
- permissions.putBoolean("recording", hmsPermissions.recording)
131
- permissions.putBoolean("streaming", hmsPermissions.streaming)
131
+ permissions.putBoolean("hlsStreaming", hmsPermissions.hlsStreaming)
132
+ permissions.putBoolean("rtmpStreaming", hmsPermissions.rtmpStreaming)
132
133
  permissions.putBoolean("changeRole", hmsPermissions.changeRole)
133
134
  }
134
135
  return permissions
@@ -197,7 +198,7 @@ object HMSDecoder {
197
198
  return peer
198
199
  }
199
200
 
200
- private fun getHmsLocalAudioTrack(track: HMSLocalAudioTrack?): WritableMap {
201
+ fun getHmsLocalAudioTrack(track: HMSLocalAudioTrack?): WritableMap {
201
202
  val hmsTrack: WritableMap = Arguments.createMap()
202
203
  if (track != null) {
203
204
  hmsTrack.putDouble("volume", track.volume)
@@ -211,7 +212,7 @@ object HMSDecoder {
211
212
  return hmsTrack
212
213
  }
213
214
 
214
- private fun getHmsLocalVideoTrack(track: HMSLocalVideoTrack?): WritableMap {
215
+ fun getHmsLocalVideoTrack(track: HMSLocalVideoTrack?): WritableMap {
215
216
  val hmsTrack: WritableMap = Arguments.createMap()
216
217
  if (track != null) {
217
218
  hmsTrack.putBoolean("isDegraded", track.isDegraded)
@@ -263,7 +264,7 @@ object HMSDecoder {
263
264
  return resolution
264
265
  }
265
266
 
266
- fun getHmsRemotePeers(remotePeers: Array<HMSRemotePeer>?): WritableArray {
267
+ fun getHmsRemotePeers(remotePeers: List<HMSRemotePeer>?): WritableArray {
267
268
  val peers: WritableArray = Arguments.createArray()
268
269
  if (remotePeers != null) {
269
270
  for (peer in remotePeers) {
@@ -292,7 +293,7 @@ object HMSDecoder {
292
293
  return peer
293
294
  }
294
295
 
295
- private fun getHmsRemoteAudioTrack(track: HMSRemoteAudioTrack?): WritableMap {
296
+ fun getHmsRemoteAudioTrack(track: HMSRemoteAudioTrack?): WritableMap {
296
297
  val hmsTrack: WritableMap = Arguments.createMap()
297
298
  if (track != null) {
298
299
  hmsTrack.putBoolean("isPlaybackAllowed", track.isPlaybackAllowed)
@@ -305,7 +306,7 @@ object HMSDecoder {
305
306
  return hmsTrack
306
307
  }
307
308
 
308
- private fun getHmsRemoteVideoTrack(track: HMSRemoteVideoTrack?): WritableMap {
309
+ fun getHmsRemoteVideoTrack(track: HMSRemoteVideoTrack?): WritableMap {
309
310
  val hmsTrack: WritableMap = Arguments.createMap()
310
311
  if (track != null) {
311
312
  hmsTrack.putBoolean("isDegraded", track.isDegraded)
@@ -360,11 +361,11 @@ object HMSDecoder {
360
361
  if (error !== null) {
361
362
  val decodedError: WritableMap = Arguments.createMap()
362
363
  decodedError.putInt("code", error.code)
363
- decodedError.putString("localizedDescription", error.localizedMessage)
364
364
  decodedError.putString("description", error.description)
365
365
  decodedError.putString("message", error.message)
366
366
  decodedError.putString("name", error.name)
367
367
  decodedError.putString("action", error.action)
368
+ decodedError.putBoolean("isTerminal", error.isTerminal)
368
369
  return decodedError
369
370
  }
370
371
  return null
@@ -485,7 +486,7 @@ object HMSDecoder {
485
486
  return subscribeDegradationParams
486
487
  }
487
488
 
488
- private fun getAllPeers(peers: Array<HMSPeer>?): WritableArray {
489
+ private fun getAllPeers(peers: List<HMSPeer>?): WritableArray {
489
490
  val decodedPeers: WritableArray = Arguments.createArray()
490
491
  if (peers != null) {
491
492
  for (peer in peers) {
@@ -524,4 +525,72 @@ object HMSDecoder {
524
525
  }
525
526
  return hmsNetworkQuality
526
527
  }
528
+
529
+ fun getHMSRTCStats(hmsRtcStats: HMSRTCStats?): WritableMap {
530
+ val rtcStats: WritableMap = Arguments.createMap()
531
+ if (hmsRtcStats != null) {
532
+ rtcStats.putDouble("bitrateReceived", hmsRtcStats.bitrateReceived)
533
+ rtcStats.putDouble("bitrateSent", hmsRtcStats.bitrateSent)
534
+ rtcStats.putString("bytesSent", hmsRtcStats.bytesSent.toString())
535
+ rtcStats.putString("bytesReceived", hmsRtcStats.bytesReceived.toString())
536
+ rtcStats.putString("packetsLost", hmsRtcStats.packetsLost.toString())
537
+ rtcStats.putString("packetsReceived", hmsRtcStats.packetsReceived.toString())
538
+ rtcStats.putDouble("roundTripTime", hmsRtcStats.roundTripTime)
539
+ }
540
+ return rtcStats
541
+ }
542
+
543
+ fun getLocalAudioStats(hmsLocalAudioStats: HMSLocalAudioStats?): WritableMap {
544
+ val localAudioStats: WritableMap = Arguments.createMap()
545
+ if (hmsLocalAudioStats != null) {
546
+ hmsLocalAudioStats.bitrate?.let { localAudioStats.putDouble("bitrate", it) }
547
+ localAudioStats.putString("bytesSent", hmsLocalAudioStats.bytesSent.toString())
548
+ hmsLocalAudioStats.roundTripTime?.let { localAudioStats.putDouble("roundTripTime", it) }
549
+ }
550
+ return localAudioStats
551
+ }
552
+
553
+ fun getLocalVideoStats(hmsLocalVideoStats: HMSLocalVideoStats?): WritableMap {
554
+ val localVideoStats: WritableMap = Arguments.createMap()
555
+ if (hmsLocalVideoStats != null) {
556
+ localVideoStats.putString("bytesSent", hmsLocalVideoStats.bytesSent.toString())
557
+ localVideoStats.putMap(
558
+ "resolution",
559
+ hmsLocalVideoStats.resolution?.let { this.getHmsVideoTrackResolution(it) }
560
+ )
561
+ hmsLocalVideoStats.bitrate?.let { localVideoStats.putDouble("bitrate", it) }
562
+ hmsLocalVideoStats.roundTripTime?.let { localVideoStats.putDouble("roundTripTime", it) }
563
+ hmsLocalVideoStats.frameRate?.let { localVideoStats.putDouble("frameRate", it) }
564
+ }
565
+ return localVideoStats
566
+ }
567
+
568
+ fun getRemoteAudioStats(hmsRemoteAudioStats: HMSRemoteAudioStats?): WritableMap {
569
+ val remoteAudioStats: WritableMap = Arguments.createMap()
570
+ if (hmsRemoteAudioStats != null) {
571
+ hmsRemoteAudioStats.bitrate?.let { remoteAudioStats.putDouble("bitrate", it) }
572
+ remoteAudioStats.putString("bytesReceived", hmsRemoteAudioStats.bytesReceived.toString())
573
+ hmsRemoteAudioStats.jitter?.let { remoteAudioStats.putDouble("jitter", it) }
574
+ hmsRemoteAudioStats.packetsLost?.let { remoteAudioStats.putInt("packetsLost", it) }
575
+ remoteAudioStats.putString("packetsReceived", hmsRemoteAudioStats.packetsReceived.toString())
576
+ }
577
+ return remoteAudioStats
578
+ }
579
+
580
+ fun getRemoteVideoStats(hmsRemoteVideoStats: HMSRemoteVideoStats?): WritableMap {
581
+ val remoteVideoStats: WritableMap = Arguments.createMap()
582
+ if (hmsRemoteVideoStats != null) {
583
+ remoteVideoStats.putString("bytesReceived", hmsRemoteVideoStats.bytesReceived.toString())
584
+ remoteVideoStats.putString("packetsReceived", hmsRemoteVideoStats.packetsReceived.toString())
585
+ hmsRemoteVideoStats.bitrate?.let { remoteVideoStats.putDouble("bitrate", it) }
586
+ remoteVideoStats.putMap(
587
+ "resolution",
588
+ hmsRemoteVideoStats.resolution?.let { this.getHmsVideoTrackResolution(it) }
589
+ )
590
+ hmsRemoteVideoStats.frameRate?.let { remoteVideoStats.putDouble("frameRate", it) }
591
+ hmsRemoteVideoStats.jitter?.let { remoteVideoStats.putDouble("jitter", it) }
592
+ hmsRemoteVideoStats.packetsLost?.let { remoteVideoStats.putInt("packetsLost", it) }
593
+ }
594
+ return remoteVideoStats
595
+ }
527
596
  }
@@ -7,6 +7,7 @@ import android.os.Handler
7
7
  import android.util.Base64
8
8
  import android.util.Log
9
9
  import android.view.PixelCopy
10
+ import android.webkit.URLUtil
10
11
  import androidx.annotation.RequiresApi
11
12
  import com.facebook.react.bridge.*
12
13
  import com.facebook.react.bridge.ReadableArray
@@ -14,17 +15,16 @@ import com.facebook.react.bridge.ReadableMap
14
15
  import com.facebook.react.uimanager.events.RCTEventEmitter
15
16
  import java.io.ByteArrayOutputStream
16
17
  import java.util.*
18
+ import live.hms.video.audio.HMSAudioManager
17
19
  import live.hms.video.error.HMSException
18
20
  import live.hms.video.media.codec.HMSAudioCodec
19
21
  import live.hms.video.media.codec.HMSVideoCodec
20
- import live.hms.video.media.settings.HMSAudioTrackSettings
21
- import live.hms.video.media.settings.HMSTrackSettings
22
- import live.hms.video.media.settings.HMSVideoResolution
23
- import live.hms.video.media.settings.HMSVideoTrackSettings
22
+ import live.hms.video.media.settings.*
24
23
  import live.hms.video.media.tracks.HMSRemoteAudioTrack
25
24
  import live.hms.video.media.tracks.HMSRemoteVideoTrack
26
25
  import live.hms.video.media.tracks.HMSTrack
27
26
  import live.hms.video.sdk.models.*
27
+ import live.hms.video.sdk.models.enums.AudioMixingMode
28
28
  import live.hms.video.sdk.models.role.HMSRole
29
29
  import live.hms.video.utils.HmsUtilities
30
30
  import org.webrtc.SurfaceViewRenderer
@@ -250,6 +250,21 @@ object HMSHelper {
250
250
  }
251
251
  }
252
252
 
253
+ fun getAudioMixingMode(audioMixingMode: String?): AudioMixingMode {
254
+ when (audioMixingMode) {
255
+ "TALK_ONLY" -> {
256
+ return AudioMixingMode.TALK_ONLY
257
+ }
258
+ "MUSIC_ONLY" -> {
259
+ return AudioMixingMode.MUSIC_ONLY
260
+ }
261
+ "TALK_AND_MUSIC" -> {
262
+ return AudioMixingMode.TALK_AND_MUSIC
263
+ }
264
+ }
265
+ return AudioMixingMode.TALK_AND_MUSIC
266
+ }
267
+
253
268
  private fun getAudioCodec(codecString: String?): HMSAudioCodec {
254
269
  when (codecString) {
255
270
  "opus" -> {
@@ -296,7 +311,7 @@ object HMSHelper {
296
311
  }
297
312
  }
298
313
 
299
- fun getRtmpUrls(rtmpURLsList: ReadableArray?): List<String> {
314
+ private fun getRtmpUrls(rtmpURLsList: ReadableArray?): List<String> {
300
315
  val rtmpURLs = mutableListOf<String>()
301
316
  if (rtmpURLsList !== null) {
302
317
  for (rtmpURL in rtmpURLsList.toArrayList()) {
@@ -306,7 +321,25 @@ object HMSHelper {
306
321
  return rtmpURLs
307
322
  }
308
323
 
309
- fun getHMSHLSMeetingURLVariants(
324
+ fun getHLSConfig(data: ReadableMap?): HMSHLSConfig? {
325
+ if (data === null) {
326
+ return data
327
+ }
328
+ var hlsMeetingUrlVariant: List<HMSHLSMeetingURLVariant>? = null
329
+ if (areAllRequiredKeysAvailable(data, arrayOf(Pair("meetingURLVariants", "Array")))) {
330
+ val meetingURLVariants =
331
+ data.getArray("meetingURLVariants")?.toArrayList() as? ArrayList<HashMap<String, String>>
332
+ hlsMeetingUrlVariant = getHMSHLSMeetingURLVariants(meetingURLVariants)
333
+ }
334
+ var hlsRecordingConfig: HMSHlsRecordingConfig? = null
335
+ if (areAllRequiredKeysAvailable(data, arrayOf(Pair("hlsRecordingConfig", "Map")))) {
336
+ val recordingConfig = data.getMap("hlsRecordingConfig")
337
+ hlsRecordingConfig = getHlsRecordingConfig(recordingConfig)
338
+ }
339
+ return HMSHLSConfig(hlsMeetingUrlVariant, hlsRecordingConfig)
340
+ }
341
+
342
+ private fun getHMSHLSMeetingURLVariants(
310
343
  hmsMeetingURLVariants: ArrayList<HashMap<String, String>>?
311
344
  ): List<HMSHLSMeetingURLVariant> {
312
345
  val meetingURLVariants = mutableListOf<HMSHLSMeetingURLVariant>()
@@ -319,28 +352,25 @@ object HMSHelper {
319
352
  return meetingURLVariants
320
353
  }
321
354
 
322
- fun getHlsRecordingConfig(data: ReadableMap): HMSHlsRecordingConfig? {
323
- if (areAllRequiredKeysAvailable(data, arrayOf(Pair("hlsRecordingConfig", "Map")))) {
324
- val hmsHlsRecordingConfig = data.getMap("hlsRecordingConfig")
325
- if (hmsHlsRecordingConfig != null) {
326
- var singleFilePerLayer = false
327
- var videoOnDemand = false
328
- if (areAllRequiredKeysAvailable(
329
- hmsHlsRecordingConfig,
330
- arrayOf(Pair("singleFilePerLayer", "Boolean"))
331
- )
332
- ) {
333
- singleFilePerLayer = hmsHlsRecordingConfig.getBoolean("singleFilePerLayer")
334
- }
335
- if (areAllRequiredKeysAvailable(
336
- hmsHlsRecordingConfig,
337
- arrayOf(Pair("videoOnDemand", "Boolean"))
338
- )
339
- ) {
340
- videoOnDemand = hmsHlsRecordingConfig.getBoolean("videoOnDemand")
341
- }
342
- return HMSHlsRecordingConfig(singleFilePerLayer, videoOnDemand)
355
+ private fun getHlsRecordingConfig(hmsHlsRecordingConfig: ReadableMap?): HMSHlsRecordingConfig? {
356
+ if (hmsHlsRecordingConfig !== null) {
357
+ var singleFilePerLayer = false
358
+ var videoOnDemand = false
359
+ if (areAllRequiredKeysAvailable(
360
+ hmsHlsRecordingConfig,
361
+ arrayOf(Pair("singleFilePerLayer", "Boolean"))
362
+ )
363
+ ) {
364
+ singleFilePerLayer = hmsHlsRecordingConfig.getBoolean("singleFilePerLayer")
343
365
  }
366
+ if (areAllRequiredKeysAvailable(
367
+ hmsHlsRecordingConfig,
368
+ arrayOf(Pair("videoOnDemand", "Boolean"))
369
+ )
370
+ ) {
371
+ videoOnDemand = hmsHlsRecordingConfig.getBoolean("videoOnDemand")
372
+ }
373
+ return HMSHlsRecordingConfig(singleFilePerLayer, videoOnDemand)
344
374
  }
345
375
  return null
346
376
  }
@@ -357,6 +387,38 @@ object HMSHelper {
357
387
  return meetingURLVariant
358
388
  }
359
389
 
390
+ private fun getResolution(data: ReadableMap): HMSRtmpVideoResolution {
391
+ val height = data.getInt("height")
392
+ val width = data.getInt("width")
393
+ return HMSRtmpVideoResolution(width, height)
394
+ }
395
+
396
+ fun getRtmpConfig(data: ReadableMap): HMSRecordingConfig? {
397
+ val record = data.getBoolean("record")
398
+ var meetingURL = ""
399
+ var rtmpURLs = listOf<String>()
400
+ var resolution: HMSRtmpVideoResolution? = null
401
+ if (areAllRequiredKeysAvailable(data, arrayOf(Pair("meetingURL", "String")))) {
402
+ val meetingURLValid = data.getString("meetingURL") as String
403
+ if (URLUtil.isValidUrl(meetingURLValid)) {
404
+ meetingURL = meetingURLValid
405
+ } else {
406
+ return null
407
+ }
408
+ }
409
+
410
+ if (areAllRequiredKeysAvailable(data, arrayOf(Pair("rtmpURLs", "Array")))) {
411
+ val rtmpURLsValid = data.getArray("rtmpURLs")
412
+ rtmpURLs = this.getRtmpUrls(rtmpURLsValid)
413
+ }
414
+
415
+ if (areAllRequiredKeysAvailable(data, arrayOf(Pair("resolution", "Map")))) {
416
+ val resolutionValid = data.getMap("resolution")
417
+ resolution = resolutionValid?.let { this.getResolution(it) }
418
+ }
419
+ return HMSRecordingConfig(meetingURL, rtmpURLs, record, resolution)
420
+ }
421
+
360
422
  fun getHmsConfig(credentials: ReadableMap): HMSConfig {
361
423
  var config =
362
424
  HMSConfig(
@@ -512,4 +574,45 @@ object HMSHelper {
512
574
  reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "captureFrame", output)
513
575
  }
514
576
  }
577
+
578
+ fun getAudioDevicesList(audioDevicesList: List<HMSAudioManager.AudioDevice>?): ReadableArray {
579
+ val hmsAudioDevicesList = Arguments.createArray()
580
+ if (audioDevicesList != null) {
581
+ for (audioDevice in audioDevicesList) {
582
+ hmsAudioDevicesList.pushString(audioDevice.name)
583
+ }
584
+ }
585
+ return hmsAudioDevicesList
586
+ }
587
+
588
+ fun getAudioDevicesSet(audioDevicesSet: Set<HMSAudioManager.AudioDevice>?): ReadableArray {
589
+ val hmsAudioDevicesSet = Arguments.createArray()
590
+ if (audioDevicesSet != null) {
591
+ for (audioDevice in audioDevicesSet) {
592
+ hmsAudioDevicesSet.pushString(audioDevice.name)
593
+ }
594
+ }
595
+ return hmsAudioDevicesSet
596
+ }
597
+
598
+ fun getAudioDevice(audioDevice: String?): HMSAudioManager.AudioDevice {
599
+ when (audioDevice) {
600
+ "AUTOMATIC" -> {
601
+ return HMSAudioManager.AudioDevice.AUTOMATIC
602
+ }
603
+ "BLUETOOTH" -> {
604
+ return HMSAudioManager.AudioDevice.BLUETOOTH
605
+ }
606
+ "EARPIECE" -> {
607
+ return HMSAudioManager.AudioDevice.EARPIECE
608
+ }
609
+ "SPEAKER_PHONE" -> {
610
+ return HMSAudioManager.AudioDevice.SPEAKER_PHONE
611
+ }
612
+ "WIRED_HEADSET" -> {
613
+ return HMSAudioManager.AudioDevice.WIRED_HEADSET
614
+ }
615
+ }
616
+ return HMSAudioManager.AudioDevice.SPEAKER_PHONE
617
+ }
515
618
  }
@@ -202,10 +202,10 @@ class HMSManager(reactContext: ReactApplicationContext) :
202
202
  }
203
203
 
204
204
  @ReactMethod
205
- fun remoteMuteAllAudio(data: ReadableMap) {
205
+ fun remoteMuteAllAudio(data: ReadableMap, callback: Promise?) {
206
206
  val hms = HMSHelper.getHms(data, hmsCollection)
207
207
 
208
- hms?.remoteMuteAllAudio()
208
+ hms?.remoteMuteAllAudio(callback)
209
209
  }
210
210
 
211
211
  @ReactMethod
@@ -238,6 +238,43 @@ class HMSManager(reactContext: ReactApplicationContext) :
238
238
  hms?.stopScreenshare(callback)
239
239
  }
240
240
 
241
+ @ReactMethod
242
+ fun startAudioshare(data: ReadableMap, callback: Promise?) {
243
+ currentActivity?.application?.registerActivityLifecycleCallbacks(this)
244
+ val hms = HMSHelper.getHms(data, hmsCollection)
245
+
246
+ hms?.startAudioshare(data, callback)
247
+ }
248
+
249
+ @ReactMethod
250
+ fun isAudioShared(data: ReadableMap, callback: Promise?) {
251
+ val hms = HMSHelper.getHms(data, hmsCollection)
252
+
253
+ hms?.isAudioShared(callback)
254
+ }
255
+
256
+ @ReactMethod
257
+ fun stopAudioshare(data: ReadableMap, callback: Promise?) {
258
+ val hms = HMSHelper.getHms(data, hmsCollection)
259
+
260
+ currentActivity?.application?.unregisterActivityLifecycleCallbacks(this)
261
+ hms?.stopAudioshare(callback)
262
+ }
263
+
264
+ @ReactMethod
265
+ fun getAudioMixingMode(data: ReadableMap, callback: Promise?) {
266
+ val hms = HMSHelper.getHms(data, hmsCollection)
267
+
268
+ callback?.resolve(hms?.getAudioMixingMode()?.name)
269
+ }
270
+
271
+ @ReactMethod
272
+ fun setAudioMixingMode(data: ReadableMap, callback: Promise?) {
273
+ val hms = HMSHelper.getHms(data, hmsCollection)
274
+
275
+ hms?.setAudioMixingMode(data, callback)
276
+ }
277
+
241
278
  @ReactMethod
242
279
  fun startRTMPOrRecording(data: ReadableMap, callback: Promise?) {
243
280
  val hms = HMSHelper.getHms(data, hmsCollection)
@@ -290,6 +327,55 @@ class HMSManager(reactContext: ReactApplicationContext) :
290
327
  callback?.resolve(result)
291
328
  }
292
329
 
330
+ @ReactMethod
331
+ fun enableRTCStats(data: ReadableMap) {
332
+ val hms = HMSHelper.getHms(data, hmsCollection)
333
+
334
+ hms?.enableRTCStats()
335
+ }
336
+
337
+ @ReactMethod
338
+ fun disableRTCStats(data: ReadableMap) {
339
+ val hms = HMSHelper.getHms(data, hmsCollection)
340
+
341
+ hms?.disableRTCStats()
342
+ }
343
+
344
+ @ReactMethod
345
+ fun getAudioDevicesList(data: ReadableMap, callback: Promise?) {
346
+ val hms = HMSHelper.getHms(data, hmsCollection)
347
+
348
+ hms?.getAudioDevicesList(callback)
349
+ }
350
+
351
+ @ReactMethod
352
+ fun getAudioOutputRouteType(data: ReadableMap, callback: Promise?) {
353
+ val hms = HMSHelper.getHms(data, hmsCollection)
354
+
355
+ hms?.getAudioOutputRouteType(callback)
356
+ }
357
+
358
+ @ReactMethod
359
+ fun switchAudioOutput(data: ReadableMap) {
360
+ val hms = HMSHelper.getHms(data, hmsCollection)
361
+
362
+ hms?.switchAudioOutput(data)
363
+ }
364
+
365
+ @ReactMethod
366
+ fun setAudioMode(data: ReadableMap) {
367
+ val hms = HMSHelper.getHms(data, hmsCollection)
368
+
369
+ hms?.setAudioMode(data)
370
+ }
371
+
372
+ @ReactMethod
373
+ fun setAudioDeviceChangeListener(data: ReadableMap) {
374
+ val hms = HMSHelper.getHms(data, hmsCollection)
375
+
376
+ hms?.setAudioDeviceChangeListener()
377
+ }
378
+
293
379
  fun emitEvent(event: String, data: WritableMap) {
294
380
  reactApplicationContext
295
381
  .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)