@100mslive/react-native-hms 0.9.1 → 0.9.4

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 (124) hide show
  1. package/README.md +239 -26
  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/build.gradle +1 -1
  10. package/android/src/main/java/com/reactnativehmssdk/HmsDecoder.kt +22 -0
  11. package/android/src/main/java/com/reactnativehmssdk/HmsHelper.kt +197 -6
  12. package/android/src/main/java/com/reactnativehmssdk/HmsModule.kt +2 -2
  13. package/android/src/main/java/com/reactnativehmssdk/HmsSDK.kt +36 -77
  14. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +16 -0
  15. package/android/src/main/java/com/reactnativehmssdk/HmsView.kt +24 -33
  16. package/android/src/main/java/com/reactnativehmssdk/HmssdkViewManager.kt +15 -2
  17. package/ios/HmsDecoder.swift +47 -4
  18. package/ios/HmsHelper.swift +14 -0
  19. package/ios/HmsSDK.swift +13 -7
  20. package/lib/commonjs/classes/HMSConfig.js +3 -0
  21. package/lib/commonjs/classes/HMSConfig.js.map +1 -1
  22. package/lib/commonjs/classes/HMSEncoder.js +33 -2
  23. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  24. package/lib/commonjs/classes/HMSHLSConfig.js +3 -0
  25. package/lib/commonjs/classes/HMSHLSConfig.js.map +1 -1
  26. package/lib/commonjs/classes/HMSHLSRecordingConfig.js +23 -0
  27. package/lib/commonjs/classes/HMSHLSRecordingConfig.js.map +1 -0
  28. package/lib/commonjs/classes/HMSHLSRecordingState.js +29 -0
  29. package/lib/commonjs/classes/HMSHLSRecordingState.js.map +1 -0
  30. package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
  31. package/lib/commonjs/classes/HMSLogger.js +21 -21
  32. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  33. package/lib/commonjs/classes/HMSMessage.js +4 -1
  34. package/lib/commonjs/classes/HMSMessage.js.map +1 -1
  35. package/lib/commonjs/classes/HMSMessageRecipient.js +26 -0
  36. package/lib/commonjs/classes/HMSMessageRecipient.js.map +1 -0
  37. package/lib/commonjs/classes/HMSMessageRecipientType.js +15 -0
  38. package/lib/commonjs/classes/HMSMessageRecipientType.js.map +1 -0
  39. package/lib/commonjs/classes/HMSNetworkQuality.js +20 -0
  40. package/lib/commonjs/classes/HMSNetworkQuality.js.map +1 -0
  41. package/lib/commonjs/classes/HMSPeer.js +3 -0
  42. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  43. package/lib/commonjs/classes/HMSPeerUpdate.js +1 -8
  44. package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
  45. package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
  46. package/lib/commonjs/classes/HMSRoom.js +3 -0
  47. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  48. package/lib/commonjs/classes/HMSSDK.js +22 -7
  49. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  50. package/lib/commonjs/classes/HmsView.js +10 -6
  51. package/lib/commonjs/classes/HmsView.js.map +1 -1
  52. package/lib/commonjs/index.js +70 -0
  53. package/lib/commonjs/index.js.map +1 -1
  54. package/lib/module/classes/HMSConfig.js +3 -0
  55. package/lib/module/classes/HMSConfig.js.map +1 -1
  56. package/lib/module/classes/HMSEncoder.js +31 -2
  57. package/lib/module/classes/HMSEncoder.js.map +1 -1
  58. package/lib/module/classes/HMSHLSConfig.js +3 -0
  59. package/lib/module/classes/HMSHLSConfig.js.map +1 -1
  60. package/lib/module/classes/HMSHLSRecordingConfig.js +14 -0
  61. package/lib/module/classes/HMSHLSRecordingConfig.js.map +1 -0
  62. package/lib/module/classes/HMSHLSRecordingState.js +20 -0
  63. package/lib/module/classes/HMSHLSRecordingState.js.map +1 -0
  64. package/lib/module/classes/HMSLocalPeer.js.map +1 -1
  65. package/lib/module/classes/HMSLogger.js +21 -21
  66. package/lib/module/classes/HMSLogger.js.map +1 -1
  67. package/lib/module/classes/HMSMessage.js +4 -1
  68. package/lib/module/classes/HMSMessage.js.map +1 -1
  69. package/lib/module/classes/HMSMessageRecipient.js +17 -0
  70. package/lib/module/classes/HMSMessageRecipient.js.map +1 -0
  71. package/lib/module/classes/HMSMessageRecipientType.js +8 -0
  72. package/lib/module/classes/HMSMessageRecipientType.js.map +1 -0
  73. package/lib/module/classes/HMSNetworkQuality.js +11 -0
  74. package/lib/module/classes/HMSNetworkQuality.js.map +1 -0
  75. package/lib/module/classes/HMSPeer.js +3 -0
  76. package/lib/module/classes/HMSPeer.js.map +1 -1
  77. package/lib/module/classes/HMSPeerUpdate.js +1 -8
  78. package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
  79. package/lib/module/classes/HMSRemotePeer.js.map +1 -1
  80. package/lib/module/classes/HMSRoom.js +3 -0
  81. package/lib/module/classes/HMSRoom.js.map +1 -1
  82. package/lib/module/classes/HMSSDK.js +22 -6
  83. package/lib/module/classes/HMSSDK.js.map +1 -1
  84. package/lib/module/classes/HmsView.js +10 -6
  85. package/lib/module/classes/HmsView.js.map +1 -1
  86. package/lib/module/index.js +5 -0
  87. package/lib/module/index.js.map +1 -1
  88. package/lib/typescript/classes/HMSConfig.d.ts +2 -0
  89. package/lib/typescript/classes/HMSEncoder.d.ts +4 -0
  90. package/lib/typescript/classes/HMSHLSConfig.d.ts +5 -2
  91. package/lib/typescript/classes/HMSHLSRecordingConfig.d.ts +8 -0
  92. package/lib/typescript/classes/HMSHLSRecordingState.d.ts +12 -0
  93. package/lib/typescript/classes/HMSLocalPeer.d.ts +2 -0
  94. package/lib/typescript/classes/HMSMessage.d.ts +8 -4
  95. package/lib/typescript/classes/HMSMessageRecipient.d.ts +13 -0
  96. package/lib/typescript/classes/HMSMessageRecipientType.d.ts +5 -0
  97. package/lib/typescript/classes/HMSNetworkQuality.d.ts +6 -0
  98. package/lib/typescript/classes/HMSPeer.d.ts +3 -0
  99. package/lib/typescript/classes/HMSPeerUpdate.d.ts +1 -8
  100. package/lib/typescript/classes/HMSRemotePeer.d.ts +2 -0
  101. package/lib/typescript/classes/HMSRoom.d.ts +3 -0
  102. package/lib/typescript/classes/HMSSDK.d.ts +299 -10
  103. package/lib/typescript/classes/HmsView.d.ts +4 -2
  104. package/lib/typescript/index.d.ts +5 -0
  105. package/package.json +1 -1
  106. package/react-native-hms.podspec +1 -1
  107. package/src/classes/HMSConfig.ts +3 -0
  108. package/src/classes/HMSEncoder.ts +62 -17
  109. package/src/classes/HMSHLSConfig.ts +8 -2
  110. package/src/classes/HMSHLSRecordingConfig.ts +9 -0
  111. package/src/classes/HMSHLSRecordingState.ts +18 -0
  112. package/src/classes/HMSLocalPeer.ts +2 -0
  113. package/src/classes/HMSLogger.ts +3 -3
  114. package/src/classes/HMSMessage.ts +11 -5
  115. package/src/classes/HMSMessageRecipient.ts +19 -0
  116. package/src/classes/HMSMessageRecipientType.ts +5 -0
  117. package/src/classes/HMSNetworkQuality.ts +7 -0
  118. package/src/classes/HMSPeer.ts +4 -2
  119. package/src/classes/HMSPeerUpdate.ts +1 -8
  120. package/src/classes/HMSRemotePeer.ts +2 -0
  121. package/src/classes/HMSRoom.ts +4 -0
  122. package/src/classes/HMSSDK.tsx +306 -11
  123. package/src/classes/HmsView.tsx +14 -6
  124. package/src/index.ts +5 -0
