@100mslive/react-native-hms 1.10.3 → 1.10.5

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 (148) hide show
  1. package/android/build.gradle +9 -2
  2. package/android/local.properties +8 -1
  3. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +11 -0
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +94 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +32 -0
  6. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +38 -0
  7. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +6 -4
  8. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +50 -25
  9. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +69 -1
  10. package/ios/HMSConstants.swift +1 -0
  11. package/ios/HMSDecoder.swift +22 -2
  12. package/ios/HMSHLSPlayerManager.m +6 -0
  13. package/ios/HMSHLSPlayerManager.swift +144 -2
  14. package/ios/HMSInteractivityDecoder.swift +41 -0
  15. package/ios/HMSManager.m +12 -0
  16. package/ios/HMSManager.swift +20 -1
  17. package/ios/HMSRNInteractivityCenter.swift +41 -0
  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/HMSEncoder.js +11 -1
  23. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  24. package/lib/commonjs/classes/HMSHLSPlaylistType.js +12 -0
  25. package/lib/commonjs/classes/HMSHLSPlaylistType.js.map +1 -0
  26. package/lib/commonjs/classes/HMSHLSVariant.js +2 -0
  27. package/lib/commonjs/classes/HMSHLSVariant.js.map +1 -1
  28. package/lib/commonjs/classes/HMSInteractivityCenter.js +58 -4
  29. package/lib/commonjs/classes/HMSInteractivityCenter.js.map +1 -1
  30. package/lib/commonjs/classes/HMSInteractivityEncoder.js +6 -0
  31. package/lib/commonjs/classes/HMSInteractivityEncoder.js.map +1 -1
  32. package/lib/commonjs/classes/HMSNoiseCancellationPlugin.js +1 -0
  33. package/lib/commonjs/classes/HMSNoiseCancellationPlugin.js.map +1 -1
  34. package/lib/commonjs/classes/HMSPermissions.js +2 -0
  35. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  36. package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js +6 -0
  37. package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js.map +1 -0
  38. package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js +11 -0
  39. package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
  40. package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js +12 -0
  41. package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
  42. package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js +12 -0
  43. package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
  44. package/lib/commonjs/classes/whiteboard/index.js +39 -0
  45. package/lib/commonjs/classes/whiteboard/index.js.map +1 -0
  46. package/lib/commonjs/classes/whiteboard/registerCallbacks.js +26 -0
  47. package/lib/commonjs/classes/whiteboard/registerCallbacks.js.map +1 -0
  48. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +98 -2
  49. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  50. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  51. package/lib/commonjs/components/HMSHLSPlayer/hooks.js +16 -6
  52. package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -1
  53. package/lib/commonjs/components/HMSHLSPlayer/index.js +15 -1
  54. package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -1
  55. package/lib/commonjs/index.js +24 -0
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/stores/hls-player-playback-slice.js +6 -0
  58. package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -1
  59. package/lib/commonjs/stores/hls-player-stats-store.js +27 -15
  60. package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -1
  61. package/lib/commonjs/stores/types.js.map +1 -1
  62. package/lib/commonjs/types.js.map +1 -1
  63. package/lib/module/classes/HMSEncoder.js +11 -1
  64. package/lib/module/classes/HMSEncoder.js.map +1 -1
  65. package/lib/module/classes/HMSHLSPlaylistType.js +6 -0
  66. package/lib/module/classes/HMSHLSPlaylistType.js.map +1 -0
  67. package/lib/module/classes/HMSHLSVariant.js +2 -0
  68. package/lib/module/classes/HMSHLSVariant.js.map +1 -1
  69. package/lib/module/classes/HMSInteractivityCenter.js +58 -4
  70. package/lib/module/classes/HMSInteractivityCenter.js.map +1 -1
  71. package/lib/module/classes/HMSInteractivityEncoder.js +6 -0
  72. package/lib/module/classes/HMSInteractivityEncoder.js.map +1 -1
  73. package/lib/module/classes/HMSNoiseCancellationPlugin.js +1 -0
  74. package/lib/module/classes/HMSNoiseCancellationPlugin.js.map +1 -1
  75. package/lib/module/classes/HMSPermissions.js +2 -0
  76. package/lib/module/classes/HMSPermissions.js.map +1 -1
  77. package/lib/module/classes/whiteboard/HMSWhiteboard.js +2 -0
  78. package/lib/module/classes/whiteboard/HMSWhiteboard.js.map +1 -0
  79. package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js +5 -0
  80. package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
  81. package/lib/module/classes/whiteboard/HMSWhiteboardState.js +6 -0
  82. package/lib/module/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
  83. package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js +6 -0
  84. package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
  85. package/lib/module/classes/whiteboard/index.js +4 -0
  86. package/lib/module/classes/whiteboard/index.js.map +1 -0
  87. package/lib/module/classes/whiteboard/registerCallbacks.js +18 -0
  88. package/lib/module/classes/whiteboard/registerCallbacks.js.map +1 -0
  89. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +101 -5
  90. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  91. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  92. package/lib/module/components/HMSHLSPlayer/hooks.js +12 -4
  93. package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -1
  94. package/lib/module/components/HMSHLSPlayer/index.js +1 -1
  95. package/lib/module/components/HMSHLSPlayer/index.js.map +1 -1
  96. package/lib/module/index.js +2 -0
  97. package/lib/module/index.js.map +1 -1
  98. package/lib/module/stores/hls-player-playback-slice.js +6 -0
  99. package/lib/module/stores/hls-player-playback-slice.js.map +1 -1
  100. package/lib/module/stores/hls-player-stats-store.js +27 -15
  101. package/lib/module/stores/hls-player-stats-store.js.map +1 -1
  102. package/lib/module/stores/types.js.map +1 -1
  103. package/lib/module/types.js.map +1 -1
  104. package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
  105. package/lib/typescript/classes/HMSHLSPlaylistType.d.ts +4 -0
  106. package/lib/typescript/classes/HMSHLSVariant.d.ts +3 -0
  107. package/lib/typescript/classes/HMSInteractivityCenter.d.ts +19 -2
  108. package/lib/typescript/classes/HMSInteractivityEncoder.d.ts +2 -0
  109. package/lib/typescript/classes/HMSNoiseCancellationPlugin.d.ts +1 -0
  110. package/lib/typescript/classes/HMSPermissions.d.ts +7 -0
  111. package/lib/typescript/classes/whiteboard/HMSWhiteboard.d.ts +10 -0
  112. package/lib/typescript/classes/whiteboard/HMSWhiteboardListenerActions.d.ts +3 -0
  113. package/lib/typescript/classes/whiteboard/HMSWhiteboardState.d.ts +4 -0
  114. package/lib/typescript/classes/whiteboard/HMSWhiteboardUpdateType.d.ts +4 -0
  115. package/lib/typescript/classes/whiteboard/index.d.ts +3 -0
  116. package/lib/typescript/classes/whiteboard/registerCallbacks.d.ts +8 -0
  117. package/lib/typescript/components/HMSHLSPlayer/HMSHLSPlayer.d.ts +6 -0
  118. package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +5 -1
  119. package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +3 -0
  120. package/lib/typescript/components/HMSHLSPlayer/index.d.ts +1 -1
  121. package/lib/typescript/index.d.ts +2 -0
  122. package/lib/typescript/stores/hls-player-stats-store.d.ts +4 -3
  123. package/lib/typescript/stores/types.d.ts +7 -1
  124. package/lib/typescript/types.d.ts +9 -0
  125. package/package.json +1 -1
  126. package/sdk-versions.json +2 -2
  127. package/src/classes/HMSEncoder.ts +13 -0
  128. package/src/classes/HMSHLSPlaylistType.ts +4 -0
  129. package/src/classes/HMSHLSVariant.ts +5 -0
  130. package/src/classes/HMSInteractivityCenter.ts +89 -10
  131. package/src/classes/HMSInteractivityEncoder.ts +8 -0
  132. package/src/classes/HMSNoiseCancellationPlugin.ts +1 -0
  133. package/src/classes/HMSPermissions.ts +9 -0
  134. package/src/classes/whiteboard/HMSWhiteboard.tsx +16 -0
  135. package/src/classes/whiteboard/HMSWhiteboardListenerActions.ts +3 -0
  136. package/src/classes/whiteboard/HMSWhiteboardState.tsx +4 -0
  137. package/src/classes/whiteboard/HMSWhiteboardUpdateType.tsx +4 -0
  138. package/src/classes/whiteboard/index.ts +3 -0
  139. package/src/classes/whiteboard/registerCallbacks.ts +34 -0
  140. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +158 -4
  141. package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +12 -0
  142. package/src/components/HMSHLSPlayer/hooks.ts +16 -4
  143. package/src/components/HMSHLSPlayer/index.ts +2 -0
  144. package/src/index.ts +2 -0
  145. package/src/stores/hls-player-playback-slice.ts +8 -0
  146. package/src/stores/hls-player-stats-store.ts +28 -18
  147. package/src/stores/types.ts +9 -1
  148. package/src/types.ts +15 -0
