react-native-theoplayer 1.7.2 → 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 (236) 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 +12 -6
  27. package/ios/THEOplayerRCTAdsAPI.swift +39 -40
  28. package/ios/THEOplayerRCTBridge.m +52 -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/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +12 -12
  33. package/ios/THEOplayerRCTView.swift +104 -24
  34. package/ios/THEOplayerRCTViewAdEventHandler.swift +2 -2
  35. package/ios/THEOplayerRCTViewCastEventHandler.swift +124 -0
  36. package/ios/THEOplayerRCTViewMainEventHandler.swift +1 -1
  37. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +6 -6
  38. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +5 -5
  39. package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
  40. package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
  41. package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
  42. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  43. package/lib/commonjs/api/barrel.js +21 -8
  44. package/lib/commonjs/api/barrel.js.map +1 -1
  45. package/lib/commonjs/api/cast/Airplay.js +6 -0
  46. package/lib/commonjs/api/cast/Airplay.js.map +1 -0
  47. package/lib/commonjs/api/cast/CastAPI.js +6 -0
  48. package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
  49. package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
  50. package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
  51. package/lib/commonjs/api/cast/CastState.js +2 -0
  52. package/lib/commonjs/api/cast/CastState.js.map +1 -0
  53. package/lib/commonjs/api/cast/Chromecast.js +6 -0
  54. package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
  55. package/lib/commonjs/api/cast/barrel.js +71 -0
  56. package/lib/commonjs/api/cast/barrel.js.map +1 -0
  57. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
  58. package/lib/commonjs/api/error/ChromecastError.js +2 -0
  59. package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
  60. package/lib/commonjs/api/error/barrel.js +13 -0
  61. package/lib/commonjs/api/error/barrel.js.map +1 -1
  62. package/lib/commonjs/api/event/CastEvent.js +21 -0
  63. package/lib/commonjs/api/event/CastEvent.js.map +1 -0
  64. package/lib/commonjs/api/event/barrel.js +25 -12
  65. package/lib/commonjs/api/event/barrel.js.map +1 -1
  66. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  67. package/lib/commonjs/api/source/barrel.js +13 -0
  68. package/lib/commonjs/api/source/barrel.js.map +1 -1
  69. package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
  70. package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
  71. package/lib/commonjs/api/source/metadata/barrel.js +19 -0
  72. package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
  73. package/lib/commonjs/internal/THEOplayerView.js +16 -0
  74. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  75. package/lib/commonjs/internal/THEOplayerView.web.js +9 -0
  76. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  77. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
  78. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  79. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
  80. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  81. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
  82. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  83. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
  84. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  85. package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
  86. package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
  87. package/lib/module/api/THEOplayerView.js.map +1 -1
  88. package/lib/module/api/barrel.js +1 -0
  89. package/lib/module/api/barrel.js.map +1 -1
  90. package/lib/module/api/cast/Airplay.js +2 -0
  91. package/lib/module/api/cast/Airplay.js.map +1 -0
  92. package/lib/module/api/cast/CastAPI.js +2 -0
  93. package/lib/module/api/cast/CastAPI.js.map +1 -0
  94. package/lib/module/api/cast/CastConfiguration.js +2 -0
  95. package/lib/module/api/cast/CastConfiguration.js.map +1 -0
  96. package/lib/module/api/cast/CastState.js +2 -0
  97. package/lib/module/api/cast/CastState.js.map +1 -0
  98. package/lib/module/api/cast/Chromecast.js +2 -0
  99. package/lib/module/api/cast/Chromecast.js.map +1 -0
  100. package/lib/module/api/cast/barrel.js +6 -0
  101. package/lib/module/api/cast/barrel.js.map +1 -0
  102. package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
  103. package/lib/module/api/error/ChromecastError.js +2 -0
  104. package/lib/module/api/error/ChromecastError.js.map +1 -0
  105. package/lib/module/api/error/barrel.js +1 -0
  106. package/lib/module/api/error/barrel.js.map +1 -1
  107. package/lib/module/api/event/CastEvent.js +14 -0
  108. package/lib/module/api/event/CastEvent.js.map +1 -0
  109. package/lib/module/api/event/barrel.js +2 -1
  110. package/lib/module/api/event/barrel.js.map +1 -1
  111. package/lib/module/api/source/SourceDescription.js.map +1 -1
  112. package/lib/module/api/source/barrel.js +1 -0
  113. package/lib/module/api/source/barrel.js.map +1 -1
  114. package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
  115. package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
  116. package/lib/module/api/source/metadata/barrel.js +2 -0
  117. package/lib/module/api/source/metadata/barrel.js.map +1 -0
  118. package/lib/module/internal/THEOplayerView.js +15 -0
  119. package/lib/module/internal/THEOplayerView.js.map +1 -1
  120. package/lib/module/internal/THEOplayerView.web.js +8 -0
  121. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  122. package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
  123. package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  124. package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
  125. package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  126. package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
  127. package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  128. package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
  129. package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  130. package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
  131. package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
  132. package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
  133. package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
  134. package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
  135. package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
  136. package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
  137. package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
  138. package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
  139. package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
  140. package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
  141. package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
  142. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
  143. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
  144. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  145. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
  146. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  147. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
  148. package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
  149. package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
  150. package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
  151. package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
  152. package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
  153. package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
  154. package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
  155. package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
  156. package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
  157. package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
  158. package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
  159. package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
  160. package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
  161. package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
  162. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
  163. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
  164. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
  165. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
  166. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
  167. package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
  168. package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
  169. package/lib/typescript/src/api/THEOplayerView.d.ts +10 -0
  170. package/lib/typescript/src/api/barrel.d.ts +1 -0
  171. package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
  172. package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
  173. package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
  174. package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
  175. package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
  176. package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
  177. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
  178. package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
  179. package/lib/typescript/src/api/error/barrel.d.ts +1 -0
  180. package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
  181. package/lib/typescript/src/api/event/barrel.d.ts +2 -1
  182. package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
  183. package/lib/typescript/src/api/source/barrel.d.ts +1 -0
  184. package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
  185. package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
  186. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  187. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +3 -1
  188. package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  189. package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
  190. package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  191. package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
  192. package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
  193. package/package.json +2 -2
  194. package/react-native-theoplayer.podspec +2 -2
  195. package/src/api/THEOplayerView.ts +12 -0
  196. package/src/api/barrel.ts +1 -0
  197. package/src/api/cast/Airplay.ts +31 -0
  198. package/src/api/cast/CastAPI.ts +30 -0
  199. package/src/api/cast/CastConfiguration.ts +44 -0
  200. package/src/api/cast/CastState.ts +10 -0
  201. package/src/api/cast/Chromecast.ts +45 -0
  202. package/src/api/cast/barrel.ts +5 -0
  203. package/src/api/config/PlayerConfiguration.ts +7 -1
  204. package/src/api/error/ChromecastError.ts +46 -0
  205. package/src/api/error/barrel.ts +1 -0
  206. package/src/api/event/CastEvent.ts +45 -0
  207. package/src/api/event/barrel.ts +2 -1
  208. package/src/api/source/SourceDescription.ts +8 -0
  209. package/src/api/source/barrel.ts +1 -0
  210. package/src/api/source/metadata/MetadataDescription.ts +13 -0
  211. package/src/api/source/metadata/barrel.ts +1 -0
  212. package/src/internal/THEOplayerView.tsx +17 -0
  213. package/src/internal/THEOplayerView.web.tsx +8 -1
  214. package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
  215. package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
  216. package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
  217. package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
  218. package/src/internal/web/stub/CastButtonStub.tsx +7 -0
  219. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
  220. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
  221. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
  222. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
  223. package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
  224. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -578
  225. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
  226. package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
  227. package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
  228. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +0 -11
  229. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +0 -11
  230. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
  231. package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
  232. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
  233. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -12
  234. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -234
  235. package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
  236. package/ios/custom/react-native-theoplayer_custom_ios.podspec +0 -36
