@100mslive/react-native-hms 1.5.0 → 1.6.1

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 (121) hide show
  1. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +44 -44
  2. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +12 -12
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +35 -35
  4. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +52 -24
  5. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +245 -62
  6. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +4 -3
  7. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +40 -33
  8. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +41 -41
  9. package/android/src/main/java/com/reactnativehmssdk/PipActionReceiver.kt +2 -2
  10. package/ios/HMSConstants.swift +3 -1
  11. package/ios/HMSDecoder.swift +1 -1
  12. package/ios/HMSHelper.swift +44 -7
  13. package/ios/HMSManager.m +8 -0
  14. package/ios/HMSManager.swift +35 -1
  15. package/ios/HMSRNSDK.swift +268 -38
  16. package/lib/commonjs/classes/HMSAudioMixerSource.js.map +1 -1
  17. package/lib/commonjs/classes/HMSAudioTrackSettings.js +14 -0
  18. package/lib/commonjs/classes/HMSAudioTrackSettings.js.map +1 -1
  19. package/lib/commonjs/classes/HMSEncoder.js +2 -1
  20. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  21. package/lib/commonjs/classes/HMSIOSAudioMode.js +13 -0
  22. package/lib/commonjs/classes/HMSIOSAudioMode.js.map +1 -0
  23. package/lib/commonjs/classes/HMSLocalAudioTrack.js.map +1 -1
  24. package/lib/commonjs/classes/HMSLocalVideoTrack.js.map +1 -1
  25. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  26. package/lib/commonjs/classes/HMSNativeEventEmitter.js.map +1 -1
  27. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  28. package/lib/commonjs/classes/HMSPeersCache.js.map +1 -1
  29. package/lib/commonjs/classes/HMSRemoteAudioTrack.js.map +1 -1
  30. package/lib/commonjs/classes/HMSRemoteVideoTrack.js.map +1 -1
  31. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  32. package/lib/commonjs/classes/HMSRoomCache.js.map +1 -1
  33. package/lib/commonjs/classes/HMSSDK.js +50 -0
  34. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  35. package/lib/commonjs/classes/HMSSessionStore.js +173 -0
  36. package/lib/commonjs/classes/HMSSessionStore.js.map +1 -0
  37. package/lib/commonjs/classes/HMSUpdateListenerActions.js +8 -0
  38. package/lib/commonjs/classes/HMSUpdateListenerActions.js.map +1 -1
  39. package/lib/commonjs/classes/HMSVideoTrackSettings.js +5 -0
  40. package/lib/commonjs/classes/HMSVideoTrackSettings.js.map +1 -1
  41. package/lib/commonjs/classes/HmsView.js +19 -29
  42. package/lib/commonjs/classes/HmsView.js.map +1 -1
  43. package/lib/commonjs/index.js +12 -0
  44. package/lib/commonjs/index.js.map +1 -1
  45. package/lib/commonjs/utils/emitter/EventEmitter.js +162 -0
  46. package/lib/commonjs/utils/emitter/EventEmitter.js.map +1 -0
  47. package/lib/commonjs/utils/emitter/_EmitterSubscription.js +46 -0
  48. package/lib/commonjs/utils/emitter/_EmitterSubscription.js.map +1 -0
  49. package/lib/commonjs/utils/emitter/_EventSubscription.js +36 -0
  50. package/lib/commonjs/utils/emitter/_EventSubscription.js.map +1 -0
  51. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js +90 -0
  52. package/lib/commonjs/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  53. package/lib/commonjs/utils/index.js +17 -0
  54. package/lib/commonjs/utils/index.js.map +1 -0
  55. package/lib/module/classes/HMSAudioMixerSource.js.map +1 -1
  56. package/lib/module/classes/HMSAudioTrackSettings.js +14 -0
  57. package/lib/module/classes/HMSAudioTrackSettings.js.map +1 -1
  58. package/lib/module/classes/HMSEncoder.js +2 -1
  59. package/lib/module/classes/HMSEncoder.js.map +1 -1
  60. package/lib/module/classes/HMSIOSAudioMode.js +6 -0
  61. package/lib/module/classes/HMSIOSAudioMode.js.map +1 -0
  62. package/lib/module/classes/HMSLocalAudioTrack.js.map +1 -1
  63. package/lib/module/classes/HMSLocalVideoTrack.js.map +1 -1
  64. package/lib/module/classes/HMSLogger.js.map +1 -1
  65. package/lib/module/classes/HMSNativeEventEmitter.js.map +1 -1
  66. package/lib/module/classes/HMSPeer.js.map +1 -1
  67. package/lib/module/classes/HMSPeersCache.js.map +1 -1
  68. package/lib/module/classes/HMSRemoteAudioTrack.js.map +1 -1
  69. package/lib/module/classes/HMSRemoteVideoTrack.js.map +1 -1
  70. package/lib/module/classes/HMSRoom.js.map +1 -1
  71. package/lib/module/classes/HMSRoomCache.js.map +1 -1
  72. package/lib/module/classes/HMSSDK.js +50 -0
  73. package/lib/module/classes/HMSSDK.js.map +1 -1
  74. package/lib/module/classes/HMSSessionStore.js +166 -0
  75. package/lib/module/classes/HMSSessionStore.js.map +1 -0
  76. package/lib/module/classes/HMSUpdateListenerActions.js +8 -0
  77. package/lib/module/classes/HMSUpdateListenerActions.js.map +1 -1
  78. package/lib/module/classes/HMSVideoTrackSettings.js +5 -0
  79. package/lib/module/classes/HMSVideoTrackSettings.js.map +1 -1
  80. package/lib/module/classes/HmsView.js +21 -31
  81. package/lib/module/classes/HmsView.js.map +1 -1
  82. package/lib/module/index.js +1 -0
  83. package/lib/module/index.js.map +1 -1
  84. package/lib/module/utils/emitter/EventEmitter.js +151 -0
  85. package/lib/module/utils/emitter/EventEmitter.js.map +1 -0
  86. package/lib/module/utils/emitter/_EmitterSubscription.js +39 -0
  87. package/lib/module/utils/emitter/_EmitterSubscription.js.map +1 -0
  88. package/lib/module/utils/emitter/_EventSubscription.js +29 -0
  89. package/lib/module/utils/emitter/_EventSubscription.js.map +1 -0
  90. package/lib/module/utils/emitter/_EventSubscriptionVendor.js +83 -0
  91. package/lib/module/utils/emitter/_EventSubscriptionVendor.js.map +1 -0
  92. package/lib/module/utils/index.js +2 -0
  93. package/lib/module/utils/index.js.map +1 -0
  94. package/lib/typescript/classes/HMSAudioTrackSettings.d.ts +14 -0
  95. package/lib/typescript/classes/HMSIOSAudioMode.d.ts +4 -0
  96. package/lib/typescript/classes/HMSSDK.d.ts +16 -0
  97. package/lib/typescript/classes/HMSSessionStore.d.ts +63 -0
  98. package/lib/typescript/classes/HMSUpdateListenerActions.d.ts +9 -1
  99. package/lib/typescript/classes/HMSVideoTrackSettings.d.ts +5 -0
  100. package/lib/typescript/index.d.ts +2 -0
  101. package/lib/typescript/utils/emitter/EventEmitter.d.ts +91 -0
  102. package/lib/typescript/utils/emitter/_EmitterSubscription.d.ts +29 -0
  103. package/lib/typescript/utils/emitter/_EventSubscription.d.ts +19 -0
  104. package/lib/typescript/utils/emitter/_EventSubscriptionVendor.d.ts +44 -0
  105. package/lib/typescript/utils/index.d.ts +1 -0
  106. package/package.json +21 -2
  107. package/sdk-versions.json +2 -2
  108. package/src/classes/HMSAudioTrackSettings.ts +16 -0
  109. package/src/classes/HMSEncoder.ts +1 -0
  110. package/src/classes/HMSIOSAudioMode.ts +4 -0
  111. package/src/classes/HMSSDK.tsx +70 -4
  112. package/src/classes/HMSSessionStore.ts +209 -0
  113. package/src/classes/HMSUpdateListenerActions.ts +8 -0
  114. package/src/classes/HMSVideoTrackSettings.ts +5 -0
  115. package/src/classes/HmsView.tsx +21 -32
  116. package/src/index.ts +5 -0
  117. package/src/utils/emitter/EventEmitter.ts +160 -0
  118. package/src/utils/emitter/_EmitterSubscription.ts +44 -0
  119. package/src/utils/emitter/_EventSubscription.ts +28 -0
  120. package/src/utils/emitter/_EventSubscriptionVendor.ts +89 -0
  121. package/src/utils/index.ts +1 -0
