@100mslive/react-native-hms 1.8.0 → 1.9.1-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 (214) hide show
  1. package/android/build.gradle +3 -3
  2. package/android/local.properties +8 -1
  3. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +1 -1
  4. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +15 -5
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +4 -3
  6. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +43 -5
  7. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +147 -47
  8. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +419 -248
  9. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +24 -4
  10. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +1 -1
  11. package/ios/HMSConstants.swift +1 -0
  12. package/ios/HMSDecoder.swift +16 -5
  13. package/ios/HMSHLSPlayerManager.swift +20 -11
  14. package/ios/HMSHelper.swift +33 -4
  15. package/ios/HMSManager.m +66 -10
  16. package/ios/HMSManager.swift +65 -21
  17. package/ios/HMSRNSDK.swift +244 -100
  18. package/ios/Hmssdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  19. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  20. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/jatinnagar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  21. package/ios/Hmssdk.xcodeproj/xcuserdata/jatinnagar.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  22. package/lib/commonjs/classes/HMSAudioCodec.js +1 -2
  23. package/lib/commonjs/classes/HMSAudioCodec.js.map +1 -1
  24. package/lib/commonjs/classes/HMSAudioDevice.js +1 -2
  25. package/lib/commonjs/classes/HMSAudioDevice.js.map +1 -1
  26. package/lib/commonjs/classes/HMSAudioMixingMode.js +1 -2
  27. package/lib/commonjs/classes/HMSAudioMixingMode.js.map +1 -1
  28. package/lib/commonjs/classes/HMSAudioMode.js +1 -2
  29. package/lib/commonjs/classes/HMSAudioMode.js.map +1 -1
  30. package/lib/commonjs/classes/HMSCameraFacing.js +1 -2
  31. package/lib/commonjs/classes/HMSCameraFacing.js.map +1 -1
  32. package/lib/commonjs/classes/HMSConstants.js +1 -2
  33. package/lib/commonjs/classes/HMSConstants.js.map +1 -1
  34. package/lib/commonjs/classes/HMSEventEmitter.js +1 -2
  35. package/lib/commonjs/classes/HMSEventEmitter.js.map +1 -1
  36. package/lib/commonjs/classes/HMSIOSAudioMode.js +1 -2
  37. package/lib/commonjs/classes/HMSIOSAudioMode.js.map +1 -1
  38. package/lib/commonjs/classes/HMSLayer.js +1 -2
  39. package/lib/commonjs/classes/HMSLayer.js.map +1 -1
  40. package/lib/commonjs/classes/HMSLogAlarmManager.js +1 -2
  41. package/lib/commonjs/classes/HMSLogAlarmManager.js.map +1 -1
  42. package/lib/commonjs/classes/HMSLogLevel.js +1 -2
  43. package/lib/commonjs/classes/HMSLogLevel.js.map +1 -1
  44. package/lib/commonjs/classes/HMSLogger.js +1 -2
  45. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  46. package/lib/commonjs/classes/HMSManagerModule.js +1 -2
  47. package/lib/commonjs/classes/HMSManagerModule.js.map +1 -1
  48. package/lib/commonjs/classes/HMSMessageRecipientType.js +1 -2
  49. package/lib/commonjs/classes/HMSMessageRecipientType.js.map +1 -1
  50. package/lib/commonjs/classes/HMSNativeEventListener.js +1 -2
  51. package/lib/commonjs/classes/HMSNativeEventListener.js.map +1 -1
  52. package/lib/commonjs/classes/HMSPIPConfig.js +4 -0
  53. package/lib/commonjs/classes/HMSPIPConfig.js.map +1 -0
  54. package/lib/commonjs/classes/HMSPIPListenerActions.js +2 -2
  55. package/lib/commonjs/classes/HMSPIPListenerActions.js.map +1 -1
  56. package/lib/commonjs/classes/HMSPeer.js +15 -0
  57. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  58. package/lib/commonjs/classes/HMSPeerListIterator.js +64 -0
  59. package/lib/commonjs/classes/HMSPeerListIterator.js.map +1 -0
  60. package/lib/commonjs/classes/HMSPeerListIteratorOptions.js +2 -0
  61. package/lib/commonjs/classes/HMSPeerListIteratorOptions.js.map +1 -0
  62. package/lib/commonjs/classes/HMSPeerUpdate.js +3 -4
  63. package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
  64. package/lib/commonjs/classes/HMSPeersCache.js +8 -2
  65. package/lib/commonjs/classes/HMSPeersCache.js.map +1 -1
  66. package/lib/commonjs/classes/HMSQualityLimitationReason.js +1 -2
  67. package/lib/commonjs/classes/HMSQualityLimitationReason.js.map +1 -1
  68. package/lib/commonjs/classes/HMSRoomCache.js +1 -2
  69. package/lib/commonjs/classes/HMSRoomCache.js.map +1 -1
  70. package/lib/commonjs/classes/HMSRoomUpdate.js +1 -2
  71. package/lib/commonjs/classes/HMSRoomUpdate.js.map +1 -1
  72. package/lib/commonjs/classes/HMSSDK.js +152 -8
  73. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  74. package/lib/commonjs/classes/HMSTrackSettingsInitState.js +1 -2
  75. package/lib/commonjs/classes/HMSTrackSettingsInitState.js.map +1 -1
  76. package/lib/commonjs/classes/HMSTrackSource.js +1 -2
  77. package/lib/commonjs/classes/HMSTrackSource.js.map +1 -1
  78. package/lib/commonjs/classes/HMSTrackType.js +1 -2
  79. package/lib/commonjs/classes/HMSTrackType.js.map +1 -1
  80. package/lib/commonjs/classes/HMSTrackUpdate.js +1 -2
  81. package/lib/commonjs/classes/HMSTrackUpdate.js.map +1 -1
  82. package/lib/commonjs/classes/HMSUpdateListenerActions.js +2 -2
  83. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  84. package/lib/commonjs/classes/HMSVideoCodec.js +1 -2
  85. package/lib/commonjs/classes/HMSVideoCodec.js.map +1 -1
  86. package/lib/commonjs/classes/HMSVideoViewMode.js +1 -2
  87. package/lib/commonjs/classes/HMSVideoViewMode.js.map +1 -1
  88. package/lib/commonjs/classes/HmsView.js +17 -5
  89. package/lib/commonjs/classes/HmsView.js.map +1 -1
  90. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +11 -9
  91. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  92. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +2 -4
  93. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  94. package/lib/commonjs/components/HMSHLSPlayer/hooks.js +11 -11
  95. package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -1
  96. package/lib/commonjs/components/HMSHLSPlayer/index.js +8 -1
  97. package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -1
  98. package/lib/commonjs/hooks/hmsviews.js +17 -0
  99. package/lib/commonjs/hooks/hmsviews.js.map +1 -0
  100. package/lib/commonjs/hooks/useHMSPeerUpdates.js +2 -2
  101. package/lib/commonjs/hooks/useHMSPeerUpdates.js.map +1 -1
  102. package/lib/commonjs/index.js +10 -3
  103. package/lib/commonjs/index.js.map +1 -1
  104. package/lib/commonjs/stores/hls-player-playback-slice.js +4 -0
  105. package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -1
  106. package/lib/commonjs/stores/hls-player-stats-store.js +1 -2
  107. package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -1
  108. package/lib/commonjs/stores/hms-store.js +4 -3
  109. package/lib/commonjs/stores/hms-store.js.map +1 -1
  110. package/lib/commonjs/stores/hmsviews-slice.js +19 -0
  111. package/lib/commonjs/stores/hmsviews-slice.js.map +1 -0
  112. package/lib/commonjs/stores/types.js +9 -0
  113. package/lib/commonjs/stores/types.js.map +1 -1
  114. package/lib/commonjs/types.js +4 -7
  115. package/lib/commonjs/types.js.map +1 -1
  116. package/lib/module/classes/HMSPIPConfig.js +2 -0
  117. package/lib/module/classes/HMSPIPConfig.js.map +1 -0
  118. package/lib/module/classes/HMSPIPListenerActions.js +1 -0
  119. package/lib/module/classes/HMSPIPListenerActions.js.map +1 -1
  120. package/lib/module/classes/HMSPeer.js +15 -0
  121. package/lib/module/classes/HMSPeer.js.map +1 -1
  122. package/lib/module/classes/HMSPeerListIterator.js +58 -0
  123. package/lib/module/classes/HMSPeerListIterator.js.map +1 -0
  124. package/lib/module/classes/HMSPeerListIteratorOptions.js +2 -0
  125. package/lib/module/classes/HMSPeerListIteratorOptions.js.map +1 -0
  126. package/lib/module/classes/HMSPeerUpdate.js +2 -1
  127. package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
  128. package/lib/module/classes/HMSPeersCache.js +7 -0
  129. package/lib/module/classes/HMSPeersCache.js.map +1 -1
  130. package/lib/module/classes/HMSSDK.js +153 -10
  131. package/lib/module/classes/HMSSDK.js.map +1 -1
  132. package/lib/module/classes/HMSUpdateListenerActions.js +1 -0
  133. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  134. package/lib/module/classes/HmsView.js +14 -1
  135. package/lib/module/classes/HmsView.js.map +1 -1
  136. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +9 -6
  137. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  138. package/lib/module/components/HMSHLSPlayer/hooks.js +4 -0
  139. package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -1
  140. package/lib/module/components/HMSHLSPlayer/index.js +1 -1
  141. package/lib/module/components/HMSHLSPlayer/index.js.map +1 -1
  142. package/lib/module/hooks/hmsviews.js +12 -0
  143. package/lib/module/hooks/hmsviews.js.map +1 -0
  144. package/lib/module/index.js +1 -0
  145. package/lib/module/index.js.map +1 -1
  146. package/lib/module/stores/hls-player-playback-slice.js +4 -0
  147. package/lib/module/stores/hls-player-playback-slice.js.map +1 -1
  148. package/lib/module/stores/hms-store.js +3 -1
  149. package/lib/module/stores/hms-store.js.map +1 -1
  150. package/lib/module/stores/hmsviews-slice.js +12 -0
  151. package/lib/module/stores/hmsviews-slice.js.map +1 -0
  152. package/lib/module/stores/types.js +9 -0
  153. package/lib/module/stores/types.js.map +1 -1
  154. package/lib/module/types.js +1 -1
  155. package/lib/module/types.js.map +1 -1
  156. package/lib/typescript/classes/HMSPIPConfig.d.ts +7 -0
  157. package/lib/typescript/classes/HMSPIPListenerActions.d.ts +1 -0
  158. package/lib/typescript/classes/HMSPeer.d.ts +3 -0
  159. package/lib/typescript/classes/HMSPeerListIterator.d.ts +9 -0
  160. package/lib/typescript/classes/HMSPeerListIteratorOptions.d.ts +24 -0
  161. package/lib/typescript/classes/HMSPeerUpdate.d.ts +2 -1
  162. package/lib/typescript/classes/HMSPeersCache.d.ts +1 -0
  163. package/lib/typescript/classes/HMSSDK.d.ts +47 -8
  164. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +2 -1
  165. package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +2 -0
  166. package/lib/typescript/components/HMSHLSPlayer/index.d.ts +1 -1
  167. package/lib/typescript/hooks/hmsviews.d.ts +3 -0
  168. package/lib/typescript/index.d.ts +2 -0
  169. package/lib/typescript/stores/hms-store.d.ts +4 -3
  170. package/lib/typescript/stores/hmsviews-slice.d.ts +5 -0
  171. package/lib/typescript/stores/types.d.ts +14 -2
  172. package/lib/typescript/types.d.ts +9 -5
  173. package/package.json +3 -1
  174. package/sdk-versions.json +2 -2
  175. package/src/classes/HMSPIPConfig.ts +7 -0
  176. package/src/classes/HMSPIPListenerActions.ts +1 -0
  177. package/src/classes/HMSPeer.ts +25 -0
  178. package/src/classes/HMSPeerListIterator.ts +60 -0
  179. package/src/classes/HMSPeerListIteratorOptions.ts +26 -0
  180. package/src/classes/HMSPeerUpdate.ts +2 -0
  181. package/src/classes/HMSPeersCache.ts +7 -0
  182. package/src/classes/HMSSDK.tsx +188 -13
  183. package/src/classes/HMSUpdateListenerActions.ts +1 -0
  184. package/src/classes/HmsView.tsx +16 -2
  185. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +11 -5
  186. package/src/components/HMSHLSPlayer/hooks.ts +7 -0
  187. package/src/components/HMSHLSPlayer/index.ts +1 -0
  188. package/src/hooks/hmsviews.ts +13 -0
  189. package/src/index.ts +2 -0
  190. package/src/stores/hls-player-playback-slice.ts +3 -0
  191. package/src/stores/hms-store.ts +2 -0
  192. package/src/stores/hmsviews-slice.ts +20 -0
  193. package/src/stores/types.ts +20 -1
  194. package/src/types.ts +13 -3
  195. package/android/.gradle/6.7.1/executionHistory/executionHistory.bin +0 -0
  196. package/android/.gradle/6.7.1/executionHistory/executionHistory.lock +0 -0
  197. package/android/.gradle/6.7.1/fileChanges/last-build.bin +0 -0
  198. package/android/.gradle/6.7.1/fileHashes/fileHashes.bin +0 -0
  199. package/android/.gradle/6.7.1/fileHashes/fileHashes.lock +0 -0
  200. package/android/.gradle/6.7.1/gc.properties +0 -0
  201. package/android/.gradle/6.9/executionHistory/executionHistory.bin +0 -0
  202. package/android/.gradle/6.9/executionHistory/executionHistory.lock +0 -0
  203. package/android/.gradle/6.9/fileChanges/last-build.bin +0 -0
  204. package/android/.gradle/6.9/fileHashes/fileHashes.bin +0 -0
  205. package/android/.gradle/6.9/fileHashes/fileHashes.lock +0 -0
  206. package/android/.gradle/6.9/gc.properties +0 -0
  207. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  208. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  209. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  210. package/android/.gradle/checksums/checksums.lock +0 -0
  211. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  212. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  213. package/android/.gradle/configuration-cache/gc.properties +0 -0
  214. package/android/.gradle/vcs-1/gc.properties +0 -0