@@ -0,0 +1,219 @@
1
+ package com.theoplayer.track
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.theoplayer.android.api.player.track.texttrack.TextTrackList
5
+ import com.facebook.react.bridge.WritableArray
6
+ import com.theoplayer.android.api.player.track.texttrack.TextTrack
7
+ import com.facebook.react.bridge.WritableMap
8
+ import com.theoplayer.android.api.player.track.mediatrack.MediaTrack
9
+ import com.theoplayer.android.api.player.track.texttrack.cue.TextTrackCue
10
+ import com.theoplayer.android.api.player.track.mediatrack.quality.Quality
11
+ import com.theoplayer.android.api.player.track.mediatrack.quality.AudioQuality
12
+ import com.theoplayer.android.api.player.track.mediatrack.quality.VideoQuality
13
+ import com.theoplayer.android.api.player.track.mediatrack.MediaTrackList
14
+
15
+ private const val PROP_ID = "id"
16
+ private const val PROP_UID = "uid"
17
+ private const val PROP_KIND = "kind"
18
+ private const val PROP_LANGUAGE = "language"
19
+ private const val PROP_MODE = "mode"
20
+ private const val PROP_LABEL = "label"
21
+ private const val PROP_TYPE = "type"
22
+ private const val PROP_CODECS = "codecs"
23
+ private const val PROP_NAME = "name"
24
+ private const val PROP_SRC = "src"
25
+ private const val PROP_FORCED = "forced"
26
+ private const val PROP_AUDIO_SAMPLING_RATE = "audioSamplingRate"
27
+ private const val PROP_BANDWIDTH = "bandwidth"
28
+ private const val PROP_QUALITIES = "qualities"
29
+ private const val PROP_ACTIVE_QUALITY = "activeQuality"
30
+ private const val PROP_TARGET_QUALITY = "targetQuality"
31
+ private const val PROP_WIDTH = "width"
32
+ private const val PROP_HEIGHT = "height"
33
+ private const val PROP_FRAMERATE = "framerate"
34
+ private const val PROP_STARTTIME = "startTime"
35
+ private const val PROP_ENDTIME = "endTime"
36
+ private const val PROP_CUES = "cues"
37
+ private const val PROP_CUE_CONTENT = "content"
38
+
39
+ class TrackListAdapter {
40
+
41
+ fun fromTextTrackList(textTrackList: TextTrackList): WritableArray {
42
+ val textTracks = Arguments.createArray()
43
+ for (i in 0 until textTrackList.length()) {
44
+ textTracks.pushMap(fromTextTrack(textTrackList.getItem(i)))
45
+ }
46
+ return textTracks
47
+ }
48
+
49
+ fun fromTextTrack(textTrack: TextTrack): WritableMap {
50
+ val textTrackPayload = Arguments.createMap()
51
+ textTrackPayload.putString(PROP_ID, textTrack.id)
52
+ textTrackPayload.putInt(PROP_UID, textTrack.uid)
53
+ textTrackPayload.putString(PROP_KIND, textTrack.kind)
54
+ textTrackPayload.putString(PROP_LANGUAGE, textTrack.language)
55
+ textTrackPayload.putString(PROP_MODE, textTrack.mode.mode)
56
+ textTrackPayload.putString(PROP_LABEL, textTrack.label)
57
+ textTrackPayload.putString(PROP_TYPE, textTrack.type.type)
58
+
59
+ // THEOplayer v3.5+
60
+ textTrackPayload.putString(PROP_SRC, textTrack.source)
61
+ textTrackPayload.putBoolean(PROP_FORCED, textTrack.isForced)
62
+
63
+ // Optionally pass cue list.
64
+ val cueList = textTrack.cues
65
+ if (cueList != null) {
66
+ val cueListPayload = Arguments.createArray()
67
+ for (cue in cueList) {
68
+ cueListPayload.pushMap(fromTextTrackCue(cue))
69
+ }
70
+ textTrackPayload.putArray(PROP_CUES, cueListPayload)
71
+ }
72
+ return textTrackPayload
73
+ }
74
+
75
+ fun fromTextTrackCue(cue: TextTrackCue): WritableMap {
76
+ val cuePayload = Arguments.createMap()
77
+ cuePayload.putString(PROP_ID, cue.id)
78
+ cuePayload.putDouble(PROP_UID, cue.uid.toDouble())
79
+ cuePayload.putDouble(PROP_STARTTIME, (1e03 * cue.startTime).toLong().toDouble())
80
+ cuePayload.putDouble(PROP_ENDTIME, (1e03 * cue.endTime).toLong().toDouble())
81
+ val content = cue.content
82
+ if (content != null) {
83
+ cuePayload.putString(PROP_CUE_CONTENT, content.optString("content"))
84
+ }
85
+ return cuePayload
86
+ }
87
+
88
+ fun fromQuality(quality: Quality): WritableMap {
89
+ return if (quality is AudioQuality) fromAudioQuality(quality) else fromVideoQuality(quality as VideoQuality)
90
+ }
91
+
92
+ private fun fromAudioQuality(quality: AudioQuality): WritableMap {
93
+ val audioQualityPayload = Arguments.createMap()
94
+ audioQualityPayload.putString(PROP_ID, quality.id)
95
+ audioQualityPayload.putInt(PROP_UID, quality.uid)
96
+ audioQualityPayload.putString(PROP_CODECS, quality.codecs)
97
+ audioQualityPayload.putString(PROP_NAME, quality.name)
98
+ audioQualityPayload.putDouble(PROP_BANDWIDTH, quality.bandwidth.toDouble())
99
+ audioQualityPayload.putDouble(
100
+ PROP_AUDIO_SAMPLING_RATE,
101
+ quality.audioSamplingRate.toDouble()
102
+ )
103
+ return audioQualityPayload
104
+ }
105
+
106
+ fun <Q : Quality?> fromMediaTrack(
107
+ track: MediaTrack<Q>,
108
+ trackType: MediaTrackType
109
+ ): WritableMap {
110
+ return if (trackType === MediaTrackType.AUDIO) fromAudioTrack(track as MediaTrack<AudioQuality>)
111
+ else fromVideoTrack(track as MediaTrack<VideoQuality>)
112
+ }
113
+
114
+ private fun fromAudioTrack(audioTrack: MediaTrack<AudioQuality>): WritableMap {
115
+ val audioTrackPayload = Arguments.createMap()
116
+ audioTrackPayload.putString(PROP_ID, audioTrack.id)
117
+ audioTrackPayload.putInt(PROP_UID, audioTrack.uid)
118
+ audioTrackPayload.putString(PROP_KIND, audioTrack.kind)
119
+ audioTrackPayload.putString(PROP_LABEL, audioTrack.label)
120
+ audioTrackPayload.putString(PROP_LANGUAGE, audioTrack.language)
121
+ val qualityList = audioTrack.qualities
122
+ val qualities = Arguments.createArray()
123
+ if (qualityList != null) {
124
+ for (j in 0 until qualityList.length()) {
125
+ qualities.pushMap(fromAudioQuality(qualityList.getItem(j)))
126
+ }
127
+ }
128
+ audioTrackPayload.putArray(PROP_QUALITIES, qualities)
129
+ val targetQualityList = audioTrack.targetQualities
130
+ val targetQualities = Arguments.createArray()
131
+ if (targetQualityList != null) {
132
+ for (j in 0 until targetQualityList.length()) {
133
+ val quality = targetQualityList.getItem(j)
134
+ val audioQualityPayload = Arguments.createMap()
135
+ audioQualityPayload.putInt(PROP_UID, quality.uid)
136
+ targetQualities.pushMap(audioQualityPayload)
137
+ }
138
+ }
139
+ val activeQuality = audioTrack.activeQuality
140
+ if (activeQuality != null) {
141
+ audioTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.uid)
142
+ }
143
+ val targetQuality = audioTrack.targetQuality
144
+ if (targetQuality != null) {
145
+ audioTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.uid)
146
+ }
147
+ return audioTrackPayload
148
+ }
149
+
150
+ fun fromAudioTrackList(audioTrackList: MediaTrackList<AudioQuality>): WritableArray {
151
+ val audioTracks = Arguments.createArray()
152
+ for (i in 0 until audioTrackList.length()) {
153
+ audioTracks.pushMap(fromAudioTrack(audioTrackList.getItem(i)))
154
+ }
155
+ return audioTracks
156
+ }
157
+
158
+ private fun fromVideoQuality(quality: VideoQuality): WritableMap {
159
+ val videoQualityPayload = Arguments.createMap()
160
+ videoQualityPayload.putString(PROP_ID, quality.id)
161
+ videoQualityPayload.putInt(PROP_UID, quality.uid)
162
+ videoQualityPayload.putString(PROP_CODECS, quality.codecs)
163
+ videoQualityPayload.putString(PROP_NAME, quality.name)
164
+ videoQualityPayload.putDouble(PROP_BANDWIDTH, quality.bandwidth.toDouble())
165
+ videoQualityPayload.putDouble(PROP_WIDTH, quality.width.toDouble())
166
+ videoQualityPayload.putDouble(PROP_HEIGHT, quality.height.toDouble())
167
+ videoQualityPayload.putDouble(PROP_FRAMERATE, quality.frameRate)
168
+ return videoQualityPayload
169
+ }
170
+
171
+ private fun fromVideoTrack(videoTrack: MediaTrack<VideoQuality>): WritableMap {
172
+ val videoTrackPayload = Arguments.createMap()
173
+ videoTrackPayload.putString(PROP_ID, videoTrack.id)
174
+ videoTrackPayload.putInt(PROP_UID, videoTrack.uid)
175
+ videoTrackPayload.putString(PROP_KIND, videoTrack.kind)
176
+ videoTrackPayload.putString(PROP_LABEL, videoTrack.label)
177
+ videoTrackPayload.putString(PROP_LANGUAGE, videoTrack.language)
178
+ val qualityList = videoTrack.qualities
179
+ val qualities = Arguments.createArray()
180
+ if (qualityList != null) {
181
+ // Sort qualities according to (height, bandwidth)
182
+ val sortedQualityList = QualityListAdapter(qualityList)
183
+ sortedQualityList.sort { o: VideoQuality, t1: VideoQuality ->
184
+ if (o.height == t1.height) t1.bandwidth.compareTo(o.bandwidth) else t1.height.compareTo(o.height)
185
+ }
186
+ for (quality in sortedQualityList) {
187
+ qualities.pushMap(fromVideoQuality(quality as VideoQuality))
188
+ }
189
+ }
190
+ videoTrackPayload.putArray(PROP_QUALITIES, qualities)
191
+ val targetQualityList = videoTrack.targetQualities
192
+ val targetQualities = Arguments.createArray()
193
+ if (targetQualityList != null) {
194
+ for (j in 0 until targetQualityList.length()) {
195
+ val quality = targetQualityList.getItem(j)
196
+ val videoQualityPayload = Arguments.createMap()
197
+ videoQualityPayload.putInt(PROP_UID, quality.uid)
198
+ targetQualities.pushMap(videoQualityPayload)
199
+ }
200
+ }
201
+ val activeQuality = videoTrack.activeQuality
202
+ if (activeQuality != null) {
203
+ videoTrackPayload.putInt(PROP_ACTIVE_QUALITY, activeQuality.uid)
204
+ }
205
+ val targetQuality = videoTrack.targetQuality
206
+ if (targetQuality != null) {
207
+ videoTrackPayload.putInt(PROP_TARGET_QUALITY, targetQuality.uid)
208
+ }
209
+ return videoTrackPayload
210
+ }
211
+
212
+ fun fromVideoTrackList(videoTrackList: MediaTrackList<VideoQuality>): WritableArray {
213
+ val videoTracks = Arguments.createArray()
214
+ for (i in 0 until videoTrackList.length()) {
215
+ videoTracks.pushMap(fromVideoTrack(videoTrackList.getItem(i)))
216
+ }
217
+ return videoTracks
218
+ }
219
+ }
@@ -0,0 +1,19 @@
1
+ package com.theoplayer.util
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.UIManagerModule
7
+ import com.theoplayer.ReactTHEOplayerView
8
+
9
+ class ViewResolver(private val reactContext: ReactApplicationContext) {
10
+ private var uiManager: UIManagerModule? = null
11
+ private val handler = Handler(Looper.getMainLooper())
12
+
13
+ fun resolveViewByTag(tag: Int, onResolved: (view: ReactTHEOplayerView?) -> Unit) {
14
+ if (uiManager == null) {
15
+ uiManager = reactContext.getNativeModule(UIManagerModule::class.java)
16
+ }
17
+ handler.post { onResolved(uiManager?.resolveView(tag) as ReactTHEOplayerView) }
18
+ }
19
+ }
@@ -23,9 +23,9 @@ let PROP_GOOGLE_AD_HEIGHT: String = "height"
23
23
  let PROP_GOOGLE_AD_CONTENT_TYPE: String = "contentType"