@@ -28,7 +28,7 @@ class HMSSDKViewManager : SimpleViewManager<HMSView>() {
28
28
  return MapBuilder.builder<String, Any>()
29
29
  .put(
30
30
  "topChange",
31
- MapBuilder.of("phasedRegistrationNames", MapBuilder.of("bubbled", "onChange"))
31
+ MapBuilder.of("phasedRegistrationNames", MapBuilder.of("bubbled", "onChange")),
32
32
  )
33
33
  .build()
34
34
  }
@@ -36,7 +36,7 @@ class HMSSDKViewManager : SimpleViewManager<HMSView>() {
36
36
  override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any>? {
37
37
  return MapBuilder.of(
38
38
  "captureFrame",
39
- MapBuilder.of("registrationName", "onDataReturned")
39
+ MapBuilder.of("registrationName", "onDataReturned"),
40
40
  )
41
41
  }
42
42
 
@@ -64,9 +64,10 @@ class HMSSDKViewManager : SimpleViewManager<HMSView>() {
64
64
  val trackId = data.getString("trackId")
65
65
  val id = data.getString("id")
66
66
  val mirror = data.getBoolean("mirror")
67
+ val scaleType = data.getString("scaleType")
67
68
  val hmsCollection = getHms()
68
69
  if (hmsCollection != null) {
69
- view.setData(id, trackId, hmsCollection, mirror)
70
+ view.setData(id, trackId, hmsCollection, mirror, scaleType)
70
71
  }
71
72
  }
72
73
 
@@ -3,6 +3,7 @@ package com.reactnativehmssdk
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
5
  import android.os.Build
6
+ import android.util.Log
6
7
  import android.view.LayoutInflater
7
8
  import android.widget.FrameLayout
8
9
  import androidx.annotation.RequiresApi
@@ -14,61 +15,68 @@ import com.facebook.react.uimanager.events.RCTEventEmitter
14
15
  import live.hms.video.media.tracks.HMSVideoTrack
15
16
  import live.hms.video.utils.HmsUtilities
16
17
  import live.hms.videoview.HMSVideoView
18
+ import live.hms.videoview.VideoViewStateChangeListener
17
19
  import org.webrtc.RendererCommon
18
20
 
19
21
  @SuppressLint("ViewConstructor")
20
22
  class HMSView(context: ReactContext) : FrameLayout(context) {
21
- private var hmsVideoView: HMSVideoView = HMSVideoView(context)
23
+ private var hmsVideoView: HMSVideoView? = null
22
24
  private var videoTrack: HMSVideoTrack? = null
23
- private var scaleTypeApplied: Boolean = false
24
25
  private var sdkId: String = "12345"
25
- private var currentScaleType: RendererCommon.ScalingType =
26
- RendererCommon.ScalingType.SCALE_ASPECT_FILL
27
26
  private var disableAutoSimulcastLayerSelect = false
27
+ private var jsCanApplyStyles = false
28
28
 
29
29
  init {
30
30
  val inflater = getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
31
31
  val view = inflater.inflate(R.layout.hms_view, this)
32
32
 
33
33
  hmsVideoView = view.findViewById(R.id.hmsVideoView)
34
- hmsVideoView.setEnableHardwareScaler(false)
35
- hmsVideoView.setScalingType(currentScaleType)
36
- hmsVideoView.setMirror(false)
37
- hmsVideoView.disableAutoSimulcastLayerSelect(disableAutoSimulcastLayerSelect)
34
+ hmsVideoView?.setEnableHardwareScaler(false)
35
+
36
+ hmsVideoView?.setMirror(false)
37
+ hmsVideoView?.disableAutoSimulcastLayerSelect(disableAutoSimulcastLayerSelect)
38
+
39
+ hmsVideoView?.addVideoViewStateChangeListener(object : VideoViewStateChangeListener {
40
+ override fun onResolutionChange(newWidth: Int, newHeight: Int) {
41
+ super.onResolutionChange(newWidth, newHeight)
42
+ if (!jsCanApplyStyles) {
43
+ val event: WritableMap = Arguments.createMap()
44
+ context.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "topChange", event)
45
+ jsCanApplyStyles = true
46
+ }
47
+ }
48
+ })
38
49
  }
39
50
 
40
51
  @RequiresApi(Build.VERSION_CODES.N)
41
52
  fun captureHmsView(args: ReadableArray?) {
42
- HMSHelper.captureSurfaceView(hmsVideoView, sdkId, args, context, id)
43
- }
44
-
45
- private fun onReceiveNativeEvent() {
46
- val event: WritableMap = Arguments.createMap()
47
- event.putString("message", "MyMessage")
48
- val reactContext = context as ReactContext
49
- reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "topChange", event)
53
+ hmsVideoView?.let {
54
+ HMSHelper.captureSurfaceView(it, sdkId, args, context, id)
55
+ }
50
56
  }
