@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.
- package/android/build.gradle +9 -2
- package/android/local.properties +8 -1
- package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +11 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +94 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +32 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +38 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +6 -4
- package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +50 -25
- package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +69 -1
- package/ios/HMSConstants.swift +1 -0
- package/ios/HMSDecoder.swift +22 -2
- package/ios/HMSHLSPlayerManager.m +6 -0
- package/ios/HMSHLSPlayerManager.swift +144 -2
- package/ios/HMSInteractivityDecoder.swift +41 -0
- package/ios/HMSManager.m +12 -0
- package/ios/HMSManager.swift +20 -1
- package/ios/HMSRNInteractivityCenter.swift +41 -0
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/jatinnagar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Hmssdk.xcodeproj/xcuserdata/jatinnagar.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/lib/commonjs/classes/HMSEncoder.js +11 -1
- package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
- package/lib/commonjs/classes/HMSHLSPlaylistType.js +12 -0
- package/lib/commonjs/classes/HMSHLSPlaylistType.js.map +1 -0
- package/lib/commonjs/classes/HMSHLSVariant.js +2 -0
- package/lib/commonjs/classes/HMSHLSVariant.js.map +1 -1
- package/lib/commonjs/classes/HMSInteractivityCenter.js +58 -4
- package/lib/commonjs/classes/HMSInteractivityCenter.js.map +1 -1
- package/lib/commonjs/classes/HMSInteractivityEncoder.js +6 -0
- package/lib/commonjs/classes/HMSInteractivityEncoder.js.map +1 -1
- package/lib/commonjs/classes/HMSNoiseCancellationPlugin.js +1 -0
- package/lib/commonjs/classes/HMSNoiseCancellationPlugin.js.map +1 -1
- package/lib/commonjs/classes/HMSPermissions.js +2 -0
- package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
- package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js +6 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js.map +1 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js +11 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js +12 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js +12 -0
- package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
- package/lib/commonjs/classes/whiteboard/index.js +39 -0
- package/lib/commonjs/classes/whiteboard/index.js.map +1 -0
- package/lib/commonjs/classes/whiteboard/registerCallbacks.js +26 -0
- package/lib/commonjs/classes/whiteboard/registerCallbacks.js.map +1 -0
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +98 -2
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/hooks.js +16 -6
- package/lib/commonjs/components/HMSHLSPlayer/hooks.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/index.js +15 -1
- package/lib/commonjs/components/HMSHLSPlayer/index.js.map +1 -1
- package/lib/commonjs/index.js +24 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/stores/hls-player-playback-slice.js +6 -0
- package/lib/commonjs/stores/hls-player-playback-slice.js.map +1 -1
- package/lib/commonjs/stores/hls-player-stats-store.js +27 -15
- package/lib/commonjs/stores/hls-player-stats-store.js.map +1 -1
- package/lib/commonjs/stores/types.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/classes/HMSEncoder.js +11 -1
- package/lib/module/classes/HMSEncoder.js.map +1 -1
- package/lib/module/classes/HMSHLSPlaylistType.js +6 -0
- package/lib/module/classes/HMSHLSPlaylistType.js.map +1 -0
- package/lib/module/classes/HMSHLSVariant.js +2 -0
- package/lib/module/classes/HMSHLSVariant.js.map +1 -1
- package/lib/module/classes/HMSInteractivityCenter.js +58 -4
- package/lib/module/classes/HMSInteractivityCenter.js.map +1 -1
- package/lib/module/classes/HMSInteractivityEncoder.js +6 -0
- package/lib/module/classes/HMSInteractivityEncoder.js.map +1 -1
- package/lib/module/classes/HMSNoiseCancellationPlugin.js +1 -0
- package/lib/module/classes/HMSNoiseCancellationPlugin.js.map +1 -1
- package/lib/module/classes/HMSPermissions.js +2 -0
- package/lib/module/classes/HMSPermissions.js.map +1 -1
- package/lib/module/classes/whiteboard/HMSWhiteboard.js +2 -0
- package/lib/module/classes/whiteboard/HMSWhiteboard.js.map +1 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js +5 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardState.js +6 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js +6 -0
- package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
- package/lib/module/classes/whiteboard/index.js +4 -0
- package/lib/module/classes/whiteboard/index.js.map +1 -0
- package/lib/module/classes/whiteboard/registerCallbacks.js +18 -0
- package/lib/module/classes/whiteboard/registerCallbacks.js.map +1 -0
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +101 -5
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/hooks.js +12 -4
- package/lib/module/components/HMSHLSPlayer/hooks.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/index.js +1 -1
- package/lib/module/components/HMSHLSPlayer/index.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/stores/hls-player-playback-slice.js +6 -0
- package/lib/module/stores/hls-player-playback-slice.js.map +1 -1
- package/lib/module/stores/hls-player-stats-store.js +27 -15
- package/lib/module/stores/hls-player-stats-store.js.map +1 -1
- package/lib/module/stores/types.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/classes/HMSEncoder.d.ts +2 -0
- package/lib/typescript/classes/HMSHLSPlaylistType.d.ts +4 -0
- package/lib/typescript/classes/HMSHLSVariant.d.ts +3 -0
- package/lib/typescript/classes/HMSInteractivityCenter.d.ts +19 -2
- package/lib/typescript/classes/HMSInteractivityEncoder.d.ts +2 -0
- package/lib/typescript/classes/HMSNoiseCancellationPlugin.d.ts +1 -0
- package/lib/typescript/classes/HMSPermissions.d.ts +7 -0
- package/lib/typescript/classes/whiteboard/HMSWhiteboard.d.ts +10 -0
- package/lib/typescript/classes/whiteboard/HMSWhiteboardListenerActions.d.ts +3 -0
- package/lib/typescript/classes/whiteboard/HMSWhiteboardState.d.ts +4 -0
- package/lib/typescript/classes/whiteboard/HMSWhiteboardUpdateType.d.ts +4 -0
- package/lib/typescript/classes/whiteboard/index.d.ts +3 -0
- package/lib/typescript/classes/whiteboard/registerCallbacks.d.ts +8 -0
- package/lib/typescript/components/HMSHLSPlayer/HMSHLSPlayer.d.ts +6 -0
- package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +5 -1
- package/lib/typescript/components/HMSHLSPlayer/hooks.d.ts +3 -0
- package/lib/typescript/components/HMSHLSPlayer/index.d.ts +1 -1
- package/lib/typescript/index.d.ts +2 -0
- package/lib/typescript/stores/hls-player-stats-store.d.ts +4 -3
- package/lib/typescript/stores/types.d.ts +7 -1
- package/lib/typescript/types.d.ts +9 -0
- package/package.json +1 -1
- package/sdk-versions.json +2 -2
- package/src/classes/HMSEncoder.ts +13 -0
- package/src/classes/HMSHLSPlaylistType.ts +4 -0
- package/src/classes/HMSHLSVariant.ts +5 -0
- package/src/classes/HMSInteractivityCenter.ts +89 -10
- package/src/classes/HMSInteractivityEncoder.ts +8 -0
- package/src/classes/HMSNoiseCancellationPlugin.ts +1 -0
- package/src/classes/HMSPermissions.ts +9 -0
- package/src/classes/whiteboard/HMSWhiteboard.tsx +16 -0
- package/src/classes/whiteboard/HMSWhiteboardListenerActions.ts +3 -0
- package/src/classes/whiteboard/HMSWhiteboardState.tsx +4 -0
- package/src/classes/whiteboard/HMSWhiteboardUpdateType.tsx +4 -0
- package/src/classes/whiteboard/index.ts +3 -0
- package/src/classes/whiteboard/registerCallbacks.ts +34 -0
- package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +158 -4
- package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +12 -0
- package/src/components/HMSHLSPlayer/hooks.ts +16 -4
- package/src/components/HMSHLSPlayer/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/stores/hls-player-playback-slice.ts +8 -0
- package/src/stores/hls-player-stats-store.ts +28 -18
- package/src/stores/types.ts +9 -1
- package/src/types.ts +15 -0
package/android/build.gradle
CHANGED
|
@@ -12,7 +12,14 @@ buildscript {
|
|
|
12
12
|
if (ext.has("kotlinVersion")) {
|
|
13
13
|
ext.kotlinVersion()
|
|
14
14
|
} else {
|
|
15
|
-
ext.safeExtGet("kotlinVersion", "1.
|
|
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:${
|
|
40
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getKotlinGradlePluginVersion()}"
|
|
34
41
|
}
|
|
35
42
|
}
|
|
36
43
|
|
package/android/local.properties
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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 {
|
package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt
CHANGED
|
@@ -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
|
}
|
package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt
CHANGED
|
@@ -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
|
}
|
package/ios/HMSConstants.swift
CHANGED
|
@@ -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
|
}
|
package/ios/HMSDecoder.swift
CHANGED
|
@@ -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
|