@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.
- package/android/build.gradle +70 -12
- package/android/src/main/java/com/reactnativehmssdk/HMSAudioshareActivity.kt +8 -8
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayer.kt +38 -12
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManagerImpl.kt +185 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +20 -10
- package/android/src/main/java/com/reactnativehmssdk/{HMSManager.kt → HMSManagerImpl.kt} +28 -111
- package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +3 -3
- package/android/src/main/java/com/reactnativehmssdk/HMSReactNativeEvent.kt +29 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManagerImpl.kt +119 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSView.kt +33 -5
- package/android/src/main/java/com/reactnativehmssdk/HmsScreenshareActivity.kt +9 -9
- package/android/src/main/java/com/reactnativehmssdk/HmssdkPackage.kt +42 -3
- package/android/src/newarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +128 -0
- package/android/src/newarch/java/com/reactnativehmssdk/HMSManager.kt +332 -0
- package/android/src/newarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +102 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +61 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSManager.kt +351 -0
- package/android/src/oldarch/java/com/reactnativehmssdk/HMSSDKViewManager.kt +87 -0
- package/ios/HMSHLSPlayerComponentView.mm +325 -0
- package/ios/HMSHLSPlayerManager.m +10 -0
- package/ios/HMSHLSPlayerManager.swift +91 -79
- package/ios/HMSManager.m +13 -0
- package/ios/HMSManager.mm +365 -0
- package/ios/HMSManager.swift +109 -103
- package/ios/HMSView.m +9 -0
- package/ios/HMSView.swift +44 -14
- package/ios/HMSViewComponentView.mm +229 -0
- package/lib/commonjs/classes/HmsView.js +45 -48
- package/lib/commonjs/classes/HmsView.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js +46 -26
- package/lib/commonjs/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +5 -4
- package/lib/commonjs/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/commonjs/modules/HMSManagerModule.js +3 -10
- package/lib/commonjs/modules/HMSManagerModule.js.map +1 -1
- package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js +75 -0
- package/lib/commonjs/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/HMSViewNativeComponent.js +55 -0
- package/lib/commonjs/specs/HMSViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/NativeHMSManager.js +38 -0
- package/lib/commonjs/specs/NativeHMSManager.js.map +1 -0
- package/lib/module/classes/HmsView.js +46 -49
- package/lib/module/classes/HmsView.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js +48 -28
- package/lib/module/components/HMSHLSPlayer/HMSHLSPlayer.js.map +1 -1
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js +3 -3
- package/lib/module/components/HMSHLSPlayer/RCTHMSHLSPlayer.js.map +1 -1
- package/lib/module/modules/HMSManagerModule.js +1 -9
- package/lib/module/modules/HMSManagerModule.js.map +1 -1
- package/lib/module/specs/HMSHLSPlayerNativeComponent.js +69 -0
- package/lib/module/specs/HMSHLSPlayerNativeComponent.js.map +1 -0
- package/lib/module/specs/HMSViewNativeComponent.js +49 -0
- package/lib/module/specs/HMSViewNativeComponent.js.map +1 -0
- package/lib/module/specs/NativeHMSManager.js +33 -0
- package/lib/module/specs/NativeHMSManager.js.map +1 -0
- package/lib/typescript/components/HMSHLSPlayer/RCTHMSHLSPlayer.d.ts +6 -9
- package/lib/typescript/specs/HMSHLSPlayerNativeComponent.d.ts +115 -0
- package/lib/typescript/specs/HMSViewNativeComponent.d.ts +97 -0
- package/lib/typescript/specs/NativeHMSManager.d.ts +147 -0
- package/package.json +16 -1
- package/react-native-hms.podspec +43 -0
- package/src/classes/HmsView.tsx +60 -78
- package/src/components/HMSHLSPlayer/HMSHLSPlayer.tsx +62 -128
- package/src/components/HMSHLSPlayer/RCTHMSHLSPlayer.ts +8 -13
- package/src/modules/HMSManagerModule.ts +1 -14
- package/src/specs/HMSHLSPlayerNativeComponent.ts +203 -0
- package/src/specs/HMSViewNativeComponent.ts +119 -0
- package/src/specs/NativeHMSManager.ts +307 -0
- package/android/src/main/java/com/reactnativehmssdk/HMSHLSPlayerManager.kt +0 -144
- 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:
|
|
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:
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
+
HMSManagerImpl.hmsCollection[id]?.hmsSDK?.startScreenshare(
|
|
21
21
|
object : HMSActionResultListener {
|
|
22
22
|
override fun onError(error: HMSException) {
|
|
23
23
|
finish()
|
|
24
|
-
|
|
24
|
+
HMSManagerImpl.hmsCollection[id]?.screenshareCallback?.reject(error)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
override fun onSuccess() {
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
67
|
+
HMSManagerImpl.startingScreenShare = false
|
|
68
68
|
} else {
|
|
69
|
-
|
|
70
|
-
|
|
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.
|
|
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
|
-
|
|
9
|
-
|
|
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
|
+
}
|