24
24
  let PROP_GOOGLE_AD_ID_REGISTRY: String = "adIdRegistry"
25
25
  let PROP_GOOGLE_AD_ID_VALUE: String = "adIdValue"
26
- let PROP_GOOLGE_AD_WRAPPER_AD_IDS: String = "wrapperAdIds"
27
- let PROP_GOOLGE_AD_WRAPPER_AD_SYSTEMS: String = "wrapperAdSystems"
28
- let PROP_GOOLGE_AD_WRAPPER_CREATIVE_IDS: String = "wrapperCreativeIds"
26
+ let PROP_GOOGLE_AD_WRAPPER_AD_IDS: String = "wrapperAdIds"
27
+ let PROP_GOOGLE_AD_WRAPPER_AD_SYSTEMS: String = "wrapperAdSystems"
28
+ let PROP_GOOGLE_AD_WRAPPER_CREATIVE_IDS: String = "wrapperCreativeIds"
29
29
  let PROP_ADBREAK_MAX_DURATION: String = "maxDuration"
30
30
  let PROP_ADBREAK_TIME_OFFSET: String = "timeOffset"
31
31
  let PROP_ADBREAK_MAX_REMAINING_DURATION: String = "maxRemainingDuration"
@@ -58,7 +58,11 @@ class THEOplayerRCTAdAggregator {
58
58
  let adBreak = ad.adBreak {
59
59
  adData[PROP_AD_BREAK] = THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak: adBreak)
60
60
  }
