@100mslive/react-native-hms 1.10.4 → 1.10.6-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/android/build.gradle +9 -2
  2. package/android/local.properties +1 -8
  3. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +8 -0
  4. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +52 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +6 -4
  6. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSInteractivityDecoder.kt +50 -25
  7. package/android/src/main/java/com/reactnativehmssdk/Interactivity/HMSRNInteractivityCenter.kt +69 -1
  8. package/ios/HMSConstants.swift +1 -0
  9. package/ios/HMSDecoder.swift +9 -1
  10. package/ios/HMSHLSPlayerManager.swift +4 -1
  11. package/ios/HMSHelper.swift +28 -2
  12. package/ios/HMSInteractivityDecoder.swift +41 -0
  13. package/ios/HMSManager.m +34 -0
  14. package/ios/HMSManager.swift +66 -1
  15. package/ios/HMSRNInteractivityCenter.swift +41 -0
  16. package/ios/HMSRNSDK.swift +201 -3
  17. package/lib/commonjs/classes/HMSInteractivityCenter.js +58 -4
  18. package/lib/commonjs/classes/HMSInteractivityCenter.js.map +1 -1
  19. package/lib/commonjs/classes/HMSInteractivityEncoder.js +6 -0
  20. package/lib/commonjs/classes/HMSInteractivityEncoder.js.map +1 -1
  21. package/lib/commonjs/classes/HMSPermissions.js +2 -0
  22. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  23. package/lib/commonjs/classes/HMSSessionStore.js +1 -1
  24. package/lib/commonjs/classes/HMSSessionStore.js.map +1 -1
  25. package/lib/commonjs/classes/HMSVideoTrackSettings.js +3 -2
  26. package/lib/commonjs/classes/HMSVideoTrackSettings.js.map +1 -1
  27. package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js +6 -0
  28. package/lib/commonjs/classes/whiteboard/HMSWhiteboard.js.map +1 -0
  29. package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js +11 -0
  30. package/lib/commonjs/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
  31. package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js +12 -0
  32. package/lib/commonjs/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
  33. package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js +12 -0
  34. package/lib/commonjs/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
  35. package/lib/commonjs/classes/whiteboard/index.js +39 -0
  36. package/lib/commonjs/classes/whiteboard/index.js.map +1 -0
  37. package/lib/commonjs/classes/whiteboard/registerCallbacks.js +26 -0
  38. package/lib/commonjs/classes/whiteboard/registerCallbacks.js.map +1 -0
  39. package/lib/commonjs/index.js +12 -0
  40. package/lib/commonjs/index.js.map +1 -1
  41. package/lib/module/classes/HMSInteractivityCenter.js +58 -4
  42. package/lib/module/classes/HMSInteractivityCenter.js.map +1 -1
  43. package/lib/module/classes/HMSInteractivityEncoder.js +6 -0
  44. package/lib/module/classes/HMSInteractivityEncoder.js.map +1 -1
  45. package/lib/module/classes/HMSPermissions.js +2 -0
  46. package/lib/module/classes/HMSPermissions.js.map +1 -1
  47. package/lib/module/classes/HMSSessionStore.js +1 -1
  48. package/lib/module/classes/HMSSessionStore.js.map +1 -1
  49. package/lib/module/classes/HMSVideoTrackSettings.js +3 -2
  50. package/lib/module/classes/HMSVideoTrackSettings.js.map +1 -1
  51. package/lib/module/classes/whiteboard/HMSWhiteboard.js +2 -0
  52. package/lib/module/classes/whiteboard/HMSWhiteboard.js.map +1 -0
  53. package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js +5 -0
  54. package/lib/module/classes/whiteboard/HMSWhiteboardListenerActions.js.map +1 -0
  55. package/lib/module/classes/whiteboard/HMSWhiteboardState.js +6 -0
  56. package/lib/module/classes/whiteboard/HMSWhiteboardState.js.map +1 -0
  57. package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js +6 -0
  58. package/lib/module/classes/whiteboard/HMSWhiteboardUpdateType.js.map +1 -0
  59. package/lib/module/classes/whiteboard/index.js +4 -0
  60. package/lib/module/classes/whiteboard/index.js.map +1 -0
  61. package/lib/module/classes/whiteboard/registerCallbacks.js +18 -0
  62. package/lib/module/classes/whiteboard/registerCallbacks.js.map +1 -0
  63. package/lib/module/index.js +1 -0
  64. package/lib/module/index.js.map +1 -1
  65. package/lib/typescript/classes/HMSInteractivityCenter.d.ts +19 -2
  66. package/lib/typescript/classes/HMSInteractivityEncoder.d.ts +2 -0
  67. package/lib/typescript/classes/HMSPermissions.d.ts +7 -0
  68. package/lib/typescript/classes/HMSVideoTrackSettings.d.ts +11 -0
  69. package/lib/typescript/classes/whiteboard/HMSWhiteboard.d.ts +10 -0
  70. package/lib/typescript/classes/whiteboard/HMSWhiteboardListenerActions.d.ts +3 -0
  71. package/lib/typescript/classes/whiteboard/HMSWhiteboardState.d.ts +4 -0
  72. package/lib/typescript/classes/whiteboard/HMSWhiteboardUpdateType.d.ts +4 -0
  73. package/lib/typescript/classes/whiteboard/index.d.ts +3 -0
  74. package/lib/typescript/classes/whiteboard/registerCallbacks.d.ts +8 -0
  75. package/lib/typescript/index.d.ts +1 -0
  76. package/package.json +1 -1
  77. package/sdk-versions.json +2 -2
  78. package/src/classes/HMSInteractivityCenter.ts +89 -10
  79. package/src/classes/HMSInteractivityEncoder.ts +8 -0
  80. package/src/classes/HMSPermissions.ts +9 -0
  81. package/src/classes/HMSSessionStore.ts +0 -3
  82. package/src/classes/HMSVideoTrackSettings.ts +15 -0
  83. package/src/classes/whiteboard/HMSWhiteboard.tsx +16 -0
  84. package/src/classes/whiteboard/HMSWhiteboardListenerActions.ts +3 -0
  85. package/src/classes/whiteboard/HMSWhiteboardState.tsx +4 -0
  86. package/src/classes/whiteboard/HMSWhiteboardUpdateType.tsx +4 -0
  87. package/src/classes/whiteboard/index.ts +3 -0
  88. package/src/classes/whiteboard/registerCallbacks.ts +34 -0
  89. package/src/index.ts +1 -0
  90. package/ios/Hmssdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  91. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  92. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/jatinnagar.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  93. package/ios/Hmssdk.xcodeproj/xcuserdata/jatinnagar.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