@@ -12,7 +12,14 @@ buildscript {
12
12
  if (ext.has("kotlinVersion")) {
13
13
  ext.kotlinVersion()
14
14
  } else {
15
- ext.safeExtGet("kotlinVersion", "1.6.0")
15
+ ext.safeExtGet("kotlinVersion", "1.7.20")
16
+ }
17
+ }
18
+ ext.getKotlinGradlePluginVersion = {
19
+ if (ext.has("kotlinGradlePluginVersion")) {
20
+ ext.kotlinGradlePluginVersion()
21
+ } else {
22
+ ext.safeExtGet("kotlinGradlePluginVersion", "1.8.0")
16
23
  }
17
24
  }
18
25
  if (project == rootProject) {
@@ -30,7 +37,7 @@ buildscript {
30
37
  mavenCentral()
31
38
  }
32
39
  dependencies {
33
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinVersion()}"
40
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinGradlePluginVersion()}"
34
41
  }
35
42
  }
36
43
 
@@ -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
@@ -344,6 +344,14 @@ object HMSDecoder {
344
344
  permissions.putBoolean("changeRole", hmsPermissions.changeRole)
345
345
  permissions.putBoolean("pollRead", hmsPermissions.pollRead)
346
346
  permissions.putBoolean("pollWrite", hmsPermissions.pollWrite)
347
+
348
+ val whiteboardPermissionMap: WritableMap = Arguments.createMap()
349
+ hmsPermissions.whiteboard.let { whiteBoardPermission ->
350
+ whiteboardPermissionMap.putBoolean("admin", whiteBoardPermission.admin)
351
+ whiteboardPermissionMap.putBoolean("read", whiteBoardPermission.read)
352
+ whiteboardPermissionMap.putBoolean("write", whiteBoardPermission.write)
353
+ }
354
+ permissions.putMap("whiteboard", whiteboardPermissionMap)
347
355
  }