61
+
62
+ #if os(iOS)
61
63
  adData[PROP_AD_COMPANIONS] = THEOplayerRCTAdAggregator.aggregateCompanionAds(companionAds: ad.companions)
64
+ #endif
65
+
62
66
  adData[PROP_AD_UNIVERSAL_AD_IDS] = []
63
67
 
64
68
  // Add additional properties for Linear Ads
@@ -69,11 +73,13 @@ class THEOplayerRCTAdAggregator {
69
73
  }
70
74
 
71
75
  // Add additional properties for NonLinear Ads
76
+ #if os(iOS)
72
77
  if let nonLinearAd = ad as? NonLinearAd {
73
78
  if let adClickThrough = nonLinearAd.clickThrough {
74
79
  adData[PROP_AD_CLICK_THROUGH] = adClickThrough
75
80
  }
76
81
  }
82
+ #endif
77
83
 
78
84
  // Add additional properties for GoogleIma Ads
79
85
  if let googleImaAd = ad as? GoogleImaAd {
@@ -105,9 +111,9 @@ class THEOplayerRCTAdAggregator {
105
111
  }
106
112
  adData[PROP_AD_UNIVERSAL_AD_IDS] = adIdList
107
113
  }
108
- adData[PROP_GOOLGE_AD_WRAPPER_AD_IDS] = googleImaAd.wrapperAdIds
109
- adData[PROP_GOOLGE_AD_WRAPPER_AD_SYSTEMS] = googleImaAd.wrapperAdSystems
110
- adData[PROP_GOOLGE_AD_WRAPPER_CREATIVE_IDS] = googleImaAd.wrapperCreativeIds
114
+ adData[PROP_GOOGLE_AD_WRAPPER_AD_IDS] = googleImaAd.wrapperAdIds
115
+ adData[PROP_GOOGLE_AD_WRAPPER_AD_SYSTEMS] = googleImaAd.wrapperAdSystems
116
+ adData[PROP_GOOGLE_AD_WRAPPER_CREATIVE_IDS] = googleImaAd.wrapperCreativeIds
111
117
  }
