@100mslive/react-native-hms 1.6.1 → 1.7.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 (216) hide show
  1. package/android/build.gradle +15 -7
  2. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +14 -15
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +248 -0
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +101 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +10 -5
  6. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +0 -14
  7. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +90 -106
  8. package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +1 -1
  9. package/android/src/main/res/layout/player_view.xml +9 -0
  10. package/ios/HMSDecoder.swift +4 -4
  11. package/ios/HMSHLSPlayerManager.m +22 -0
  12. package/ios/HMSHLSPlayerManager.swift +368 -0
  13. package/ios/HMSManager.m +1 -2
  14. package/ios/HMSManager.swift +22 -16
  15. package/ios/HMSRNSDK.swift +34 -85
  16. package/lib/commonjs/classes/HMSEncoder.js +12 -4
  17. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  18. package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
  19. package/lib/commonjs/classes/HMSMessage.js +2 -1
  20. package/lib/commonjs/classes/HMSMessage.js.map +1 -1
  21. package/lib/commonjs/classes/HMSPeer.js +55 -20
  22. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  23. package/lib/commonjs/classes/HMSPeerUpdate.js +1 -1
  24. package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
  25. package/lib/commonjs/classes/HMSPeersCache.js +30 -38
  26. package/lib/commonjs/classes/HMSPeersCache.js.map +1 -1
  27. package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -1
  28. package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
  29. package/lib/commonjs/classes/HMSSDK.js +36 -33
  30. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  31. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +147 -0
  32. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
  33. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +12 -0
  34. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
  35. package/lib/commonjs/components/HMSHLSPlayer/hooks.js +71 -0
  36. package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -0
  37. package/lib/commonjs/components/HMSHLSPlayer/index.js +63 -0
  38. package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -0
  39. package/lib/commonjs/index.js +38 -0
  40. package/lib/commonjs/index.js.map +1 -1
  41. package/lib/commonjs/stores/hls-player-playback-slice.js +23 -0
  42. package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -0
  43. package/lib/commonjs/stores/hls-player-stats-store.js +36 -0
  44. package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -0
  45. package/lib/commonjs/stores/hms-store.js +16 -0
  46. package/lib/commonjs/stores/hms-store.js.map +1 -0
  47. package/lib/commonjs/stores/types.js +6 -0
  48. package/lib/commonjs/stores/types.js.map +1 -0
  49. package/lib/commonjs/types.js +36 -0
  50. package/lib/commonjs/types.js.map +1 -0
  51. package/lib/module/classes/HMSEncoder.js +12 -4
  52. package/lib/module/classes/HMSEncoder.js.map +1 -1
  53. package/lib/module/classes/HMSLocalPeer.js.map +1 -1
  54. package/lib/module/classes/HMSMessage.js +2 -1
  55. package/lib/module/classes/HMSMessage.js.map +1 -1
  56. package/lib/module/classes/HMSPeer.js +55 -20
  57. package/lib/module/classes/HMSPeer.js.map +1 -1
  58. package/lib/module/classes/HMSPeerUpdate.js +1 -1
  59. package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
  60. package/lib/module/classes/HMSPeersCache.js +30 -38
  61. package/lib/module/classes/HMSPeersCache.js.map +1 -1
  62. package/lib/module/classes/HMSRTMPConfig.js.map +1 -1
  63. package/lib/module/classes/HMSRemotePeer.js.map +1 -1
  64. package/lib/module/classes/HMSSDK.js +36 -33
  65. package/lib/module/classes/HMSSDK.js.map +1 -1
  66. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +138 -0
  67. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -0
  68. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +4 -0
  69. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -0
  70. package/lib/module/components/HMSHLSPlayer/hooks.js +56 -0
  71. package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -0
  72. package/lib/module/components/HMSHLSPlayer/index.js +3 -0
  73. package/lib/module/components/HMSHLSPlayer/index.js.map +1 -0
  74. package/lib/module/index.js +7 -0
  75. package/lib/module/index.js.map +1 -1
  76. package/lib/module/stores/hls-player-playback-slice.js +16 -0
  77. package/lib/module/stores/hls-player-playback-slice.js.map +1 -0
  78. package/lib/module/stores/hls-player-stats-store.js +29 -0
  79. package/lib/module/stores/hls-player-stats-store.js.map +1 -0
  80. package/lib/module/stores/hms-store.js +9 -0
  81. package/lib/module/stores/hms-store.js.map +1 -0
  82. package/lib/module/stores/types.js +2 -0
  83. package/lib/module/stores/types.js.map +1 -0
  84. package/lib/module/types.js +32 -0
  85. package/lib/module/types.js.map +1 -0
  86. package/lib/typescript/classes/HMSEncoder.d.ts +1 -0
  87. package/lib/typescript/classes/HMSLocalPeer.d.ts +0 -1
  88. package/lib/typescript/classes/HMSMessage.d.ts +2 -0
  89. package/lib/typescript/classes/HMSPeer.d.ts +10 -5
  90. package/lib/typescript/classes/HMSPeersCache.d.ts +17 -2
  91. package/lib/typescript/classes/HMSRTMPConfig.d.ts +2 -2
  92. package/lib/typescript/classes/HMSRemotePeer.d.ts +0 -1
  93. package/lib/typescript/classes/HMSSDK.d.ts +12 -17
  94. package/lib/typescript/components/HMSHLSPlayer/HMSHLSPlayer.d.ts +21 -0
  95. package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +19 -0
  96. package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +17 -0
  97. package/lib/typescript/components/HMSHLSPlayer/index.d.ts +2 -0
  98. package/lib/typescript/index.d.ts +3 -0
  99. package/lib/typescript/stores/hls-player-playback-slice.d.ts +5 -0
  100. package/lib/typescript/stores/hls-player-stats-store.d.ts +9 -0
  101. package/lib/typescript/stores/hms-store.d.ts +9 -0
  102. package/lib/typescript/stores/types.d.ts +25 -0
  103. package/lib/typescript/types.d.ts +63 -0
  104. package/package.json +10 -5
  105. package/react-native-hms.podspec +1 -0
  106. package/sdk-versions.json +3 -2
  107. package/src/classes/HMSEncoder.ts +15 -3
  108. package/src/classes/HMSLocalPeer.ts +0 -1
  109. package/src/classes/HMSMessage.ts +3 -1
  110. package/src/classes/HMSPeer.ts +96 -48
  111. package/src/classes/HMSPeerUpdate.ts +4 -4
  112. package/src/classes/HMSPeersCache.ts +53 -40
  113. package/src/classes/HMSRTMPConfig.ts +2 -2
  114. package/src/classes/HMSRemotePeer.ts +0 -1
  115. package/src/classes/HMSSDK.tsx +59 -47
  116. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +235 -0
  117. package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +38 -0
  118. package/src/components/HMSHLSPlayer/hooks.ts +100 -0
  119. package/src/components/HMSHLSPlayer/index.ts +9 -0
  120. package/src/index.ts +8 -0
  121. package/src/stores/hls-player-playback-slice.ts +25 -0
  122. package/src/stores/hls-player-stats-store.ts +37 -0
  123. package/src/stores/hms-store.ts +11 -0
  124. package/src/stores/types.ts +49 -0
  125. package/src/types.ts +119 -0
  126. package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
  127. package/android/.gradle/6.9/fileChanges/last-build.bin +0 -0
  128. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  129. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  130. package/android/.gradle/6.9/gc.properties +0 -0
  131. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  132. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  133. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  134. package/android/.gradle/checksums/checksums.lock +0 -0
  135. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  136. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  137. package/android/.gradle/vcs-1/gc.properties +0 -0
  138. package/android/.idea/compiler.xml +0 -6
  139. package/android/.idea/gradle.xml +0 -18
  140. package/android/.idea/jarRepositories.xml +0 -50
  141. package/android/.idea/libraries/Gradle__androidx_activity_activity_1_2_4_aar.xml +0 -16
  142. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_1_3_0.xml +0 -11
  143. package/android/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_1_0_aar.xml +0 -13
  144. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_4_1_aar.xml +0 -16
  145. package/android/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_4_1_aar.xml +0 -13
  146. package/android/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml +0 -11
  147. package/android/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml +0 -13
  148. package/android/.idea/libraries/Gradle__androidx_autofill_autofill_1_1_0_aar.xml +0 -16
  149. package/android/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml +0 -11
  150. package/android/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_1_3_aar.xml +0 -13
  151. package/android/.idea/libraries/Gradle__androidx_core_core_1_7_0_aar.xml +0 -16
  152. package/android/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml +0 -13
  153. package/android/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml +0 -13
  154. package/android/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml +0 -16
  155. package/android/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_6_aar.xml +0 -16
  156. package/android/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml +0 -13
  157. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_4_0.xml +0 -11
  158. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml +0 -13
  159. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml +0 -13
  160. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_4_0_aar.xml +0 -13
  161. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml +0 -13
  162. package/android/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml +0 -13
  163. package/android/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml +0 -13
  164. package/android/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml +0 -13
  165. package/android/.idea/libraries/Gradle__androidx_swiperefreshlayout_swiperefreshlayout_1_0_0_aar.xml +0 -16
  166. package/android/.idea/libraries/Gradle__androidx_tracing_tracing_1_1_0_aar.xml +0 -13
  167. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml +0 -13
  168. package/android/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml +0 -13
  169. package/android/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml +0 -13
  170. package/android/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml +0 -13
  171. package/android/.idea/libraries/Gradle__com_facebook_fbjni_fbjni_0_3_0_aar.xml +0 -14
  172. package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_2_5_0_aar.xml +0 -15
  173. package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_2_5_0_aar.xml +0 -18
  174. package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_2_5_0_aar.xml +0 -18
  175. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_2_5_0_aar.xml +0 -18
  176. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_2_5_0_aar.xml +0 -18
  177. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_native_2_5_0_aar.xml +0 -15
  178. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_2_5_0_aar.xml +0 -15
  179. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_ashmem_2_5_0_aar.xml +0 -15
  180. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_java_2_5_0_aar.xml +0 -15
  181. package/android/.idea/libraries/Gradle__com_facebook_fresco_memory_type_native_2_5_0_aar.xml +0 -15
  182. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagefilters_2_5_0_aar.xml +0 -15
  183. package/android/.idea/libraries/Gradle__com_facebook_fresco_nativeimagetranscoder_2_5_0_aar.xml +0 -15
  184. package/android/.idea/libraries/Gradle__com_facebook_fresco_ui_common_2_5_0_aar.xml +0 -15
  185. package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_18_0.xml +0 -13
  186. package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_71_0_rc_0_debug_aar.xml +0 -14
  187. package/android/.idea/libraries/Gradle__com_facebook_soloader_annotation_0_10_4.xml +0 -13
  188. package/android/.idea/libraries/Gradle__com_facebook_soloader_nativeloader_0_10_4.xml +0 -13
  189. package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_10_4_aar.xml +0 -14
  190. package/android/.idea/libraries/Gradle__com_facebook_yoga_proguard_annotations_1_19_0.xml +0 -13
  191. package/android/.idea/libraries/Gradle__com_github_100mslive_android_sdk_lib_2_5_1_aar.xml +0 -10
  192. package/android/.idea/libraries/Gradle__com_github_100mslive_webrtc_m104_hms_1_3_aar.xml +0 -10
  193. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2.xml +0 -13
  194. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_9_2.xml +0 -13
  195. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_4_9_2.xml +0 -13
  196. package/android/.idea/libraries/Gradle__com_squareup_okio_okio_2_9_0.xml +0 -13
  197. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml +0 -13
  198. package/android/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml +0 -13
  199. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_annotations_jvm_1_3_72.xml +0 -13
  200. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_6_10.xml +0 -13
  201. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_6_10.xml +0 -13
  202. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_6_10.xml +0 -13
  203. package/android/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_6_10.xml +0 -13
  204. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_6_0.xml +0 -13
  205. package/android/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_6_0.xml +0 -13
  206. package/android/.idea/misc.xml +0 -9
  207. package/android/.idea/modules/android.androidTest.iml +0 -203
  208. package/android/.idea/modules/android.iml +0 -40
  209. package/android/.idea/modules/android.main.iml +0 -199
  210. package/android/.idea/modules/android.unitTest.iml +0 -197
  211. package/android/.idea/modules.xml +0 -11
  212. package/android/.idea/sonarlint/issuestore/3/c/3c46088b6add3088181589d8ed726652742b6221 +0 -5
  213. package/android/.idea/sonarlint/issuestore/a/8/a8c9f5ddd88723818e51ae3cf8693d02355a8691 +0 -0
  214. package/android/.idea/sonarlint/issuestore/f/0/f07866736216be0ee2aba49e392191aeae700a35 +0 -0
  215. package/android/.idea/sonarlint/issuestore/index.pb +0 -7
  216. package/android/.idea/vcs.xml +0 -6