348
356
  return permissions
349
357
  }
@@ -747,6 +755,9 @@ object HMSDecoder {
747
755
  variant.startedAt?.let {
748
756
  input.putString("startedAt", it.toString())
749
757
  }
758
+ variant.playlistType?.let {
759
+ input.putString("playlistType", it.name.uppercase())
760
+ }
750
761
  variants.pushMap(input)
751
762
  }
752
763
  }
@@ -3,12 +3,16 @@ package com.reactnativehmssdk
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
5
  import android.view.LayoutInflater
6
+ import android.view.View
6
7
  import android.widget.FrameLayout
7
8
  import androidx.media3.common.Player
8
9
  import androidx.media3.common.VideoSize
10
+ import androidx.media3.common.text.CueGroup
9
11
  import androidx.media3.ui.PlayerView
10
12
  import com.facebook.react.bridge.Arguments
11
13
  import com.facebook.react.bridge.ReactContext
14
+ import com.facebook.react.bridge.ReadableArray
15
+ import com.facebook.react.bridge.ReadableMap
12
16
  import com.facebook.react.bridge.WritableMap
13
17
  import com.facebook.react.uimanager.events.RCTEventEmitter
14
18
  import live.hms.hls_player.*
@@ -25,6 +29,7 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
25
29
  private var hmsHlsPlayer: HmsHlsPlayer? = null // 100ms HLS Player
26
30
  private var hmssdkInstance: HMSSDK? = null
27
31
  private var statsMonitorAttached = false
32
+ private var shouldSendCaptionsToJS = false
28
33
  private val hmsHlsPlaybackEventsObject =
29
34
  object : HmsHlsPlaybackEvents {
30
35
  override fun onCue(cue: HmsHlsCue) {
@@ -115,6 +120,7 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
115
120
  val localPlayerView = view.findViewById<PlayerView>(R.id.hls_view)
116
121
  playerView = localPlayerView
117
122
  localPlayerView.useController = false
123
+ localPlayerView.subtitleView?.visibility = View.GONE
118
124
 
119
125
  val hmssdkCollection = context.getNativeModule(HMSManager::class.java)?.getHmsInstance()
120
126
  hmssdkInstance = hmssdkCollection?.get("12345")?.hmsSDK
@@ -144,6 +150,13 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
144
150
  sendHLSPlaybackEventToJS(HMSHLSPlayerConstants.ON_PLAYBACK_RESOLUTION_CHANGE_EVENT, data)
145
151
  }
146
152
  }
153
+
154
+ override fun onCues(cueGroup: CueGroup) {
155
+ super.onCues(cueGroup)
156
+ if (!shouldSendCaptionsToJS) return
157
+ val ccText = cueGroup.cues.firstOrNull()?.text?.toString()
158
+ sendHLSPlayerCuesEventToJS(ccText)
159
+ }
147
160
  },
148
161
  )
149
162
  }
@@ -204,6 +217,38 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
204
217
  hmsHlsPlayer?.volume = level