112
118
 
113
119
  return adData
@@ -165,7 +165,46 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
165
165
  }
166
166
  }
167
167
  }
168
+ #else
169
+ @objc(skip:)
170
+ func skip(_ node: NSNumber) -> Void {
171
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
172
+ return
173
+ }
174
+
175
+ @objc(playing:resolver:rejecter:)
176
+ func playing(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
177
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
178
+ resolve(false)
179
+ }
180
+
181
+ @objc(currentAdBreak:resolver:rejecter:)
182
+ func currentAdBreak(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
183
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
184
+ resolve([:])
185
+ }
168
186
 
187
+ @objc(currentAds:resolver:rejecter:)
188
+ func currentAds(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
189
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
190
+ resolve([])
191
+ }
192
+
193
+ @objc(scheduledAdBreaks:resolver:rejecter:)
194
+ func scheduledAdBreaks(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
195
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
196
+ resolve([])
197
+ // TODO: handle request for scheduled adbreaks. Awaiting iOS SDK implementation
198
+ }
199
+
200
+ @objc(schedule:ad:)
201
+ func schedule(_ node: NSNumber, adDict: NSDictionary) -> Void {
202
+ if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
203
+ return
204
+ }
205
+ #endif
206
+
207
+ #if os(iOS) && ADS && GOOGLE_DAI
169
208
  @objc(daiSnapback:resolver:rejecter:)