@@ -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,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
1
+ sdk.dir=/Users/yogesh/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
  }
@@ -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(
@@ -1569,6 +1607,20 @@ class HMSManager(reactContext: ReactApplicationContext) :
1569
1607
  }
1570
1608
  // endregion
1571
1609
 
1610
+ // region Warning on JS side
1611
+ @ReactMethod
1612
+ fun addListener(eventName: String) {
1613
+ // Keep: Required for RN built in Event Emitter Calls.
1614
+ // Fixes Warning - `new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method.
1615
+ }
1616
+
1617
+ @ReactMethod
1618
+ fun removeListeners(count: Int) {
1619
+ // Keep: Required for RN built in Event Emitter Calls.
1620
+ // Fixes Warning - `new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method.
1621
+ }
1622
+ // endregion
1623
+
1572
1624
  // region ActivityLifecycleCallbacks
1573
1625
 
1574
1626
  override fun onActivityCreated(
@@ -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,
@@ -463,6 +463,14 @@ class HMSDecoder: NSObject {
463
463
  "pollRead": permissions.pollRead ?? false,
464
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
@@ -339,7 +339,10 @@ class HMSHLSPlayer: UIView {
339
339
  attachPlayerPlaybackListeners()
340
340
 
341
341
  hmsHLSPlayerViewController?.showsPlaybackControls = false
342
- hmsHLSPlayerViewController?.allowsPictureInPicturePlayback = false
342
+ hmsHLSPlayerViewController?.allowsPictureInPicturePlayback = true
343
+ if #available(iOS 14.2, *) {
344
+ hmsHLSPlayerViewController?.canStartPictureInPictureAutomaticallyFromInline = true
345
+ }
343
346
  }
344
347
 
345
348
  required init?(coder: NSCoder) {
@@ -167,7 +167,7 @@ class HMSHelper: NSObject {
167
167
  isPrebuilt: isPrebuilt)
168
168
  }
169
169
 
170
- static func getLocalVideoSettings(_ settings: NSDictionary?) -> HMSVideoTrackSettings? {
170
+ static func getLocalVideoSettings(_ settings: NSDictionary?, _ videoPlugin: HMSVideoPlugin?) -> HMSVideoTrackSettings? {
171
171
  if settings === nil {
172
172
  return nil
173
173
  }
@@ -180,6 +180,7 @@ class HMSHelper: NSObject {
180
180
  let cameraFacingEncoded = HMSHelper.getCameraFacing(cameraFacing)
181
181
  let initialState = settings?.value(forKey: "initialState") as? String
182
182
  let initialStateEncoded = HMSHelper.getHMSTrackSettingsInitState(initialState)
183
+ let videoPlugins: [HMSVideoPlugin]? = if let videoPlugin = videoPlugin { [videoPlugin] } else { nil }
183
184
  let hmsTrackSettings = HMSVideoTrackSettings(codec: codec,
184
185
  resolution: resolution,
185
186
  maxBitrate: maxBitrate,
@@ -188,7 +189,7 @@ class HMSHelper: NSObject {
188
189
  simulcastSettings: nil,
189
190
  trackDescription: trackDescription,
190
191
  initialMuteState: initialStateEncoded,
191
- videoPlugins: nil)
192
+ videoPlugins: videoPlugins)
192
193
  return hmsTrackSettings
193
194
  }
194
195
 
@@ -291,6 +292,31 @@ class HMSHelper: NSObject {
291
292
  return nil
292
293
  }
293
294
 
295
+ static func getHMSVideoPlugin(_ videoPluginData: NSDictionary?) -> HMSVideoPlugin? {
296
+ guard let videoPluginDict = videoPluginData else {
297
+ print(#function, "No Video Plugin data passed!")
298
+ return nil
299
+ }
300
+ guard let videoPluginType = videoPluginDict.value(forKey: "type") as? String else {
301
+ print(#function, "No HMSVideoPlugin `type` passed!")
302
+ return nil
303
+ }
304
+ switch videoPluginType {
305
+ case "HMSVirtualBackgroundPlugin":
306
+ if #available(iOS 15.0, *) {
307
+ return HMSVirtualBackgroundPlugin(backgroundImage: nil, blurRadius: 100)
308
+ } else {
309
+ print(#function, "HMSVirtualBackgroundPlugin is not available below iOS 15.0")
310
+ return nil
311
+ }
312
+ case "HMSVideoFilterPlugin":
313
+ return HMSVideoFilterPlugin()
314
+ default:
315
+ print(#function, "Unknown HMSVideoPlugin `type` passed!")
316
+ return nil
317
+ }
318
+ }
319
+
294
320
  static func getAudioMixerSourceMap() -> [String: HMSAudioNode]? {
295
321
  return self.audioMixerSourceHashMap
296
322
  }
@@ -270,4 +270,45 @@ class HMSInteractivityDecoder {
270
270
 
271
271
  return result
272
272
  }
273
+
274
+ static func getHMSWhiteboard(_ hmsWhiteboard: HMSWhiteboard) -> [String: Any] {
275
+ var result: [String: Any] = [
276
+ "id": hmsWhiteboard.id,
277
+ "state": getWhiteboardState(hmsWhiteboard.state)
278
+ ]
279
+ if let owner = hmsWhiteboard.owner {
280
+ result["owner"] = HMSDecoder.getHmsPeerSubset(owner)
281
+ }
282
+ if let title = hmsWhiteboard.title {
283
+ result["title"] = title
284
+ }
285
+ if let urlString = hmsWhiteboard.url?.absoluteString {
286
+ result["url"] = urlString
287
+ }
288
+ return result
289
+ }
290
+
291
+ static func getWhiteboardState(_ state: HMSWhiteboard.WhiteboardState) -> String {
292
+ switch state {
293
+ case .started:
294
+ return "STARTED"
295
+ case .stopped:
296
+ return "STOPPED"
297
+ @unknown default:
298
+ print("@unknown default case: Invalid HMSWhiteboardUpdateType")
299
+ return "STOPPED"
300
+ }
301
+ }
302
+
303
+ static func getWhiteboardUpdateType(_ type: HMSWhiteboardUpdateType) -> String {
304
+ switch type {
305
+ case .started:
306
+ return "STARTED"
307
+ case .stopped:
308
+ return "STOPPED"
309
+ @unknown default:
310
+ print("@unknown default case: Invalid HMSWhiteboardUpdateType")
311
+ return "STOPPED"
312
+ }
313
+ }
273
314
  }
package/ios/HMSManager.m CHANGED
@@ -353,4 +353,38 @@ RCT_EXTERN_METHOD(isNoiseCancellationPluginAvailable
353
353
  : (RCTPromiseResolveBlock)resolve
354
354
  : (RCTPromiseRejectBlock)reject)
355
355
 
356
+ #pragma mark - Noise Cancellation Plugin
357
+
358
+ RCT_EXTERN_METHOD(enableVideoPlugin
359
+ : (NSDictionary)data
360
+ : (RCTPromiseResolveBlock)resolve
361
+ : (RCTPromiseRejectBlock)reject)
362
+
363
+ RCT_EXTERN_METHOD(disableVideoPlugin
364
+ : (NSDictionary)data
365
+ : (RCTPromiseResolveBlock)resolve
366
+ : (RCTPromiseRejectBlock)reject)
367
+
368
+ RCT_EXTERN_METHOD(changeVirtualBackground
369
+ : (NSDictionary)data
370
+ : (RCTPromiseResolveBlock)resolve
371
+ : (RCTPromiseRejectBlock)reject)
372
+
373
+ RCT_EXTERN_METHOD(setVideoFilterParameter
374
+ : (NSDictionary)data
375
+ : (RCTPromiseResolveBlock)resolve
376
+ : (RCTPromiseRejectBlock)reject)
377
+
378
+ #pragma mark - Interactivity Center - Whiteboard
379
+
380
+ RCT_EXTERN_METHOD(startWhiteboard
381
+ : (NSDictionary)data
382
+ : (RCTPromiseResolveBlock)resolve
383
+ : (RCTPromiseRejectBlock)reject)
384
+
385
+ RCT_EXTERN_METHOD(stopWhiteboard
386
+ : (NSDictionary)data
387
+ : (RCTPromiseResolveBlock)resolve
388
+ : (RCTPromiseRejectBlock)reject)
389
+
356
390
  @end
@@ -37,7 +37,7 @@ class HMSManager: RCTEventEmitter {
37
37
  }
38
38
 
39
39
  override func supportedEvents() -> [String]! {
40
- return [ON_JOIN, ON_PREVIEW, ON_ROOM_UPDATE, ON_PEER_UPDATE, ON_TRACK_UPDATE, ON_ERROR, ON_MESSAGE, ON_SPEAKER, RECONNECTING, RECONNECTED, ON_ROLE_CHANGE_REQUEST, ON_CHANGE_TRACK_STATE_REQUEST, ON_REMOVED_FROM_ROOM, ON_RTC_STATS, ON_LOCAL_AUDIO_STATS, ON_LOCAL_VIDEO_STATS, ON_REMOTE_AUDIO_STATS, ON_REMOTE_VIDEO_STATS, ON_AUDIO_DEVICE_CHANGED, HMSConstants.ON_SESSION_STORE_AVAILABLE, HMSConstants.ON_SESSION_STORE_CHANGED, HMSConstants.ON_PEER_LIST_UPDATED, HMSConstants.ON_POLL_UPDATE]
40
+ return [ON_JOIN, ON_PREVIEW, ON_ROOM_UPDATE, ON_PEER_UPDATE, ON_TRACK_UPDATE, ON_ERROR, ON_MESSAGE, ON_SPEAKER, RECONNECTING, RECONNECTED, ON_ROLE_CHANGE_REQUEST, ON_CHANGE_TRACK_STATE_REQUEST, ON_REMOVED_FROM_ROOM, ON_RTC_STATS, ON_LOCAL_AUDIO_STATS, ON_LOCAL_VIDEO_STATS, ON_REMOTE_AUDIO_STATS, ON_REMOTE_VIDEO_STATS, ON_AUDIO_DEVICE_CHANGED, HMSConstants.ON_SESSION_STORE_AVAILABLE, HMSConstants.ON_SESSION_STORE_CHANGED, HMSConstants.ON_PEER_LIST_UPDATED, HMSConstants.ON_POLL_UPDATE, HMSConstants.ON_WHITEBOARD_UPDATE]
41
41
  }
42
42
 
43
43
  // MARK: - HMS SDK Delegate Callbacks
@@ -762,4 +762,69 @@ class HMSManager: RCTEventEmitter {
762
762
  }
763
763
  rnsdk.isNoiseCancellationPluginAvailable(data, resolve, reject)
764
764
  }
765
+
766
+ // MARK: - Video Plugin Functions
767
+
768
+ @objc
769
+ func enableVideoPlugin( _ data: NSDictionary,
770
+ _ resolve: RCTPromiseResolveBlock?,
771
+ _ reject: RCTPromiseRejectBlock?) {
772
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection) else {
773
+ reject?("6004", "HMSRNSDK instance not found!", nil)
774
+ return
775
+ }
776
+ rnsdk.enableVideoPlugin(data, resolve, reject)
777
+ }
778
+
779
+ @objc
780
+ func disableVideoPlugin(_ data: NSDictionary,
781
+ _ resolve: RCTPromiseResolveBlock?,
782
+ _ reject: RCTPromiseRejectBlock?) {
783
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection) else {
784
+ reject?("6004", "HMSRNSDK instance not found!", nil)
785
+ return
786
+ }
787
+ rnsdk.disableVideoPlugin(data, resolve, reject)
788
+ }
789
+
790
+ @objc
791
+ func changeVirtualBackground(_ data: NSDictionary,
792
+ _ resolve: RCTPromiseResolveBlock?,
793
+ _ reject: RCTPromiseRejectBlock?) {
794
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection) else {
795
+ reject?("6004", "HMSRNSDK instance not found!", nil)
796
+ return
797
+ }
798
+ rnsdk.changeVirtualBackground(data, resolve, reject)
799
+ }
800
+
801
+ @objc
802
+ func setVideoFilterParameter(_ data: NSDictionary,
803
+ _ resolve: RCTPromiseResolveBlock?,
804
+ _ reject: RCTPromiseRejectBlock?) {
805
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection) else {
806
+ reject?("6004", "HMSRNSDK instance not found!", nil)
807
+ return
808
+ }
809
+ rnsdk.setVideoFilterParameter(data, resolve, reject)
810
+ }
811
+
812
+ // MARK: - Interactivity Center - Whiteboard
813
+ @objc
814
+ func startWhiteboard(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
815
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection), let interactivity = rnsdk.interactivity else {
816
+ reject?("6004", "HMSRNSDK instance not found!", nil)
817
+ return
818
+ }
819
+ interactivity.startWhiteboard(resolve, reject)
820
+ }
821
+
822
+ @objc
823
+ func stopWhiteboard(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
824
+ guard let rnsdk = HMSHelper.getHms(data, hmsCollection), let interactivity = rnsdk.interactivity else {
825
+ reject?("6004", "HMSRNSDK instance not found!", nil)
826
+ return
827
+ }
828
+ interactivity.stopWhiteboard(resolve, reject)
829
+ }
765
830
  }