51
57
 
52
58
  override fun onDetachedFromWindow() {
53
59
  super.onDetachedFromWindow()
54
- hmsVideoView.removeTrack()
60
+ hmsVideoView?.removeTrack()
55
61
  }
56
62
 
57
63
  override fun onAttachedToWindow() {
58
64
  super.onAttachedToWindow()
59
- hmsVideoView.addTrack(videoTrack!!) // DOUBT: Handle case when videoTrack is null
60
- if (!scaleTypeApplied) {
61
- if (currentScaleType != RendererCommon.ScalingType.SCALE_ASPECT_FILL) {
62
- onReceiveNativeEvent()
63
- }
64
- scaleTypeApplied = true
65
+
66
+ videoTrack?.let { // Safe Call Operator to check if videoTrack is not null
67
+ hmsVideoView?.addTrack(it) // add the videoTrack to the hmsVideoView
68
+ } ?: run { // Elvis Operator to handle the case when videoTrack is null
69
+ Log.e(
70
+ "HMSView",
71
+ "HMSView attached to window, but it's videoTrack is null",
72
+ ) // log an error message
65
73
  }
66
74
  }
67
75
 
68
76
  fun updateZOrderMediaOverlay(setZOrderMediaOverlay: Boolean?) {
69
77
  if (setZOrderMediaOverlay != null && setZOrderMediaOverlay) {
70
78
  // hmsVideoView.setZOrderOnTop(true);
71
- hmsVideoView.setZOrderMediaOverlay(setZOrderMediaOverlay)
79
+ hmsVideoView?.setZOrderMediaOverlay(setZOrderMediaOverlay)
72
80
  }
73
81
  }
74
82
 
@@ -76,18 +84,15 @@ class HMSView(context: ReactContext) : FrameLayout(context) {
76
84
  if (scaleType != null) {
77
85
  when (scaleType) {
78
86
  "ASPECT_FIT" -> {
79
- hmsVideoView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
80
- currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_FIT
87
+ hmsVideoView?.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT)
81
88
  return
82
89
  }
83
90
  "ASPECT_FILL" -> {
84
- hmsVideoView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FILL)
85
- currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_FILL
91
+ hmsVideoView?.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FILL)
86
92
  return
87
93
  }
88
94
  "ASPECT_BALANCED" -> {
89
- hmsVideoView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_BALANCED)
90
- currentScaleType = RendererCommon.ScalingType.SCALE_ASPECT_BALANCED
95
+ hmsVideoView?.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_BALANCED)
91
96
  return