@@ -86,7 +86,7 @@ dependencies {
86
86
  implementation "androidx.constraintlayout:constraintlayout:2.1.3"
87
87
  implementation "androidx.appcompat:appcompat:1.3.1"
88
88
 
89
- implementation "live.100ms:android-sdk:${sdkVersions["android"]}"
90
- implementation "live.100ms:video-view:${sdkVersions["android"]}"
91
- implementation "live.100ms:hls-player:${sdkVersions["android"]}"
89
+ implementation "live.100ms:android-sdk:${sdkVersions["android"]}"
90
+ implementation "live.100ms:video-view:${sdkVersions["android"]}"
91
+ implementation "live.100ms:hls-player:${sdkVersions["android"]}"
92
92
  }
@@ -1 +1,8 @@
1
- sdk.dir=/Users/yogesh/Library/Android/sdk
1
+ ## This file must *NOT* be checked into Version Control Systems,
2
+ # as it contains information specific to your local configuration.
3
+ #
4
+ # Location of the SDK. This is only used by Gradle.
5
+ # For customization when using a Version Control System, please read the
6
+ # header note.
7
+ #Mon Nov 14 20:51:00 IST 2022
8
+ sdk.dir=/Users/jatinnagar/Library/Android/sdk
@@ -29,7 +29,7 @@ class HMSAudioshareActivity : ComponentActivity() {
29
29
  override fun onSuccess() {
30
30
  HMSManager.hmsCollection[id]?.isAudioSharing = true
31
31
  HMSManager.hmsCollection[id]?.audioshareCallback?.resolve(
32
- HMSManager.hmsCollection[id]?.emitHMSSuccess(),
32
+ HMSManager.hmsCollection[id]?.getPromiseResolveData(),
33
33
  )
34
34
  finish()
35
35
  }
@@ -172,6 +172,9 @@ object HMSDecoder {
172
172
  HMSPeerUpdate.NAME_CHANGED -> {
173
173
  print("$peerUpdateType received")
174
174
  }
175
+ HMSPeerUpdate.HAND_RAISED_CHANGED -> {
176
+ peer.putBoolean("isHandRaised", hmsPeer.isHandRaised)
177
+ }
175
178
  else -> {
176
179
  print("Unhandled Peer Update Type received: $peerUpdateType")
177
180
  }
@@ -205,6 +208,9 @@ object HMSDecoder {
205
208
  HMSPeerUpdate.NAME_CHANGED -> {
206
209
  print("$peerUpdateType received")
207
210
  }
211
+ HMSPeerUpdate.HAND_RAISED_CHANGED -> {
212
+ peer.putBoolean("isHandRaised", hmsPeer.isHandRaised)
213
+ }
208
214
  else -> {
209
215
  print("Unhandled Peer Update Type received: $peerUpdateType")
210
216
  }
@@ -231,6 +237,8 @@ object HMSDecoder {
231
237
 
232
238
  peer.putMap("role", this.getHmsRole(hmsPeer.hmsRole))
233
239
 
240
+ peer.putBoolean("isHandRaised", hmsPeer.isHandRaised)
241
+
234
242
  hmsPeer.networkQuality?.let {
235
243
  peer.putMap("networkQuality", this.getHmsNetworkQuality(it))
236
244
  }
@@ -479,10 +487,12 @@ object HMSDecoder {
479
487
  private fun getHmsAudioTrackSettings(hmsAudioTrackSettings: HMSAudioTrackSettings?): WritableMap {
480
488
  val settings: WritableMap = Arguments.createMap()
481
489
  if (hmsAudioTrackSettings != null) {
482
- settings.putBoolean(
483
- "useHardwareAcousticEchoCanceler",
484
- hmsAudioTrackSettings.useHardwareAcousticEchoCanceler,
485
- )
490
+ hmsAudioTrackSettings.useHardwareAcousticEchoCanceler?.let {
491
+ settings.putBoolean(
492
+ "useHardwareAcousticEchoCanceler",
493
+ it,
494
+ )
495
+ }
486
496
  settings.putString("initialState", hmsAudioTrackSettings.initialState.name)
487
497
  }
488
498
  return settings
@@ -625,7 +635,7 @@ object HMSDecoder {
625
635
  fun getHMSBrowserRecordingState(data: HMSBrowserRecordingState?): ReadableMap {
626
636
  val input = Arguments.createMap()
627
637
  if (data !== null) {
628
- input.putBoolean("initialising", false)
638
+ input.putBoolean("initialising", data.initialising)
629
639
 
630
640
  input.putBoolean("running", data.running)
631
641
 
@@ -153,9 +153,9 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
153
153
  }
154
154
 
155
155
  val data = Arguments.createMap()
156
- data.putString("state", "onVideoSizeChanged")
157
- data.putDouble("aspectRatio", (width / height))
158
- sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_STATE_CHANGE_EVENT, data)
156
+ data.putDouble("width", width)
157
+ data.putDouble("height", height)
158
+ sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_RESOLUTION_CHANGE_EVENT, data)
159
159
  }
160
160
  }
161
161
  },
@@ -285,6 +285,7 @@ object HMSHLSPlayerConstants {
285
285
  const val ON_PLAYBACK_CUE_EVENT = "ON_PLAYBACK_CUE_EVENT"
286
286
  const val ON_PLAYBACK_FAILURE_EVENT = "ON_PLAYBACK_FAILURE_EVENT"
287
287
  const val ON_PLAYBACK_STATE_CHANGE_EVENT = "ON_PLAYBACK_STATE_CHANGE_EVENT"
288
+ const val ON_PLAYBACK_RESOLUTION_CHANGE_EVENT = "ON_PLAYBACK_RESOLUTION_CHANGE_EVENT"
288
289
 
289
290
  // HLS Playback Stats Events
290
291
  const val HMS_HLS_STATS_EVENT = "hmsHlsStatsEvent"
@@ -18,6 +18,8 @@ import live.hms.video.media.settings.*
18
18
  import live.hms.video.media.tracks.HMSRemoteAudioTrack
19
19
  import live.hms.video.media.tracks.HMSRemoteVideoTrack
20
20
  import live.hms.video.media.tracks.HMSTrack
21
+ import live.hms.video.sdk.HMSSDK
22
+ import live.hms.video.sdk.listeners.PeerListResultListener
21
23
  import live.hms.video.sdk.models.*
22
24
  import live.hms.video.sdk.models.enums.AudioMixingMode
23
25
  import live.hms.video.sdk.models.role.HMSRole
@@ -27,6 +29,10 @@ import live.hms.video.utils.HmsUtilities
27
29
  import org.webrtc.SurfaceViewRenderer
28
30
  import java.io.ByteArrayOutputStream
29
31
  import java.util.*
32
+ import kotlin.collections.ArrayList
33
+ import kotlin.coroutines.resume
34
+ import kotlin.coroutines.resumeWithException
35
+ import kotlin.coroutines.suspendCoroutine
30
36
 
31
37
  object HMSHelper {
32
38
  fun areAllRequiredKeysAvailable(
@@ -105,14 +111,35 @@ object HMSHelper {
105
111
  return null
106
112
  }
107
113
 
108
- fun getRemotePeerFromPeerId(
114
+ suspend fun getRemotePeerFromPeerId(
109
115
  peerId: String?,
110
- room: HMSRoom?,
116
+ hmsSDK: HMSSDK?,
111
117
  ): HMSRemotePeer? {
112
- if (peerId != null && room != null) {
113
- return HmsUtilities.getPeer(peerId, room) as? HMSRemotePeer
118
+ return suspendCoroutine {
119
+ val room = hmsSDK?.getRoom()
120
+
121
+ if (peerId != null && room != null) {
122
+ val peerFromRoom = HmsUtilities.getPeer(peerId, room) as? HMSRemotePeer
123
+ if (peerFromRoom != null) {
124
+ it.resume(peerFromRoom)
125
+ } else {
126
+ val limit = 1
127
+ val peerIds = arrayListOf(peerId)
128
+ val peerListIterator = hmsSDK.getPeerListIterator(PeerListIteratorOptions(limit = limit, byPeerIds = peerIds))
129
+ peerListIterator.next(object : PeerListResultListener {
130
+ override fun onError(error: HMSException) {
131
+ it.resumeWithException(error)
132
+ }
133
+ override fun onSuccess(result: ArrayList<HMSPeer>) {
134
+ val peerFromIterator = result[0]
135
+ it.resume(peerFromIterator as? HMSRemotePeer)
136
+ }
137
+ })
138
+ }
139
+ } else {
140
+ it.resume(null)
141
+ }
114
142
  }
115
- return null
116
143
  }
117
144
 
118
145
  fun getRolesFromRoleNames(
@@ -668,4 +695,15 @@ object HMSHelper {
668
695
  }
669
696
  return HMSAudioManager.AudioDevice.SPEAKER_PHONE
670
697
  }
698
+
699
+ fun getPeerListIteratorOptions(data: ReadableMap?): PeerListIteratorOptions? {
700
+ if (data == null) {
701
+ return null
702
+ }
703
+ val limit = data.getInt("limit")
704
+ val role = data.getString("byRoleName")
705
+ val peerIds = data.getArray("byPeerIds")?.toArrayList() as? ArrayList<String>
706
+
707
+ return PeerListIteratorOptions(null, role, peerIds, limit)
708
+ }
671
709
  }
@@ -5,6 +5,7 @@ import android.app.Application
5
5
  import android.app.PendingIntent
6
6
  import android.content.Intent
7
7
  import android.content.pm.PackageManager
8
+ import android.content.res.Configuration
8
9
  import android.os.Build
9
10
  import android.os.Bundle
10
11
  import android.util.Rational
@@ -13,6 +14,7 @@ import com.facebook.react.bridge.*
13
14
  import com.facebook.react.module.annotations.ReactModule
14
15
  import com.facebook.react.modules.core.DeviceEventManagerModule
15
16
  import com.reactnativehmssdk.HMSManager.Companion.REACT_CLASS
17
+ import live.hms.video.error.HMSException
16
18
  import java.util.UUID
17
19
 
18
20
  @ReactModule(name = REACT_CLASS)
@@ -21,6 +23,32 @@ class HMSManager(reactContext: ReactApplicationContext) :
21
23
  companion object {
22
24
  const val REACT_CLASS = "HMSManager"
23
25
  var hmsCollection = mutableMapOf<String, HMSRNSDK>()
26
+
27
+ var reactAppContext: ReactApplicationContext? = null
28
+ var pipParamConfig: PipParamConfig? = null;
29
+ var pipParamsUntyped: Any? = null;
30
+ var emitter: DeviceEventManagerModule.RCTDeviceEventEmitter? = null
31
+
32
+ fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
33
+ emitter?.let {
34
+ val data = Arguments.createMap()
35
+ data.putBoolean("isInPictureInPictureMode", isInPictureInPictureMode)
36
+
37
+ it.emit("ON_PIP_MODE_CHANGED", data)
38
+ }
39
+ }
40
+
41
+ fun onUserLeaveHint() {
42
+ val pipParams = pipParamsUntyped
43
+ if (
44
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
45
+ Build.VERSION.SDK_INT < Build.VERSION_CODES.S &&
46
+ pipParamConfig?.autoEnterPipMode == true &&
47
+ pipParams is android.app.PictureInPictureParams
48
+ ) {
49
+ reactAppContext?.currentActivity?.enterPictureInPictureMode(pipParams)
50
+ }
51
+ }
24
52
  }
25
53
 
26
54
  override fun getName(): String {
@@ -31,6 +59,21 @@ class HMSManager(reactContext: ReactApplicationContext) :
31
59
  return hmsCollection
32
60
  }
33
61
 
62
+ private fun setupPip() {
63
+ if (emitter == null) {
64
+ reactAppContext = reactApplicationContext
65
+
66
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
67
+ currentActivity?.let {
68
+ pipReceiver?.register(it)
69
+ }
70
+ }
71
+
72
+ emitter = reactApplicationContext
73
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
74
+ }
75
+ }
76
+
34
77
  // Example method
35
78
  // See https://reactnative.dev/docs/native-modules-android
36
79
  @ReactMethod
@@ -38,22 +81,26 @@ class HMSManager(reactContext: ReactApplicationContext) :
38
81
  data: ReadableMap?,
39
82
  callback: Promise?,
40
83
  ) {
41
- val hasItem = hmsCollection.containsKey("12345")
42
- if (hasItem) {
43
- val uuid = UUID.randomUUID()
44
- val randomUUIDString = uuid.toString()
45
- val sdkInstance = HMSRNSDK(data, this, randomUUIDString, reactApplicationContext)
84
+ try {
85
+ val hasItem = hmsCollection.containsKey("12345")
86
+ if (hasItem) {
87
+ val uuid = UUID.randomUUID()
88
+ val randomUUIDString = uuid.toString()
89
+ val sdkInstance = HMSRNSDK(data, this, randomUUIDString, reactApplicationContext)
46
90
 
47
- hmsCollection[randomUUIDString] = sdkInstance
91
+ hmsCollection[randomUUIDString] = sdkInstance
48
92
 
49
- callback?.resolve(randomUUIDString)
50
- } else {
51
- val randomUUIDString = "12345"
52
- val sdkInstance = HMSRNSDK(data, this, randomUUIDString, reactApplicationContext)
93
+ callback?.resolve(randomUUIDString)
94
+ } else {
95
+ val randomUUIDString = "12345"
96
+ val sdkInstance = HMSRNSDK(data, this, randomUUIDString, reactApplicationContext)
53
97
 
54
- hmsCollection[randomUUIDString] = sdkInstance
98
+ hmsCollection[randomUUIDString] = sdkInstance
55
99
 
56
- callback?.resolve(randomUUIDString)
100
+ callback?.resolve(randomUUIDString)
101
+ }
102
+ } catch (e: HMSException) {
103
+ callback?.reject(e.code.toString(), e.description)
57
104
  }
58
105
  }
59
106
 
@@ -254,10 +301,10 @@ class HMSManager(reactContext: ReactApplicationContext) :
254
301
  }
255
302
 
256
303
  @ReactMethod
257
- fun setPlaybackAllowed(data: ReadableMap) {
304
+ fun setPlaybackAllowed(data: ReadableMap, callback: Promise?) {
258
305
  val hms = HMSHelper.getHms(data, hmsCollection)
259
306
 
260
- hms?.setPlaybackAllowed(data)
307
+ hms?.setPlaybackAllowed(data, callback)
261
308
  }
262
309
 
263
310
  @ReactMethod
@@ -301,10 +348,10 @@ class HMSManager(reactContext: ReactApplicationContext) :
301
348
  }
302
349
 
303
350
  @ReactMethod
304
- fun setVolume(data: ReadableMap) {
351
+ fun setVolume(data: ReadableMap, callback: Promise?) {
305
352
  val hms = HMSHelper.getHms(data, hmsCollection)
306
353
 
307
- hms?.setVolume(data)
354
+ hms?.setVolume(data, callback)
308
355
  }
309
356
 
310
357
  @ReactMethod
@@ -318,10 +365,10 @@ class HMSManager(reactContext: ReactApplicationContext) :
318
365
  }
319
366
 
320
367
  @ReactMethod
321
- fun setPlaybackForAllAudio(data: ReadableMap) {
368
+ fun setPlaybackForAllAudio(data: ReadableMap, callback: Promise?) {
322
369
  val hms = HMSHelper.getHms(data, hmsCollection)
323
370
 
324
- hms?.setPlaybackForAllAudio(data)
371
+ hms?.setPlaybackForAllAudio(data, callback)
325
372
  }
326
373
 
327
374
  @ReactMethod
@@ -533,17 +580,17 @@ class HMSManager(reactContext: ReactApplicationContext) :
533
580
  }
534
581
 
535
582
  @ReactMethod
536
- fun switchAudioOutput(data: ReadableMap) {
583
+ fun switchAudioOutput(data: ReadableMap, callback: Promise?) {
537
584
  val hms = HMSHelper.getHms(data, hmsCollection)
538
585
 
539
- hms?.switchAudioOutput(data)
586
+ hms?.switchAudioOutput(data, callback)
540
587
  }
541
588
 
542
589
  @ReactMethod
543
- fun setAudioMode(data: ReadableMap) {
590
+ fun setAudioMode(data: ReadableMap, callback: Promise?) {
544
591
  val hms = HMSHelper.getHms(data, hmsCollection)
545
592
 
546
- hms?.setAudioMode(data)
593
+ hms?.setAudioMode(data, callback)
547
594
  }
548
595
 
549
596
  @ReactMethod
@@ -743,7 +790,8 @@ class HMSManager(reactContext: ReactApplicationContext) :
743
790
  }
744
791
  // endregion
745
792
 
746
- private data class PipParamConfig(
793
+ data class PipParamConfig(
794
+ val autoEnterPipMode: Boolean,
747
795
  val aspectRatio: Pair<Int, Int>?,
748
796
  val showEndButton: Boolean,
749
797
  val showVideoButton: Boolean,
@@ -767,6 +815,8 @@ class HMSManager(reactContext: ReactApplicationContext) :
767
815
  }
768
816
 
769
817
  try {
818
+ setupPip()
819
+
770
820
  PipActionReceiver.sdkIdForPIP = data.getString("id")
771
821
 
772
822
  when (action) {
@@ -774,8 +824,8 @@ class HMSManager(reactContext: ReactApplicationContext) :
774
824
  val result = isPipModeSupported()
775
825
  promise?.resolve(result)
776
826
  }
777
- "enablePipMode" -> {
778
- val result = enablePipMode(data)
827
+ "enterPipMode" -> {
828
+ val result = enterPipMode(data)
779
829
  promise?.resolve(result)
780
830
  }
781
831
  "setPictureInPictureParams" -> {
@@ -807,10 +857,9 @@ class HMSManager(reactContext: ReactApplicationContext) :
807
857
  )
808
858
  }
809
859
 
810
- // TODO:= We need compileSdkVersion >= 31 for autoEnterEnabled
811
- // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && config.autoEnterEnabled !== null)
812
- // it.setAutoEnterEnabled(config.autoEnterEnabled)
813
- // }
860
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
861
+ it.setAutoEnterEnabled(config.autoEnterPipMode)
862
+ }
814
863
 
815
864
  // region Setting RemoteActions on PictureInPictureParams
816
865
  val hmssdk = getHmsInstance()[PipActionReceiver.sdkIdForPIP!!]?.hmsSDK
@@ -897,14 +946,12 @@ class HMSManager(reactContext: ReactApplicationContext) :
897
946
  return null
898
947
  }
899
948
 
949
+ var autoEnterPipMode = false
900
950
  var aspectRatio: Pair<Int, Int> = Pair(16, 9)
901
951
  var showEndButton = false
902
952
  var showAudioButton = false
903
953
  var showVideoButton = false
904
954
 
905
- // TODO:= We need compileSdkVersion >= 31 for autoEnterEnabled
906
- // var autoEnterEnabled: Boolean? = null;
907
-
908
955
  if (data !== null) {
909
956
  if (data.hasKey("aspectRatio")) {
910
957
  val aspectRatioArray = data.getArray("aspectRatio")
@@ -940,17 +987,17 @@ class HMSManager(reactContext: ReactApplicationContext) :
940
987
  showVideoButton = data.getBoolean("videoButton")
941
988
  }
942
989
 
943
- // TODO:= We need compileSdkVersion >= 31 for autoEnterEnabled
944
- // if (data.hasKey("autoEnterEnabled")) {
945
- // val autoEnterEnabledType = data.getType("autoEnterEnabled")
946
- //
947
- // if (autoEnterEnabledType === ReadableType.Boolean) {
948
- // autoEnterEnabled = data.getBoolean("autoEnterEnabled")
949
- // }
950
- // }
990
+ if (data.hasKey("autoEnterPipMode")) {
991
+ val autoEnterPipModeType = data.getType("autoEnterPipMode")
992
+
993
+ if (autoEnterPipModeType === ReadableType.Boolean) {
994
+ autoEnterPipMode = data.getBoolean("autoEnterPipMode")
995
+ }
996
+ }
951
997
  }
952
998
 
953
999
  return PipParamConfig(
1000
+ autoEnterPipMode = autoEnterPipMode,
954
1001
  aspectRatio = aspectRatio,
955
1002
  showEndButton = showEndButton,
956
1003
  showAudioButton = showAudioButton,
@@ -975,6 +1022,10 @@ class HMSManager(reactContext: ReactApplicationContext) :
975
1022
  if (pipParams !is android.app.PictureInPictureParams) {
976
1023
  return false
977
1024
  }
1025
+
1026
+ HMSManager.pipParamConfig = pipParamConfig
1027
+ HMSManager.pipParamsUntyped = pipParams
1028
+
978
1029
  activity.setPictureInPictureParams(pipParams)
979
1030
  return true
980
1031
  } catch (e: Exception) {
@@ -991,7 +1042,7 @@ class HMSManager(reactContext: ReactApplicationContext) :
991
1042
  }
992
1043
 
993
1044
  @RequiresApi(Build.VERSION_CODES.O)
994
- private fun enablePipMode(data: ReadableMap): Boolean {
1045
+ private fun enterPipMode(data: ReadableMap): Boolean {
995
1046
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
996
1047
  return false
997
1048
  }
@@ -1007,12 +1058,11 @@ class HMSManager(reactContext: ReactApplicationContext) :
1007
1058
  if (pipParams !is android.app.PictureInPictureParams) {
1008
1059
  return false
1009
1060
  }
1010
- pipReceiver?.register(activity)
1011
- val entered = activity.enterPictureInPictureMode(pipParams)
1012
- if (entered === false) {
1013
- pipReceiver?.unregister(activity)
1014
- }
1015
- return entered
1061
+
1062
+ HMSManager.pipParamConfig = pipParamConfig
1063
+ HMSManager.pipParamsUntyped = pipParams
1064
+
1065
+ return activity.enterPictureInPictureMode(pipParams)
1016
1066
  } catch (e: Exception) {
1017
1067
  throw e
1018
1068
  }
@@ -1128,6 +1178,56 @@ class HMSManager(reactContext: ReactApplicationContext) :
1128
1178
  hms?.getRoomLayout(data, promise)
1129
1179
  }
1130
1180
 
1181
+ @ReactMethod
1182
+ fun raiseLocalPeerHand(
1183
+ data: ReadableMap,
1184
+ promise: Promise?,
1185
+ ) {
1186
+ val hms = HMSHelper.getHms(data, hmsCollection)
1187
+ hms?.raiseLocalPeerHand(data, promise)
1188
+ }
1189
+
1190
+ @ReactMethod
1191
+ fun lowerLocalPeerHand(
1192
+ data: ReadableMap,
1193
+ promise: Promise?,
1194
+ ) {
1195
+ val hms = HMSHelper.getHms(data, hmsCollection)
1196
+ hms?.lowerLocalPeerHand(data, promise)
1197
+ }
1198
+
1199
+ fun lowerRemotePeerHand(
1200
+ data: ReadableMap,
1201
+ promise: Promise?,
1202
+ ) {
1203
+ val hms = HMSHelper.getHms(data, hmsCollection)
1204
+ hms?.lowerRemotePeerHand(data, promise)
1205
+ }
1206
+
1207
+ @ReactMethod(isBlockingSynchronousMethod = true)
1208
+ fun getPeerListIterator(data: ReadableMap): WritableMap? {
1209
+ val hms = HMSHelper.getHms(data, hmsCollection) ?: return null
1210
+ return hms.getPeerListIterator(data)
1211
+ }
1212
+
1213
+ @ReactMethod
1214
+ fun peerListIteratorHasNext(
1215
+ data: ReadableMap,
1216
+ promise: Promise?,
1217
+ ) {
1218
+ val hms = HMSHelper.getHms(data, hmsCollection)
1219
+ hms?.peerListIteratorHasNext(data, promise)
1220
+ }
1221
+
1222
+ @ReactMethod
1223
+ fun peerListIteratorNext(
1224
+ data: ReadableMap,
1225
+ promise: Promise?,
1226
+ ) {
1227
+ val hms = HMSHelper.getHms(data, hmsCollection)
1228
+ hms?.peerListIteratorNext(data, promise)
1229
+ }
1230
+
1131
1231
  fun emitEvent(
1132
1232
  event: String,
1133
1233
  data: WritableMap,