170
209
  func daiSnapback(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
171
210
  DispatchQueue.main.async {
@@ -234,46 +273,7 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
234
273
  }
235
274
  }
236
275
  }
237
-
238
276
  #else
239
-
240
- @objc(skip:)
241
- func skip(_ node: NSNumber) -> Void {
242
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
243
- return
244
- }
245
-
246
- @objc(playing:resolver:rejecter:)
247
- func playing(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
248
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
249
- resolve(false)
250
- }
251
-
252
- @objc(currentAdBreak:resolver:rejecter:)
253
- func currentAdBreak(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
254
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
255
- resolve([:])
256
- }
257
-
258
- @objc(currentAds:resolver:rejecter:)
259
- func currentAds(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
260
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
261
- resolve([])
262
- }
263
-
264
- @objc(scheduledAdBreaks:resolver:rejecter:)
265
- func scheduledAdBreaks(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
266
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
267
- resolve([])
268
- // TODO: handle request for scheduled adbreaks. Awaiting iOS SDK implementation
269
- }
270
-
271
- @objc(schedule:ad:)
272
- func schedule(_ node: NSNumber, adDict: NSDictionary) -> Void {
273
- if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
274
- return
275
- }
276
-
277
277
  @objc(daiSnapback:resolver:rejecter:)
