@100mslive/react-native-hms 1.12.2 → 2.0.0-alpha.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 (70) hide show
  1. package/android/build.gradle +70 -12
  2. package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +8 -8
  3. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +38 -12
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManagerImpl.kt +185 -0
  5. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +20 -10
  6. package/android/src/main/java/com/reactnativehmssdk/{HMSManager.kt → HMSManagerImpl.kt} +28 -111
  7. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +3 -3
  8. package/android/src/main/java/com/reactnativehmssdk/HMSReactNativeEvent.kt +29 -0
  9. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManagerImpl.kt +119 -0
  10. package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +33 -5
  11. package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +9 -9
  12. package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +42 -3
  13. package/android/src/newarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +128 -0
  14. package/android/src/newarch/java/com/reactnativehmssdk/HMSManager.kt +332 -0
  15. package/android/src/newarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +102 -0
  16. package/android/src/oldarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +61 -0
  17. package/android/src/oldarch/java/com/reactnativehmssdk/HMSManager.kt +351 -0
  18. package/android/src/oldarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +87 -0
  19. package/ios/HMSHLSPlayerComponentView.mm +325 -0
  20. package/ios/HMSHLSPlayerManager.m +10 -0
  21. package/ios/HMSHLSPlayerManager.swift +91 -79
  22. package/ios/HMSManager.m +13 -0
  23. package/ios/HMSManager.mm +365 -0
  24. package/ios/HMSManager.swift +109 -103
  25. package/ios/HMSView.m +9 -0
  26. package/ios/HMSView.swift +44 -14
  27. package/ios/HMSViewComponentView.mm +229 -0
  28. package/lib/commonjs/classes/HmsView.js +45 -48
  29. package/lib/commonjs/classes/HmsView.js.map +1 -1
  30. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +46 -26
  31. package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  32. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +5 -4
  33. package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  34. package/lib/commonjs/modules/HMSManagerModule.js +3 -10
  35. package/lib/commonjs/modules/HMSManagerModule.js.map +1 -1
  36. package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js +75 -0
  37. package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
  38. package/lib/commonjs/specs/HMSViewNativeComponent.js +55 -0
  39. package/lib/commonjs/specs/HMSViewNativeComponent.js.map +1 -0
  40. package/lib/commonjs/specs/NativeHMSManager.js +38 -0
  41. package/lib/commonjs/specs/NativeHMSManager.js.map +1 -0
  42. package/lib/module/classes/HmsView.js +46 -49
  43. package/lib/module/classes/HmsView.js.map +1 -1
  44. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +48 -28
  45. package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
  46. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +3 -3
  47. package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
  48. package/lib/module/modules/HMSManagerModule.js +1 -9
  49. package/lib/module/modules/HMSManagerModule.js.map +1 -1
  50. package/lib/module/specs/HMSHLSPlayerNativeComponent.js +69 -0
  51. package/lib/module/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
  52. package/lib/module/specs/HMSViewNativeComponent.js +49 -0
  53. package/lib/module/specs/HMSViewNativeComponent.js.map +1 -0
  54. package/lib/module/specs/NativeHMSManager.js +33 -0
  55. package/lib/module/specs/NativeHMSManager.js.map +1 -0
  56. package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +6 -9
  57. package/lib/typescript/specs/HMSHLSPlayerNativeComponent.d.ts +115 -0
  58. package/lib/typescript/specs/HMSViewNativeComponent.d.ts +97 -0
  59. package/lib/typescript/specs/NativeHMSManager.d.ts +147 -0
  60. package/package.json +16 -1
  61. package/react-native-hms.podspec +43 -0
  62. package/src/classes/HmsView.tsx +60 -78
  63. package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +62 -128
  64. package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +8 -13
  65. package/src/modules/HMSManagerModule.ts +1 -14
  66. package/src/specs/HMSHLSPlayerNativeComponent.ts +203 -0
  67. package/src/specs/HMSViewNativeComponent.ts +119 -0
  68. package/src/specs/NativeHMSManager.ts +307 -0
  69. package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +0 -144
  70. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +0 -111