205
218
  }
206
219
 
220
+ fun areClosedCaptionSupported(requestId: Int) {
221
+ hmsHlsPlayer.let {
222
+ if (it == null) {
223
+ sendHLSDataRequestEventToJS(requestId, false)
224
+ } else {
225
+ sendHLSDataRequestEventToJS(requestId, it.areClosedCaptionsSupported())
226
+ }
227
+ }
228
+ }
229
+
230
+ fun isClosedCaptionEnabled(requestId: Int) {
231
+ sendHLSDataRequestEventToJS(requestId, shouldSendCaptionsToJS)
232
+ }
233
+
234
+ fun enableClosedCaption() {
235
+ shouldSendCaptionsToJS = true
236
+ }
237
+
238
+ fun disableClosedCaption() {
239
+ shouldSendCaptionsToJS = false
240
+ sendHLSPlayerCuesEventToJS(null)
241
+ }
242
+
243
+ fun getPlayerDurationDetails(requestId: Int) {
244
+ val data: WritableMap = Arguments.createMap()
245
+ hmsHlsPlayer?.getNativePlayer()?.let { exoPlayer ->
246
+ data.putInt("rollingWindowTime", exoPlayer.seekParameters.toleranceAfterUs.div(1000).toInt())
247
+ data.putInt("streamDuration", exoPlayer.duration.toInt())
248
+ }
249
+ sendHLSDataRequestEventToJS(requestId, data)
250
+ }
251
+
207
252
  fun enableStats(enable: Boolean) {
208
253
  if (enable) {
209
254
  attachStatsMonitor()
@@ -215,11 +260,13 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
215
260
  fun enableControls(show: Boolean) {
216
261
  playerView?.let {
217
262
  if (show) {
263
+ it.subtitleView?.visibility = View.VISIBLE
218
264
  it.useController = true
219
265
  it.showController()
220
266
  } else {
221
267
  it.hideController()
222
268
  it.useController = false
269
+ it.subtitleView?.visibility = View.GONE
223
270
  }
224
271
  }
225
272
  }
@@ -263,6 +310,46 @@ class HMSHLSPlayer(context: ReactContext) : FrameLayout(context) {
263
310
  val reactContext = context as ReactContext
264
311
  reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, HMSHLSPlayerConstants.HMS_HLS_STATS_EVENT, event)
265
312
  }
313
+
314
+ private fun sendHLSDataRequestEventToJS(
315
+ requestId: Int,
316
+ data: Any,
317
+ ) {
318
+ val event: WritableMap = Arguments.createMap()
319
+ event.putInt("requestId", requestId)
320
+
321
+ if (data is Boolean) {
322
+ event.putBoolean("data", data)
323
+ } else if (data is String) {
324
+ event.putString("data", data)
325
+ } else if (data is Int) {
326
+ event.putInt("data", data)
327
+ } else if (data is Double) {
328
+ event.putDouble("data", data)
329
+ } else if (data is ReadableMap) {
330
+ event.putMap("data", data)
331
+ } else if (data is ReadableArray) {
332
+ event.putArray("data", data)
333
+ } else {
334
+ event.putNull("data")
335
+ }
336
+
337
+ val reactContext = context as ReactContext
338
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, HMSHLSPlayerConstants.HLS_DATA_REQUEST_EVENT, event)
339
+ }
340
+
341
+ private fun sendHLSPlayerCuesEventToJS(ccText: String?) {
342
+ val event: WritableMap = Arguments.createMap()
343
+ event.putString("event", HMSHLSPlayerConstants.ON_CLOSED_CAPTION_UPDATE)
344
+
345
+ if (ccText is String) {
346
+ event.putString("data", ccText)
347
+ } else {
348
+ event.putNull("data")
349
+ }
350
+ val reactContext = context as ReactContext
351
+ reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, HMSHLSPlayerConstants.HLS_PLAYER_CUES_EVENT, event)
352
+ }
266
353
  }
267
354
 