278
278
  func daiSnapback(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
279
279
  if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
@@ -291,6 +291,5 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
291
291
  if DEBUG_ADS_API { print(ERROR_MESSAGE_ADS_UNSUPPORTED_FEATURE) }
292
292
  resolve(timeValue.doubleValue)
293
293
  }
294
-
295
294
  #endif
296
295
  }
@@ -10,7 +10,9 @@
10
10
  #import <React/RCTBridgeModule.h>
11
11
  #import <React/RCTEventEmitter.h>
12
12
 
13
+ // ----------------------------------------------------------------------------
13
14
  // View Manager
15
+ // ----------------------------------------------------------------------------
14
16
  @interface RCT_EXTERN_MODULE(THEOplayerRCTViewManager, RCTViewManager)
15
17
 
16
18
  RCT_EXPORT_VIEW_PROPERTY(src, NSDictionary);
@@ -51,11 +53,16 @@ RCT_EXPORT_VIEW_PROPERTY(onNativeMediaTrackEvent, RCTDirectEventBlock);
51
53
 
52
54
  RCT_EXPORT_VIEW_PROPERTY(onNativeAdEvent, RCTDirectEventBlock);
53
55
 
56
+ RCT_EXPORT_VIEW_PROPERTY(onNativeCastEvent, RCTDirectEventBlock);
57
+
54
58
  RCT_EXTERN_METHOD(destroy:(nonnull NSNumber *)node);
