react-native-theoplayer 1.7.1 → 1.8.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.
- package/README.md +2 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +115 -0
- package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +648 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +23 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +446 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.kt +117 -0
- package/android/src/main/java/com/theoplayer/{TimeUpdateRate.java → TimeUpdateRate.kt} +2 -2
- package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +161 -0
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +90 -0
- package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +140 -0
- package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +81 -0
- package/android/src/main/java/com/theoplayer/cast/CastModule.kt +75 -0
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +2 -2
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +1 -2
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +1 -2
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +3 -5
- package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +402 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.kt +6 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackType.kt +6 -0
- package/android/src/main/java/com/theoplayer/track/QualityListAdapter.kt +43 -0
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +28 -0
- package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.kt +10 -0
- package/android/src/main/java/com/theoplayer/track/TrackEventType.kt +7 -0
- package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +219 -0
- package/android/src/main/java/com/theoplayer/util/ViewResolver.kt +19 -0
- package/ios/THEOplayerRCTAdAggregator.swift +15 -6
- package/ios/THEOplayerRCTAdsAPI.swift +39 -40
- package/ios/THEOplayerRCTBridge.m +54 -1
- package/ios/THEOplayerRCTCastAPI.swift +275 -0
- package/ios/THEOplayerRCTDebug.swift +3 -0
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +91 -19
- package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
- package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +69 -55
- package/ios/THEOplayerRCTView.swift +126 -22
- package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
- package/ios/THEOplayerRCTViewCastEventHandler.swift +124 -0
- package/ios/THEOplayerRCTViewMainEventHandler.swift +1 -1
- package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
- package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +30 -13
- package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
- package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
- package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/barrel.js +21 -8
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/cast/Airplay.js +6 -0
- package/lib/commonjs/api/cast/Airplay.js.map +1 -0
- package/lib/commonjs/api/cast/CastAPI.js +6 -0
- package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
- package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
- package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
- package/lib/commonjs/api/cast/CastState.js +2 -0
- package/lib/commonjs/api/cast/CastState.js.map +1 -0
- package/lib/commonjs/api/cast/Chromecast.js +6 -0
- package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
- package/lib/commonjs/api/cast/barrel.js +71 -0
- package/lib/commonjs/api/cast/barrel.js.map +1 -0
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/commonjs/api/error/ChromecastError.js +2 -0
- package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
- package/lib/commonjs/api/error/barrel.js +13 -0
- package/lib/commonjs/api/error/barrel.js.map +1 -1
- package/lib/commonjs/api/event/CastEvent.js +21 -0
- package/lib/commonjs/api/event/CastEvent.js.map +1 -0
- package/lib/commonjs/api/event/TrackEvent.js +17 -1
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
- package/lib/commonjs/api/event/barrel.js +25 -12
- package/lib/commonjs/api/event/barrel.js.map +1 -1
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
- package/lib/commonjs/api/source/barrel.js +13 -0
- package/lib/commonjs/api/source/barrel.js.map +1 -1
- package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
- package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
- package/lib/commonjs/api/source/metadata/barrel.js +19 -0
- package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
- package/lib/commonjs/internal/THEOplayerView.js +30 -0
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +80 -20
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
- package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
- package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
- package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
- package/lib/module/api/THEOplayerView.js.map +1 -1
- package/lib/module/api/barrel.js +1 -0
- package/lib/module/api/barrel.js.map +1 -1
- package/lib/module/api/cast/Airplay.js +2 -0
- package/lib/module/api/cast/Airplay.js.map +1 -0
- package/lib/module/api/cast/CastAPI.js +2 -0
- package/lib/module/api/cast/CastAPI.js.map +1 -0
- package/lib/module/api/cast/CastConfiguration.js +2 -0
- package/lib/module/api/cast/CastConfiguration.js.map +1 -0
- package/lib/module/api/cast/CastState.js +2 -0
- package/lib/module/api/cast/CastState.js.map +1 -0
- package/lib/module/api/cast/Chromecast.js +2 -0
- package/lib/module/api/cast/Chromecast.js.map +1 -0
- package/lib/module/api/cast/barrel.js +6 -0
- package/lib/module/api/cast/barrel.js.map +1 -0
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/module/api/error/ChromecastError.js +2 -0
- package/lib/module/api/error/ChromecastError.js.map +1 -0
- package/lib/module/api/error/barrel.js +1 -0
- package/lib/module/api/error/barrel.js.map +1 -1
- package/lib/module/api/event/CastEvent.js +14 -0
- package/lib/module/api/event/CastEvent.js.map +1 -0
- package/lib/module/api/event/TrackEvent.js +14 -0
- package/lib/module/api/event/TrackEvent.js.map +1 -1
- package/lib/module/api/event/barrel.js +2 -1
- package/lib/module/api/event/barrel.js.map +1 -1
- package/lib/module/api/source/SourceDescription.js.map +1 -1
- package/lib/module/api/source/barrel.js +1 -0
- package/lib/module/api/source/barrel.js.map +1 -1
- package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
- package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
- package/lib/module/api/source/metadata/barrel.js +2 -0
- package/lib/module/api/source/metadata/barrel.js.map +1 -0
- package/lib/module/internal/THEOplayerView.js +29 -0
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +80 -21
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
- package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
- package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
- package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
- package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
- package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
- package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
- package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
- package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
- package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
- package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
- package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
- package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
- package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
- package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
- package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
- package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
- package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
- package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +21 -3
- package/lib/typescript/src/api/barrel.d.ts +1 -0
- package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
- package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
- package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
- package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
- package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
- package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
- package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
- package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
- package/lib/typescript/src/api/error/barrel.d.ts +1 -0
- package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
- package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
- package/lib/typescript/src/api/event/barrel.d.ts +2 -1
- package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
- package/lib/typescript/src/api/source/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
- package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/src/internal/THEOplayerView.d.ts +9 -1
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +7 -2
- package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
- package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
- package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
- package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
- package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
- package/package.json +2 -2
- package/react-native-theoplayer.podspec +2 -2
- package/src/api/THEOplayerView.ts +25 -3
- package/src/api/barrel.ts +1 -0
- package/src/api/cast/Airplay.ts +31 -0
- package/src/api/cast/CastAPI.ts +30 -0
- package/src/api/cast/CastConfiguration.ts +44 -0
- package/src/api/cast/CastState.ts +10 -0
- package/src/api/cast/Chromecast.ts +45 -0
- package/src/api/cast/barrel.ts +5 -0
- package/src/api/config/PlayerConfiguration.ts +7 -1
- package/src/api/error/ChromecastError.ts +46 -0
- package/src/api/error/barrel.ts +1 -0
- package/src/api/event/CastEvent.ts +45 -0
- package/src/api/event/TrackEvent.ts +58 -2
- package/src/api/event/barrel.ts +2 -1
- package/src/api/source/SourceDescription.ts +8 -0
- package/src/api/source/barrel.ts +1 -0
- package/src/api/source/metadata/MetadataDescription.ts +13 -0
- package/src/api/source/metadata/barrel.ts +1 -0
- package/src/internal/THEOplayerView.tsx +35 -0
- package/src/internal/THEOplayerView.web.tsx +87 -19
- package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
- package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
- package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
- package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
- package/src/internal/web/stub/CastButtonStub.tsx +7 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
- package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -442
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
- package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
- package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
- package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
- package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
- package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -11
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -212
- package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
- package/ios/custom/react-native-theoplayer_custom_ios.podspec +0 -36
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
package com.theoplayer
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.os.Build
|
|
5
|
+
import android.os.Handler
|
|
6
|
+
import android.os.Looper
|
|
7
|
+
import android.util.Log
|
|
8
|
+
import android.widget.FrameLayout
|
|
9
|
+
import com.facebook.react.bridge.*
|
|
10
|
+
import com.theoplayer.util.TypeUtils.encodeInfNan
|
|
11
|
+
import com.theoplayer.android.api.ads.ima.GoogleImaIntegrationFactory.createGoogleImaIntegration
|
|
12
|
+
import com.theoplayer.android.api.ads.dai.GoogleDaiIntegrationFactory.createGoogleDaiIntegration
|
|
13
|
+
import com.theoplayer.android.api.cast.CastIntegrationFactory.createCastIntegration
|
|
14
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
15
|
+
import com.theoplayer.android.api.THEOplayerView
|
|
16
|
+
import com.theoplayer.android.api.ads.dai.GoogleDaiIntegration
|
|
17
|
+
import com.theoplayer.android.api.ads.ima.GoogleImaIntegration
|
|
18
|
+
import com.theoplayer.android.api.cast.CastIntegration
|
|
19
|
+
import com.theoplayer.android.api.ads.wrapper.AdsApiWrapper
|
|
20
|
+
import com.theoplayer.android.api.player.Player
|
|
21
|
+
import com.theoplayer.android.api.source.SourceDescription
|
|
22
|
+
import com.theoplayer.android.api.player.track.texttrack.TextTrack
|
|
23
|
+
import com.theoplayer.android.api.player.track.texttrack.cue.TextTrackCue
|
|
24
|
+
import com.theoplayer.android.api.THEOplayerConfig
|
|
25
|
+
import com.google.ads.interactivemedia.v3.api.AdsRenderingSettings
|
|
26
|
+
import com.google.ads.interactivemedia.v3.api.ImaSdkFactory
|
|
27
|
+
import com.theoplayer.abr.ABRConfigurationAdapter
|
|
28
|
+
import com.theoplayer.source.SourceAdapter
|
|
29
|
+
import com.theoplayer.android.api.error.THEOplayerException
|
|
30
|
+
import com.theoplayer.android.api.player.track.texttrack.TextTrackMode
|
|
31
|
+
import com.theoplayer.android.api.player.track.mediatrack.quality.AudioQuality
|
|
32
|
+
import com.theoplayer.android.api.player.track.mediatrack.quality.VideoQuality
|
|
33
|
+
import com.theoplayer.android.api.cast.Cast
|
|
34
|
+
import com.theoplayer.android.api.player.track.mediatrack.MediaTrack
|
|
35
|
+
import com.theoplayer.android.api.timerange.TimeRanges
|
|
36
|
+
import com.theoplayer.track.QualityListFilter
|
|
37
|
+
import com.theoplayer.track.TrackListAdapter
|
|
38
|
+
import java.lang.Exception
|
|
39
|
+
|
|
40
|
+
private const val TAG = "ReactTHEOplayerView"
|
|
41
|
+
private const val TIME_UNSET = Long.MIN_VALUE + 1
|
|
42
|
+
|
|
43
|
+
@SuppressLint("ViewConstructor")
|
|
44
|
+
class ReactTHEOplayerView(private val reactContext: ThemedReactContext) :
|
|
45
|
+
FrameLayout(reactContext), LifecycleEventListener {
|
|
46
|
+
|
|
47
|
+
private val eventEmitter: PlayerEventEmitter = PlayerEventEmitter(reactContext.reactApplicationContext, this)
|
|
48
|
+
private var playerView: THEOplayerView? = null
|
|
49
|
+
private var abrConfig: ReadableMap? = null
|
|
50
|
+
private var paused = false
|
|
51
|
+
private var muted = false
|
|
52
|
+
private var fullscreen = false
|
|
53
|
+
private var playbackRate = 1.0
|
|
54
|
+
private var volume = 1.0
|
|
55
|
+
private var seekTime = TIME_UNSET.toDouble()
|
|
56
|
+
private var sourceDescription: SourceDescription? = null
|
|
57
|
+
private val mainHandler = Handler(Looper.getMainLooper())
|
|
58
|
+
private val trackListAdapter = TrackListAdapter()
|
|
59
|
+
|
|
60
|
+
var daiIntegration: GoogleDaiIntegration? = null
|
|
61
|
+
var imaIntegration: GoogleImaIntegration? = null
|
|
62
|
+
var castIntegration: CastIntegration? = null
|
|
63
|
+
val adsApi: AdsApiWrapper
|
|
64
|
+
var player: Player? = null
|
|
65
|
+
|
|
66
|
+
init {
|
|
67
|
+
reactContext.addLifecycleEventListener(this)
|
|
68
|
+
adsApi = AdsApiWrapper()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
val castApi: Cast?
|
|
72
|
+
get() = if (playerView != null) playerView!!.cast else null
|
|
73
|
+
|
|
74
|
+
val textTrackInfo: WritableArray
|
|
75
|
+
get() = if (player != null) {
|
|
76
|
+
trackListAdapter.fromTextTrackList(player!!.textTracks)
|
|
77
|
+
} else Arguments.createArray()
|
|
78
|
+
|
|
79
|
+
fun initialize(configProps: ReadableMap?) {
|
|
80
|
+
createViews(PlayerConfigAdapter.fromProps(configProps))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
fun getTextTrackInfo(track: TextTrack): WritableMap {
|
|
84
|
+
return if (player != null) {
|
|
85
|
+
trackListAdapter.fromTextTrack(track)
|
|
86
|
+
} else Arguments.createMap()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fun getTextTrackCueInfo(cue: TextTrackCue): WritableMap {
|
|
90
|
+
return if (player != null) {
|
|
91
|
+
trackListAdapter.fromTextTrackCue(cue)
|
|
92
|
+
} else Arguments.createMap()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
val audioTrackInfo: WritableArray
|
|
96
|
+
get() = if (player != null) {
|
|
97
|
+
trackListAdapter.fromAudioTrackList(player!!.audioTracks)
|
|
98
|
+
} else Arguments.createArray()
|
|
99
|
+
|
|
100
|
+
val videoTrackInfo: WritableArray
|
|
101
|
+
get() = if (player != null) {
|
|
102
|
+
trackListAdapter.fromVideoTrackList(player!!.videoTracks)
|
|
103
|
+
} else Arguments.createArray()
|
|
104
|
+
|
|
105
|
+
val duration: Double
|
|
106
|
+
get() = encodeInfNan(if (player != null) 1e03 * player!!.duration else Double.NaN)
|
|
107
|
+
|
|
108
|
+
fun getSeekableRange() : TimeRanges? {
|
|
109
|
+
return player?.seekable
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
override fun setId(id: Int) {
|
|
113
|
+
super.setId(id)
|
|
114
|
+
eventEmitter.setViewId(id)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private fun createViews(playerConfig: THEOplayerConfig) {
|
|
118
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
119
|
+
Log.d(TAG, "Create views")
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
playerView = object : THEOplayerView(reactContext.currentActivity!!, playerConfig) {
|
|
123
|
+
private fun measureAndLayout() {
|
|
124
|
+
measure(
|
|
125
|
+
MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY),
|
|
126
|
+
MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY)
|
|
127
|
+
)
|
|
128
|
+
layout(left, top, right, bottom)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
override fun requestLayout() {
|
|
132
|
+
super.requestLayout()
|
|
133
|
+
|
|
134
|
+
// schedule a forced layout
|
|
135
|
+
mainHandler.post { measureAndLayout() }
|
|
136
|
+
}
|
|
137
|
+
}.also {
|
|
138
|
+
val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
|
139
|
+
it.layoutParams = layoutParams
|
|
140
|
+
addIntegrations(it, playerConfig)
|
|
141
|
+
addView(it, 0, layoutParams)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private fun addIntegrations(playerView: THEOplayerView, playerConfig: THEOplayerConfig) {
|
|
146
|
+
try {
|
|
147
|
+
if (BuildConfig.EXTENSION_GOOGLE_IMA) {
|
|
148
|
+
imaIntegration = createGoogleImaIntegration(playerView).apply {
|
|
149
|
+
setAdsRenderingSettings(createRenderSettings(playerConfig))
|
|
150
|
+
playerView.player.addIntegration(this)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} catch (ignore: Exception) {
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
if (BuildConfig.EXTENSION_GOOGLE_DAI) {
|
|
157
|
+
daiIntegration = createGoogleDaiIntegration(playerView).apply {
|
|
158
|
+
setAdsRenderingSettings(createRenderSettings(playerConfig))
|
|
159
|
+
playerView.player.addIntegration(this)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} catch (ignore: Exception) {
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
if (BuildConfig.EXTENSION_CAST) {
|
|
166
|
+
castIntegration = createCastIntegration(playerView).apply {
|
|
167
|
+
playerView.player.addIntegration(this)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Add other future integrations here.
|
|
171
|
+
} catch (ignore: Exception) {
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private fun createRenderSettings(playerConfig: THEOplayerConfig): AdsRenderingSettings {
|
|
176
|
+
val renderingSettings = ImaSdkFactory.getInstance().createAdsRenderingSettings()
|
|
177
|
+
if (playerConfig.ads != null && !playerConfig.ads!!.isShowCountdown) {
|
|
178
|
+
renderingSettings.setUiElements(emptySet())
|
|
179
|
+
renderingSettings.disableUi = true
|
|
180
|
+
}
|
|
181
|
+
return renderingSettings
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
override fun onAttachedToWindow() {
|
|
185
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
186
|
+
Log.d(TAG, "onAttachedToWindow")
|
|
187
|
+
}
|
|
188
|
+
super.onAttachedToWindow()
|
|
189
|
+
initializePlayer()
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
override fun onDetachedFromWindow() {
|
|
193
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
194
|
+
Log.d(TAG, "onDetachedFromWindow")
|
|
195
|
+
}
|
|
196
|
+
super.onDetachedFromWindow()
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private fun initializePlayer() {
|
|
200
|
+
// This ensures all props have been settled, to avoid async racing conditions.
|
|
201
|
+
mainHandler.postDelayed({
|
|
202
|
+
if (player == null) {
|
|
203
|
+
player = playerView!!.player
|
|
204
|
+
ABRConfigurationAdapter.applyABRConfigurationFromProps(player, abrConfig)
|
|
205
|
+
if (BuildConfig.EXTENSION_ADS) {
|
|
206
|
+
adsApi.initialize(player!!, imaIntegration, daiIntegration)
|
|
207
|
+
}
|
|
208
|
+
eventEmitter.attachListeners(player!!)
|
|
209
|
+
player?.isMuted = muted
|
|
210
|
+
player?.volume = volume
|
|
211
|
+
player?.playbackRate = playbackRate
|
|
212
|
+
setSource(sourceDescription)
|
|
213
|
+
if (!paused) {
|
|
214
|
+
player?.play()
|
|
215
|
+
}
|
|
216
|
+
if (seekTime != TIME_UNSET.toDouble()) {
|
|
217
|
+
seekTo(seekTime)
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}, 1)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
override fun onHostResume() {
|
|
224
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
225
|
+
Log.d(TAG, "onHostResume")
|
|
226
|
+
}
|
|
227
|
+
playerView?.onResume()
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
override fun onHostPause() {
|
|
231
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
232
|
+
Log.d(TAG, "onHostPause")
|
|
233
|
+
}
|
|
234
|
+
playerView?.onPause()
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
override fun onHostDestroy() {
|
|
238
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
239
|
+
Log.d(TAG, "onHostDestroy")
|
|
240
|
+
}
|
|
241
|
+
cleanUpResources()
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
fun cleanUpResources() {
|
|
245
|
+
if (BuildConfig.LOG_VIEW_EVENTS) {
|
|
246
|
+
Log.d(TAG, "cleanUpResources")
|
|
247
|
+
}
|
|
248
|
+
releasePlayer()
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
private fun releasePlayer() {
|
|
252
|
+
player?.let {
|
|
253
|
+
eventEmitter.removeListeners(it)
|
|
254
|
+
adsApi.destroy()
|
|
255
|
+
it.stop()
|
|
256
|
+
player = null
|
|
257
|
+
}
|
|
258
|
+
playerView?.onDestroy()
|
|
259
|
+
reactContext.removeLifecycleEventListener(this)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
fun setSource(source: ReadableMap?) {
|
|
263
|
+
try {
|
|
264
|
+
setSource(SourceAdapter().parseSourceFromJS(source!!))
|
|
265
|
+
} catch (exception: THEOplayerException) {
|
|
266
|
+
Log.e(TAG, exception.message!!)
|
|
267
|
+
eventEmitter.emitError(exception)
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
fun setABRConfig(abrConfigProps: ReadableMap?) {
|
|
272
|
+
abrConfig = abrConfigProps
|
|
273
|
+
ABRConfigurationAdapter.applyABRConfigurationFromProps(player, abrConfig)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
fun setSource(sourceDescription: SourceDescription?) {
|
|
277
|
+
this.sourceDescription = sourceDescription
|
|
278
|
+
adsApi.setSource(sourceDescription)
|
|
279
|
+
if (player != null && sourceDescription != null) {
|
|
280
|
+
player!!.source = sourceDescription
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
fun setPaused(paused: Boolean) {
|
|
285
|
+
this.paused = paused
|
|
286
|
+
if (player != null) {
|
|
287
|
+
val playerIsPaused = player!!.isPaused
|
|
288
|
+
if (!paused && playerIsPaused) {
|
|
289
|
+
applyPaused(false)
|
|
290
|
+
} else if (paused && (!playerIsPaused || adsApi.isPlaying)) {
|
|
291
|
+
applyPaused(true)
|
|
292
|
+
} else {
|
|
293
|
+
// The player's paused state is out-of-sync, this shouldn't happen.
|
|
294
|
+
Log.w(TAG, "paused stated out-of-sync")
|
|
295
|
+
applyPaused(paused)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
private fun applyPaused(paused: Boolean) {
|
|
301
|
+
if (paused) {
|
|
302
|
+
player?.pause()
|
|
303
|
+
} else {
|
|
304
|
+
player?.play()
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
fun setMuted(muted: Boolean) {
|
|
309
|
+
this.muted = muted
|
|
310
|
+
player?.isMuted = muted
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
fun setVolume(volume: Double) {
|
|
314
|
+
this.volume = volume
|
|
315
|
+
player?.volume = volume
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
fun setPlaybackRate(playbackRate: Double) {
|
|
319
|
+
this.playbackRate = playbackRate
|
|
320
|
+
player?.playbackRate = playbackRate
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
fun seekTo(seekTime: Double) {
|
|
324
|
+
this.seekTime = seekTime
|
|
325
|
+
player?.let {
|
|
326
|
+
it.currentTime = 1e-03 * seekTime
|
|
327
|
+
|
|
328
|
+
// reset once used
|
|
329
|
+
this.seekTime = TIME_UNSET.toDouble()
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
val selectedTextTrack: TextTrack?
|
|
334
|
+
get() {
|
|
335
|
+
if (player != null) {
|
|
336
|
+
val tracks = player!!.textTracks
|
|
337
|
+
for (i in 0 until tracks.length()) {
|
|
338
|
+
val track = tracks.getItem(i)
|
|
339
|
+
if (track.mode == TextTrackMode.SHOWING) {
|
|
340
|
+
return track
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return null
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
fun setSelectedTextTrack(uid: Int) {
|
|
348
|
+
if (player != null) {
|
|
349
|
+
for (track in player!!.textTracks) {
|
|
350
|
+
if (track.uid == uid) {
|
|
351
|
+
track.mode = TextTrackMode.SHOWING
|
|
352
|
+
} else if (track.mode == TextTrackMode.SHOWING) {
|
|
353
|
+
track.mode = TextTrackMode.DISABLED
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
val selectedAudioTrack: MediaTrack<AudioQuality>?
|
|
360
|
+
get() {
|
|
361
|
+
if (player != null) {
|
|
362
|
+
val tracks = player!!.audioTracks
|
|
363
|
+
for (i in 0 until tracks.length()) {
|
|
364
|
+
val track = tracks.getItem(i)
|
|
365
|
+
if (track.isEnabled) {
|
|
366
|
+
return track
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return null
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
fun setSelectedAudioTrack(uid: Int) {
|
|
374
|
+
if (player != null) {
|
|
375
|
+
for (track in player!!.audioTracks) {
|
|
376
|
+
track.isEnabled = track.uid == uid
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
val selectedVideoTrack: MediaTrack<VideoQuality?>?
|
|
382
|
+
get() {
|
|
383
|
+
if (player != null) {
|
|
384
|
+
val tracks = player!!.videoTracks
|
|
385
|
+
for (i in 0 until tracks.length()) {
|
|
386
|
+
val track = tracks.getItem(i)
|
|
387
|
+
if (track.isEnabled) {
|
|
388
|
+
return track
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return null
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
fun setSelectedVideoTrack(uid: Int) {
|
|
396
|
+
if (player != null) {
|
|
397
|
+
for (track in player!!.videoTracks) {
|
|
398
|
+
track.isEnabled = track.uid == uid
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
fun setTargetVideoQualities(uids: ReadableArray) {
|
|
404
|
+
@Suppress("UNCHECKED_CAST") val currentVideoTrack = selectedVideoTrack as MediaTrack<VideoQuality>?
|
|
405
|
+
if (currentVideoTrack != null) {
|
|
406
|
+
if (uids.size() == 0) {
|
|
407
|
+
// Reset target qualities when passing empty list.
|
|
408
|
+
currentVideoTrack.setTargetQuality(null)
|
|
409
|
+
} else {
|
|
410
|
+
currentVideoTrack.qualities?.let {
|
|
411
|
+
currentVideoTrack.targetQualities = QualityListFilter(it).filterQualityList(uids)
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
@SuppressLint("ObsoleteSdkInt")
|
|
418
|
+
fun setFullscreen(fullscreen: Boolean) {
|
|
419
|
+
if (fullscreen == this.fullscreen) {
|
|
420
|
+
return
|
|
421
|
+
}
|
|
422
|
+
this.fullscreen = fullscreen
|
|
423
|
+
val activity = reactContext.currentActivity ?: return
|
|
424
|
+
val window = activity.window
|
|
425
|
+
val decorView = window.decorView
|
|
426
|
+
val uiOptions: Int
|
|
427
|
+
if (fullscreen) {
|
|
428
|
+
uiOptions = if (Build.VERSION.SDK_INT >= 19) { // 4.4+
|
|
429
|
+
(SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
|
430
|
+
or SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
|
431
|
+
or SYSTEM_UI_FLAG_FULLSCREEN)
|
|
432
|
+
} else {
|
|
433
|
+
(SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
|
434
|
+
or SYSTEM_UI_FLAG_FULLSCREEN)
|
|
435
|
+
}
|
|
436
|
+
eventEmitter.onFullscreenWillPresent()
|
|
437
|
+
decorView.systemUiVisibility = uiOptions
|
|
438
|
+
eventEmitter.onFullscreenDidPresent()
|
|
439
|
+
} else {
|
|
440
|
+
uiOptions = SYSTEM_UI_FLAG_VISIBLE
|
|
441
|
+
eventEmitter.onFullscreenWillDismiss()
|
|
442
|
+
decorView.systemUiVisibility = uiOptions
|
|
443
|
+
eventEmitter.onFullscreenDidDismiss()
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
@file:Suppress("unused")
|
|
2
|
+
|
|
3
|
+
package com.theoplayer
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
6
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
7
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
8
|
+
import com.facebook.react.bridge.ReadableMap
|
|
9
|
+
import com.facebook.react.bridge.ReadableArray
|
|
10
|
+
import com.facebook.react.common.MapBuilder
|
|
11
|
+
|
|
12
|
+
private const val REACT_CLASS = "THEOplayerRCTView"
|
|
13
|
+
|
|
14
|
+
private const val PROP_CONFIG = "config"
|
|
15
|
+
private const val PROP_ABR_CONFIG = "abrConfig"
|
|
16
|
+
private const val PROP_SRC = "src"
|
|
17
|
+
private const val PROP_SEEK = "seek"
|
|
18
|
+
private const val PROP_PAUSED = "paused"
|
|
19
|
+
private const val PROP_MUTED = "muted"
|
|
20
|
+
private const val PROP_VOLUME = "volume"
|
|
21
|
+
private const val PROP_PLAYBACKRATE = "playbackRate"
|
|
22
|
+
private const val PROP_FULLSCREEN = "fullscreen"
|
|
23
|
+
private const val PROP_SELECTED_TEXTTRACK = "selectedTextTrack"
|
|
24
|
+
private const val PROP_SELECTED_AUDIOTRACK = "selectedAudioTrack"
|
|
25
|
+
private const val PROP_SELECTED_VIDEOTRACK = "selectedVideoTrack"
|
|
26
|
+
private const val PROP_TARGET_VIDEOQUALITY = "targetVideoQuality"
|
|
27
|
+
|
|
28
|
+
class ReactTHEOplayerViewManager : ViewGroupManager<ReactTHEOplayerView>() {
|
|
29
|
+
override fun getName(): String {
|
|
30
|
+
return REACT_CLASS
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override fun createViewInstance(reactContext: ThemedReactContext): ReactTHEOplayerView {
|
|
34
|
+
return ReactTHEOplayerView(reactContext)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override fun onDropViewInstance(view: ReactTHEOplayerView) {
|
|
38
|
+
view.cleanUpResources()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@ReactProp(name = PROP_CONFIG)
|
|
42
|
+
fun setConfig(videoView: ReactTHEOplayerView, config: ReadableMap?) {
|
|
43
|
+
videoView.initialize(config)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@ReactProp(name = PROP_ABR_CONFIG)
|
|
47
|
+
fun setABRConfig(videoView: ReactTHEOplayerView, config: ReadableMap?) {
|
|
48
|
+
videoView.setABRConfig(config)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@ReactProp(name = PROP_SRC)
|
|
52
|
+
fun setSource(videoView: ReactTHEOplayerView, src: ReadableMap?) {
|
|
53
|
+
videoView.setSource(src)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@ReactProp(name = PROP_SEEK)
|
|
57
|
+
fun setSeek(videoView: ReactTHEOplayerView, seek: Double) {
|
|
58
|
+
videoView.seekTo(seek)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@ReactProp(name = PROP_PAUSED, defaultBoolean = false)
|
|
62
|
+
fun setPaused(videoView: ReactTHEOplayerView, paused: Boolean) {
|
|
63
|
+
videoView.setPaused(paused)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@ReactProp(name = PROP_MUTED, defaultBoolean = false)
|
|
67
|
+
fun setMuted(videoView: ReactTHEOplayerView, muted: Boolean) {
|
|
68
|
+
videoView.setMuted(muted)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@ReactProp(name = PROP_VOLUME, defaultDouble = 1.0)
|
|
72
|
+
fun setVolume(videoView: ReactTHEOplayerView, volume: Double) {
|
|
73
|
+
videoView.setVolume(volume)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@ReactProp(name = PROP_PLAYBACKRATE, defaultDouble = 1.0)
|
|
77
|
+
fun setPlaybackRate(videoView: ReactTHEOplayerView, playbackRate: Double) {
|
|
78
|
+
videoView.setPlaybackRate(playbackRate)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false)
|
|
82
|
+
fun setFullscreen(videoView: ReactTHEOplayerView, fullscreen: Boolean) {
|
|
83
|
+
videoView.setFullscreen(fullscreen)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@ReactProp(name = PROP_SELECTED_TEXTTRACK, defaultInt = -1)
|
|
87
|
+
fun setSelectedTextTrack(videoView: ReactTHEOplayerView, uid: Int) {
|
|
88
|
+
videoView.setSelectedTextTrack(uid)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@ReactProp(name = PROP_SELECTED_AUDIOTRACK, defaultInt = -1)
|
|
92
|
+
fun setSelectedAudioTrack(videoView: ReactTHEOplayerView, uid: Int) {
|
|
93
|
+
if (uid != -1) {
|
|
94
|
+
videoView.setSelectedAudioTrack(uid)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@ReactProp(name = PROP_SELECTED_VIDEOTRACK, defaultInt = -1)
|
|
99
|
+
fun setSelectedVideoTrack(videoView: ReactTHEOplayerView, uid: Int) {
|
|
100
|
+
if (uid != -1) {
|
|
101
|
+
videoView.setSelectedVideoTrack(uid)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@ReactProp(name = PROP_TARGET_VIDEOQUALITY)
|
|
106
|
+
fun setTargetVideoQuality(videoView: ReactTHEOplayerView, uid: ReadableArray) {
|
|
107
|
+
videoView.setTargetVideoQualities(uid)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> {
|
|
111
|
+
val builder = MapBuilder.builder<String, Any>()
|
|
112
|
+
for (event in PlayerEventEmitter.Events) {
|
|
113
|
+
builder.put(event, MapBuilder.of("registrationName", event))
|
|
114
|
+
}
|
|
115
|
+
return builder.build()
|
|
116
|
+
}
|
|
117
|
+
}
|