268
355
  object HMSHLSPlayerConstants {
@@ -277,4 +364,11 @@ object HMSHLSPlayerConstants {
277
364
  const val HMS_HLS_STATS_EVENT = "hmsHlsStatsEvent"
278
365
  const val ON_STATS_EVENT_UPDATE = "ON_STATS_EVENT_UPDATE"
279
366
  const val ON_STATS_EVENT_ERROR = "ON_STATS_EVENT_ERROR"
367
+
368
+ // HLS Requested Data Returned
369
+ const val HLS_DATA_REQUEST_EVENT = "hlsDataRequestEvent"
370
+
371
+ // HLS Player Cues Events
372
+ const val HLS_PLAYER_CUES_EVENT = "hlsPlayerCuesEvent"
373
+ const val ON_CLOSED_CAPTION_UPDATE = "ON_CLOSED_CAPTION_UPDATE"
280
374
  }
@@ -31,6 +31,10 @@ class HMSHLSPlayerManager : SimpleViewManager<HMSHLSPlayer>() {
31
31
  MapBuilder.of("registrationName", "onHmsHlsPlaybackEvent"),
32
32
  HMSHLSPlayerConstants.HMS_HLS_STATS_EVENT,
33
33
  MapBuilder.of("registrationName", "onHmsHlsStatsEvent"),
34
+ HMSHLSPlayerConstants.HLS_DATA_REQUEST_EVENT,
35
+ MapBuilder.of("registrationName", "onDataReturned"),
36
+ HMSHLSPlayerConstants.HLS_PLAYER_CUES_EVENT,
37
+ MapBuilder.of("registrationName", "onHlsPlayerCuesEvent"),
34
38
  )
35
39
  }
36
40
 
@@ -68,6 +72,29 @@ class HMSHLSPlayerManager : SimpleViewManager<HMSHLSPlayer>() {
68
72
  }
69
73
  }
70
74
  }
75
+ 90 -> {
76
+ args.let {
77
+ if (it != null) {
78
+ root.areClosedCaptionSupported(it.getInt(0))
79
+ }
80
+ }
81
+ }
82
+ 100 -> {
83
+ args.let {
84
+ if (it != null) {
85
+ root.isClosedCaptionEnabled(it.getInt(0))
86
+ }
87
+ }
88
+ }
89
+ 110 -> root.enableClosedCaption()
90
+ 120 -> root.disableClosedCaption()
91
+ 130 -> {
92
+ args.let {
93
+ if (it != null) {
94
+ root.getPlayerDurationDetails(it.getInt(0))
95
+ }
96
+ }
97
+ }
71
98
  }
72
99
  }
73
100
 
@@ -81,6 +108,11 @@ class HMSHLSPlayerManager : SimpleViewManager<HMSHLSPlayer>() {
81
108
  .put("seekForward", 60)
82
109
  .put("seekBackward", 70)
83
110
  .put("setVolume", 80)
111
+ .put("areClosedCaptionSupported", 90)
112
+ .put("isClosedCaptionEnabled", 100)
113
+ .put("enableClosedCaption", 110)
114
+ .put("disableClosedCaption", 120)
115
+ .put("getPlayerDurationDetails", 130)
84
116
  .build()
85
117
  }
86
118
 
@@ -1458,6 +1458,44 @@ class HMSManager(reactContext: ReactApplicationContext) :
1458
1458
  }
1459
1459
  // endregion
1460
1460
 
1461
+ //region Whiteboard
1462
+ @ReactMethod
1463
+ fun startWhiteboard(
1464
+ data: ReadableMap,
1465
+ promise: Promise?,
1466
+ ) {
1467
+ val rnSDK = HMSHelper.getHms(data, hmsCollection)
1468
+ rnSDK?.let { sdk ->
1469
+ sdk.interactivityCenter?.let { center ->
1470
+ center.startWhiteboard(data, promise)
1471
+ return
1472
+ }
1473
+ }
1474
+ promise?.reject(
1475
+ "6004",
1476
+ "HMS SDK not initialized",
1477
+ )
1478
+ }
1479
+
1480
+ @ReactMethod
1481
+ fun stopWhiteboard(
1482
+ data: ReadableMap,
1483
+ promise: Promise?,
1484
+ ) {
1485
+ val rnSDK = HMSHelper.getHms(data, hmsCollection)
1486
+ rnSDK?.let { sdk ->
1487
+ sdk.interactivityCenter?.let { center ->
1488
+ center.stopWhiteboard(promise)
1489
+ return
1490
+ }
1491
+ }
1492
+ promise?.reject(
1493
+ "6004",
1494
+ "HMS SDK not initialized",
1495
+ )
1496
+ }
1497
+ //endregion
1498
+
1461
1499
  // region Noise Cancellation Plugin
1462
1500
  @ReactMethod