55
59
 
56
60
  @end
57
61
 
62
+ // ----------------------------------------------------------------------------
58
63
  // Ads Module
64
+ // ----------------------------------------------------------------------------
65
+
59
66
  @interface RCT_EXTERN_REMAP_MODULE(AdsModule, THEOplayerRCTAdsAPI, NSObject)
60
67
 
61
68
  RCT_EXTERN_METHOD(skip:(nonnull NSNumber *)node)
@@ -98,7 +105,9 @@ RCT_EXTERN_METHOD(daiStreamTimeForContentTime:(nonnull NSNumber *)node
98
105
 
99
106
  @end
100
107
 
101
- // ContentProtectionModule
108
+ // ----------------------------------------------------------------------------
109
+ // ContentProtection Module
110
+ // ----------------------------------------------------------------------------
102
111
  @interface RCT_EXTERN_REMAP_MODULE(ContentProtectionModule, THEOplayerRCTContentProtectionAPI, RCTEventEmitter)
103
112
 
104
113
  RCT_EXTERN_METHOD(onBuildProcessed:(NSDictionary)result)
@@ -113,3 +122,45 @@ RCT_EXTERN_METHOD(registerContentProtectionIntegration:(nonnull NSString *)integ
113
122
  keySystemId:(nonnull NSString *)keySystemId)
114
123
 
115
124
  @end
125
+
126
+ // ----------------------------------------------------------------------------
127
+ // Cast Module
128
+ // ----------------------------------------------------------------------------
129
+
130
+ @interface RCT_EXTERN_REMAP_MODULE(CastModule, THEOplayerRCTCastAPI, NSObject)
131
+
132
+ RCT_EXTERN_METHOD(casting:(nonnull NSNumber *)node
133
+ resolver:(RCTPromiseResolveBlock)resolve
134
+ rejecter:(RCTPromiseRejectBlock)reject)
135
+
136
+ // chromecast specific
137
+ RCT_EXTERN_METHOD(chromecastCasting:(nonnull NSNumber *)node
138
+ resolver:(RCTPromiseResolveBlock)resolve
139
+ rejecter:(RCTPromiseRejectBlock)reject)
140
+
141
+ RCT_EXTERN_METHOD(chromecastState:(nonnull NSNumber *)node
142
+ resolver:(RCTPromiseResolveBlock)resolve
143
+ rejecter:(RCTPromiseRejectBlock)reject)
144
+
145
+ RCT_EXTERN_METHOD(chromecastStart:(nonnull NSNumber *)node)
146
+
147
+ RCT_EXTERN_METHOD(chromecastStop:(nonnull NSNumber *)node)
148
+
149
+ RCT_EXTERN_METHOD(chromecastJoin:(nonnull NSNumber *)node)
150
+
151
+ RCT_EXTERN_METHOD(chromecastLeave:(nonnull NSNumber *)node)
152
+
153
+ // airplay specific
154
+ RCT_EXTERN_METHOD(airplayCasting:(nonnull NSNumber *)node
155
+ resolver:(RCTPromiseResolveBlock)resolve
156
+ rejecter:(RCTPromiseRejectBlock)reject)
157
+
158
+ RCT_EXTERN_METHOD(airplayState:(nonnull NSNumber *)node
159
+ resolver:(RCTPromiseResolveBlock)resolve
160
+ rejecter:(RCTPromiseRejectBlock)reject)
161
+
162
+ RCT_EXTERN_METHOD(airplayStart:(nonnull NSNumber *)node)
163
+
164
+ RCT_EXTERN_METHOD(airplayStop:(nonnull NSNumber *)node)
165
+
166
+ @end