react-native-theoplayer 9.9.1 → 10.0.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 (162) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +5 -1
  3. package/android/build.gradle +8 -8
  4. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/10.0.0/ads-wrapper-10.0.0.aar +0 -0
  5. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/{9.0.0/ads-wrapper-9.0.0.pom → 10.0.0/ads-wrapper-10.0.0.pom} +3 -3
  6. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +4 -4
  7. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +18 -1
  8. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +32 -14
  9. package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +18 -6
  10. package/android/src/main/java/com/theoplayer/broadcast/EventBroadcastModule.kt +15 -5
  11. package/android/src/main/java/com/theoplayer/cache/CacheAdapter.kt +0 -12
  12. package/android/src/main/java/com/theoplayer/cache/CacheModule.kt +20 -7
  13. package/android/src/main/java/com/theoplayer/cast/CastModule.kt +17 -3
  14. package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +1 -1
  15. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +28 -11
  16. package/android/src/main/java/com/theoplayer/player/PlayerModule.kt +16 -3
  17. package/android/src/main/java/com/theoplayer/presentation/FullscreenLayoutObserver.kt +41 -6
  18. package/android/src/main/java/com/theoplayer/presentation/PresentationManager.kt +25 -7
  19. package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +15 -36
  20. package/android/src/main/java/com/theoplayer/theoads/THEOadsAdapter.kt +83 -0
  21. package/android/src/main/java/com/theoplayer/theoads/THEOadsEventAdapter.kt +52 -0
  22. package/android/src/main/java/com/theoplayer/theoads/THEOadsModule.kt +63 -0
  23. package/android/src/main/java/com/theoplayer/theolive/THEOliveModule.kt +16 -3
  24. package/ios/THEOplayerRCTBridge.m +19 -0
  25. package/ios/THEOplayerRCTDebug.swift +4 -1
  26. package/ios/THEOplayerRCTMainEventHandler.swift +1 -1
  27. package/ios/THEOplayerRCTPlayerAPI.swift +3 -3
  28. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +2 -1
  29. package/ios/THEOplayerRCTView.swift +12 -0
  30. package/ios/theoAds/THEOplayerRCTTHEOAdsAPI.swift +101 -0
  31. package/ios/theoAds/THEOplayerRCTTHEOAdsEventAdapter.swift +118 -0
  32. package/ios/theoAds/THEOplayerRCTTHEOAdsEventHandler.swift +174 -0
  33. package/ios/theolive/THEOplayerRCTSourceDescriptionBuilder+Theolive.swift +0 -1
  34. package/ios/theolive/THEOplayerRCTTHEOliveEventHandler.swift +1 -1
  35. package/ios/theolive/THEOplayerRCTView+THEOlive.swift +1 -5
  36. package/ios/theolive/THEOplayerRCTView+THEOliveConfig.swift +0 -2
  37. package/lib/commonjs/api/barrel.js +45 -56
  38. package/lib/commonjs/api/barrel.js.map +1 -1
  39. package/lib/commonjs/api/cache/CachingTaskParameters.js +0 -19
  40. package/lib/commonjs/api/cache/CachingTaskParameters.js.map +1 -1
  41. package/lib/commonjs/api/event/TheoAdsEvent.js +7 -0
  42. package/lib/commonjs/api/event/TheoAdsEvent.js.map +1 -1
  43. package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
  44. package/lib/commonjs/api/source/SourceDescription.js +1 -13
  45. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  46. package/lib/commonjs/api/source/ads/{THEOplayerAdDescription.js → CsaiAdDescription.js} +1 -1
  47. package/lib/commonjs/api/source/ads/CsaiAdDescription.js.map +1 -0
  48. package/lib/commonjs/api/source/ads/barrel.js +4 -4
  49. package/lib/commonjs/api/source/ads/barrel.js.map +1 -1
  50. package/lib/commonjs/index.js +0 -8
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/internal/THEOplayerView.js +13 -3
  53. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  54. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +4 -2
  55. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
  56. package/lib/commonjs/internal/adapter/WebEventForwarder.js +8 -1
  57. package/lib/commonjs/internal/adapter/WebEventForwarder.js.map +1 -1
  58. package/lib/commonjs/internal/adapter/event/PlayerEvents.js +10 -1
  59. package/lib/commonjs/internal/adapter/event/PlayerEvents.js.map +1 -1
  60. package/lib/commonjs/internal/adapter/event/native/NativeTheoAdsEvent.js +20 -0
  61. package/lib/commonjs/internal/adapter/event/native/NativeTheoAdsEvent.js.map +1 -0
  62. package/lib/commonjs/internal/adapter/theoads/THEOAdsNativeAdapter.js +6 -12
  63. package/lib/commonjs/internal/adapter/theoads/THEOAdsNativeAdapter.js.map +1 -1
  64. package/lib/commonjs/manifest.json +1 -1
  65. package/lib/module/api/barrel.js +0 -1
  66. package/lib/module/api/barrel.js.map +1 -1
  67. package/lib/module/api/cache/CachingTaskParameters.js +1 -19
  68. package/lib/module/api/cache/CachingTaskParameters.js.map +1 -1
  69. package/lib/module/api/event/TheoAdsEvent.js +8 -0
  70. package/lib/module/api/event/TheoAdsEvent.js.map +1 -1
  71. package/lib/module/api/player/PlayerEventMap.js.map +1 -1
  72. package/lib/module/api/source/SourceDescription.js +0 -13
  73. package/lib/module/api/source/SourceDescription.js.map +1 -1
  74. package/lib/module/api/source/ads/CsaiAdDescription.js +4 -0
  75. package/lib/module/api/source/ads/CsaiAdDescription.js.map +1 -0
  76. package/lib/module/api/source/ads/barrel.js +1 -1
  77. package/lib/module/api/source/ads/barrel.js.map +1 -1
  78. package/lib/module/index.js +0 -1
  79. package/lib/module/index.js.map +1 -1
  80. package/lib/module/internal/THEOplayerView.js +13 -3
  81. package/lib/module/internal/THEOplayerView.js.map +1 -1
  82. package/lib/module/internal/adapter/THEOplayerAdapter.js +4 -2
  83. package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
  84. package/lib/module/internal/adapter/WebEventForwarder.js +9 -2
  85. package/lib/module/internal/adapter/WebEventForwarder.js.map +1 -1
  86. package/lib/module/internal/adapter/event/PlayerEvents.js +8 -0
  87. package/lib/module/internal/adapter/event/PlayerEvents.js.map +1 -1
  88. package/lib/module/internal/adapter/event/native/NativeTheoAdsEvent.js +16 -0
  89. package/lib/module/internal/adapter/event/native/NativeTheoAdsEvent.js.map +1 -0
  90. package/lib/module/internal/adapter/theoads/THEOAdsNativeAdapter.js +6 -12
  91. package/lib/module/internal/adapter/theoads/THEOAdsNativeAdapter.js.map +1 -1
  92. package/lib/module/manifest.json +1 -1
  93. package/lib/typescript/api/barrel.d.ts +0 -1
  94. package/lib/typescript/api/barrel.d.ts.map +1 -1
  95. package/lib/typescript/api/cache/CachingTaskParameters.d.ts +0 -34
  96. package/lib/typescript/api/cache/CachingTaskParameters.d.ts.map +1 -1
  97. package/lib/typescript/api/event/TheoAdsEvent.d.ts +13 -0
  98. package/lib/typescript/api/event/TheoAdsEvent.d.ts.map +1 -1
  99. package/lib/typescript/api/player/PlayerEventMap.d.ts +3 -3
  100. package/lib/typescript/api/player/PlayerEventMap.d.ts.map +1 -1
  101. package/lib/typescript/api/source/SourceDescription.d.ts +0 -20
  102. package/lib/typescript/api/source/SourceDescription.d.ts.map +1 -1
  103. package/lib/typescript/api/source/ads/{THEOplayerAdDescription.d.ts → CsaiAdDescription.d.ts} +2 -2
  104. package/lib/typescript/api/source/ads/CsaiAdDescription.d.ts.map +1 -0
  105. package/lib/typescript/api/source/ads/barrel.d.ts +1 -1
  106. package/lib/typescript/api/source/ads/barrel.d.ts.map +1 -1
  107. package/lib/typescript/index.d.ts +0 -1
  108. package/lib/typescript/index.d.ts.map +1 -1
  109. package/lib/typescript/internal/THEOplayerView.d.ts +2 -0
  110. package/lib/typescript/internal/THEOplayerView.d.ts.map +1 -1
  111. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts.map +1 -1
  112. package/lib/typescript/internal/adapter/WebEventForwarder.d.ts.map +1 -1
  113. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts +7 -1
  114. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts.map +1 -1
  115. package/lib/typescript/internal/adapter/event/native/NativeTheoAdsEvent.d.ts +18 -0
  116. package/lib/typescript/internal/adapter/event/native/NativeTheoAdsEvent.d.ts.map +1 -0
  117. package/lib/typescript/internal/adapter/theoads/THEOAdsNativeAdapter.d.ts +1 -1
  118. package/lib/typescript/internal/adapter/theoads/THEOAdsNativeAdapter.d.ts.map +1 -1
  119. package/package.json +6 -6
  120. package/react-native-theoplayer.podspec +7 -7
  121. package/src/api/barrel.ts +0 -1
  122. package/src/api/cache/CachingTaskParameters.ts +0 -37
  123. package/src/api/event/TheoAdsEvent.ts +14 -0
  124. package/src/api/player/PlayerEventMap.ts +4 -2
  125. package/src/api/source/SourceDescription.ts +0 -22
  126. package/src/api/source/ads/{THEOplayerAdDescription.ts → CsaiAdDescription.ts} +1 -1
  127. package/src/api/source/ads/barrel.ts +1 -1
  128. package/src/index.tsx +0 -1
  129. package/src/internal/THEOplayerView.tsx +17 -2
  130. package/src/internal/adapter/THEOplayerAdapter.ts +6 -2
  131. package/src/internal/adapter/WebEventForwarder.ts +7 -1
  132. package/src/internal/adapter/event/PlayerEvents.ts +11 -0
  133. package/src/internal/adapter/event/native/NativeTheoAdsEvent.ts +30 -0
  134. package/src/internal/adapter/theoads/THEOAdsNativeAdapter.ts +7 -12
  135. package/src/manifest.json +1 -1
  136. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/9.0.0/ads-wrapper-9.0.0.aar +0 -0
  137. package/android/src/main/java/com/theoplayer/playback/PlaybackSettingsModule.kt +0 -28
  138. package/lib/commonjs/api/playback/PlaybackSettingsAPI.js +0 -2
  139. package/lib/commonjs/api/playback/PlaybackSettingsAPI.js.map +0 -1
  140. package/lib/commonjs/api/playback/barrel.js +0 -17
  141. package/lib/commonjs/api/playback/barrel.js.map +0 -1
  142. package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js.map +0 -1
  143. package/lib/commonjs/internal/playback/PlaybackSettings.js +0 -28
  144. package/lib/commonjs/internal/playback/PlaybackSettings.js.map +0 -1
  145. package/lib/module/api/playback/PlaybackSettingsAPI.js +0 -2
  146. package/lib/module/api/playback/PlaybackSettingsAPI.js.map +0 -1
  147. package/lib/module/api/playback/barrel.js +0 -4
  148. package/lib/module/api/playback/barrel.js.map +0 -1
  149. package/lib/module/api/source/ads/THEOplayerAdDescription.js +0 -4
  150. package/lib/module/api/source/ads/THEOplayerAdDescription.js.map +0 -1
  151. package/lib/module/internal/playback/PlaybackSettings.js +0 -23
  152. package/lib/module/internal/playback/PlaybackSettings.js.map +0 -1
  153. package/lib/typescript/api/playback/PlaybackSettingsAPI.d.ts +0 -35
  154. package/lib/typescript/api/playback/PlaybackSettingsAPI.d.ts.map +0 -1
  155. package/lib/typescript/api/playback/barrel.d.ts +0 -2
  156. package/lib/typescript/api/playback/barrel.d.ts.map +0 -1
  157. package/lib/typescript/api/source/ads/THEOplayerAdDescription.d.ts.map +0 -1
  158. package/lib/typescript/internal/playback/PlaybackSettings.d.ts +0 -7
  159. package/lib/typescript/internal/playback/PlaybackSettings.d.ts.map +0 -1
  160. package/src/api/playback/PlaybackSettingsAPI.ts +0 -36
  161. package/src/api/playback/barrel.ts +0 -1
  162. package/src/internal/playback/PlaybackSettings.ts +0 -25