@@ -31,7 +31,7 @@ import java.util.Date
31
31
 
32
32
  class HMSRNSDK(
33
33
  data: ReadableMap?,
34
- HmsDelegate: HMSManager,
34
+ HmsDelegate: HMSManagerImpl,
35
35
  sdkId: String,
36
36
  reactApplicationContext: ReactApplicationContext,
37
37
  ) {
@@ -39,7 +39,7 @@ class HMSRNSDK(
39
39
  var screenshareCallback: Promise? = null
40
40
  var audioshareCallback: Promise? = null
41
41
  var isAudioSharing: Boolean = false
42
- var delegate: HMSManager = HmsDelegate
42
+ var delegate: HMSManagerImpl = HmsDelegate
43
43
  var previewForRoleVideoTrack: HMSLocalVideoTrack? = null
44
44
  var previewForRoleAudioTrack: HMSLocalAudioTrack? = null
45
45
  private var recentRoleChangeRequest: HMSRoleChangeRequest? = null
@@ -1596,7 +1596,7 @@ class HMSRNSDK(
1596
1596
 
1597
1597
  fun startScreenshare(callback: Promise?) {
1598
1598
  screenshareCallback = callback
1599
- HMSManager.startingScreenShare = true
1599
+ HMSManagerImpl.startingScreenShare = true
1600
1600
  runOnUiThread {
1601
1601
  val intent = Intent(context, HmsScreenshareActivity::class.java)
1602
1602
  intent.flags = FLAG_ACTIVITY_NEW_TASK
@@ -0,0 +1,29 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import com.facebook.react.bridge.WritableMap
4
+ import com.facebook.react.uimanager.events.Event
5
+
6
+ /**
7
+ * Generic view-event wrapper used by `<HMSView />` and `<HMSHLSPlayer />`.
8
+ *
9
+ * Replaces the legacy paper-only `getJSModule(RCTEventEmitter::class.java).receiveEvent(...)`
10
+ * call. Dispatched through `UIManagerHelper.getEventDispatcherForReactTag(...)`,
11
+ * which routes to paper's RCTEventEmitter or Fabric's typed event emitter
12
+ * depending on which arch is active — including bridgeless mode.
13
+ *
14
+ * The event-name → JSX-prop mapping is registered separately in each view
15
+ * manager via `getExportedCustomDirectEventTypeConstants()`.
16
+ */
17
+ class HMSReactNativeEvent(
18
+ surfaceId: Int,
19
+ viewId: Int,
20
+ // Renamed from `eventName` to `name` because RN 0.82's `Event<T>` introduced
21
+ // a same-named member on the supertype; Kotlin 2.x (default in Gradle 8.13)
22
+ // promotes the hides-supertype-member warning to an error.
23
+ private val name: String,
24
+ private val payload: WritableMap?,
25
+ ) : Event<HMSReactNativeEvent>(surfaceId, viewId) {
26
+ override fun getEventName(): String = name
27
+
28
+ override fun getEventData(): WritableMap? = payload
29
+ }
@@ -0,0 +1,119 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.ReadableArray
5
+ import com.facebook.react.bridge.ReadableMap
6
+ import com.facebook.react.common.MapBuilder
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+
9
+ /**
10
+ * HMSSDKViewManagerImpl — shared view-manager logic for `<HMSView />`.
11
+ *
12
+ * Phase 1 / 1C-3 of the New Architecture migration. View-manager
13
+ * responsibilities (creating the view, prop dispatch, command handling,
14
+ * event-type registration) live here as static helpers. Arch-specific
15
+ * wrappers live at:
16
+ * - android/src/oldarch/.../HMSSDKViewManager.kt
17
+ * (extends SimpleViewManager — paper)
18
+ * - android/src/newarch/.../HMSSDKViewManager.kt
19
+ * (extends SimpleViewManager + implements the Codegen-generated
20
+ * HMSViewManagerInterface — Fabric)
21
+ *
22
+ * Both wrappers delegate every call here, so the actual logic stays
23
+ * in one place.
24
+ */
25
+ class HMSSDKViewManagerImpl {
26
+ companion object {
27
+ const val REACT_CLASS = "HMSView"
28
+
29
+ fun createViewInstance(reactContext: ThemedReactContext): HMSView = HMSView(reactContext)
30
+
31
+ /**
32
+ * Set the `data` prop. Resolves the active SDK instance via the
33
+ * passed-in `reactContext` (route through `reactApplicationContext`
34
+ * for new-arch interop / bridgeless safety).
35
+ */
36
+ fun setData(
37
+ view: HMSView,
38
+ data: ReadableMap,
39
+ reactContext: ThemedReactContext?,
40
+ ) {
41
+ val trackId = data.getString("trackId")
42
+ val id = data.getString("id")
43
+ val mirror = data.getBoolean("mirror")
44
+ val scaleType = data.getString("scaleType")
45
+ val hmsCollection = getHmsCollection(reactContext) ?: return
46
+ view.setData(id, trackId, hmsCollection, mirror, scaleType)
47
+ }
48
+
49
+ fun setScaleType(
50
+ view: HMSView,
51
+ data: String?,
52
+ ) = view.updateScaleType(data)
53
+
54
+ fun setZOrderMediaOverlay(
55
+ view: HMSView,
56
+ data: Boolean?,
57
+ ) = view.updateZOrderMediaOverlay(data)
58
+
59
+ fun setAutoSimulcast(
60
+ view: HMSView,
61
+ data: Boolean?,
62
+ ) {
63
+ data?.let { view.updateAutoSimulcast(it) }
64
+ }
65
+
66
+ /** Imperative `capture` command (paper — args is a numeric-array). */
67
+ fun capture(
68
+ view: HMSView,
69
+ args: ReadableArray?,
70
+ ) = view.captureHmsView(args)
71
+
72
+ /** Imperative `capture` command (Fabric — typed `requestId`). */
73
+ fun capture(
74
+ view: HMSView,
75
+ requestId: Int,
76
+ ) {
77
+ val args = Arguments.createArray().apply { pushInt(requestId) }
78
+ view.captureHmsView(args)
79
+ }
80
+
81
+ fun getCommandsMap(): Map<String, Int> = MapBuilder.of("capture", 1)
82
+
83
+ /**
84
+ * Called from both arch wrappers' `onDropViewInstance` override.
85
+ * Forwards to `HMSView.cleanup()` to release the listener registered
86
+ * in `init`, avoiding a memory leak across mount/unmount cycles.
87
+ */
88
+ fun onDropViewInstance(view: HMSView) = view.cleanup()
89
+
90
+ /**
91
+ * Both events are DIRECT, matching the Codegen spec which declares both as
92
+ * `DirectEventHandler<...>`. The names are deliberately unique (not the
93
+ * default `topChange`) to avoid colliding with RN's built-in `topChange`
94
+ * (which RN registers as bubbling on every RCTView), which would trigger
95
+ * "Event cannot be both direct and bubbling" at runtime.
96
+ *
97
+ * - `topResolutionChange` → JS receives as `onResolutionChange`.
98
+ * - `captureFrame` → JS receives as `onDataReturned`.
99
+ */
100
+ fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> =
101
+ MapBuilder
102
+ .builder<String, Any>()
103
+ .put("topResolutionChange", MapBuilder.of("registrationName", "onResolutionChange"))
104
+ .put("captureFrame", MapBuilder.of("registrationName", "onDataReturned"))
105
+ .build()
106
+
107
+ /**
108
+ * Look up the active SDK instances map. Routes through
109
+ * `reactApplicationContext` rather than `themedContext.getNativeModule`
110
+ * directly — the themed-context lookup is unreliable under the New
111
+ * Architecture Interop Layer / bridgeless mode.
112
+ */
113
+ fun getHmsCollection(reactContext: ThemedReactContext?): MutableMap<String, HMSRNSDK>? =
114
+ reactContext
115
+ ?.reactApplicationContext
116
+ ?.getNativeModule(HMSManager::class.java)
117
+ ?.getHmsInstance()
118
+ }
119
+ }
@@ -11,7 +11,7 @@ import com.facebook.react.bridge.Arguments
11
11
  import com.facebook.react.bridge.ReactContext
12
12
  import com.facebook.react.bridge.ReadableArray
13
13
  import com.facebook.react.bridge.WritableMap
14
- import com.facebook.react.uimanager.events.RCTEventEmitter
14
+ import com.facebook.react.uimanager.UIManagerHelper
15
15
  import hms.webrtc.RendererCommon
16
16
  import live.hms.video.media.tracks.HMSVideoTrack
17
17
  import live.hms.video.utils.HmsUtilities
@@ -28,6 +28,12 @@ class HMSView(
28
28
  private var disableAutoSimulcastLayerSelect = false
29
29
  private var jsCanApplyStyles = false
30
30
 
31
+ // Held so `cleanup()` can clear the listener from `HMSVideoView` on view
32
+ // drop. The anonymous VideoViewStateChangeListener captures `this`, so
33
+ // leaking it across mount/unmount cycles prevents GC of HMSView instances.
34
+ // Mirrors the same fix applied to HMSHLSPlayer's Player.Listener.
35
+ private var videoViewStateChangeListener: VideoViewStateChangeListener? = null
36
+
31
37
  init {
32
38
  val inflater = getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
33
39
  val view = inflater.inflate(R.layout.hms_view, this)
@@ -38,7 +44,7 @@ class HMSView(
38
44
  hmsVideoView?.setMirror(false)
39
45
  hmsVideoView?.disableAutoSimulcastLayerSelect(disableAutoSimulcastLayerSelect)
40
46
 
41
- hmsVideoView?.addVideoViewStateChangeListener(
47
+ val listener =
42
48
  object : VideoViewStateChangeListener {
43
49
  override fun onResolutionChange(
44
50
  newWidth: Int,
@@ -59,8 +65,21 @@ class HMSView(
59
65
  }
60
66
  }
61
67
  }
62
- },
63
- )
68
+ }
69
+ videoViewStateChangeListener = listener
70
+ hmsVideoView?.addVideoViewStateChangeListener(listener)
71
+ }
72
+
73
+ /**
74
+ * Called from `HMSSDKViewManager.onDropViewInstance` when RN destroys the
75
+ * view. Clears the VideoViewStateChangeListener registered in `init` so
76
+ * the anonymous listener doesn't retain `this` across mount/unmount.
77
+ */
78
+ fun cleanup() {
79
+ if (videoViewStateChangeListener != null) {
80
+ hmsVideoView?.addVideoViewStateChangeListener(null)
81
+ videoViewStateChangeListener = null
82
+ }
64
83
  }
65
84
 
66
85
  private fun sendEventToJS(
@@ -72,7 +91,16 @@ class HMSView(
72
91
  event.putMap("data", data)
73
92
 
74
93
  val reactContext = context as ReactContext
75
- reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "topChange", event)
94
+ val surfaceId = UIManagerHelper.getSurfaceId(this)
95
+ val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id)
96
+ if (dispatcher != null) {
97
+ dispatcher.dispatchEvent(HMSReactNativeEvent(surfaceId, id, "topResolutionChange", event))
98
+ } else {
99
+ // Bridgeless mode: dispatcher can be null if the view is detaching or
100
+ // the React tag is no longer valid. Log instead of silently dropping
101
+ // so the event loss is debuggable. Same pattern as HMSHLSPlayer.kt.
102
+ Log.w("HMSView", "Event 'topResolutionChange' dropped — dispatcher null for tag $id")
103
+ }
76
104
  }
77
105
 
78
106
  @RequiresApi(Build.VERSION_CODES.N)
@@ -17,16 +17,16 @@ class HmsScreenshareActivity : ComponentActivity() {
17
17
  if (result.resultCode == Activity.RESULT_OK) {
18
18
  val mediaProjectionPermissionResultData: Intent? = result.data
19
19
  val id = intent.getStringExtra("id")
20
- HMSManager.hmsCollection[id]?.hmsSDK?.startScreenshare(
20
+ HMSManagerImpl.hmsCollection[id]?.hmsSDK?.startScreenshare(
21
21
  object : HMSActionResultListener {
22
22
  override fun onError(error: HMSException) {
23
23
  finish()
24
- HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
24
+ HMSManagerImpl.hmsCollection[id]?.screenshareCallback?.reject(error)
25
25
  }
26
26
 
27
27
  override fun onSuccess() {
28
- HMSManager.hmsCollection[id]?.screenshareCallback?.resolve(
29
- HMSManager.hmsCollection[id]?.getPromiseResolveData(),
28
+ HMSManagerImpl.hmsCollection[id]?.screenshareCallback?.resolve(
29
+ HMSManagerImpl.hmsCollection[id]?.getPromiseResolveData(),
30
30
  )
31
31
  finish()
32
32
  }
@@ -43,7 +43,7 @@ class HmsScreenshareActivity : ComponentActivity() {
43
43
  "RESULT_CANCELED",
44
44
  "RESULT_CANCELED",
45
45
  )
46
- HMSManager.hmsCollection[id]?.screenshareCallback?.reject(error)
46
+ HMSManagerImpl.hmsCollection[id]?.screenshareCallback?.reject(error)
47
47
  finish()
48
48
  }
49
49
  }
@@ -55,7 +55,7 @@ class HmsScreenshareActivity : ComponentActivity() {
55
55
 
56
56
  private fun startScreenshare() {
57
57
  val id = intent.getStringExtra("id")
58
- val isScreenShared = HMSManager.hmsCollection[id]?.hmsSDK?.isScreenShared()
58
+ val isScreenShared = HMSManagerImpl.hmsCollection[id]?.hmsSDK?.isScreenShared()
59
59
  if (isScreenShared !== null && !isScreenShared) {
60
60
  try {
61
61
  val mediaProjectionManager =
@@ -64,10 +64,10 @@ class HmsScreenshareActivity : ComponentActivity() {
64
64
  } catch (e: Exception) {
65
65
  println(e)
66
66
  }
67
- HMSManager.startingScreenShare = false
67
+ HMSManagerImpl.startingScreenShare = false
68
68
  } else {
69
- HMSManager.startingScreenShare = false
70
- HMSManager.hmsCollection[id]?.emitHMSError(
69
+ HMSManagerImpl.startingScreenShare = false
70
+ HMSManagerImpl.hmsCollection[id]?.emitHMSError(
71
71
  HMSException(
72
72
  103,
73
73
  "SCREENSHARE_IS_ALREADY_RUNNING",
@@ -1,12 +1,51 @@
1
1
  package com.reactnativehmssdk
2
2
 
3
- import com.facebook.react.ReactPackage
3
+ import com.facebook.react.BaseReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
6
8
  import com.facebook.react.uimanager.ViewManager
7
9
 
8
- class HmssdkPackage : ReactPackage {
9
- override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> = listOf(HMSManager(reactContext))
10
+ /**
11
+ * HmssdkPackage Phase 1 / 1C-2 of the New Architecture migration.
12
+ *
13
+ * Converted from `ReactPackage` to `BaseReactPackage` so that under New
14
+ * Architecture, modules are instantiated lazily via `getModule(name)` —
15
+ * matching how TurboModules are registered. `getReactModuleInfoProvider()`
16
+ * advertises which modules this package owns.
17
+ *
18
+ * The same package class works under both arches; the active source set
19
+ * (oldarch or newarch) determines which `HMSManager` class is on the
20
+ * classpath. View managers are still registered eagerly via
21
+ * `createViewManagers()` — Fabric component-view migration for them
22
+ * lives in 1C-3 (HMSSDKViewManager) and 1C-4 (HMSHLSPlayerManager).
23
+ */
24
+ class HmssdkPackage : BaseReactPackage() {
25
+ override fun getModule(
26
+ name: String,
27
+ reactContext: ReactApplicationContext,
28
+ ): NativeModule? =
29
+ when (name) {
30
+ HMSManagerImpl.REACT_CLASS -> HMSManager(reactContext)
31
+ else -> null
32
+ }
33
+
34
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
35
+ ReactModuleInfoProvider {
36
+ mapOf(
37
+ HMSManagerImpl.REACT_CLASS to
38
+ ReactModuleInfo(
39
+ HMSManagerImpl.REACT_CLASS, // name
40
+ "com.reactnativehmssdk.HMSManager", // className (the wrapper, set per source set)
41
+ false, // canOverrideExistingModule
42
+ false, // needsEagerInit
43
+ false, // hasConstants (deprecated, ignored under New Arch)
44
+ false, // isCxxModule
45
+ BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, // isTurboModule
46
+ ),
47
+ )
48
+ }
10
49
 
11
50
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
12
51
  listOf<ViewManager<*, *>>(HMSSDKViewManager(), HMSHLSPlayerManager())
@@ -0,0 +1,128 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import com.facebook.react.bridge.ReadableArray
4
+ import com.facebook.react.uimanager.SimpleViewManager
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.uimanager.ViewManagerDelegate
7
+ import com.facebook.react.viewmanagers.HMSHLSPlayerManagerDelegate
8
+ import com.facebook.react.viewmanagers.HMSHLSPlayerManagerInterface
9
+
10
+ /**
11
+ * HMSHLSPlayerManager — new-arch (Fabric) view manager for `<HMSHLSPlayer />`.
12
+ *
13
+ * Phase 1 / 1C-4 of the New Architecture migration. Compiled only when
14
+ * the consumer's app uses new architecture.
15
+ *
16
+ * Differences from the old-arch wrapper:
17
+ * - Implements the Codegen-generated `HMSHLSPlayerManagerInterface<HMSHLSPlayer>`
18
+ * (typed prop setters AND typed command methods that Fabric calls directly).
19
+ * - Uses `HMSHLSPlayerManagerDelegate` for prop dispatch via Fabric's
20
+ * mounting mechanism.
21
+ * - Drops @ReactProp annotations — Fabric doesn't scan for them.
22
+ * - Implements receiveCommand(commandName: String, args) for Fabric's
23
+ * string-based command dispatch (in addition to numeric Int dispatch
24
+ * via the typed command methods).
25
+ *
26
+ * All logic delegates to HMSHLSPlayerManagerImpl in src/main/.
27
+ */
28
+ class HMSHLSPlayerManager :
29
+ SimpleViewManager<HMSHLSPlayer>(),
30
+ HMSHLSPlayerManagerInterface<HMSHLSPlayer> {
31
+ private val mDelegate: ViewManagerDelegate<HMSHLSPlayer> = HMSHLSPlayerManagerDelegate(this)
32
+
33
+ override fun getName(): String = HMSHLSPlayerManagerImpl.REACT_CLASS
34
+
35
+ override fun getDelegate(): ViewManagerDelegate<HMSHLSPlayer> = mDelegate
36
+
37
+ override fun createViewInstance(reactContext: ThemedReactContext): HMSHLSPlayer =
38
+ HMSHLSPlayerManagerImpl.createViewInstance(reactContext)
39
+
40
+ override fun onDropViewInstance(view: HMSHLSPlayer) {
41
+ super.onDropViewInstance(view)
42
+ HMSHLSPlayerManagerImpl.onDropViewInstance(view)
43
+ }
44
+
45
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> =
46
+ HMSHLSPlayerManagerImpl.getExportedCustomDirectEventTypeConstants()
47
+
48
+ /** Fabric command dispatch by string name (Codegen routes here via the delegate). */
49
+ override fun receiveCommand(
50
+ root: HMSHLSPlayer,
51
+ commandId: String?,
52
+ args: ReadableArray?,
53
+ ) {
54
+ if (commandId != null) {
55
+ HMSHLSPlayerManagerImpl.receiveCommandByName(root, commandId, args)
56
+ }
57
+ }
58
+
59
+ // ─────────────────────────────────────────────────────────────────
60
+ // Codegen-interface methods — typed prop setters
61
+ // ─────────────────────────────────────────────────────────────────
62
+
63
+ override fun setUrl(
64
+ view: HMSHLSPlayer,
65
+ value: String?,
66
+ ) = HMSHLSPlayerManagerImpl.setUrl(view, value)
67
+
68
+ override fun setEnableStats(
69
+ view: HMSHLSPlayer,
70
+ value: Boolean,
71
+ ) = HMSHLSPlayerManagerImpl.setEnableStats(view, value)
72
+
73
+ override fun setEnableControls(
74
+ view: HMSHLSPlayer,
75
+ value: Boolean,
76
+ ) = HMSHLSPlayerManagerImpl.setEnableControls(view, value)
77
+
78
+ // ─────────────────────────────────────────────────────────────────
79
+ // Codegen-interface methods — typed imperative commands (13)
80
+ // ─────────────────────────────────────────────────────────────────
81
+
82
+ override fun play(
83
+ view: HMSHLSPlayer,
84
+ url: String?,
85
+ ) = HMSHLSPlayerManagerImpl.play(view, url)
86
+
87
+ override fun stop(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.stop(view)
88
+
89
+ override fun pause(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.pause(view)
90
+
91
+ override fun resume(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.resume(view)
92
+
93
+ override fun seekToLivePosition(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.seekToLivePosition(view)
94
+
95
+ override fun seekForward(
96
+ view: HMSHLSPlayer,
97
+ seconds: Double,
98
+ ) = HMSHLSPlayerManagerImpl.seekForward(view, seconds)
99
+
100
+ override fun seekBackward(
101
+ view: HMSHLSPlayer,
102
+ seconds: Double,
103
+ ) = HMSHLSPlayerManagerImpl.seekBackward(view, seconds)
104
+
105
+ override fun setVolume(
106
+ view: HMSHLSPlayer,
107
+ level: Int,
108
+ ) = HMSHLSPlayerManagerImpl.setVolume(view, level)
109
+
110
+ override fun areClosedCaptionSupported(
111
+ view: HMSHLSPlayer,
112
+ requestId: Int,
113
+ ) = HMSHLSPlayerManagerImpl.areClosedCaptionSupported(view, requestId)
114
+
115
+ override fun isClosedCaptionEnabled(
116
+ view: HMSHLSPlayer,
117
+ requestId: Int,
118
+ ) = HMSHLSPlayerManagerImpl.isClosedCaptionEnabled(view, requestId)
119
+
120
+ override fun enableClosedCaption(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.enableClosedCaption(view)
121
+
122
+ override fun disableClosedCaption(view: HMSHLSPlayer) = HMSHLSPlayerManagerImpl.disableClosedCaption(view)
123
+
124
+ override fun getPlayerDurationDetails(
125
+ view: HMSHLSPlayer,
126
+ requestId: Int,
127
+ ) = HMSHLSPlayerManagerImpl.getPlayerDurationDetails(view, requestId)
128
+ }