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.
Files changed (243) hide show
  1. package/README.md +2 -0
  2. package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +115 -0
  3. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +648 -0
  4. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +23 -0
  5. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +446 -0
  6. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.kt +117 -0
  7. package/android/src/main/java/com/theoplayer/{TimeUpdateRate.java → TimeUpdateRate.kt} +2 -2
  8. package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +161 -0
  9. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +90 -0
  10. package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +140 -0
  11. package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +81 -0
  12. package/android/src/main/java/com/theoplayer/cast/CastModule.kt +75 -0
  13. package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +2 -2
  14. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +1 -2
  15. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +1 -2
  16. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +3 -5
  17. package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +402 -0
  18. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.kt +6 -0
  19. package/android/src/main/java/com/theoplayer/track/MediaTrackType.kt +6 -0
  20. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.kt +43 -0
  21. package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +28 -0
  22. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.kt +10 -0
  23. package/android/src/main/java/com/theoplayer/track/TrackEventType.kt +7 -0
  24. package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +219 -0
  25. package/android/src/main/java/com/theoplayer/util/ViewResolver.kt +19 -0
  26. package/ios/THEOplayerRCTAdAggregator.swift +15 -6
  27. package/ios/THEOplayerRCTAdsAPI.swift +39 -40
  28. package/ios/THEOplayerRCTBridge.m +54 -1
  29. package/ios/THEOplayerRCTCastAPI.swift +275 -0
  30. package/ios/THEOplayerRCTDebug.swift +3 -0
  31. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +91 -19
  32. package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
  33. package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +69 -55
  34. package/ios/THEOplayerRCTView.swift +126 -22
  35. package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
  36. package/ios/THEOplayerRCTViewCastEventHandler.swift +124 -0
  37. package/ios/THEOplayerRCTViewMainEventHandler.swift +1 -1
  38. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
  39. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +30 -13
  40. package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
  41. package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
  42. package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
  43. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  44. package/lib/commonjs/api/barrel.js +21 -8
  45. package/lib/commonjs/api/barrel.js.map +1 -1
  46. package/lib/commonjs/api/cast/Airplay.js +6 -0
  47. package/lib/commonjs/api/cast/Airplay.js.map +1 -0
  48. package/lib/commonjs/api/cast/CastAPI.js +6 -0
  49. package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
  50. package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
  51. package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
  52. package/lib/commonjs/api/cast/CastState.js +2 -0
  53. package/lib/commonjs/api/cast/CastState.js.map +1 -0
  54. package/lib/commonjs/api/cast/Chromecast.js +6 -0
  55. package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
  56. package/lib/commonjs/api/cast/barrel.js +71 -0
  57. package/lib/commonjs/api/cast/barrel.js.map +1 -0
  58. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
  59. package/lib/commonjs/api/error/ChromecastError.js +2 -0
  60. package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
  61. package/lib/commonjs/api/error/barrel.js +13 -0
  62. package/lib/commonjs/api/error/barrel.js.map +1 -1
  63. package/lib/commonjs/api/event/CastEvent.js +21 -0
  64. package/lib/commonjs/api/event/CastEvent.js.map +1 -0
  65. package/lib/commonjs/api/event/TrackEvent.js +17 -1
  66. package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
  67. package/lib/commonjs/api/event/barrel.js +25 -12
  68. package/lib/commonjs/api/event/barrel.js.map +1 -1
  69. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  70. package/lib/commonjs/api/source/barrel.js +13 -0
  71. package/lib/commonjs/api/source/barrel.js.map +1 -1
  72. package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
  73. package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
  74. package/lib/commonjs/api/source/metadata/barrel.js +19 -0
  75. package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
  76. package/lib/commonjs/internal/THEOplayerView.js +30 -0
  77. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  78. package/lib/commonjs/internal/THEOplayerView.web.js +80 -20
  79. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  80. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
  81. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  82. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
  83. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  84. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
  85. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  86. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
  87. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  88. package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
  89. package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
  90. package/lib/module/api/THEOplayerView.js.map +1 -1
  91. package/lib/module/api/barrel.js +1 -0
  92. package/lib/module/api/barrel.js.map +1 -1
  93. package/lib/module/api/cast/Airplay.js +2 -0
  94. package/lib/module/api/cast/Airplay.js.map +1 -0
  95. package/lib/module/api/cast/CastAPI.js +2 -0
  96. package/lib/module/api/cast/CastAPI.js.map +1 -0
  97. package/lib/module/api/cast/CastConfiguration.js +2 -0
  98. package/lib/module/api/cast/CastConfiguration.js.map +1 -0
  99. package/lib/module/api/cast/CastState.js +2 -0
  100. package/lib/module/api/cast/CastState.js.map +1 -0
  101. package/lib/module/api/cast/Chromecast.js +2 -0
  102. package/lib/module/api/cast/Chromecast.js.map +1 -0
  103. package/lib/module/api/cast/barrel.js +6 -0
  104. package/lib/module/api/cast/barrel.js.map +1 -0
  105. package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
  106. package/lib/module/api/error/ChromecastError.js +2 -0
  107. package/lib/module/api/error/ChromecastError.js.map +1 -0
  108. package/lib/module/api/error/barrel.js +1 -0
  109. package/lib/module/api/error/barrel.js.map +1 -1
  110. package/lib/module/api/event/CastEvent.js +14 -0
  111. package/lib/module/api/event/CastEvent.js.map +1 -0
  112. package/lib/module/api/event/TrackEvent.js +14 -0
  113. package/lib/module/api/event/TrackEvent.js.map +1 -1
  114. package/lib/module/api/event/barrel.js +2 -1
  115. package/lib/module/api/event/barrel.js.map +1 -1
  116. package/lib/module/api/source/SourceDescription.js.map +1 -1
  117. package/lib/module/api/source/barrel.js +1 -0
  118. package/lib/module/api/source/barrel.js.map +1 -1
  119. package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
  120. package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
  121. package/lib/module/api/source/metadata/barrel.js +2 -0
  122. package/lib/module/api/source/metadata/barrel.js.map +1 -0
  123. package/lib/module/internal/THEOplayerView.js +29 -0
  124. package/lib/module/internal/THEOplayerView.js.map +1 -1
  125. package/lib/module/internal/THEOplayerView.web.js +80 -21
  126. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  127. package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
  128. package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  129. package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
  130. package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  131. package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
  132. package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  133. package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
  134. package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  135. package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
  136. package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
  137. package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
  138. package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
  139. package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
  140. package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
  141. package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
  142. package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
  143. package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
  144. package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
  145. package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
  146. package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
  147. package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
  148. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
  149. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
  150. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  151. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
  152. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  153. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
  154. package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
  155. package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
  156. package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
  157. package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
  158. package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
  159. package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
  160. package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
  161. package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
  162. package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
  163. package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
  164. package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
  165. package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
  166. package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
  167. package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
  168. package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
  169. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
  170. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
  171. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
  172. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
  173. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
  174. package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
  175. package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
  176. package/lib/typescript/src/api/THEOplayerView.d.ts +21 -3
  177. package/lib/typescript/src/api/barrel.d.ts +1 -0
  178. package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
  179. package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
  180. package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
  181. package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
  182. package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
  183. package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
  184. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
  185. package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
  186. package/lib/typescript/src/api/error/barrel.d.ts +1 -0
  187. package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
  188. package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
  189. package/lib/typescript/src/api/event/barrel.d.ts +2 -1
  190. package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
  191. package/lib/typescript/src/api/source/barrel.d.ts +1 -0
  192. package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
  193. package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
  194. package/lib/typescript/src/internal/THEOplayerView.d.ts +9 -1
  195. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +7 -2
  196. package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  197. package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
  198. package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  199. package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
  200. package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
  201. package/package.json +2 -2
  202. package/react-native-theoplayer.podspec +2 -2
  203. package/src/api/THEOplayerView.ts +25 -3
  204. package/src/api/barrel.ts +1 -0
  205. package/src/api/cast/Airplay.ts +31 -0
  206. package/src/api/cast/CastAPI.ts +30 -0
  207. package/src/api/cast/CastConfiguration.ts +44 -0
  208. package/src/api/cast/CastState.ts +10 -0
  209. package/src/api/cast/Chromecast.ts +45 -0
  210. package/src/api/cast/barrel.ts +5 -0
  211. package/src/api/config/PlayerConfiguration.ts +7 -1
  212. package/src/api/error/ChromecastError.ts +46 -0
  213. package/src/api/error/barrel.ts +1 -0
  214. package/src/api/event/CastEvent.ts +45 -0
  215. package/src/api/event/TrackEvent.ts +58 -2
  216. package/src/api/event/barrel.ts +2 -1
  217. package/src/api/source/SourceDescription.ts +8 -0
  218. package/src/api/source/barrel.ts +1 -0
  219. package/src/api/source/metadata/MetadataDescription.ts +13 -0
  220. package/src/api/source/metadata/barrel.ts +1 -0
  221. package/src/internal/THEOplayerView.tsx +35 -0
  222. package/src/internal/THEOplayerView.web.tsx +87 -19
  223. package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
  224. package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
  225. package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
  226. package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
  227. package/src/internal/web/stub/CastButtonStub.tsx +7 -0
  228. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
  229. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
  230. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
  231. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
  232. package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
  233. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -442
  234. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
  235. package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
  236. package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
  237. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
  238. package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
  239. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
  240. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -11
  241. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -212
  242. package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
  243. 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
+ }
@@ -1,6 +1,6 @@
1
- package com.theoplayer;
1
+ package com.theoplayer
2
2
 
3
- public enum TimeUpdateRate {
3
+ enum class TimeUpdateRate {
4
4
  UNLIMITED,
5
5
  LIMITED_ONE_HZ,
6
6
  LIMITED_TWO_HZ,