@@ -3,7 +3,9 @@ import groovy.json.JsonSlurper
3
3
  def sdkVersions = new JsonSlurper().parse file("../sdk-versions.json")
4
4
 
5
5
  buildscript {
6
- ext.kotlin_version = '1.5.30-RC'
6
+ ext.kotlin_version = "1.6.0"
7
+ ext.hms_coroutines_version = "1.6.0"
8
+ ext.ktx_version = "1.6.0"
7
9
  if (project == rootProject) {
8
10
  repositories {
9
11
  google()
@@ -31,10 +33,10 @@ def safeExtGet(prop, fallback) {
31
33
  }
32
34
 
33
35
  android {
34
- compileSdkVersion safeExtGet('Hmssdk_compileSdkVersion', 30)
36
+ compileSdkVersion safeExtGet('Hmssdk_compileSdkVersion', 31)
35
37
  defaultConfig {
36
38
  minSdkVersion safeExtGet('Hmssdk_minSdkVersion', 21)
37
- targetSdkVersion safeExtGet('Hmssdk_targetSdkVersion', 30)
39
+ targetSdkVersion safeExtGet('Hmssdk_targetSdkVersion', 31)
38
40
  versionCode 1
39
41
  versionName "1.0"
40
42
  }
@@ -68,10 +70,16 @@ repositories {
68
70
  dependencies {
69
71
  //noinspection GradleDynamicVersion
70
72
  implementation "com.facebook.react:react-native:+"
71
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // From node_modules
73
+ implementation "com.google.code.gson:gson:2.9.0"
74
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
75
+ implementation "androidx.core:core-ktx:$ktx_version"
76
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$hms_coroutines_version"
77
+ implementation "androidx.constraintlayout:constraintlayout:2.1.3"
78
+ implementation "androidx.appcompat:appcompat:1.3.1"
79
+
80
+ // 100ms
72
81
  implementation "live.100ms:android-sdk:${sdkVersions["android"]}"
73
82
  implementation "live.100ms:video-view:${sdkVersions["android"]}"
74
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
75
- implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
76
- implementation 'androidx.appcompat:appcompat:1.3.1'
83
+ implementation "live.100ms:hls-player:${sdkVersions["android"]}"
84
+ implementation "live.100ms:hls-player-stats:${sdkVersions["android"]}"
77
85
  }
@@ -130,23 +130,22 @@ object HMSDecoder {
130
130
  if (hmsPeer != null) {
131
131
  peer.putString(peerUpdateType.ordinal.toString(), hmsPeer.peerID)
132
132
 
133
- if (peerUpdateType !== null) {
134
- when (peerUpdateType) {
135
- HMSPeerUpdate.NAME_CHANGED -> {
136
- peer.putString("name", hmsPeer.name)
137
- }
138
- HMSPeerUpdate.METADATA_CHANGED -> {
139
- peer.putString("metadata", hmsPeer.metadata)
140
- }
141
- HMSPeerUpdate.ROLE_CHANGED -> {
142
- peer.putMap("role", this.getHmsRole(hmsPeer.hmsRole))
143
- }
144
- HMSPeerUpdate.NETWORK_QUALITY_UPDATED -> {
145
- hmsPeer.networkQuality?.let {
146
- peer.putMap("networkQuality", this.getHmsNetworkQuality(it))
147
- }
133
+ when (peerUpdateType) {
134
+ HMSPeerUpdate.NAME_CHANGED -> {
135
+ peer.putString("name", hmsPeer.name)
136
+ }
137
+ HMSPeerUpdate.METADATA_CHANGED -> {
138
+ peer.putString("metadata", hmsPeer.metadata)
139
+ }
140
+ HMSPeerUpdate.ROLE_CHANGED -> {
141
+ peer.putMap("role", this.getHmsRole(hmsPeer.hmsRole))
142
+ }
143
+ HMSPeerUpdate.NETWORK_QUALITY_UPDATED -> {
144
+ hmsPeer.networkQuality?.let {
145
+ peer.putMap("networkQuality", this.getHmsNetworkQuality(it))
148
146
  }
149
147
  }
148
+ else -> {}
150
149
  }
151
150
  }
152
151
  return peer
@@ -0,0 +1,248 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import android.view.LayoutInflater
6
+ import android.widget.FrameLayout
7
+ import androidx.media3.ui.PlayerView
8
+ import com.facebook.react.bridge.Arguments
9
+ import com.facebook.react.bridge.ReactContext
10
+ import com.facebook.react.bridge.WritableMap
11
+ import com.facebook.react.uimanager.events.RCTEventEmitter
12
+ import live.hms.hls_player.*
13
+ import live.hms.stats.PlayerStatsListener
14
+ import live.hms.stats.model.PlayerStatsModel
15
+ import live.hms.video.error.HMSException
16
+ import live.hms.video.sdk.HMSSDK
17
+ import java.util.concurrent.TimeUnit
18
+
19
+ @SuppressLint("ViewConstructor")
20
+ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
21
+ private var playerView: PlayerView? = null // Exoplayer View
22
+ private var hmsHlsPlayer: HmsHlsPlayer? = null // 100ms HLS Player
23
+ private var hmssdkInstance: HMSSDK? = null
24
+ private var statsMonitorAttached = false
25
+ private val hmsHlsPlaybackEventsObject = object : HmsHlsPlaybackEvents {
26
+ override fun onCue(cue: HmsHlsCue) {
27
+ super.onCue(cue)
28
+
29
+ val data = Arguments.createMap()
30
+ cue.endDate?.let { data.putString("endDate", it.time.toString()) }
31
+ cue.id?.let { data.putString("id", it) }
32
+ cue.payloadval?.let { data.putString("payloadval", it) }
33
+ data.putString("startDate", cue.startDate.time.toString())
34
+
35
+ sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_CUE_EVENT, data)
36
+ }
37
+
38
+ override fun onPlaybackFailure(error: HmsHlsException) {
39
+ super.onPlaybackFailure(error)
40
+
41
+ val data = Arguments.createMap()
42
+
43
+ // error
44
+ val errorData = Arguments.createMap()
45
+ errorData.putInt("errorCode", error.error.errorCode)
46
+ errorData.putString("errorCodeName", error.error.errorCodeName)
47
+ error.error.message?.let {
48
+ errorData.putString("message", it)
49
+ }
50
+
51
+ data.putMap("error", errorData)
52
+
53
+ sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_FAILURE_EVENT, data)
54
+ }
55
+
56
+ override fun onPlaybackStateChanged(state: HmsHlsPlaybackState) {
57
+ super.onPlaybackStateChanged(state)
58
+
59
+ val data = Arguments.createMap()
60
+ data.putString("state", state.name)
61
+ sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_STATE_CHANGE_EVENT, data)
62
+ }
63
+ }
64
+ private val hmsHlsPlayerStatsListenerObject = object : PlayerStatsListener {
65
+ override fun onError(error: HMSException) {
66
+ val data = Arguments.createMap()
67
+
68
+ data.putString("action", error.action)
69
+ data.putInt("code", error.code)
70
+ data.putString("description", error.description)
71
+ data.putBoolean("isTerminal", error.isTerminal)
72
+ data.putString("message", error.message)
73
+ data.putString("name", error.name)
74
+
75
+ sendHLSStatsEventToJS(HMSHLSPlayerConstants.ON_STATS_EVENT_ERROR, data)
76
+ }
77
+
78
+ override fun onEventUpdate(playerStatsModel: PlayerStatsModel) {
79
+ val data = Arguments.createMap()
80
+
81
+ // bandwidth
82
+ data.putInt("bandWidthEstimate", playerStatsModel.bandwidth.bandWidthEstimate.toInt())
83
+ data.putInt("totalBytesLoaded", playerStatsModel.bandwidth.totalBytesLoaded.toInt())
84
+
85
+ // bufferedDuration
86
+ data.putInt("bufferedDuration", playerStatsModel.bufferedDuration.toInt())
87
+
88
+ // distanceFromLive
89
+ data.putInt("distanceFromLive", playerStatsModel.distanceFromLive.toInt())
90
+
91
+ // frameInfo
92
+ data.putInt("droppedFrameCount", playerStatsModel.frameInfo.droppedFrameCount)
93
+
94
+ // videoInfo
95
+ data.putInt("averageBitrate", playerStatsModel.videoInfo.averageBitrate)
96
+ data.putInt("videoHeight", playerStatsModel.videoInfo.videoHeight)
97
+ data.putInt("videoWidth", playerStatsModel.videoInfo.videoWidth)
98
+
99
+ sendHLSStatsEventToJS(HMSHLSPlayerConstants.ON_STATS_EVENT_UPDATE, data)
100
+ }
101
+ }
102
+
103
+ init {
104
+ val inflater = getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
105
+
106
+ // Inflating player_view xml
107
+ val view = inflater.inflate(R.layout.player_view, this)
108
+
109
+ // getting Exoplayer View from above xml
110
+ val localPlayerView = view.findViewById<PlayerView>(R.id.hls_view)
111
+ playerView = localPlayerView
112
+
113
+ val hmssdkCollection = context.getNativeModule(HMSManager::class.java)?.getHmsInstance()
114
+ hmssdkInstance = hmssdkCollection?.get("12345")?.hmsSDK
115
+
116
+ // creating 100ms HLS Player
117
+ val localHmsHlsPlayer = HmsHlsPlayer(context, hmssdkInstance)
118
+ hmsHlsPlayer = localHmsHlsPlayer
119
+
120
+ // Attaching HLS Player Playback State Events listener
121
+ localHmsHlsPlayer.addPlayerEventListener(hmsHlsPlaybackEventsObject)
122
+
123
+ // setting 100ms HLS Player on Exoplayer
124
+ localPlayerView.player = localHmsHlsPlayer.getNativePlayer()
125
+ }
126
+
127
+ fun cleanup() {
128
+ hmsHlsPlayer?.stop()
129
+ hmsHlsPlayer?.addPlayerEventListener(null)
130
+ hmsHlsPlayer?.setStatsMonitor(null)
131
+ }
132
+
133
+ fun play(url: String?) {
134
+ if (url !== null && url.isNotEmpty()) {
135
+ hmsHlsPlayer?.play(url)
136
+ return
137
+ }
138
+
139
+ val hlsStreamingState = this.hmssdkInstance?.getRoom()?.hlsStreamingState
140
+
141
+ val defaultURL: String? = hlsStreamingState?.let {
142
+ if (it.running) {
143
+ it.variants?.get(0)?.hlsStreamUrl
144
+ } else {
145
+ null
146
+ }
147
+ }
148
+
149
+ if (defaultURL !== null) {
150
+ hmsHlsPlayer?.play(defaultURL)
151
+ }
152
+ }
153
+
154
+ fun stop() {
155
+ hmsHlsPlayer?.stop()
156
+ }
157
+
158
+ fun pause() {
159
+ hmsHlsPlayer?.pause()
160
+ }
161
+
162
+ fun resume() {
163
+ hmsHlsPlayer?.resume()
164
+ }
165
+
166
+ fun seekForward(seconds: Double) {
167
+ hmsHlsPlayer?.seekForward(seconds.toLong(), TimeUnit.SECONDS)
168
+ }
169
+
170
+ fun seekBackward(seconds: Double) {
171
+ hmsHlsPlayer?.seekBackward(seconds.toLong(), TimeUnit.SECONDS)
172
+ }
173
+
174
+ fun seekToLivePosition() {
175
+ hmsHlsPlayer?.seekToLivePosition()
176
+ }
177
+
178
+ fun setVolume(level: Int) {
179
+ hmsHlsPlayer?.volume = level
180
+ }
181
+
182
+ fun enableStats(enable: Boolean) {
183
+ if (enable) {
184
+ attachStatsMonitor()
185
+ } else {
186
+ removeStatsMonitor()
187
+ }
188
+ }
189
+
190
+ fun enableControls(show: Boolean) {
191
+ playerView?.let {
192
+ if (show) {
193
+ it.useController = true
194
+ it.showController()
195
+ } else {
196
+ it.hideController()
197
+ it.useController = false
198
+ }
199
+ }
200
+ }
201
+
202
+ private fun attachStatsMonitor() {
203
+ if (statsMonitorAttached) return
204
+
205
+ hmsHlsPlayer?.let {
206
+ it.setStatsMonitor(hmsHlsPlayerStatsListenerObject)
207
+ statsMonitorAttached = true
208
+ }
209
+ }
210
+
211
+ private fun removeStatsMonitor() {
212
+ if (!statsMonitorAttached) return
213
+
214
+ hmsHlsPlayer?.setStatsMonitor(null)
215
+ statsMonitorAttached = false
216
+ }
217
+
218
+ private fun sendHLSPlaybackEventToJS(eventName: String, data: WritableMap) {
219
+ val event: WritableMap = Arguments.createMap()
220
+ event.putString("event", eventName)
221
+ event.putMap("data", data)
222
+
223
+ val reactContext = context as ReactContext
224
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, HMSHLSPlayerConstants.HMS_HLS_PLAYBACK_EVENT, event)
225
+ }
226
+
227
+ private fun sendHLSStatsEventToJS(eventName: String, data: WritableMap) {
228
+ val event: WritableMap = Arguments.createMap()
229
+ event.putString("event", eventName)
230
+ event.putMap("data", data)
231
+
232
+ val reactContext = context as ReactContext
233
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, HMSHLSPlayerConstants.HMS_HLS_STATS_EVENT, event)
234
+ }
235
+ }
236
+
237
+ object HMSHLSPlayerConstants {
238
+ // HLS Playback Events
239
+ const val HMS_HLS_PLAYBACK_EVENT = "hmsHlsPlaybackEvent"
240
+ const val ON_PLAYBACK_CUE_EVENT = "ON_PLAYBACK_CUE_EVENT"
241
+ const val ON_PLAYBACK_FAILURE_EVENT = "ON_PLAYBACK_FAILURE_EVENT"
242
+ const val ON_PLAYBACK_STATE_CHANGE_EVENT = "ON_PLAYBACK_STATE_CHANGE_EVENT"
243
+
244
+ // HLS Playback Stats Events
245
+ const val HMS_HLS_STATS_EVENT = "hmsHlsStatsEvent"
246
+ const val ON_STATS_EVENT_UPDATE = "ON_STATS_EVENT_UPDATE"
247
+ const val ON_STATS_EVENT_ERROR = "ON_STATS_EVENT_ERROR"
248
+ }
@@ -0,0 +1,101 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import com.facebook.react.bridge.ReadableArray
4
+ import com.facebook.react.common.MapBuilder
5
+ import com.facebook.react.uimanager.SimpleViewManager
6
+ import com.facebook.react.uimanager.ThemedReactContext
7
+ import com.facebook.react.uimanager.annotations.ReactProp
8
+
9
+ class HMSHLSPlayerManager : SimpleViewManager<HMSHLSPlayer>() {
10
+ private var reactContext: ThemedReactContext? = null
11
+
12
+ override fun getName(): String {
13
+ return REACT_CLASS
14
+ }
15
+
16
+ override fun createViewInstance(reactContext: ThemedReactContext): HMSHLSPlayer {
17
+ this.reactContext = reactContext
18
+ return HMSHLSPlayer(reactContext)
19
+ }
20
+
21
+ override fun onDropViewInstance(view: HMSHLSPlayer) {
22
+ super.onDropViewInstance(view)
23
+ view.cleanup()
24
+ }
25
+
26
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any>? {
27
+ super.getExportedCustomDirectEventTypeConstants()
28
+
29
+ return MapBuilder.of(
30
+ HMSHLSPlayerConstants.HMS_HLS_PLAYBACK_EVENT,
31
+ MapBuilder.of("registrationName", "onHmsHlsPlaybackEvent"),
32
+ HMSHLSPlayerConstants.HMS_HLS_STATS_EVENT,
33
+ MapBuilder.of("registrationName", "onHmsHlsStatsEvent"),
34
+ )
35
+ }
36
+
37
+ override fun receiveCommand(root: HMSHLSPlayer, commandId: Int, args: ReadableArray?) {
38
+ super.receiveCommand(root, commandId, args)
39
+
40
+ when (commandId) {
41
+ 10 -> root.play(args?.getString(0))
42
+ 20 -> root.stop()
43
+ 30 -> root.pause()
44
+ 40 -> root.resume()
45
+ 50 -> root.seekToLivePosition()
46
+ 60 -> {
47
+ args.let {
48
+ if (it != null) {
49
+ root.seekForward(it.getDouble(0))
50
+ }
51
+ }
52
+ }
53
+ 70 -> {
54
+ args.let {
55
+ if (it != null) {
56
+ root.seekBackward(it.getDouble(0))
57
+ }
58
+ }
59
+ }
60
+ 80 -> {
61
+ args.let {
62
+ if (it != null) {
63
+ root.setVolume(it.getInt(0))
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+
70
+ override fun getCommandsMap(): MutableMap<String, Int>? {
71
+ return MapBuilder.builder<String, Int>()
72
+ .put("play", 10)
73
+ .put("stop", 20)
74
+ .put("pause", 30)
75
+ .put("resume", 40)
76
+ .put("seekToLivePosition", 50)
77
+ .put("seekForward", 60)
78
+ .put("seekBackward", 70)
79
+ .put("setVolume", 80)
80
+ .build()
81
+ }
82
+
83
+ @ReactProp(name = "url")
84
+ fun setStreamURL(view: HMSHLSPlayer, data: String?) {
85
+ view.play(data)
86
+ }
87
+
88
+ @ReactProp(name = "enableStats", defaultBoolean = false)
89
+ fun setEnableStats(view: HMSHLSPlayer, data: Boolean) {
90
+ view.enableStats(data)
91
+ }
92
+
93
+ @ReactProp(name = "enableControls", defaultBoolean = false)
94
+ fun setEnableControls(view: HMSHLSPlayer, data: Boolean) {
95
+ view.enableControls(data)
96
+ }
97
+
98
+ companion object {
99
+ const val REACT_CLASS = "HMSHLSPlayer"
100
+ }
101
+ }
@@ -255,6 +255,8 @@ object HMSHelper {
255
255
  ) {
256
256
  val useHardwareEchoCancellation = data.getBoolean("useHardwareEchoCancellation")
257
257
  builder.setUseHardwareAcousticEchoCanceler(useHardwareEchoCancellation)
258
+ } else {
259
+ builder.setUseHardwareAcousticEchoCanceler(false)
258
260
  }
259
261
 
260
262
  if (areAllRequiredKeysAvailable(data, arrayOf(Pair("initialState", "String")))) {
@@ -425,15 +427,18 @@ object HMSHelper {
425
427
 
426
428
  fun getRtmpConfig(data: ReadableMap): HMSRecordingConfig? {
427
429
  val record = data.getBoolean("record")
428
- var meetingURL = ""
430
+ var meetingURL: String? = null
429
431
  var rtmpURLs = listOf<String>()
430
432
  var resolution: HMSRtmpVideoResolution? = null
431
433
  if (areAllRequiredKeysAvailable(data, arrayOf(Pair("meetingURL", "String")))) {
432
434
  val meetingURLValid = data.getString("meetingURL") as String
433
- if (URLUtil.isValidUrl(meetingURLValid)) {
434
- meetingURL = meetingURLValid
435
- } else {
436
- return null
435
+
436
+ if (meetingURLValid.isNotEmpty()) {
437
+ if (URLUtil.isValidUrl(meetingURLValid)) {
438
+ meetingURL = meetingURLValid
439
+ } else {
440
+ return null
441
+ }
437
442
  }
438
443
  }
439
444
 
@@ -419,20 +419,6 @@ class HMSManager(reactContext: ReactApplicationContext) :
419
419
  hms?.setAudioDeviceChangeListener()
420
420
  }
421
421
 
422
- @ReactMethod
423
- fun setSessionMetaData(data: ReadableMap, callback: Promise?) {
424
- val hms = HMSHelper.getHms(data, hmsCollection)
425
-
426
- hms?.setSessionMetaData(data, callback)
427
- }
428
-
429
- @ReactMethod
430
- fun getSessionMetaData(data: ReadableMap, callback: Promise?) {
431
- val hms = HMSHelper.getHms(data, hmsCollection)
432
-
433
- hms?.getSessionMetaData(callback)
434
- }
435
-
436
422
  @ReactMethod(isBlockingSynchronousMethod = true)
437
423
  fun getPeerProperty(data: ReadableMap): WritableMap? {
438
424
  val hms = HMSHelper.getHms(data, hmsCollection) ?: return null