@@ -26,8 +26,9 @@ class HmsSDK(
26
26
  reactApplicationContext: ReactApplicationContext
27
27
  ) {
28
28
  var hmsSDK: HMSSDK? = null
29
- private var recentRoleChangeRequest: HMSRoleChangeRequest? = null
29
+ var screenshareCallback: Promise? = null
30
30
  var delegate: HmsModule = HmsDelegate
31
+ private var recentRoleChangeRequest: HMSRoleChangeRequest? = null
31
32
  private var context: ReactApplicationContext = reactApplicationContext
32
33
  private var previewInProgress: Boolean = false
33
34
  private var id: String = sdkId
@@ -96,42 +97,7 @@ class HmsSDK(
96
97
  )
97
98
  if (requiredKeys) {
98
99
  previewInProgress = true
99
- var config =
100
- HMSConfig(
101
- credentials.getString("username") as String,
102
- credentials.getString("authToken") as String,
103
- )
104
-
105
- when {
106
- HmsHelper.areAllRequiredKeysAvailable(
107
- credentials,
108
- arrayOf(Pair("endpoint", "String"), Pair("metadata", "String"))
109
- ) -> {
110
- config =
111
- HMSConfig(
112
- credentials.getString("username") as String,
113
- credentials.getString("authToken") as String,
114
- initEndpoint = credentials.getString("endpoint") as String,
115
- metadata = credentials.getString("metadata") as String,
116
- )
117
- }
118
- HmsHelper.areAllRequiredKeysAvailable(credentials, arrayOf(Pair("endpoint", "String"))) -> {
119
- config =
120
- HMSConfig(
121
- credentials.getString("username") as String,
122
- credentials.getString("authToken") as String,
123
- initEndpoint = credentials.getString("endpoint") as String,
124
- )
125
- }
126
- HmsHelper.areAllRequiredKeysAvailable(credentials, arrayOf(Pair("metadata", "String"))) -> {
127
- config =
128
- HMSConfig(
129
- credentials.getString("username") as String,
130
- credentials.getString("authToken") as String,
131
- metadata = credentials.getString("metadata") as String,
132
- )
133
- }
134
- }
100
+ val config = HmsHelper.getHmsConfig(credentials)
135
101
 
136
102
  hmsSDK?.preview(
137
103
  config,
@@ -142,6 +108,16 @@ class HmsSDK(
142
108
  }
143
109
 
144
110
  override fun onPeerUpdate(type: HMSPeerUpdate, peer: HMSPeer) {
111
+ if (type === HMSPeerUpdate.AUDIO_TOGGLED ||
112
+ type === HMSPeerUpdate.VIDEO_TOGGLED ||
113
+ type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
114
+ type === HMSPeerUpdate.NO_DOMINANT_SPEAKER ||
115
+ type === HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER ||
116
+ type === HMSPeerUpdate.STARTED_SPEAKING ||
117
+ type === HMSPeerUpdate.STOPPED_SPEAKING
118
+ ) {
119
+ return
120
+ }
145
121
  val updateType = type.name
146
122
  val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
147
123
  val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
@@ -206,42 +182,7 @@ class HmsSDK(
206
182
  arrayOf(Pair("username", "String"), Pair("authToken", "String"))
207
183
  )
208
184
  if (requiredKeys) {
209
- var config =
210
- HMSConfig(
211
- credentials.getString("username") as String,
212
- credentials.getString("authToken") as String
213
- )
214
-
215
- when {
216
- HmsHelper.areAllRequiredKeysAvailable(
217
- credentials,
218
- arrayOf(Pair("endpoint", "String"), Pair("metadata", "String"))
219
- ) -> {
220
- config =
221
- HMSConfig(
222
- credentials.getString("username") as String,
223
- credentials.getString("authToken") as String,
224
- initEndpoint = credentials.getString("endpoint") as String,
225
- metadata = credentials.getString("metadata") as String,
226
- )
227
- }
228
- HmsHelper.areAllRequiredKeysAvailable(credentials, arrayOf(Pair("endpoint", "String"))) -> {
229
- config =
230
- HMSConfig(
231
- credentials.getString("username") as String,
232
- credentials.getString("authToken") as String,
233
- initEndpoint = credentials.getString("endpoint") as String,
234
- )
235
- }
236
- HmsHelper.areAllRequiredKeysAvailable(credentials, arrayOf(Pair("metadata", "String"))) -> {
237
- config =
238
- HMSConfig(
239
- credentials.getString("username") as String,
240
- credentials.getString("authToken") as String,
241
- metadata = credentials.getString("metadata") as String,
242
- )
243
- }
244
- }
185
+ val config = HmsHelper.getHmsConfig(credentials)
245
186
 
246
187
  HMSCoroutineScope.launch {
247
188
  try {
@@ -295,6 +236,16 @@ class HmsSDK(
295
236
  }
296
237
 
297
238
  override fun onPeerUpdate(type: HMSPeerUpdate, peer: HMSPeer) {
239
+ if (type === HMSPeerUpdate.AUDIO_TOGGLED ||
240
+ type === HMSPeerUpdate.VIDEO_TOGGLED ||
241
+ type === HMSPeerUpdate.BECAME_DOMINANT_SPEAKER ||
242
+ type === HMSPeerUpdate.NO_DOMINANT_SPEAKER ||
243
+ type === HMSPeerUpdate.RESIGNED_DOMINANT_SPEAKER ||
244
+ type === HMSPeerUpdate.STARTED_SPEAKING ||
245
+ type === HMSPeerUpdate.STOPPED_SPEAKING
246
+ ) {
247
+ return
248
+ }
298
249
  val updateType = type.name
299
250
  val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
300
251
  val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
@@ -351,12 +302,12 @@ class HmsSDK(
351
302
  override fun onMessageReceived(message: HMSMessage) {
352
303
  val data: WritableMap = Arguments.createMap()
353
304
 
354
- data.putString("sender", message.sender.name)
305
+ data.putMap("sender", HmsDecoder.getHmsPeer(message.sender))
355
306
  data.putString("message", message.message)
356
307
  data.putString("type", message.type)
357
308
  data.putString("time", message.serverReceiveTime.toString())
358
309
  data.putString("id", id)
359
- data.putString("event", "ON_MESSAGE")
310
+ data.putMap("recipient", HmsDecoder.getHmsMessageRecipient(message.recipient))
360
311
 
361
312
  delegate.emitEvent("ON_MESSAGE", data)
362
313
  }
@@ -433,6 +384,7 @@ class HmsSDK(
433
384
  hmsSDK?.leave(
434
385
  object : HMSActionResultListener {
435
386
  override fun onSuccess() {
387
+ screenshareCallback = null
436
388
  callback?.resolve(emitHMSSuccess())
437
389
  }
438
390
 
@@ -891,6 +843,9 @@ class HmsSDK(
891
843
  }
892
844
  }
893
845
  }
846
+ this.emitCustomError("TRACKID_NOT_MATCHED")
847
+ } else {
848
+ this.emitCustomError("REMOTE_PEERS_NOT_FOUND")
894
849
  }
895
850
  } else {
896
851
  this.emitRequiredKeysError()
@@ -991,7 +946,8 @@ class HmsSDK(
991
946
  )
992
947
  }
993
948
 
994
- fun startScreenshare() {
949
+ fun startScreenshare(callback: Promise?) {
950
+ screenshareCallback = callback
995
951
  runOnUiThread {
996
952
  val intent = Intent(context, HmsScreenshareActivity::class.java)
997
953
  intent.flags = FLAG_ACTIVITY_NEW_TASK
@@ -1008,10 +964,12 @@ class HmsSDK(
1008
964
  hmsSDK?.stopScreenshare(
1009
965
  object : HMSActionResultListener {
1010
966
  override fun onError(error: HMSException) {
967
+ screenshareCallback = null
1011
968
  callback?.reject(error.code.toString(), error.message)
1012
969
  self.emitHMSError(error)
1013
970
  }
1014
971
  override fun onSuccess() {
972
+ screenshareCallback = null
1015
973
  callback?.resolve(emitHMSSuccess())
1016
974
  }
1017
975
  }
@@ -1025,7 +983,8 @@ class HmsSDK(
1025
983
  val meetingURLVariants =
1026
984
  data.getArray("meetingURLVariants")?.toArrayList() as? ArrayList<HashMap<String, String>>
1027
985
  val hlsMeetingUrlVariant = HmsHelper.getHMSHLSMeetingURLVariants(meetingURLVariants)
1028
- val config = HMSHLSConfig(hlsMeetingUrlVariant)
986
+ val hlsRecordingConfig = HmsHelper.getHlsRecordingConfig(data)
987
+ val config = HMSHLSConfig(hlsMeetingUrlVariant, hlsRecordingConfig)
1029
988
 
1030
989
  hmsSDK?.startHLSStreaming(
1031
990
  config,
@@ -8,6 +8,8 @@ import android.os.Bundle
8
8
  import androidx.activity.ComponentActivity
9
9
  import androidx.activity.result.ActivityResultLauncher
10
10
  import androidx.activity.result.contract.ActivityResultContracts
11
+ import com.facebook.react.bridge.Arguments
12
+ import com.facebook.react.bridge.WritableMap
11
13
  import live.hms.video.error.HMSException
12
14
  import live.hms.video.sdk.HMSActionResultListener
13
15
 
@@ -21,15 +23,29 @@ class HmsScreenshareActivity : ComponentActivity() {
21
23
  object : HMSActionResultListener {
22
24
  override fun onError(error: HMSException) {
23
25
  finish()
26
+ HmsModule.hmsCollection[id]?.screenshareCallback?.reject(error)
24
27
  HmsModule.hmsCollection[id]?.emitHMSError(error)
25
28
  }
26
29
  override fun onSuccess() {
30
+ HmsModule.hmsCollection[id]?.screenshareCallback?.resolve(
31
+ HmsModule.hmsCollection[id]?.emitHMSSuccess()
32
+ )
27
33
  finish()
28
34
  }
29
35
  },
30
36
  mediaProjectionPermissionResultData
31
37
  )
32
38
  } else {
39
+ val id = intent.getStringExtra("id")
40
+ val error = HMSException(
41
+ 103,
42
+ "RESULT_CANCELED",
43
+ "RESULT_CANCELED",
44
+ "RESULT_CANCELED",
45
+ "RESULT_CANCELED"
46
+ )
47
+ HmsModule.hmsCollection[id]?.screenshareCallback?.reject(error)
48
+ HmsModule.hmsCollection[id]?.emitHMSError(error)
33
49
  finish()
34
50
  }
35
51
  }
@@ -2,14 +2,16 @@ package com.reactnativehmssdk
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
+ import android.os.Build
5
6
  import android.view.LayoutInflater
6
7
  import android.widget.FrameLayout
8
+ import androidx.annotation.RequiresApi
7
9
  import com.facebook.react.bridge.Arguments
8
10
  import com.facebook.react.bridge.ReactContext
9
11
  import com.facebook.react.bridge.WritableMap
10
12
  import com.facebook.react.uimanager.events.RCTEventEmitter
11
- import live.hms.video.media.tracks.HMSTrackType
12
13
  import live.hms.video.media.tracks.HMSVideoTrack
14
+ import live.hms.video.utils.HmsUtilities
13
15
  import live.hms.video.utils.SharedEglContext
14
16
  import org.webrtc.RendererCommon
15
17
  import org.webrtc.SurfaceViewRenderer
@@ -18,19 +20,25 @@ import org.webrtc.SurfaceViewRenderer
18
20
  class HmsView(context: ReactContext) : FrameLayout(context) {
19
21
  private var surfaceView: SurfaceViewRenderer = SurfaceViewRenderer(context)
20
22
  private var videoTrack: HMSVideoTrack? = null
21
- private var localTrack: String? = null
22
23
  private var scaleTypeApplied: Boolean = false
24
+ private var sdkId: String = "12345"
23
25
  private var currentScaleType: RendererCommon.ScalingType =
24
- RendererCommon.ScalingType.SCALE_ASPECT_FILL
26
+ RendererCommon.ScalingType.SCALE_ASPECT_FILL
25
27
 
26
28
  init {
27
- val inflater = getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
29
+ val inflater =
30
+ getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
28
31
  val view = inflater.inflate(R.layout.hms_view, this)
29
32
 
30
33
  surfaceView = view.findViewById(R.id.surfaceView)
31
34
  surfaceView.setEnableHardwareScaler(true)
32
35
  }
33
36
 
37
+ @RequiresApi(Build.VERSION_CODES.N)
38
+ fun captureHmsView() {
39
+ HmsHelper.captureSurfaceView(surfaceView, context, sdkId)
40
+ }
41
+
34
42
  private fun onReceiveNativeEvent() {
35
43
  val event: WritableMap = Arguments.createMap()
36
44
  event.putString("message", "MyMessage")
@@ -56,6 +64,13 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
56
64
  }
57
65
  }
58
66
 
67
+ fun updateZOrderMediaOverlay(setZOrderMediaOverlay: Boolean?) {
68
+ if (setZOrderMediaOverlay != null && setZOrderMediaOverlay) {
69
+ // surfaceView.setZOrderOnTop(true);
70
+ surfaceView.setZOrderMediaOverlay(setZOrderMediaOverlay)
71
+ }
72
+ }
73
+
59
74
  fun updateScaleType(scaleType: String?) {
60
75
  if (scaleType != null) {
61
76
  when (scaleType) {
@@ -82,45 +97,21 @@ class HmsView(context: ReactContext) : FrameLayout(context) {
82
97
  }
83
98
 
84
99
  fun setData(
85
- id: String?,
86
- trackId: String?,
87
- hmsCollection: MutableMap<String, HmsSDK>,
88
- mirror: Boolean?
100
+ id: String?,
101
+ trackId: String?,
102
+ hmsCollection: MutableMap<String, HmsSDK>,
103
+ mirror: Boolean?
89
104
  ) {
90
- var sdkId = "12345"
91
105
  if (id != null) {
92
106
  sdkId = id
93
107
  }
94
-
95
108
  val hms = hmsCollection[sdkId]?.hmsSDK
96
109
 
97
110
  if (trackId != null && hms != null) {
98
111
  if (mirror != null) {
99
112
  surfaceView.setMirror(mirror)
100
113
  }
101
- localTrack = trackId
102
- val localTrackId = hms.getLocalPeer()?.videoTrack?.trackId
103
- if (localTrackId == localTrack) {
104
- videoTrack = hms.getLocalPeer()?.videoTrack
105
- }
106
-
107
- val remotePeers = hms.getRemotePeers()
108
- for (peer in remotePeers) {
109
- val videoTrackId = peer.videoTrack?.trackId
110
-
111
- val auxiliaryTracks = peer.auxiliaryTracks
112
- for (track in auxiliaryTracks) {
113
- val auxTrackId = track.trackId
114
- if (trackId == auxTrackId && track.type == HMSTrackType.VIDEO && !track.isMute) {
115
- videoTrack = track as HMSVideoTrack
116
- return
117
- }
118
- }
119
- if (videoTrackId == localTrack) {
120
- videoTrack = peer.videoTrack
121
- return
122
- }
123
- }
114
+ videoTrack = hms.getRoom()?.let { HmsUtilities.getVideoTrack(trackId, it) }
124
115
  }
125
116
  }
126
117
  }
@@ -1,5 +1,7 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
+ import android.os.Build
4
+ import androidx.annotation.RequiresApi
3
5
  import com.facebook.react.bridge.ReadableMap
4
6
  import com.facebook.react.common.MapBuilder
5
7
  import com.facebook.react.uimanager.SimpleViewManager
@@ -31,14 +33,12 @@ class HmssdkViewManager : SimpleViewManager<HmsView>() {
31
33
  @ReactProp(name = "data")
32
34
  fun setData(view: HmsView, data: ReadableMap) {
33
35
  val trackId = data.getString("trackId")
34
- // val sink = data.getBoolean("sink")
35
36
  val id = data.getString("id")
36
37
  val mirror = data.getBoolean("mirror")
37
38
  val hmsCollection = getHms()
38
39
  if (hmsCollection != null) {
39
40
  view.setData(id, trackId, hmsCollection, mirror)
40
41
  }
41
- // do the processing here
42
42
  }
43
43
 
44
44
  @ReactProp(name = "scaleType")
@@ -46,6 +46,19 @@ class HmssdkViewManager : SimpleViewManager<HmsView>() {
46
46
  view.updateScaleType(data)
47
47
  }
48
48
 
49
+ @ReactProp(name = "setZOrderMediaOverlay")
50
+ fun setZOrderMediaOverlay(view: HmsView, data: Boolean?) {
51
+ view.updateZOrderMediaOverlay(data)
52
+ }
53
+
54
+ @RequiresApi(Build.VERSION_CODES.N)
55
+ @ReactProp(name = "screenshot")
56
+ fun setCaptureHmsView(view: HmsView, screenshot: Boolean?) {
57
+ if(screenshot == true){
58
+ view.captureHmsView()
59
+ }
60
+ }
61
+
49
62
  private fun getHms(): MutableMap<String, HmsSDK>? {
50
63
  return reactContext?.getNativeModule(HmsModule::class.java)?.getHmsInstance()
51
64
  }
@@ -14,16 +14,19 @@ class HmsDecoder: NSObject {
14
14
  let rtmpStreamingState = HmsDecoder.getHMSRtmpStreamingState(hmsRoom?.rtmpStreamingState)
15
15
  let serverRecordingState = HmsDecoder.getHMSServerRecordingState(hmsRoom?.serverRecordingState)
16
16
  let hlsStreamingState = HmsDecoder.getHlsStreamingState(hmsRoom?.hlsStreamingState)
17
+ let hlsRecordingState = HmsDecoder.getHlsRecordingState(hmsRoom?.hlsRecordingState)
17
18
  var peers = [[String: Any]]()
18
19
 
19
20
  for peer in room.peers {
20
21
  peers.append(getHmsPeer(peer))
21
22
  }
22
23
 
23
- return ["id": id, "name": name, "metaData": metaData, "peers": peers, "browserRecordingState": browserRecordingState, "rtmpHMSRtmpStreamingState": rtmpStreamingState, "serverRecordingState": serverRecordingState, "hlsStreamingState": hlsStreamingState, "peerCount": count]
24
+ return ["id": id, "name": name, "metaData": metaData, "peers": peers, "browserRecordingState": browserRecordingState, "rtmpHMSRtmpStreamingState": rtmpStreamingState, "serverRecordingState": serverRecordingState, "hlsRecordingState": hlsRecordingState, "hlsStreamingState": hlsStreamingState, "peerCount": count]
24
25
  }
25
26
 
26
- static func getHmsPeer (_ peer: HMSPeer) -> [String: Any] {
27
+ static func getHmsPeer (_ hmsPeer: HMSPeer?) -> [String: Any] {
28
+
29
+ guard let peer = hmsPeer else { return [:] }
27
30
 
28
31
  let peerID = peer.peerID
29
32
  let name = peer.name
@@ -34,6 +37,7 @@ class HmsDecoder: NSObject {
34
37
  let audioTrack = getHmsAudioTrack(peer.audioTrack)
35
38
  let videoTrack = getHmsVideoTrack(peer.videoTrack)
36
39
  let role = getHmsRole(peer.role)
40
+ let networkQuality = getHmsNetworkQuality(peer.networkQuality)
37
41
 
38
42
  let auxiliaryTracks = getAllTracks(peer.auxiliaryTracks ?? [] )
39
43
 
@@ -46,6 +50,7 @@ class HmsDecoder: NSObject {
46
50
  "audioTrack": audioTrack,
47
51
  "videoTrack": videoTrack,
48
52
  "auxiliaryTracks": auxiliaryTracks,
53
+ "networkQuality": networkQuality,
49
54
  "role": role]
50
55
  }
51
56
 
@@ -111,6 +116,7 @@ class HmsDecoder: NSObject {
111
116
  let audioTrack = getHmsAudioTrack(peer.audioTrack)
112
117
  let videoTrack = getHmsVideoTrack(peer.videoTrack)
113
118
  let role = getHmsRole(peer.role)
119
+ let networkQuality = getHmsNetworkQuality(peer.networkQuality)
114
120
 
115
121
  var auxiliaryTracks = [[String: Any]]()
116
122
  for track in peer.auxiliaryTracks ?? [] {
@@ -130,7 +136,7 @@ class HmsDecoder: NSObject {
130
136
  localVideoTrackData = getHmsLocalVideoTrack(localVideo)
131
137
  }
132
138
 
133
- return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "localAudioTrackData": localAudioTrackData, "localVideoTrackData": localVideoTrackData, "role": role]
139
+ return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "localAudioTrackData": localAudioTrackData, "localVideoTrackData": localVideoTrackData, "role": role, "networkQuality": networkQuality]
134
140
  }
135
141
 
136
142
  static func getHmsLocalAudioTrack(_ localAudio: HMSLocalAudioTrack) -> [String: Any] {
@@ -229,6 +235,7 @@ class HmsDecoder: NSObject {
229
235
  let audioTrack = getHmsAudioTrack(hmsRemotePeer.audioTrack)
230
236
  let videoTrack = getHmsVideoTrack(hmsRemotePeer.videoTrack)
231
237
  let role = getHmsRole(hmsRemotePeer.role)
238
+ let networkQuality = getHmsNetworkQuality(hmsRemotePeer.networkQuality)
232
239
 
233
240
  var auxiliaryTracks = [[String: Any]]()
234
241
 
@@ -249,7 +256,7 @@ class HmsDecoder: NSObject {
249
256
  remoteVideoTrackData = getHMSRemoteVideoTrack(remoteVideo)
250
257
  }
251
258
 
252
- return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "remoteAudioTrackData": remoteAudioTrackData, "remoteVideoTrackData": remoteVideoTrackData, "role": role]
259
+ return ["peerID": peerID, "name": name, "isLocal": isLocal, "customerUserID": customerUserID, "customerDescription": customerDescription, "metadata": metadata, "audioTrack": audioTrack, "videoTrack": videoTrack, "auxiliaryTracks": auxiliaryTracks, "remoteAudioTrackData": remoteAudioTrackData, "remoteVideoTrackData": remoteVideoTrackData, "role": role, "networkQuality": networkQuality]
253
260
  }
254
261
 
255
262
  static func getHMSRemoteAudioTrack(_ remoteAudio: HMSRemoteAudioTrack) -> [String: Any] {
@@ -531,6 +538,19 @@ class HmsDecoder: NSObject {
531
538
  return [:]
532
539
  }
533
540
  }
541
+
542
+ static func getHlsRecordingState(_ data: HMSHLSRecordingState?) -> [String: Any] {
543
+ if let recordingState = data {
544
+ let running = recordingState.running
545
+ let startedAt = recordingState.startedAt?.timeIntervalSince1970 ?? 0
546
+ let singleFilePerLayer = recordingState.singleFilePerLayer
547
+ let enableVOD = recordingState.enableVOD
548
+
549
+ return ["running": running, "startedAt": startedAt * 1000, "singleFilePerLayer": singleFilePerLayer, "videoOnDemand": enableVOD]
550
+ } else {
551
+ return [:]
552
+ }
553
+ }
534
554
 
535
555
  static func getHMSHlsVariant(_ data: [HMSHLSVariant]?) -> [[String: Any]] {
536
556
  var variants = [[String: Any]]()
@@ -568,4 +588,27 @@ class HmsDecoder: NSObject {
568
588
  static func getRemoteVideoStats(_ data: HMSRemoteVideoStats) -> [String: Any] {
569
589
  return ["bitrate": data.bitrate, "packetsReceived": data.packetsReceived, "packetsLost": data.packetsLost, "bytesReceived": data.bytesReceived, "jitter": data.jitter, "resolution": HmsDecoder.getHmsVideoResolution(data.resolution), "frameRate": data.frameRate]
570
590
  }
591
+
592
+ static func getHmsMessageRecipient(_ recipient: HMSMessageRecipient) -> [String: Any] {
593
+ return ["recipientPeer": getHmsPeer(recipient.peerRecipient), "recipientRoles": getAllRoles(recipient.rolesRecipient), "type": self.getRecipientType(from: recipient.type)]
594
+ }
595
+
596
+ static func getHmsNetworkQuality(_ hmsNetworkQuality: HMSNetworkQuality?) -> [String: Any] {
597
+ guard let networkQuality = hmsNetworkQuality else { return [:] }
598
+
599
+ return ["downlinkQuality": networkQuality.downlinkQuality]
600
+ }
601
+
602
+ static private func getRecipientType(from recipientType: HMSMessageRecipientType) -> String {
603
+ switch recipientType {
604
+ case .broadcast:
605
+ return "BROADCAST"
606
+ case .peer:
607
+ return "PEER"
608
+ case .roles:
609
+ return "ROLES"
610
+ default:
611
+ return ""
612
+ }
613
+ }
571
614
  }
@@ -208,6 +208,20 @@ class HmsHelper: NSObject {
208
208
  }
209
209
  return hlsVariants
210
210
  }
211
+
212
+ static func getHlsRecordingConfig(_ data: NSDictionary) -> HMSHLSRecordingConfig? {
213
+ guard let meetingURLVariants = data.value(forKey: "hlsRecordingConfig") as? NSDictionary
214
+ else {
215
+ return nil
216
+ }
217
+ guard let singleFilePerLayer = meetingURLVariants.value(forKey: "singleFilePerLayer") as? Bool ,
218
+ let videoOnDemand = meetingURLVariants.value(forKey: "videoOnDemand") as? Bool
219
+ else {
220
+ return nil
221
+ }
222
+
223
+ return HMSHLSRecordingConfig(singleFilePerLayer: singleFilePerLayer, enableVOD: videoOnDemand)
224
+ }
211
225
 
212
226
  static func getHMSHLSMeetingURLVariant(_ variant: [String: Any]) -> HMSHLSMeetingURLVariant? {
213
227
  let meetingUrl = variant["meetingUrl"] as? String
package/ios/HmsSDK.swift CHANGED
@@ -72,13 +72,15 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
72
72
  }
73
73
 
74
74
  let metadata = credentials.value(forKey: "metadata") as? String
75
+ let captureNetworkQualityInPreview = credentials.value(forKey: "captureNetworkQualityInPreview") as? Bool ?? false
76
+
75
77
  DispatchQueue.main.async { [weak self] in
76
78
  guard let strongSelf = self else { return }
77
79
  if let endpoint = credentials.value(forKey: "endpoint") as? String {
78
- strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, endpoint: endpoint)
80
+ strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, endpoint: endpoint, captureNetworkQualityInPreview: captureNetworkQualityInPreview)
79
81
  strongSelf.hms?.preview(config: strongSelf.config!, delegate: strongSelf)
80
82
  } else {
81
- strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata)
83
+ strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, captureNetworkQualityInPreview: captureNetworkQualityInPreview)
82
84
  strongSelf.hms?.preview(config: strongSelf.config!, delegate: strongSelf)
83
85
  }
84
86
  strongSelf.previewInProgress = true
@@ -135,6 +137,7 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
135
137
  }
136
138
 
137
139
  let metadata = credentials.value(forKey: "metadata") as? String
140
+ let captureNetworkQualityInPreview = credentials.value(forKey: "captureNetworkQualityInPreview") as? Bool ?? false
138
141
 
139
142
  DispatchQueue.main.async { [weak self] in
140
143
  guard let strongSelf = self else { return }
@@ -142,10 +145,10 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
142
145
  strongSelf.hms?.join(config: config, delegate: strongSelf)
143
146
  } else {
144
147
  if let endpoint = credentials.value(forKey: "endpoint") as? String {
145
- strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, endpoint: endpoint)
148
+ strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, endpoint: endpoint, captureNetworkQualityInPreview: captureNetworkQualityInPreview)
146
149
  strongSelf.hms?.join(config: strongSelf.config!, delegate: strongSelf)
147
150
  } else {
148
- strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata)
151
+ strongSelf.config = HMSConfig(userName: user, authToken: authToken, metadata: metadata, captureNetworkQualityInPreview: captureNetworkQualityInPreview)
149
152
  strongSelf.hms?.join(config: strongSelf.config!, delegate: strongSelf)
150
153
  }
151
154
  }
@@ -643,9 +646,10 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
643
646
  delegate?.emitEvent(ON_ERROR, ["event": ON_ERROR, "error": HmsDecoder.getError(error), "id": id])
644
647
  return
645
648
  }
646
-
649
+
650
+ let recordConfig = HmsHelper.getHlsRecordingConfig(data)
647
651
  let hlsMeetingUrlVariant = HmsHelper.getHMSHLSMeetingURLVariants(meetingURLVariants)
648
- let config = HMSHLSConfig(variants: hlsMeetingUrlVariant)
652
+ let config = HMSHLSConfig(variants: hlsMeetingUrlVariant, recording: recordConfig)
649
653
 
650
654
  hms?.startHLSStreaming(config: config, completion: { success, error in
651
655
  if success {
@@ -801,7 +805,7 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
801
805
  }
802
806
 
803
807
  func on(message: HMSMessage) {
804
- self.delegate?.emitEvent(ON_MESSAGE, ["event": ON_MESSAGE, "id": self.id, "sender": message.sender?.name ?? "", "time": message.time, "message": message.message, "type": message.type])
808
+ self.delegate?.emitEvent(ON_MESSAGE, ["event": ON_MESSAGE, "id": self.id, "sender": HmsDecoder.getHmsPeer(message.sender), "recipient": HmsDecoder.getHmsMessageRecipient(message.recipient), "time": message.time.timeIntervalSince1970 * 1000, "message": message.message, "type": message.type])
805
809
  }
806
810
 
807
811
  func on(updated speakers: [HMSSpeaker]) {
@@ -949,6 +953,8 @@ class HmsSDK: HMSUpdateListener, HMSPreviewListener {
949
953
  return "NAME_CHANGED"
950
954
  case .defaultUpdate:
951
955
  return "DEFAULT_UPDATE"
956
+ case .networkQualityUpdated:
957
+ return "NETWORK_QUALITY_UPDATED"
952
958
  default:
953
959
  return ""
954
960
  }
@@ -17,10 +17,13 @@ class HMSConfig {
17
17
 
18
18
  _defineProperty(this, "metadata", void 0);
19
19
 
20
+ _defineProperty(this, "captureNetworkQualityInPreview", void 0);
21
+
20
22
  this.username = params.username;
21
23
  this.authToken = params.authToken;
22
24
  this.endpoint = params.endpoint;
23
25
  this.metadata = params.metadata;
26
+ this.captureNetworkQualityInPreview = params.captureNetworkQualityInPreview;
24
27
  }
25
28
 
26
29
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["HMSConfig.ts"],"names":["HMSConfig","constructor","params","username","authToken","endpoint","metadata"],"mappings":";;;;;;;;;AAAO,MAAMA,SAAN,CAAgB;AAMrBC,EAAAA,WAAW,CAACC,MAAD,EAKR;AAAA;;AAAA;;AAAA;;AAAA;;AACD,SAAKC,QAAL,GAAgBD,MAAM,CAACC,QAAvB;AACA,SAAKC,SAAL,GAAiBF,MAAM,CAACE,SAAxB;AACA,SAAKC,QAAL,GAAgBH,MAAM,CAACG,QAAvB;AACA,SAAKC,QAAL,GAAgBJ,MAAM,CAACI,QAAvB;AACD;;AAhBoB","sourcesContent":["export class HMSConfig {\n username: string;\n authToken: string;\n endpoint?: string;\n metadata?: string;\n\n constructor(params: {\n username: string;\n authToken: string;\n endpoint?: string;\n metadata?: string;\n }) {\n this.username = params.username;\n this.authToken = params.authToken;\n this.endpoint = params.endpoint;\n this.metadata = params.metadata;\n }\n}\n"]}
1
+ {"version":3,"sources":["HMSConfig.ts"],"names":["HMSConfig","constructor","params","username","authToken","endpoint","metadata","captureNetworkQualityInPreview"],"mappings":";;;;;;;;;AAAO,MAAMA,SAAN,CAAgB;AAOrBC,EAAAA,WAAW,CAACC,MAAD,EAMR;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AACD,SAAKC,QAAL,GAAgBD,MAAM,CAACC,QAAvB;AACA,SAAKC,SAAL,GAAiBF,MAAM,CAACE,SAAxB;AACA,SAAKC,QAAL,GAAgBH,MAAM,CAACG,QAAvB;AACA,SAAKC,QAAL,GAAgBJ,MAAM,CAACI,QAAvB;AACA,SAAKC,8BAAL,GAAsCL,MAAM,CAACK,8BAA7C;AACD;;AAnBoB","sourcesContent":["export class HMSConfig {\n username: string;\n authToken: string;\n endpoint?: string;\n metadata?: string;\n captureNetworkQualityInPreview?: boolean;\n\n constructor(params: {\n username: string;\n authToken: string;\n endpoint?: string;\n metadata?: string;\n captureNetworkQualityInPreview?: boolean;\n }) {\n this.username = params.username;\n this.authToken = params.authToken;\n this.endpoint = params.endpoint;\n this.metadata = params.metadata;\n this.captureNetworkQualityInPreview = params.captureNetworkQualityInPreview;\n }\n}\n"]}