92
97
  }
93
98
  else -> {
@@ -101,7 +106,8 @@ class HMSView(context: ReactContext) : FrameLayout(context) {
101
106
  id: String?,
102
107
  trackId: String?,
103
108
  hmsCollection: MutableMap<String, HMSRNSDK>,
104
- mirror: Boolean?
109
+ mirror: Boolean?,
110
+ scaleType: String?,
105
111
  ) {
106
112
  if (id != null) {
107
113
  sdkId = id
@@ -110,8 +116,9 @@ class HMSView(context: ReactContext) : FrameLayout(context) {
110
116
 
111
117
  if (trackId != null && hms != null) {
112
118
  if (mirror != null) {
113
- hmsVideoView.setMirror(mirror)
119
+ hmsVideoView?.setMirror(mirror)
114
120
  }
121
+ updateScaleType(scaleType)
115
122
  // TODO: can be optimized here
116
123
  videoTrack = hms.getRoom()?.let { HmsUtilities.getVideoTrack(trackId, it) }
117
124
  }
@@ -119,7 +126,7 @@ class HMSView(context: ReactContext) : FrameLayout(context) {
119
126
 
120
127
  fun updateAutoSimulcast(autoSimulcast: Boolean?) {
121
128
  autoSimulcast?.let {
122
- hmsVideoView.disableAutoSimulcastLayerSelect(!it)
129
+ hmsVideoView?.disableAutoSimulcastLayerSelect(!it)
123
130
  }
124
131
  }
125
132
  }
@@ -13,41 +13,41 @@ import live.hms.video.sdk.HMSActionResultListener
13
13
 
14
14
  class HmsScreenshareActivity : ComponentActivity() {
15
15
  private var resultLauncher: ActivityResultLauncher<Intent> =
16
- this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
17
- if (result.resultCode == Activity.RESULT_OK) {
18
- val mediaProjectionPermissionResultData: Intent? = result.data
19
- val id = intent.getStringExtra("id")
20
- HMSManager.hmsCollection[id]?.hmsSDK?.startScreenshare(
21
- object : HMSActionResultListener {
22
- override fun onError(error: HMSException) {
23
- finish()
24
- HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
25
- HMSManager.hmsCollection[id]?.emitHMSError(error)
26
- }
27
- override fun onSuccess() {
28
- HMSManager.hmsCollection[id]?.screenshareCallback?.resolve(
29
- HMSManager.hmsCollection[id]?.emitHMSSuccess()
30
- )
31
- finish()
32
- }
33
- },
34
- mediaProjectionPermissionResultData
35
- )
36
- } else {
37
- val id = intent.getStringExtra("id")
38
- val error =
39
- HMSException(
40
- 103,
41
- "RESULT_CANCELED",
42
- "RESULT_CANCELED",
43
- "RESULT_CANCELED",
44
- "RESULT_CANCELED"
16
+ this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
17
+ if (result.resultCode == Activity.RESULT_OK) {
18
+ val mediaProjectionPermissionResultData: Intent? = result.data
19
+ val id = intent.getStringExtra("id")
20
+ HMSManager.hmsCollection[id]?.hmsSDK?.startScreenshare(
21
+ object : HMSActionResultListener {
22
+ override fun onError(error: HMSException) {
23
+ finish()
24
+ HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
25
+ HMSManager.hmsCollection[id]?.emitHMSError(error)
26
+ }
27
+ override fun onSuccess() {
28
+ HMSManager.hmsCollection[id]?.screenshareCallback?.resolve(
29
+ HMSManager.hmsCollection[id]?.emitHMSSuccess(),
45
30
  )
46
- HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
47
- HMSManager.hmsCollection[id]?.emitHMSError(error)
48
- finish()
49
- }
31
+ finish()
32
+ }
33
+ },
34
+ mediaProjectionPermissionResultData,
35
+ )
36
+ } else {
37
+ val id = intent.getStringExtra("id")
38
+ val error =
39
+ HMSException(
40
+ 103,
41
+ "RESULT_CANCELED",
42
+ "RESULT_CANCELED",
43
+ "RESULT_CANCELED",
44
+ "RESULT_CANCELED",
45
+ )
46
+ HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
47
+ HMSManager.hmsCollection[id]?.emitHMSError(error)
48
+ finish()
50
49
  }
50
+ }
51
51
 
52
52
  override fun onCreate(savedInstanceState: Bundle?) {
53
53
  super.onCreate(savedInstanceState)
@@ -60,20 +60,20 @@ class HmsScreenshareActivity : ComponentActivity() {
60
60
  if (isScreenShared !== null && !isScreenShared) {
61
61
  try {
62
62
  val mediaProjectionManager =
63
- getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
63
+ getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
64
64
  resultLauncher.launch(mediaProjectionManager.createScreenCaptureIntent())
65
65
  } catch (e: Exception) {
66
66
  println(e)
67
67
  }
68
68
  } else {
69
69
  HMSManager.hmsCollection[id]?.emitHMSError(
70
- HMSException(
71
- 103,
72
- "SCREENSHARE_IS_ALREADY_RUNNING",
73
- "SCREENSHARE_IS_ALREADY_RUNNING",
74
- "SCREENSHARE_IS_ALREADY_RUNNING",
75
- "SCREENSHARE_IS_ALREADY_RUNNING"
76
- )
70
+ HMSException(
71
+ 103,
72
+ "SCREENSHARE_IS_ALREADY_RUNNING",
73
+ "SCREENSHARE_IS_ALREADY_RUNNING",
74
+ "SCREENSHARE_IS_ALREADY_RUNNING",
75
+ "SCREENSHARE_IS_ALREADY_RUNNING",
76
+ ),
77
77
  )
78
78
  finish()
79
79
  }
@@ -16,7 +16,7 @@ data class PIPActions(val endMeet: PIPAction, val localAudio: PIPAction, val loc
16
16
  class PipActionReceiver(
17
17
  val toggleLocalAudio: () -> Unit,
18
18
  val toggleLocalVideo: () -> Unit,
19
- val endMeeting: () -> Unit
19
+ val endMeeting: () -> Unit,
20
20
  ) : BroadcastReceiver() {
21
21
  companion object {
22
22
  var sdkIdForPIP: String? = null
@@ -25,7 +25,7 @@ class PipActionReceiver(
25
25
  val PIPActions = PIPActions(
26
26
  endMeet = PIPAction(title = "End", description = "End Meeting", requestCode = 346),
27
27
  localAudio = PIPAction(title = "Mic", description = "Toggle Mic", requestCode = 344),
28
- localVideo = PIPAction(title = "Camera", description = "Toggle Camera", requestCode = 345)
28
+ localVideo = PIPAction(title = "Camera", description = "Toggle Camera", requestCode = 345),
29
29
  )
30
30
  }
31
31
 
@@ -16,7 +16,7 @@ struct HMSConstants {
16
16
  static let ON_PEER_UPDATE = "3"
17
17
  static let ON_TRACK_UPDATE = "ON_TRACK_UPDATE"
18
18
  static let ON_ROLE_CHANGE_REQUEST = "ON_ROLE_CHANGE_REQUEST"
19
- static let ON_CHANGE_TRACK_STATE_REQUEST = "ON_CHANGE_TRACK_STATE_REQUEST" // new
19
+ static let ON_CHANGE_TRACK_STATE_REQUEST = "ON_CHANGE_TRACK_STATE_REQUEST"
20
20
  static let ON_REMOVED_FROM_ROOM = "ON_REMOVED_FROM_ROOM"
21
21
  static let ON_ERROR = "ON_ERROR"
22
22
  static let ON_MESSAGE = "ON_MESSAGE"
@@ -28,4 +28,6 @@ struct HMSConstants {
28
28
  static let ON_LOCAL_VIDEO_STATS = "ON_LOCAL_VIDEO_STATS"
29
29
  static let ON_REMOTE_AUDIO_STATS = "ON_REMOTE_AUDIO_STATS"
30
30
  static let ON_REMOTE_VIDEO_STATS = "ON_REMOTE_VIDEO_STATS"
31
+ static let ON_SESSION_STORE_AVAILABLE = "ON_SESSION_STORE_AVAILABLE"
32
+ static let ON_SESSION_STORE_CHANGED = "ON_SESSION_STORE_CHANGED"
31
33
  }
@@ -278,7 +278,7 @@ class HMSDecoder: NSObject {
278
278
  return ["trackId": localVideo.trackId, "source": localVideo.source, "trackDescription": localVideo.trackDescription, "settings": getHmsVideoTrackSettings(localVideo.settings), "isMute": localVideo.isMute(), "type": type, "kind": type]
279
279
  }
280
280
 
281
- static func getHmsAudioTrackSettings(_ hmsAudioTrackSettings: HMSAudioTrackSettings?) -> [String: Any] {
281
+ static func getHmsAudioTrackSettings(_ hmsAudioTrackSettings: HMSAudioTrackSettings?) -> [String: Any?] {
282
282
 
283
283
  guard let settings = hmsAudioTrackSettings else { return [String: Any]() }
284
284
 
@@ -172,15 +172,21 @@ class HMSHelper: NSObject {
172
172
  }
173
173
 
174
174
  static func getLocalAudioSettings(_ settings: NSDictionary?, _ hms: HMSSDK?, _ delegate: HMSManager?, _ id: String) -> HMSAudioTrackSettings? {
175
- if settings === nil {
175
+
176
+ guard let settings = settings
177
+ else {
178
+ print(#function, "No Local Audio Settings passed.")
176
179
  return nil
177
180
  }
178
- let initialState = settings?.value(forKey: "initialState") as? String
181
+
182
+ let initialState = settings.value(forKey: "initialState") as? String
179
183
  let initialStateEncoded = HMSHelper.getHMSTrackSettingsInitState(initialState)
180
184
 
185
+ let audioMode = getAudioMode(from: settings["audioMode"] as? String)
186
+
181
187
  if #available(iOS 13.0, *) {
182
188
  var audioMixerSourceMap: [String: HMSAudioNode]?
183
- if let playerNode = settings?.value(forKey: "audioSource") as? [String] {
189
+ if let playerNode = settings.value(forKey: "audioSource") as? [String] {
184
190
  audioMixerSourceMap = [String: HMSAudioNode]()
185
191
  for node in playerNode {
186
192
  if audioMixerSourceMap?[node] == nil {
@@ -190,7 +196,7 @@ class HMSHelper: NSObject {
190
196
  do {
191
197
  audioMixerSourceMap?["screen_broadcast_audio_receiver_node"] = try hms?.screenBroadcastAudioReceiverNode()
192
198
  } catch {
193
- delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
199
+ delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
194
200
  }
195
201
  } else {
196
202
  audioMixerSourceMap?[node] = HMSAudioFilePlayerNode()
@@ -203,15 +209,33 @@ class HMSHelper: NSObject {
203
209
  do {
204
210
  self.audioMixerSourceHashMap = audioMixerSourceMap
205
211
  let audioMixerSource = try HMSAudioMixerSource(nodes: audioMixerSourceMap.values.map {$0})
206
- return HMSAudioTrackSettings(maxBitrate: 32, trackDescription: "", initialMuteState: initialStateEncoded, audioSource: audioMixerSource)
212
+
213
+ return HMSAudioTrackSettings.build { builder in
214
+
215
+ builder.initialMuteState = initialStateEncoded
216
+
217
+ builder.audioSource = audioMixerSource
218
+
219
+ if let audioMode = audioMode {
220
+ builder.audioMode = audioMode
221
+ }
222
+ }
223
+
207
224
  } catch {
208
- delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]], "id": id])
225
+ delegate?.emitEvent("ON_ERROR", ["error": ["code": 6002, "description": error.localizedDescription, "isTerminal": false, "canRetry": true, "params": ["function": #function]] as [String: Any], "id": id])
209
226
  return nil
210
227
  }
211
228
  }
212
229
  }
213
230
 
214
- return HMSAudioTrackSettings(maxBitrate: 32, trackDescription: "", initialMuteState: initialStateEncoded, audioSource: nil)
231
+ return HMSAudioTrackSettings.build { builder in
232
+
233
+ builder.initialMuteState = initialStateEncoded
234
+
235
+ if let audioMode = audioMode {
236
+ builder.audioMode = audioMode
237
+ }
238
+ }
215
239
  }
216
240
 
217
241
  static func getAudioMixerSourceMap() -> [String: HMSAudioNode]? {
@@ -318,4 +342,17 @@ class HMSHelper: NSObject {
318
342
  }
319
343
  return nil
320
344
  }
345
+
346
+ private static func getAudioMode(from mode: String?) -> HMSAudioMode? {
347
+ switch mode {
348
+ case "voice":
349
+ return .voice
350
+
351
+ case "music":
352
+ return .music
353
+
354
+ default:
355
+ return nil
356
+ }
357
+ }
321
358
  }
package/ios/HMSManager.m CHANGED
@@ -72,4 +72,12 @@ RCT_EXTERN_METHOD(setVideoTrackLayer: (NSDictionary) data :(RCTPromiseResolveBlo
72
72
  #pragma mark - Advanced Camera Controls
73
73
 
74
74
  RCT_EXTERN_METHOD(captureImageAtMaxSupportedResolution: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
75
+
76
+ #pragma mark - Session Store
77
+
78
+ RCT_EXTERN_METHOD(getSessionMetadataForKey: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
79
+ RCT_EXTERN_METHOD(setSessionMetadataForKey: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
80
+ RCT_EXTERN_METHOD(addKeyChangeListener: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
81
+ RCT_EXTERN_METHOD(removeKeyChangeListener: (NSDictionary) data :(RCTPromiseResolveBlock) resolve :(RCTPromiseRejectBlock) reject)
82
+
75
83
  @end
@@ -36,7 +36,7 @@ class HMSManager: RCTEventEmitter {
36
36
  }
37
37
 
38
38
  override func supportedEvents() -> [String]! {
39
- 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]
39
+ 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]
40
40
  }
41
41
 
42
42
  // MARK: - HMS SDK Delegate Callbacks
@@ -551,4 +551,38 @@ class HMSManager: RCTEventEmitter {
551
551
 
552
552
  hms?.captureImageAtMaxSupportedResolution(data, resolve, reject)
553
553
  }
554
+
555
+ // MARK: - Session Store
556
+
557
+ @objc
558
+ func getSessionMetadataForKey(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
559
+
560
+ let hms = HMSHelper.getHms(data, hmsCollection)
561
+
562
+ hms?.getSessionMetadataForKey(data, resolve, reject)
563
+ }
564
+
565
+ @objc
566
+ func setSessionMetadataForKey(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
567
+
568
+ let hms = HMSHelper.getHms(data, hmsCollection)
569
+
570
+ hms?.setSessionMetadataForKey(data, resolve, reject)
571
+ }
572
+
573
+ @objc
574
+ func addKeyChangeListener(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
575
+
576
+ let hms = HMSHelper.getHms(data, hmsCollection)
577
+
578
+ hms?.addKeyChangeListener(data, resolve, reject)
579
+ }
580
+
581
+ @objc
582
+ func removeKeyChangeListener(_ data: NSDictionary, _ resolve: RCTPromiseResolveBlock?, _ reject: RCTPromiseRejectBlock?) {
583
+
584
+ let hms = HMSHelper.getHms(data, hmsCollection)
585
+
586
+ hms?.removeKeyChangeListener(data, resolve, reject)
587
+ }
554
588
  }