1463
1501
  fun enableNoiseCancellationPlugin(
@@ -256,9 +256,11 @@ class HMSRNSDK(
256
256
  delegate.emitEvent("ON_PREVIEW", data)
257
257
  }
258
258
 
259
- /*
260
- override fun peerListUpdated(addedPeers: ArrayList<HMSPeer>?, removedPeers: ArrayList<HMSPeer>?) {
261
-
259
+ override fun peerListUpdated(
260
+ addedPeers: ArrayList<HMSPeer>?,
261
+ removedPeers: ArrayList<HMSPeer>?,
262
+ ) {
263
+ super.peerListUpdated(addedPeers, removedPeers)
262
264
  if (eventsEnableStatus["ON_PEER_LIST_UPDATED"] != true) {
263
265
  return
264
266
  }
@@ -278,11 +280,11 @@ class HMSRNSDK(
278
280
  }
279
281
  }
280
282
 
283
+ data.putString("id", id)
281
284
  data.putArray("addedPeers", addedPeersArray)
282
285
  data.putArray("removedPeers", removedPeersArray)
283
286
  delegate.emitEvent("ON_PEER_LIST_UPDATED", data)
284
287
  }
285
- */
286
288
  },
287
289
  )
288
290
  } else {
@@ -17,8 +17,12 @@ import live.hms.video.polls.network.HMSPollLeaderboardEntry
17
17
  import live.hms.video.polls.network.HMSPollLeaderboardSummary
18
18
  import live.hms.video.polls.network.PollLeaderboardResponse
19
19
  import live.hms.video.polls.network.PollResultsDisplay
20
+ import live.hms.video.whiteboard.HMSWhiteboard
21
+ import live.hms.video.whiteboard.HMSWhiteboardUpdate
22
+ import live.hms.video.whiteboard.State
20
23
 
21
24
  object HMSInteractivityDecoder {
25
+ //region poll methods
22
26
  fun getPollUpdateType(hmsPollUpdateType: HMSPollUpdateType): Int {
23
27
  return when (hmsPollUpdateType) {
24
28
  HMSPollUpdateType.started -> 0
@@ -280,31 +284,6 @@ object HMSInteractivityDecoder {
280
284
  return readableArray
281
285
  }
282
286
 
283
- /*
284
-
285
- static func getHMSPollQuestionResponseResults(_ hmsPollQuestionResponseResults: [HMSPollQuestionResponseResult]) -> [[String: AnyHashable]] {
286
- var results = [[String: AnyHashable]]()
287
-
288
- hmsPollQuestionResponseResults.forEach { result in
289
- results.append(getHMSPollQuestionResponseResult(result))
290
- }
291
- return results
292
- }
293
-
294
- static func getHMSPollQuestionResponseResult(_ hmsPollQuestionResponseResult: HMSPollQuestionResponseResult) -> [String: AnyHashable] {
295
- var result: [String: AnyHashable] = [
296
- "question": hmsPollQuestionResponseResult.question
297
- ]
298
- if let correct = hmsPollQuestionResponseResult.correct {
299
- result["correct"] = correct
300
- }
301
- if let error = hmsPollQuestionResponseResult.error {
302
- result["error"] = error.localizedDescription
303
- }
304
- return result
305
- }
306
-
307
- */
308
287
  fun getHMSPollQuestionResponseResults(hmsPollQuestionResponseResults: PollAnswerResponse): WritableArray {
309
288
  val results = Arguments.createArray()
310
289
 
@@ -410,4 +389,50 @@ object HMSInteractivityDecoder {
410
389
 
411
390
  return result
412
391
  }
392
+ //endregion
393
+
394
+ //region whiteboard methods
395
+ fun getHMSWhiteboard(hmsWhiteboard: HMSWhiteboard): WritableMap {
396
+ val data: WritableMap = Arguments.createMap()
397
+
398
+ data.putString("id", hmsWhiteboard.id)
399
+ data.putBoolean("isOwner", hmsWhiteboard.isOwner)
400
+ data.putString("state", getWhiteboardState(hmsWhiteboard.state))
401
+ hmsWhiteboard.title?.let { title ->
402
+ data.putString("title", title)
403
+ }
404
+ hmsWhiteboard.owner?.let { owner ->
405
+ data.putMap("owner", HMSDecoder.getHmsPeerSubset(owner))
406
+ }
407
+ data.putString("url", hmsWhiteboard.url)
408
+ return data
409
+ }
410
+
411
+ enum class JSWhiteboardState(val label: String) {
412
+ Start("STARTED"),
413
+ Stop("STOPPED"),
414
+ }
415
+
416
+ private fun getWhiteboardState(hmsWhiteboardState: State): String {
417
+ return when (hmsWhiteboardState) {
418
+ State.Started -> {
419
+ JSWhiteboardState.Start.label
420
+ }
421
+ State.Stopped -> {
422
+ JSWhiteboardState.Stop.label
423
+ }
424
+ }
425
+ }
426
+
427
+ fun getWhiteboardUpdateType(hmsWhiteboardUpdate: HMSWhiteboardUpdate): String {
428
+ return when (hmsWhiteboardUpdate) {
429
+ is HMSWhiteboardUpdate.Start -> {
430
+ JSWhiteboardState.Start.label
431
+ }
432
+ is HMSWhiteboardUpdate.Stop -> {
433
+ JSWhiteboardState.Stop.label
434
+ }
435
+ }
436
+ }
437
+ //endregion
413
438
  }
@@ -13,10 +13,12 @@ import live.hms.video.polls.network.PollLeaderboardResponse
13
13
  import live.hms.video.sdk.HMSActionResultListener
14
14
  import live.hms.video.sdk.HMSSDK
15
15
  import live.hms.video.sdk.HmsTypedActionResultListener
16
+ import live.hms.video.whiteboard.HMSWhiteboardUpdate
17
+ import live.hms.video.whiteboard.HMSWhiteboardUpdateListener
16
18
 
17
19
  class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRNSDK) {
18
20
  init {
19
- // Listen for poll updates
21
+ //region Listen for poll updates
20
22
  this.sdk.getHmsInteractivityCenter().pollUpdateListener =
21
23
  object : HmsPollUpdateListener {
22
24
  override fun onPollUpdate(
@@ -35,8 +37,34 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN
35
37
  rnSDK.delegate.emitEvent("ON_POLL_UPDATE", data)
36
38
  }
37
39
  }
40
+ //endregion
41
+
42
+ //region Listen for whiteboard updates
43
+ this.sdk.getHmsInteractivityCenter().setWhiteboardUpdateListener(
44
+ object : HMSWhiteboardUpdateListener {
45
+ override fun onUpdate(hmsWhiteboardUpdate: HMSWhiteboardUpdate) {
46
+ if (rnSDK.eventsEnableStatus["ON_WHITEBOARD_UPDATE"] != true) {
47
+ return
48
+ }
49
+ val data: WritableMap = Arguments.createMap()
50
+ when (hmsWhiteboardUpdate) {
51
+ is HMSWhiteboardUpdate.Start -> {
52
+ data.putMap("hmsWhiteboard", HMSInteractivityDecoder.getHMSWhiteboard(hmsWhiteboardUpdate.hmsWhiteboard))
53
+ data.putString("updateType", HMSInteractivityDecoder.getWhiteboardUpdateType(hmsWhiteboardUpdate))
54
+ }
55
+ is HMSWhiteboardUpdate.Stop -> {
56
+ data.putMap("hmsWhiteboard", HMSInteractivityDecoder.getHMSWhiteboard(hmsWhiteboardUpdate.hmsWhiteboard))
57
+ data.putString("updateType", HMSInteractivityDecoder.getWhiteboardUpdateType(hmsWhiteboardUpdate))
58
+ }
59
+ }
60
+ rnSDK.delegate.emitEvent("ON_WHITEBOARD_UPDATE", data)
61
+ }
62
+ },
63
+ )
64
+ //endregion
38
65
  }
39
66
 
67
+ //region poll methods
40
68
  fun quickStartPoll(
41
69
  data: ReadableMap,
42
70
  promise: Promise?,
@@ -159,4 +187,44 @@ class HMSRNInteractivityCenter(private val sdk: HMSSDK, private val rnSDK: HMSRN
159
187
  },
160
188
  )
161
189
  }
190
+ //endregion
191
+
192
+ //region whiteboard methods
193
+ fun startWhiteboard(
194
+ data: ReadableMap,
195
+ promise: Promise?,
196
+ ) {
197
+ val whiteboardTitle = data.getString("title")
198
+ if (whiteboardTitle == null) {
199
+ promise?.reject("6004", "whiteboard title is required")
200
+ return
201
+ }
202
+ sdk.getHmsInteractivityCenter().startWhiteboard(
203
+ whiteboardTitle,
204
+ object : HMSActionResultListener {
205
+ override fun onSuccess() {
206
+ promise?.resolve(true)
207
+ }
208
+
209
+ override fun onError(error: HMSException) {
210
+ promise?.reject(error.code.toString(), error.description)
211
+ }
212
+ },
213
+ )
214
+ }
215
+
216
+ fun stopWhiteboard(promise: Promise?) {
217
+ sdk.getHmsInteractivityCenter().stopWhiteboard(
218
+ object : HMSActionResultListener {
219
+ override fun onSuccess() {
220
+ promise?.resolve(true)
221
+ }
222
+
223
+ override fun onError(error: HMSException) {
224
+ promise?.reject(error.code.toString(), error.description)
225
+ }
226
+ },
227
+ )
228
+ }
229
+ //endregion
162
230
  }
@@ -32,4 +32,5 @@ struct HMSConstants {
32
32
  static let ON_SESSION_STORE_AVAILABLE = "ON_SESSION_STORE_AVAILABLE"
33
33
  static let ON_SESSION_STORE_CHANGED = "ON_SESSION_STORE_CHANGED"
34
34
  static let ON_POLL_UPDATE = "ON_POLL_UPDATE"
35
+ static let ON_WHITEBOARD_UPDATE = "ON_WHITEBOARD_UPDATE"
35
36
  }
@@ -451,7 +451,7 @@ class HMSDecoder: NSObject {
451
451
  }
452
452
 
453
453
  static private func getPermissions (_ permissions: HMSPermissions) -> [String: Any] {
454
- [
454
+ var permissionsDict: [String: Any] = [
455
455
  "endRoom": permissions.endRoom ?? false,
456
456
  "removeOthers": permissions.removeOthers ?? false,
457
457
  "browserRecording": permissions.browserRecording ?? false,
@@ -461,8 +461,16 @@ class HMSDecoder: NSObject {
461
461
  "unmute": permissions.unmute ?? false,
462
462
  "changeRole": permissions.changeRole ?? false,
463
463
  "pollRead": permissions.pollRead ?? false,
464
- "pollWrite": permissions.pollWrite ?? false
464
+ "pollWrite": permissions.pollWrite ?? false,
465
465
  ]
466
+ if let whiteboardPermissions = permissions.whiteboard {
467
+ permissionsDict["whiteboard"] = [
468
+ "admin": whiteboardPermissions.admin,
469
+ "read": whiteboardPermissions.read,
470
+ "write": whiteboardPermissions.write
471
+ ]
472
+ }
473
+ return permissionsDict
466
474
  }
467
475
 
468
476
  // MARK: - HMSRole Publish Settings and Utility functions
@@ -811,12 +819,24 @@ class HMSDecoder: NSObject {
811
819
  if let startedAt = variant.startedAt?.timeIntervalSince1970 {
812
820
  decodedVariant["startedAt"] = startedAt * 1000
813
821
  }
822
+ if let type = variant.playlistType {
823
+ decodedVariant["playlistType"] = getHLSVariantPlaylistType(from: type)
824
+ }
814
825
  variants.append(decodedVariant)
815
826
  }
816
827
  }
817
828
  return variants
818
829
  }
819
830
 
831
+ static func getHLSVariantPlaylistType(from type: HMSHLSPlaylistType) -> String {
832
+ switch type {
833
+ case .dvr:
834
+ return "DVR"
835
+ default:
836
+ return "NODVR"
837
+ }
838
+ }
839
+
820
840
  static func getHMSRTCStats(_ data: HMSRTCStats) -> [Any] {
821
841
  // [bitrateReceived, bitrateSent, bytesReceived, bytesSent, packetsLost, packetsReceived, roundTripTime]
822
842
  return [
@@ -7,6 +7,7 @@
7
7
  RCT_EXPORT_VIEW_PROPERTY(url, NSString);
8
8
  RCT_EXPORT_VIEW_PROPERTY(enableStats, BOOL);
9
9
  RCT_EXPORT_VIEW_PROPERTY(enableControls, BOOL);
10
+ RCT_EXPORT_VIEW_PROPERTY(onDataReturned, RCTDirectEventBlock);
10
11
  RCT_EXPORT_VIEW_PROPERTY(onHmsHlsPlaybackEvent, RCTDirectEventBlock);
11
12
  RCT_EXPORT_VIEW_PROPERTY(onHmsHlsStatsEvent, RCTDirectEventBlock);
12
13
 
@@ -18,5 +19,10 @@ RCT_EXTERN_METHOD(seekToLivePosition:(nonnull NSNumber *)node)
18
19
  RCT_EXTERN_METHOD(seekForward:(nonnull NSNumber *)node seconds:(nonnull NSNumber *)seconds)
19
20
  RCT_EXTERN_METHOD(seekBackward:(nonnull NSNumber *)node seconds:(nonnull NSNumber *)seconds)
20
21
  RCT_EXTERN_METHOD(setVolume:(nonnull NSNumber *)node level:(nonnull NSNumber *)level)
22
+ RCT_EXTERN_METHOD(areClosedCaptionSupported:(nonnull NSNumber *)node requestId:(nonnull NSNumber *)requestId)
23
+ RCT_EXTERN_METHOD(isClosedCaptionEnabled:(nonnull NSNumber *)node requestId:(nonnull NSNumber *)requestId)
24
+ RCT_EXTERN_METHOD(enableClosedCaption:(nonnull NSNumber *)node)
25
+ RCT_EXTERN_METHOD(disableClosedCaption:(nonnull NSNumber *)node)
26
+ RCT_EXTERN_METHOD(getPlayerDurationDetails:(nonnull NSNumber *)node requestId:(nonnull NSNumber *)requestId)
21
27
 
22
28
  @end