@@ -27,8 +27,27 @@ class HMSRNInteractivityCenter {
27
27
  ["update": update.rawValue, "updatedPoll": HMSInteractivityDecoder.getHMSPoll(updatedPoll)]
28
28
  )
29
29
  }
30
+
31
+ hmssdk.interactivityCenter.addWhiteboardUpdateListener { [weak self] hmsWhiteboard, hmsWhiteboardUpdateType in
32
+ guard let self = self else { return }
33
+ guard let enabledEvents = self.hmsrnsdk?.eventsEnableStatus, enabledEvents[HMSConstants.ON_WHITEBOARD_UPDATE] == true else {
34
+ print("HMSConstants.ON_WHITEBOARD_UPDATE event is not enabled")
35
+ return
36
+ }
37
+ var hmsWhiteboardDict = HMSInteractivityDecoder.getHMSWhiteboard(hmsWhiteboard)
38
+ hmsWhiteboardDict["isOwner"] = hmsWhiteboard.owner?.peerID == self.hmssdk?.localPeer?.peerID
39
+
40
+ self.hmsrnsdk?.delegate?.emitEvent(
41
+ HMSConstants.ON_WHITEBOARD_UPDATE,
42
+ [
43
+ "hmsWhiteboard": hmsWhiteboardDict,
44
+ "updateType": HMSInteractivityDecoder.getWhiteboardUpdateType(hmsWhiteboardUpdateType)
45
+ ]
46
+ )
47
+ }
30
48
  }
31
49
 
50
+ // MARK: Poll Methods
32
51
  func quickStartPoll(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
33
52
  let pollBuilder = HMSInteractivityHelper.getPollBuilderFromDict(data, sdkRoles: hmssdk?.roles)
34
53
 
@@ -117,4 +136,26 @@ class HMSRNInteractivityCenter {
117
136
  }
118
137
  }
119
138
  }
139
+
140
+ // MARK: - Whiteboard Methods
141
+
142
+ func startWhiteboard(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
143
+ self.hmssdk?.interactivityCenter.startWhiteboard { success, error in
144
+ if let error = error {
145
+ reject?("6004", error.localizedDescription, nil)
146
+ return
147
+ }
148
+ resolve?(success)
149
+ }
150
+ }
151
+
152
+ func stopWhiteboard(_ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
153
+ self.hmssdk?.interactivityCenter.stopWhiteboard { success, error in
154
+ if let error = error {
155
+ reject?("6004", error.localizedDescription, nil)
156
+ return
157
+ }
158
+ resolve?(success)
159
+ }
160
+ }
120
161
  }