@@ -49,6 +49,7 @@ RCT_EXPORT_VIEW_PROPERTY(onNativePresentationModeChange, RCTDirectEventBlock);
49
49
  RCT_EXPORT_VIEW_PROPERTY(onNativeResize, RCTDirectEventBlock);
50
50
  RCT_EXPORT_VIEW_PROPERTY(onNativeAdEvent, RCTDirectEventBlock);
51
51
  RCT_EXPORT_VIEW_PROPERTY(onNativeTHEOliveEvent, RCTDirectEventBlock);
52
+ RCT_EXPORT_VIEW_PROPERTY(onNativeTHEOadsEvent, RCTDirectEventBlock);
52
53
  RCT_EXPORT_VIEW_PROPERTY(onNativeCastEvent, RCTDirectEventBlock);
53
54
 
54
55
  @end
@@ -285,3 +286,21 @@ RCT_EXTERN_METHOD(setAuthToken:(nonnull NSNumber *)node
285
286
 
286
287
  @end
287
288
 
289
+ // ----------------------------------------------------------------------------
290
+ // THEOAds Module
291
+ // ----------------------------------------------------------------------------
292
+ @interface RCT_EXTERN_REMAP_MODULE(THEORCTTHEOAdsModule, THEOplayerRCTTHEOAdsAPI, NSObject)
293
+
294
+ RCT_EXTERN_METHOD(currentInterstitials:(nonnull NSNumber *)node
295
+ resolver:(RCTPromiseResolveBlock)resolve
296
+ rejecter:(RCTPromiseRejectBlock)reject)
297
+
298
+ RCT_EXTERN_METHOD(scheduledInterstitials:(nonnull NSNumber *)node
299
+ resolver:(RCTPromiseResolveBlock)resolve
300
+ rejecter:(RCTPromiseRejectBlock)reject)
301
+
302
+ RCT_EXTERN_METHOD(replaceAdTagParameters:(nonnull NSNumber *)node
303
+ adTagParameters:(nullable NSDictionary *)adTagParameters)
304
+
305
+ @end
306
+
@@ -45,8 +45,11 @@ let DEBUG_CACHE_EVENTS = DEBUG && false
45
45
  // Debug flag to monitor cache API usage
46
46
  let DEBUG_CACHE_API = DEBUG && false
47
47
 
48
- // Debug flag to monitor theolive API usage
48
+ // Debug flag to monitor THEOLive API usage
49
49
  let DEBUG_THEOLIVE_API = DEBUG && false
50
50
 
51
+ // Debug flag to monitor THEOAds API usage
52
+ let DEBUG_THEOADS_API = DEBUG && false
53
+
51
54
  // Debug flag to monitor AudioSession interruptions (e.g. phone cll)
52
55
  let DEBUG_INTERRUPTIONS = DEBUG && false
@@ -224,7 +224,7 @@ public class THEOplayerRCTMainEventHandler {
224
224
  if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] Seeking listener attached to THEOplayer") }
225
225
 
226
226
  // SEEKED
227
- self.timeUpdateListener = player.addEventListener(type: PlayerEventTypes.SEEKED) { [weak self] event in
227
+ self.seekedListener = player.addEventListener(type: PlayerEventTypes.SEEKED) { [weak self] event in
228
228
  if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received SEEKED event from THEOplayer") }
229
229
  if let forwardedSeekedEvent = self?.onNativeSeeked {
230
230
  forwardedSeekedEvent(["currentTime": 1e3 * event.currentTime])
@@ -276,7 +276,7 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
276
276
  }
277
277
  if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Showing textTrack \(uidValue) on TheoPlayer") }
278
278
  for i in 0...textTracks.count-1 {
279
- var textTrack: TextTrack = textTracks.get(i)
279
+ let textTrack: TextTrack = textTracks.get(i)
280
280
  if textTrack.uid == uidValue {
281
281
  textTrack.mode = TextTrackMode.showing
282
282
  } else if textTrack.mode == TextTrackMode.showing {
@@ -299,7 +299,7 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
299
299
  }
300
300
  if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Enabling audioTrack \(uidValue) on TheoPlayer") }
301
301
  for i in 0...audioTracks.count-1 {
302
- var audioTrack: MediaTrack = audioTracks.get(i)
302
+ let audioTrack: MediaTrack = audioTracks.get(i)
303
303
  audioTrack.enabled = (audioTrack.uid == uidValue)
304
304
  }
305
305
  }
@@ -318,7 +318,7 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
318
318
  }
319
319
  if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Enabling videoTrack \(uidValue) on TheoPlayer") }
320
320
  for i in 0...videoTracks.count-1 {
321
- var videoTrack: MediaTrack = videoTracks.get(i)
321
+ let videoTrack: MediaTrack = videoTracks.get(i)
322
322
  videoTrack.enabled = (videoTrack.uid == uidValue)
323
323
  }
324
324
  }
@@ -162,7 +162,8 @@ class THEOplayerRCTSourceDescriptionBuilder {
162
162
  }
163
163
 
164
164
  // 6. configure CMCD
165
- if let cmcd = sourceData[SD_PROP_CMCD] as? [String:Any] {
165
+ let cmcd = sourceData[SD_PROP_CMCD] as? [String:Any]
166
+ if cmcd != nil {
166
167
  typedSources.forEach { typedSource in
167
168
  typedSource.cmcd = true;
168
169
  }
@@ -32,6 +32,7 @@ public class THEOplayerRCTView: UIView {
32
32
  var metadataTrackEventHandler: THEOplayerRCTSideloadedMetadataTrackEventHandler
33
33
  var adEventHandler: THEOplayerRCTAdsEventHandler
34
34
  var theoliveEventHandler: THEOplayerRCTTHEOliveEventHandler
35
+ var theoadsEventHandler: THEOplayerRCTTHEOadsEventHandler
35
36
  var castEventHandler: THEOplayerRCTCastEventHandler
36
37
  var presentationModeManager: THEOplayerRCTPresentationModeManager
37
38
  var backgroundAudioManager: THEOplayerRCTBackgroundAudioManager
@@ -99,6 +100,7 @@ public class THEOplayerRCTView: UIView {
99
100
  self.metadataTrackEventHandler = THEOplayerRCTSideloadedMetadataTrackEventHandler()
100
101
  self.adEventHandler = THEOplayerRCTAdsEventHandler()
101
102
  self.theoliveEventHandler = THEOplayerRCTTHEOliveEventHandler()
103
+ self.theoadsEventHandler = THEOplayerRCTTHEOadsEventHandler()
102
104
  self.castEventHandler = THEOplayerRCTCastEventHandler()
103
105
  self.presentationModeManager = THEOplayerRCTPresentationModeManager()
104
106
  self.backgroundAudioManager = THEOplayerRCTBackgroundAudioManager()
@@ -121,6 +123,7 @@ public class THEOplayerRCTView: UIView {
121
123
  self.deviceEventHandler.destroy()
122
124
  self.adEventHandler.destroy()
123
125
  self.theoliveEventHandler.destroy()
126
+ self.theoadsEventHandler.destroy()
124
127
  self.castEventHandler.destroy()
125
128
  self.nowPlayingManager.destroy()
126
129
  self.remoteCommandsManager.destroy()
@@ -156,6 +159,7 @@ public class THEOplayerRCTView: UIView {
156
159
  self.mediaTrackEventHandler.setPlayer(player)
157
160
  self.adEventHandler.setPlayer(player)
158
161
  self.theoliveEventHandler.setPlayer(player)
162
+ self.theoadsEventHandler.setPlayer(player)
159
163
  self.castEventHandler.setPlayer(player)
160
164
  self.nowPlayingManager.setPlayer(player)
161
165
  self.remoteCommandsManager.setPlayer(player)
@@ -427,4 +431,12 @@ public class THEOplayerRCTView: UIView {
427
431
  self.theoliveEventHandler.onNativeTHEOliveEvent = nativeTHEOliveEvent
428
432
  if DEBUG_VIEW { PrintUtils.printLog(logText: "[NATIVE] nativeTHEOliveEvent prop set.") }
429
433
  }
434
+
435
+ // MARK: - Listener based THEOADS event bridging
436
+
437
+ @objc(setOnNativeTHEOadsEvent:)
438
+ func setOnNativeTHEOadsEvent(nativeTHEOadsEvent: @escaping RCTDirectEventBlock) {
439
+ self.theoadsEventHandler.onNativeTHEOadsEvent = nativeTHEOadsEvent
440
+ if DEBUG_VIEW { PrintUtils.printLog(logText: "[NATIVE] nativeTHEOadsEvent prop set.") }
441
+ }
430
442
  }
@@ -0,0 +1,101 @@
1
+ //
2
+ // THEOplayerRCTTHEOAdsAPI.swift
3
+ // Theoplayer
4
+ //
5
+ import Foundation
6
+
7
+ #if canImport(THEOplayerTHEOadsIntegration)
8
+ import THEOplayerTHEOadsIntegration
9
+ #endif
10
+
11
+ let ERROR_MESSAGE_THEOADS_UNSUPPORTED_FEATURE = "This functionality is not supported by the provided iOS SDKs"
12
+ let ERROR_CODE_THEOADS_ACCESS_FAILURE = "theoads_access_failure"
13
+ let ERROR_MESSAGE_THEOADS_ACCESS_FAILURE = "Could not access THEOplayer THEOAds Module"
14
+
15
+ @objc(THEOplayerRCTTHEOAdsAPI)
16
+ class THEOplayerRCTTHEOAdsAPI: NSObject, RCTBridgeModule {
17
+ @objc var bridge: RCTBridge!
18
+
19
+ static func moduleName() -> String! {
20
+ return "THEORCTTHEOAdsModule"
21
+ }
22
+
23
+ static func requiresMainQueueSetup() -> Bool {
24
+ return false
25
+ }
26
+
27
+ #if canImport(THEOplayerTHEOadsIntegration)
28
+ @objc(currentInterstitials:resolver:rejecter:)
29
+ func currentInterstitials(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
30
+ DispatchQueue.main.async {
31
+ if let theView = self.bridge.uiManager.view(forReactTag: node) as? THEOplayerRCTView,
32
+ let player = theView.player,
33
+ let theoAds = player.ads.theoAds {
34
+ var currentInterstitials: [[String:Any]] = []
35
+ for interstitial in theoAds.currentInterstitials {
36
+ currentInterstitials.append(THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(interstitial))
37
+ }
38
+ resolve(currentInterstitials)
39
+ } else {
40
+ if DEBUG_THEOADS_API { PrintUtils.printLog(logText: "[NATIVE] Could not get currentInterstitials (THEOAds module unavailable).") }
41
+ reject(ERROR_CODE_THEOADS_ACCESS_FAILURE, ERROR_MESSAGE_THEOADS_ACCESS_FAILURE, nil)
42
+ }
43
+ }
44
+ }
45
+
46
+ @objc(scheduledInterstitials:resolver:rejecter:)
47
+ func scheduledInterstitials(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
48
+ DispatchQueue.main.async {
49
+ if let theView = self.bridge.uiManager.view(forReactTag: node) as? THEOplayerRCTView,
50
+ let player = theView.player,
51
+ let theoAds = player.ads.theoAds {
52
+ var scheduledInterstitials: [[String:Any]] = []
53
+ for interstitial in theoAds.scheduledInterstitials {
54
+ scheduledInterstitials.append(THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(interstitial))
55
+ }
56
+ resolve(scheduledInterstitials)
57
+ } else {
58
+ if DEBUG_THEOADS_API { PrintUtils.printLog(logText: "[NATIVE] Could not get scheduledInterstitials (THEOAds module unavailable).") }
59
+ reject(ERROR_CODE_THEOADS_ACCESS_FAILURE, ERROR_MESSAGE_THEOADS_ACCESS_FAILURE, nil)
60
+ }
61
+ }
62
+ }
63
+
64
+ @objc(replaceAdTagParameters:adTagParameters:)
65
+ func replaceAdTagParameters(_ node: NSNumber, adTagParameters: [String:Any]?) -> Void {
66
+ DispatchQueue.main.async {
67
+ if let theView = self.bridge.uiManager.view(forReactTag: node) as? THEOplayerRCTView,
68
+ let player = theView.player,
69
+ let theoAds = player.ads.theoAds {
70
+ if let newParams = adTagParameters as? [String: String] {
71
+ theoAds.replaceAdTagParams(params: newParams)
72
+ if DEBUG_THEOADS_API { PrintUtils.printLog(logText: "[NATIVE] THEOAds adTagParameters replaced.") }
73
+ } else {
74
+ if DEBUG_THEOADS_API { PrintUtils.printLog(logText: "[NATIVE] Could not replace THEOAds adTagParameters.") }
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ #else
81
+
82
+ @objc(currentInterstitials:resolver:rejecter:)
83
+ func currentInterstitials(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
84
+ if DEBUG_THEOADS_API { print(ERROR_MESSAGE_THEOADS_UNSUPPORTED_FEATURE) }
85
+ reject(ERROR_CODE_THEOADS_ACCESS_FAILURE, ERROR_MESSAGE_THEOADS_ACCESS_FAILURE, nil)
86
+ }
87
+
88
+ @objc(scheduledInterstitials:resolver:rejecter:)
89
+ func scheduledInterstitials(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
90
+ if DEBUG_THEOADS_API { print(ERROR_MESSAGE_THEOADS_UNSUPPORTED_FEATURE) }
91
+ reject(ERROR_CODE_THEOADS_ACCESS_FAILURE, ERROR_MESSAGE_THEOADS_ACCESS_FAILURE, nil)
92
+ }
93
+
94
+ @objc(replaceAdTagParameters:token:)
95
+ func replaceAdTagParameters(_ node: NSNumber, adTagParameters: [String:Any]?) -> Void {
96
+ if DEBUG_THEOADS_API { print(ERROR_MESSAGE_THEOADS_UNSUPPORTED_FEATURE) }
97
+ }
98
+
99
+ #endif
100
+
101
+ }
@@ -0,0 +1,118 @@
1
+ // THEOplayerRCTTHEOadsEventAdapter.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ #if canImport(THEOplayerTHEOadsIntegration)
7
+ @_spi(Core) import THEOplayerTHEOadsIntegration
8
+ #endif
9
+
10
+ // general
11
+ let PROP_INTERSTITIAL_ID: String = "id"
12
+ let PROP_INTERSTITIAL_TYPE: String = "type"
13
+ let PROP_INTERSTITIAL_START_TIME: String = "startTime"
14
+ let PROP_INTERSTITIAL_DURATION: String = "duration"
15
+
16
+ // adbreak specific
17
+ let PROP_ADBREAK_INTERSTITIAL_LAYOUT: String = "layout"
18
+ let PROP_ADBREAK_INTERSTITIAL_BACKDROPURI: String = "backdropUri"
19
+ let PROP_ADBREAK_INTERSTITIAL_ADS: String = "ads"
20
+
21
+ // overlay specific
22
+ let PROP_OVERLAY_INTERSTITIAL_IMAGE_URL: String = "imageUrl"
23
+ let PROP_OVERLAY_INTERSTITIAL_CLICKTHROUGH: String = "clickThrough"
24
+ let PROP_OVERLAY_INTERSTITIAL_POSITION: String = "position"
25
+ let PROP_OVERLAY_INTERSTITIAL_SIZE: String = "size"
26
+
27
+ class THEOplayerRCTTHEOadsEventAdapter {
28
+
29
+ #if canImport(THEOplayerTHEOadsIntegration)
30
+ class func fromInterstitial(_ interstitial: THEOplayerTHEOadsIntegration.Interstitial?) -> [String:Any] {
31
+ guard let interstitial = interstitial else {
32
+ return [:]
33
+ }
34
+
35
+ var interstitialData: [String:Any] = [:]
36
+ interstitialData[PROP_INTERSTITIAL_ID] = interstitial.id
37
+ interstitialData[PROP_INTERSTITIAL_TYPE] = THEOplayerRCTTHEOadsEventAdapter.fromInterstitialType(interstitial.type)
38
+ interstitialData[PROP_INTERSTITIAL_START_TIME] = interstitial.startTime
39
+ if let duration = interstitial.duration {
40
+ interstitialData[PROP_INTERSTITIAL_DURATION] = duration
41
+ }
42
+
43
+ // ADBREAK-INTERSTITIAL SPECIFIC:
44
+ if let adBreakInterstitial = interstitial as? THEOplayerTHEOadsIntegration.AdBreakInterstitial {
45
+ interstitialData[PROP_ADBREAK_INTERSTITIAL_LAYOUT] = THEOplayerRCTTHEOadsEventAdapter.fromInterstitialLayout(adBreakInterstitial.layout)
46
+ if let backdropUri = adBreakInterstitial.backdropUri {
47
+ interstitialData[PROP_ADBREAK_INTERSTITIAL_BACKDROPURI] = backdropUri
48
+ }
49
+ let interstitialAds = adBreakInterstitial.ads
50
+ var ads: [[String:Any]] = []
51
+ for ad in interstitialAds {
52
+ ads.append(THEOplayerRCTAdAdapter.fromAd(ad: ad))
53
+ }
54
+ interstitialData[PROP_ADBREAK_INTERSTITIAL_ADS] = ads
55
+ }
56
+
57
+ // OVERLAY-INTERSTITIAL SPECIFIC
58
+ if let overlayInterstitial = interstitial as? THEOplayerTHEOadsIntegration.OverlayInterstitial {
59
+ if let imageUrl = overlayInterstitial.imageUrl {
60
+ interstitialData[PROP_OVERLAY_INTERSTITIAL_IMAGE_URL] = imageUrl
61
+ }
62
+ if let clickThrough = overlayInterstitial.clickThrough {
63
+ interstitialData[PROP_OVERLAY_INTERSTITIAL_CLICKTHROUGH] = clickThrough
64
+ }
65
+ interstitialData[PROP_OVERLAY_INTERSTITIAL_POSITION] = THEOplayerRCTTHEOadsEventAdapter.fromOverlayPosition(overlayInterstitial.position)
66
+ interstitialData[PROP_OVERLAY_INTERSTITIAL_SIZE] = THEOplayerRCTTHEOadsEventAdapter.fromOverlaySize(overlayInterstitial.size)
67
+ }
68
+
69
+ return interstitialData
70
+ }
71
+
72
+ class func fromInterstitialType(_ interstitialType: THEOplayerTHEOadsIntegration.InterstitialType) -> String {
73
+ switch interstitialType {
74
+ case InterstitialType.adbreak:
75
+ return "adbreak"
76
+ default:
77
+ return "overlay"
78
+ }
79
+ }
80
+
81
+ class func fromInterstitialLayout(_ interstitialLayout: THEOplayerTHEOadsIntegration.THEOadsLayout) -> String {
82
+ switch interstitialLayout {
83
+ case THEOadsLayout.single:
84
+ return "single"
85
+ case THEOadsLayout.double:
86
+ return "double"
87
+ default:
88
+ return "l-shape"
89
+ }
90
+ }
91
+
92
+ class func fromOverlayPosition(_ overlayPosition: THEOplayerTHEOadsIntegration.OverlayPosition) -> [String:Any] {
93
+ var overlayPositionData: [String:Any] = [:]
94
+ if let left = overlayPosition.left {
95
+ overlayPositionData["left"] = left
96
+ }
97
+ if let right = overlayPosition.right {
98
+ overlayPositionData["right"] = right
99
+ }
100
+ if let top = overlayPosition.top {
101
+ overlayPositionData["top"] = top
102
+ }
103
+ if let bottom = overlayPosition.bottom {
104
+ overlayPositionData["bottom"] = bottom
105
+ }
106
+ return overlayPositionData
107
+ }
108
+
109
+ class func fromOverlaySize(_ overlaySize: THEOplayerTHEOadsIntegration.OverlaySize) -> [String:Any] {
110
+ var overlaySizeData: [String:Any] = [:]
111
+ overlaySizeData["width"] = overlaySize.width
112
+ overlaySizeData["height"] = overlaySize.height
113
+ return overlaySizeData
114
+ }
115
+
116
+ #endif
117
+
118
+ }
@@ -0,0 +1,174 @@
1
+ // THEOplayerRCTTHEOadsEventHandler.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ #if canImport(THEOplayerTHEOadsIntegration)
7
+ import THEOplayerTHEOadsIntegration
8
+ #endif
9
+
10
+ let EVENT_TYPE_ADD_INTERSTITIAL: String = "addinterstitial"
11
+ let EVENT_TYPE_INTERSTITIAL_BEGIN: String = "interstitialbegin"
12
+ let EVENT_TYPE_INTERSTITIAL_END: String = "interstitialend"
13
+ let EVENT_TYPE_INTERSTITIAL_UPDATE: String = "interstitialupdate"
14
+ let EVENT_TYPE_INTERSTITIAL_ERROR: String = "interstitialerror"
15
+
16
+ let THEOADS_EVENT_PROP_TYPE: String = "type"
17
+ let THEOADS_EVENT_PROP_INTERSTITIAL: String = "interstitial"
18
+ let THEOADS_EVENT_PROP_MESSAGE: String = "message"
19
+
20
+ class THEOplayerRCTTHEOadsEventHandler {
21
+ // MARK: Members
22
+ private weak var player: THEOplayer?
23
+
24
+ // MARK: Events
25
+ var onNativeTHEOadsEvent: RCTDirectEventBlock?
26
+
27
+ // MARK: THEOAds Listeners
28
+ private var addInterstitialListener: EventListener?
29
+ private var interstitialBeginListener: EventListener?
30
+ private var interstitialEndListener: EventListener?
31
+ private var interstitialUpdateListener: EventListener?
32
+ private var interstitialErrorListener: EventListener?
33
+
34
+ // MARK: - destruction
35
+ func destroy() {
36
+ // dettach listeners
37
+ self.dettachListeners()
38
+ }
39
+
40
+ // MARK: - player setup / breakdown
41
+ func setPlayer(_ player: THEOplayer) {
42
+ self.player = player;
43
+
44
+ // attach listeners
45
+ self.attachListeners()
46
+ }
47
+
48
+ // MARK: - attach/dettach Listeners
49
+ private func attachListeners() {
50
+ guard let player = self.player else {
51
+ return
52
+ }
53
+
54
+ #if canImport(THEOplayerTHEOadsIntegration)
55
+ // ADD_INTERSTITIAL
56
+ self.addInterstitialListener = player.ads.theoAds?.addEventListener(type: THEOadsEventTypes.ADD_INTERSTITIAL) { [weak self] event in
57
+ if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received AddInterstitial event from THEOplayer.ads.theoAds") }
58
+ if let forwardedTHEOadsEvent = self?.onNativeTHEOadsEvent {
59
+ forwardedTHEOadsEvent([
60
+ THEOADS_EVENT_PROP_TYPE: EVENT_TYPE_ADD_INTERSTITIAL,
61
+ THEOADS_EVENT_PROP_INTERSTITIAL: THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(event.interstitial)
62
+ ])
63
+ }
64
+ }
65
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] AddInterstitial listener attached to THEOplayer.ads.theoAds") }
66
+
67
+ // INTERSTITIAL_BEGIN
68
+ self.interstitialBeginListener = player.ads.theoAds?.addEventListener(type: THEOadsEventTypes.INTERSTITIAL_BEGIN) { [weak self] event in
69
+ if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received InterstitialBegin event from THEOplayer.ads.theoAds") }
70
+ if let forwardedTHEOadsEvent = self?.onNativeTHEOadsEvent {
71
+ forwardedTHEOadsEvent([
72
+ THEOADS_EVENT_PROP_TYPE: EVENT_TYPE_INTERSTITIAL_BEGIN,
73
+ THEOADS_EVENT_PROP_INTERSTITIAL: THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(event.interstitial)
74
+ ])
75
+ }
76
+ }
77
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialBegin listener attached to THEOplayer.ads.theoAds") }
78
+
79
+ // INTERSTITIAL_END
80
+ self.interstitialEndListener = player.ads.theoAds?.addEventListener(type: THEOadsEventTypes.INTERSTITIAL_END) { [weak self] event in
81
+ if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received InterstitialEnd event from THEOplayer.ads.theoAds") }
82
+ if let forwardedTHEOadsEvent = self?.onNativeTHEOadsEvent {
83
+ forwardedTHEOadsEvent([
84
+ THEOADS_EVENT_PROP_TYPE: EVENT_TYPE_INTERSTITIAL_END,
85
+ THEOADS_EVENT_PROP_INTERSTITIAL: THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(event.interstitial)
86
+ ])
87
+ }
88
+ }
89
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialEnd listener attached to THEOplayer.ads.theoAds") }
90
+
91
+ // INTERSTITIAL_UPDATE
92
+ self.interstitialUpdateListener = player.ads.theoAds?.addEventListener(type: THEOadsEventTypes.INTERSTITIAL_UPDATE) { [weak self] event in
93
+ if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received InterstitialUpdate event from THEOplayer.ads.theoAds") }
94
+ if let forwardedTHEOadsEvent = self?.onNativeTHEOadsEvent {
95
+ forwardedTHEOadsEvent([
96
+ THEOADS_EVENT_PROP_TYPE: EVENT_TYPE_INTERSTITIAL_UPDATE,
97
+ THEOADS_EVENT_PROP_INTERSTITIAL: THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(event.interstitial)
98
+ ])
99
+ }
100
+ }
101
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialUpdate listener attached to THEOplayer.ads.theoAds") }
102
+
103
+ // INTERSTITIAL_ERROR
104
+ self.interstitialErrorListener = player.ads.theoAds?.addEventListener(type: THEOadsEventTypes.INTERSTITIAL_ERROR) { [weak self] event in
105
+ if DEBUG_THEOPLAYER_EVENTS { PrintUtils.printLog(logText: "[NATIVE] Received InterstitialError event from THEOplayer.ads.theoAds") }
106
+ if let forwardedTHEOadsEvent = self?.onNativeTHEOadsEvent {
107
+ var interstitialData: [String: Any] = [:]
108
+ interstitialData[THEOADS_EVENT_PROP_TYPE] = EVENT_TYPE_INTERSTITIAL_ERROR
109
+ interstitialData[THEOADS_EVENT_PROP_INTERSTITIAL] = THEOplayerRCTTHEOadsEventAdapter.fromInterstitial(event.interstitial)
110
+ if let errorMessage = event.message {
111
+ interstitialData[THEOADS_EVENT_PROP_MESSAGE] = errorMessage
112
+ }
113
+ forwardedTHEOadsEvent(interstitialData)
114
+ }
115
+ }
116
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialError listener attached to THEOplayer.ads.theoAds") }
117
+
118
+ #endif
119
+ }
120
+
121
+ private func dettachListeners() {
122
+ guard let player = self.player else {
123
+ return
124
+ }
125
+
126
+ #if canImport(THEOplayerTHEOadsIntegration)
127
+ // ADD_INTERSTITIAL
128
+ if let addInterstitialListener = self.addInterstitialListener {
129
+ player.ads.theoAds?.removeEventListener(
130
+ type: THEOadsEventTypes.ADD_INTERSTITIAL,
131
+ listener: addInterstitialListener
132
+ )
133
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] AddInterstitial listener detached from THEOplayer.ads.theoAds") }
134
+ }
135
+
136
+ // INTERSTITIAL_BEGIN
137
+ if let interstitialBeginListener = self.interstitialBeginListener {
138
+ player.ads.theoAds?.removeEventListener(
139
+ type: THEOadsEventTypes.INTERSTITIAL_BEGIN,
140
+ listener: interstitialBeginListener
141
+ )
142
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialBegin listener detached from THEOplayer.ads.theoAds") }
143
+ }
144
+
145
+ // INTERSTITIAL_END
146
+ if let interstitialEndListener = self.interstitialEndListener {
147
+ player.ads.theoAds?.removeEventListener(
148
+ type: THEOadsEventTypes.INTERSTITIAL_END,
149
+ listener: interstitialEndListener
150
+ )
151
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialEnd listener detached from THEOplayer.ads.theoAds") }
152
+ }
153
+
154
+ // INTERSTITIAL_UPDATE
155
+ if let interstitialUpdateListener = self.interstitialUpdateListener {
156
+ player.ads.theoAds?.removeEventListener(
157
+ type: THEOadsEventTypes.INTERSTITIAL_UPDATE,
158
+ listener: interstitialUpdateListener
159
+ )
160
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialUpdate listener detached from THEOplayer.ads.theoAds") }
161
+ }
162
+
163
+ // INTERSTITIAL_ERROR
164
+ if let interstitialErrorListener = self.interstitialErrorListener {
165
+ player.ads.theoAds?.removeEventListener(
166
+ type: THEOadsEventTypes.INTERSTITIAL_ERROR,
167
+ listener: interstitialErrorListener
168
+ )
169
+ if DEBUG_EVENTHANDLER { PrintUtils.printLog(logText: "[NATIVE] InterstitialError listener detached from THEOplayer.ads.theoAds") }
170
+ }
171
+ #endif
172
+
173
+ }
174
+ }
@@ -17,7 +17,6 @@ extension THEOplayerRCTSourceDescriptionBuilder {
17
17
  static func buildTHEOliveDescription(_ theoliveData: [String:Any]) -> TypedSource? {
18
18
  #if canImport(THEOplayerTHEOliveIntegration)
19
19
  if let src = theoliveData[SD_PROP_SRC] as? String {
20
- //let headers = typedSourceData[SD_PROP_HEADERS] as? [String:String]
21
20
  return TheoLiveSource(channelId: src)
22
21
  }
23
22
  #endif
@@ -24,7 +24,7 @@ class THEOplayerRCTTHEOliveEventHandler {
24
24
  // MARK: Events
25
25
  var onNativeTHEOliveEvent: RCTDirectEventBlock?
26
26
 
27
- // MARK: Ad Listeners
27
+ // MARK: THEOlive Listeners
28
28
  private var distributionLoadStartListener: EventListener?
29
29
  private var distributionOfflineListener: EventListener?
30
30
  private var endPointLoadedListener: EventListener?
@@ -4,7 +4,7 @@ import Foundation
4
4
  import THEOplayerSDK
5
5
 
6
6
  #if canImport(THEOplayerTHEOliveIntegration)
7
- @_spi(Experimental) import THEOplayerTHEOliveIntegration
7
+ import THEOplayerTHEOliveIntegration
8
8
  #endif
9
9
 
10
10
  extension THEOplayerRCTView {
@@ -15,11 +15,7 @@ extension THEOplayerRCTView {
15
15
 
16
16
  #if canImport(THEOplayerTHEOliveIntegration)
17
17
  let THEOliveConfig = THEOliveConfiguration(externalSessionId: self.theoliveConfig.externalSessionId,
18
- experimentalHespContentPlayer: !self.theoliveConfig.useLegacyTHEOlive,
19
18
  discoveryUrl: self.theoliveConfig.discoveryUrl)
20
- if DEBUG_THEOLIVE_API {
21
- PrintUtils.printLog(logText: "[NATIVE] Using \(self.theoliveConfig.useLegacyTHEOlive ? "legacy" : "new") theolive pipeline.")
22
- }
23
19
 
24
20
  self.THEOliveIntegration = THEOliveIntegrationFactory.createIntegration(with: THEOliveConfig)
25
21
  player.addIntegration(self.THEOliveIntegration!)
@@ -6,7 +6,6 @@ import THEOplayerSDK
6
6
  struct THEOliveConfig {
7
7
  var externalSessionId: String?
8
8
  var discoveryUrl: String?
9
- var useLegacyTHEOlive: Bool = false
10
9
  }
11
10
 
12
11
  extension THEOplayerRCTView {
@@ -15,7 +14,6 @@ extension THEOplayerRCTView {
15
14
  if let theoLiveConfig = configDict["theoLive"] as? NSDictionary {
16
15
  self.theoliveConfig.externalSessionId = theoLiveConfig["externalSessionId"] as? String
17
16
  self.theoliveConfig.discoveryUrl = theoLiveConfig["discoveryUrl"] as? String
18
- self.theoliveConfig.useLegacyTHEOlive = theoLiveConfig["useLegacyTHEOlive"] as? Bool ?? false
19
17
  }
20
18
  }
21
19
  }