react-native-theoplayer 3.2.1 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +3 -1
  3. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +2 -1
  4. package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +295 -4
  5. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +63 -15
  6. package/android/src/main/java/com/theoplayer/broadcast/DefaultEventDispatcher.kt +27 -0
  7. package/android/src/main/java/com/theoplayer/broadcast/EventAdapter.kt +23 -0
  8. package/android/src/main/java/com/theoplayer/broadcast/EventBroadcastAdapter.kt +15 -0
  9. package/android/src/main/java/com/theoplayer/broadcast/EventBroadcastModule.kt +36 -0
  10. package/ios/THEOplayerRCTBridge.m +10 -0
  11. package/ios/THEOplayerRCTTypeUtils.swift +17 -0
  12. package/ios/THEOplayerRCTView.swift +2 -0
  13. package/ios/ads/{THEOplayerRCTAdAggregator.swift → THEOplayerRCTAdAdapter.swift} +92 -20
  14. package/ios/ads/THEOplayerRCTAdEventAdapter.swift +27 -0
  15. package/ios/ads/THEOplayerRCTAdsAPI.swift +3 -3
  16. package/ios/ads/THEOplayerRCTAdsEventHandler.swift +9 -9
  17. package/ios/ads/THEOplayerRCTAdsNative.swift +159 -0
  18. package/ios/eventBroadcasting/THEOplayerRCTBroadcastEventHandler.swift +99 -0
  19. package/ios/eventBroadcasting/THEOplayerRCTEventBroadcastAPI.swift +33 -0
  20. package/lib/commonjs/api/barrel.js +42 -20
  21. package/lib/commonjs/api/barrel.js.map +1 -1
  22. package/lib/commonjs/api/broadcast/EventBroadcastAPI.js +6 -0
  23. package/lib/commonjs/api/broadcast/EventBroadcastAPI.js.map +1 -0
  24. package/lib/commonjs/api/broadcast/barrel.js +17 -0
  25. package/lib/commonjs/api/broadcast/barrel.js.map +1 -0
  26. package/lib/commonjs/api/player/THEOplayer.js.map +1 -1
  27. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +9 -0
  28. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
  29. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +5 -0
  30. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  31. package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.js +24 -0
  32. package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -0
  33. package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.web.js +44 -0
  34. package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -0
  35. package/lib/commonjs/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js +72 -0
  36. package/lib/commonjs/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -0
  37. package/lib/module/api/barrel.js +2 -0
  38. package/lib/module/api/barrel.js.map +1 -1
  39. package/lib/module/api/broadcast/EventBroadcastAPI.js +2 -0
  40. package/lib/module/api/broadcast/EventBroadcastAPI.js.map +1 -0
  41. package/lib/module/api/broadcast/barrel.js +2 -0
  42. package/lib/module/api/broadcast/barrel.js.map +1 -0
  43. package/lib/module/api/player/THEOplayer.js.map +1 -1
  44. package/lib/module/internal/adapter/THEOplayerAdapter.js +9 -0
  45. package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
  46. package/lib/module/internal/adapter/THEOplayerWebAdapter.js +5 -0
  47. package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  48. package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.js +17 -0
  49. package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -0
  50. package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.web.js +37 -0
  51. package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -0
  52. package/lib/module/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js +63 -0
  53. package/lib/module/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -0
  54. package/lib/typescript/api/barrel.d.ts +2 -0
  55. package/lib/typescript/api/broadcast/EventBroadcastAPI.d.ts +12 -0
  56. package/lib/typescript/api/broadcast/barrel.d.ts +1 -0
  57. package/lib/typescript/api/player/THEOplayer.d.ts +5 -0
  58. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +4 -3
  59. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +4 -2
  60. package/lib/typescript/internal/adapter/broadcast/EventBroadcastAdapter.d.ts +7 -0
  61. package/lib/typescript/internal/adapter/broadcast/EventBroadcastAdapter.web.d.ts +11 -0
  62. package/lib/typescript/internal/adapter/broadcast/web/DefaultWebEventDispatcher.d.ts +12 -0
  63. package/package.json +2 -2
  64. package/react-native-theoplayer.podspec +1 -1
  65. package/src/api/barrel.ts +2 -0
  66. package/src/api/broadcast/EventBroadcastAPI.ts +13 -0
  67. package/src/api/broadcast/barrel.ts +1 -0
  68. package/src/api/player/THEOplayer.ts +6 -0
  69. package/src/internal/adapter/THEOplayerAdapter.ts +10 -2
  70. package/src/internal/adapter/THEOplayerWebAdapter.ts +11 -5
  71. package/src/internal/adapter/broadcast/EventBroadcastAdapter.ts +20 -0
  72. package/src/internal/adapter/broadcast/EventBroadcastAdapter.web.ts +44 -0
  73. package/src/internal/adapter/broadcast/web/DefaultWebEventDispatcher.ts +66 -0
@@ -1,4 +1,4 @@
1
- // THEOplayerRCTAdAggregator.swift
1
+ // THEOplayerRCTAdAdapter.swift
2
2
 
3
3
  import Foundation
4
4
  import THEOplayerSDK
@@ -38,10 +38,9 @@ let PROP_COMPANION_WIDTH: String = "width"
38
38
  let PROP_COMPANION_HEIGHT: String = "height"
39
39
  let PROP_COMPANION_RESOURCE_URI: String = "resourceURI"
40
40
 
41
- class THEOplayerRCTAdAggregator {
41
+ class THEOplayerRCTAdAdapter {
42
42
 
43
- #if (GOOGLE_IMA || GOOGLE_DAI) || canImport(THEOplayerGoogleIMAIntegration)
44
- class func aggregateAd(ad: Ad, processAdBreak: Bool = true) -> [String:Any] {
43
+ class func fromAd(ad: Ad, processAdBreak: Bool = true) -> [String:Any] {
45
44
  var adData: [String:Any] = [:]
46
45
  adData[PROP_AD_INTEGRATION] = ad.integration._rawValue
47
46
  adData[PROP_AD_TYPE] = ad.type
@@ -56,11 +55,11 @@ class THEOplayerRCTAdAggregator {
56
55
  }
57
56
  if processAdBreak,
58
57
  let adBreak = ad.adBreak {
59
- adData[PROP_AD_BREAK] = THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak: adBreak)
58
+ adData[PROP_AD_BREAK] = THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adBreak)
60
59
  }
61
60
 
62
61
  #if os(iOS)
63
- adData[PROP_AD_COMPANIONS] = THEOplayerRCTAdAggregator.aggregateCompanionAds(companionAds: ad.companions)
62
+ adData[PROP_AD_COMPANIONS] = THEOplayerRCTAdAdapter.fromCompanionAds(companionAds: ad.companions)
64
63
  #endif
65
64
 
66
65
  adData[PROP_AD_UNIVERSAL_AD_IDS] = []
@@ -91,7 +90,7 @@ class THEOplayerRCTAdAggregator {
91
90
  }
92
91
  let traffickingParametersString = googleImaAd.traffickingParameters
93
92
  adData[PROP_GOOGLE_AD_TRAFFICKING_PARAMETERS_STRING] = traffickingParametersString
94
- if let traffickingParameters = THEOplayerRCTAdAggregator.aggregateTraffickingParameters(traffickingParametersString: traffickingParametersString) {
93
+ if let traffickingParameters = THEOplayerRCTAdAdapter.fromTraffickingParameters(traffickingParametersString: traffickingParametersString) {
95
94
  adData[PROP_GOOGLE_AD_TRAFFICKING_PARAMETERS] = traffickingParameters
96
95
  }
97
96
  adData[PROP_GOOGLE_AD_BITRATE] = googleImaAd.vastMediaBitrate
@@ -102,14 +101,7 @@ class THEOplayerRCTAdAggregator {
102
101
  adData[PROP_GOOGLE_AD_HEIGHT] = height
103
102
  }
104
103
  if !googleImaAd.universalAdIds.isEmpty {
105
- var adIdList: [[String:Any]] = []
106
- for adId in googleImaAd.universalAdIds {
107
- var adIdData: [String:Any] = [:]
108
- adIdData[PROP_GOOGLE_AD_ID_REGISTRY] = adId.adIdRegistry
109
- adIdData[PROP_GOOGLE_AD_ID_VALUE] = adId.adIdValue
110
- adIdList.append(adIdData)
111
- }
112
- adData[PROP_AD_UNIVERSAL_AD_IDS] = adIdList
104
+ adData[PROP_AD_UNIVERSAL_AD_IDS] = THEOplayerRCTAdAdapter.fromUniversalAdIds(universalAdIds: googleImaAd.universalAdIds)
113
105
  }
114
106
  adData[PROP_GOOGLE_AD_WRAPPER_AD_IDS] = googleImaAd.wrapperAdIds
115
107
  adData[PROP_GOOGLE_AD_WRAPPER_AD_SYSTEMS] = googleImaAd.wrapperAdSystems
@@ -119,7 +111,64 @@ class THEOplayerRCTAdAggregator {
119
111
  return adData
120
112
  }
121
113
 
122
- class func aggregateAdBreak(adBreak: AdBreak) -> [String:Any] {
114
+ private class func fromUniversalAdIds(universalAdIds: [THEOplayerSDK.UniversalAdId]?) -> [[String:Any]] {
115
+ guard let universalAdIds = universalAdIds else {
116
+ return []
117
+ }
118
+
119
+ var adIdList: [[String:Any]] = []
120
+ for adId in universalAdIds {
121
+ var adIdData: [String:Any] = [:]
122
+ adIdData[PROP_GOOGLE_AD_ID_REGISTRY] = adId.adIdRegistry
123
+ adIdData[PROP_GOOGLE_AD_ID_VALUE] = adId.adIdValue
124
+ adIdList.append(adIdData)
125
+ }
126
+
127
+ return adIdList
128
+ }
129
+
130
+ class func toAd(adData: [String:Any]?) -> NativeAd? {
131
+ guard let adData = adData else {
132
+ return nil
133
+ }
134
+
135
+ return NativeLinearGoogleImaAd(adBreak: THEOplayerRCTAdAdapter.toAdBreak(adBreakData: adData[PROP_AD_BREAK] as? [String:Any]),
136
+ companions: THEOplayerRCTAdAdapter.toCompanionAds(companiondAdsData: adData[PROP_AD_COMPANIONS] as? [[String : Any]]),
137
+ type: (adData[PROP_AD_TYPE] as? String) ?? "",
138
+ id: adData[PROP_AD_ID] as? String,
139
+ skipOffset: adData[PROP_AD_SKIP_OFFSET] as? Int,
140
+ resourceURI: adData[PROP_AD_RESOURCE_URI] as? String,
141
+ width: adData[PROP_GOOGLE_AD_WIDTH] as? Int,
142
+ height: adData[PROP_GOOGLE_AD_HEIGHT] as? Int,
143
+ integration: THEOplayerRCTTypeUtils.adIntegrationKind((adData[PROP_AD_INTEGRATION] as? String) ?? ""),
144
+ duration: lround((adData[PROP_AD_DURATION] as? Double) ?? 0.0),
145
+ mediaFiles: [], // TODO
146
+ adSystem: adData[PROP_GOOGLE_AD_AD_SYSTEM] as? String,
147
+ creativeId: adData[PROP_GOOGLE_AD_CREATIVE_ID] as? String,
148
+ wrapperAdIds: (adData[PROP_GOOGLE_AD_WRAPPER_AD_IDS] as? [String]) ?? [],
149
+ wrapperAdSystems: (adData[PROP_GOOGLE_AD_WRAPPER_AD_SYSTEMS] as? [String]) ?? [],
150
+ wrapperCreativeIds: (adData[PROP_GOOGLE_AD_WRAPPER_CREATIVE_IDS] as? [String] ?? []),
151
+ vastMediaBitrate: (adData[PROP_GOOGLE_AD_BITRATE] as? Int) ?? 0,
152
+ universalAdIds: THEOplayerRCTAdAdapter.toUniversalAdIds(universalAdIdsData: adData[PROP_AD_UNIVERSAL_AD_IDS] as? [[String:Any]]),
153
+ traffickingParameters: "") // TODO
154
+ }
155
+
156
+ private class func toUniversalAdIds(universalAdIdsData: [[String:Any]]?) -> [THEOplayerSDK.UniversalAdId] {
157
+ guard let universalAdIdsData = universalAdIdsData else {
158
+ return []
159
+ }
160
+
161
+ var adIdList: [THEOplayerSDK.UniversalAdId] = []
162
+
163
+ for adIdData in universalAdIdsData {
164
+ adIdList.append(NativeUniversalAdId(adIdValue: (adIdData[PROP_GOOGLE_AD_ID_VALUE] as? String) ?? "",
165
+ adIdRegistry: (adIdData[PROP_GOOGLE_AD_ID_REGISTRY] as? String) ?? ""))
166
+ }
167
+
168
+ return adIdList
169
+ }
170
+
171
+ class func fromAdBreak(adBreak: AdBreak) -> [String:Any] {
123
172
  var adBreakData: [String:Any] = [:]
124
173
  adBreakData[PROP_ADBREAK_MAX_DURATION] = adBreak.maxDuration * 1000 // sec -> msec
125
174
  adBreakData[PROP_ADBREAK_TIME_OFFSET] = adBreak.timeOffset * 1000 // sec -> msec
@@ -128,7 +177,7 @@ class THEOplayerRCTAdAggregator {
128
177
  if !adBreak.ads.isEmpty {
129
178
  var adList: [[String:Any]] = []
130
179
  for ad in adBreak.ads {
131
- adList.append(THEOplayerRCTAdAggregator.aggregateAd(ad: ad, processAdBreak: false))
180
+ adList.append(THEOplayerRCTAdAdapter.fromAd(ad: ad, processAdBreak: false))
132
181
  }
133
182
  adBreakData[PROP_ADBREAK_ADS] = adList
134
183
  if adList.count > 0,
@@ -139,7 +188,27 @@ class THEOplayerRCTAdAggregator {
139
188
  return adBreakData
140
189
  }
141
190
 
142
- class private func aggregateCompanionAds(companionAds: [CompanionAd?]) -> [[String:Any]] {
191
+ class func toAdBreak(adBreakData: [String:Any]?) -> NativeAdBreak? {
192
+ guard let adBreakData = adBreakData else {
193
+ return nil
194
+ }
195
+
196
+ var ads: [NativeAd] = []
197
+ if let adsData = adBreakData[PROP_ADBREAK_ADS] as? [[String:Any]] {
198
+ for adData in adsData {
199
+ if let ad = THEOplayerRCTAdAdapter.toAd(adData: adData) {
200
+ ads.append(ad)
201
+ }
202
+ }
203
+ }
204
+
205
+ return NativeAdBreak(ads: ads,
206
+ maxDuration: lround(Double((adBreakData[PROP_ADBREAK_MAX_DURATION] as? Int) ?? 0) * 0.001), // msec -> sec,
207
+ maxRemainingDuration: Double((adBreakData[PROP_ADBREAK_MAX_REMAINING_DURATION] as? Int) ?? 0) * 0.001, // msec -> sec,
208
+ timeOffset: lround(Double((adBreakData[PROP_ADBREAK_TIME_OFFSET] as? Int) ?? 0) * 0.001)) // msec -> sec,
209
+ }
210
+
211
+ class private func fromCompanionAds(companionAds: [CompanionAd?]) -> [[String:Any]] {
143
212
  var companionAdsData: [[String:Any]] = []
144
213
  for cAd in companionAds {
145
214
  if let companionAd = cAd {
@@ -156,12 +225,15 @@ class THEOplayerRCTAdAggregator {
156
225
  return companionAdsData
157
226
  }
158
227
 
159
- class private func aggregateTraffickingParameters(traffickingParametersString: String) -> [String:Any]? {
228
+ class func toCompanionAds(companiondAdsData: [[String:Any]]?) -> [CompanionAd?] {
229
+ return []
230
+ }
231
+
232
+ class private func fromTraffickingParameters(traffickingParametersString: String) -> [String:Any]? {
160
233
  if let data = traffickingParametersString.data(using: .utf8) {
161
234
  return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
162
235
  }
163
236
  return nil
164
237
  }
165
- #endif
166
238
 
167
239
  }
@@ -0,0 +1,27 @@
1
+ // THEOplayerRCTAdEventAdapter.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ let ADEVENT_PROP_SUBTYPE: String = "subType"
7
+ let ADEVENT_PROP_AD: String = "ad"
8
+
9
+ class THEOplayerRCTAdEventAdapter {
10
+ class func toAdEvent(eventData: NSDictionary) -> THEOplayerSDK.EventProtocol? {
11
+ if let subtype = eventData[ADEVENT_PROP_SUBTYPE] as? String {
12
+ let adData = eventData[ADEVENT_PROP_AD] as? [String:Any]
13
+ switch (subtype) {
14
+ case "adloaded": return THEOplayerSDK.AdLoadedEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
15
+ case "adbreakbegin": return THEOplayerSDK.AdBreakBeginEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAdBreak(adBreakData: adData))
16
+ case "adbegin": return THEOplayerSDK.AdBeginEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
17
+ case "adfirstquartile": return THEOplayerSDK.AdFirstQuartileEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
18
+ case "admidpoint": return THEOplayerSDK.AdMidpointEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
19
+ case "adthirdquartile": return THEOplayerSDK.AdThirdQuartileEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
20
+ case "adend": return THEOplayerSDK.AdEndEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAd(adData: adData))
21
+ case "adbreakend": return THEOplayerSDK.AdBreakEndEvent(date: Date(), ad: THEOplayerRCTAdAdapter.toAdBreak(adBreakData: adData))
22
+ default: return nil
23
+ }
24
+ }
25
+ return nil
26
+ }
27
+ }
@@ -67,7 +67,7 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
67
67
  let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
68
68
  if let ads = theView.ads(),
69
69
  let currentAdBreak = ads.currentAdBreak {
70
- resolve(THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak:currentAdBreak))
70
+ resolve(THEOplayerRCTAdAdapter.fromAdBreak(adBreak:currentAdBreak))
71
71
  } else {
72
72
  reject(ERROR_CODE_ADS_ACCESS_FAILURE, ERROR_MESSAGE_ADS_ACCESS_FAILURE, nil)
73
73
  if DEBUG_ADS_API { PrintUtils.printLog(logText: "[NATIVE] Could not retrieve current adbreak (ads module unavailable).") }
@@ -83,7 +83,7 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
83
83
  let currentAdsArray = ads.currentAds
84
84
  var currentAds: [[String:Any]] = []
85
85
  for ad in currentAdsArray {
86
- currentAds.append(THEOplayerRCTAdAggregator.aggregateAd(ad: ad))
86
+ currentAds.append(THEOplayerRCTAdAdapter.fromAd(ad: ad))
87
87
  }
88
88
  resolve(currentAds)
89
89
  } else {
@@ -101,7 +101,7 @@ class THEOplayerRCTAdsAPI: NSObject, RCTBridgeModule {
101
101
  let currentAdBreaksArray = ads.scheduledAdBreaks
102
102
  var currentAdBreaks: [[String:Any]] = []
103
103
  for adbreak in currentAdBreaksArray {
104
- currentAdBreaks.append(THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak: adbreak))
104
+ currentAdBreaks.append(THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adbreak))
105
105
  }
106
106
  resolve(currentAdBreaks)
107
107
  } else {
@@ -62,7 +62,7 @@ class THEOplayerRCTAdsEventHandler {
62
62
  let ad = event.ad {
63
63
  forwardedAdEvent([
64
64
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_BEGIN,
65
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
65
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
66
66
  ])
67
67
  }
68
68
  }
@@ -75,7 +75,7 @@ class THEOplayerRCTAdsEventHandler {
75
75
  let ad = event.ad {
76
76
  forwardedAdEvent([
77
77
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_END,
78
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
78
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
79
79
  ])
80
80
  }
81
81
  }
@@ -88,7 +88,7 @@ class THEOplayerRCTAdsEventHandler {
88
88
  let adBreak = event.ad {
89
89
  forwardedAdEvent([
90
90
  AD_EVENT_PROP_TYPE: EVENT_TYPE_ADBREAK_BEGIN,
91
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak: adBreak)
91
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adBreak)
92
92
  ])
93
93
  }
94
94
  }
@@ -101,7 +101,7 @@ class THEOplayerRCTAdsEventHandler {
101
101
  let adBreak = event.ad {
102
102
  forwardedAdEvent([
103
103
  AD_EVENT_PROP_TYPE: EVENT_TYPE_ADBREAK_END,
104
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAdBreak(adBreak: adBreak)
104
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adBreak)
105
105
  ])
106
106
  }
107
107
  }
@@ -114,7 +114,7 @@ class THEOplayerRCTAdsEventHandler {
114
114
  let ad = event.ad {
115
115
  forwardedAdEvent([
116
116
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_ERROR,
117
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
117
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
118
118
  ])
119
119
  }
120
120
  }
@@ -127,7 +127,7 @@ class THEOplayerRCTAdsEventHandler {
127
127
  let ad = event.ad {
128
128
  forwardedAdEvent([
129
129
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_FIRST_QUARTILE,
130
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
130
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
131
131
  ])
132
132
  }
133
133
  }
@@ -140,7 +140,7 @@ class THEOplayerRCTAdsEventHandler {
140
140
  let ad = event.ad {
141
141
  forwardedAdEvent([
142
142
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_MIDPOINT,
143
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
143
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
144
144
  ])
145
145
  }
146
146
  }
@@ -153,7 +153,7 @@ class THEOplayerRCTAdsEventHandler {
153
153
  let ad = event.ad {
154
154
  forwardedAdEvent([
155
155
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_THIRD_QUARTILE,
156
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
156
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
157
157
  ])
158
158
  }
159
159
  }
@@ -166,7 +166,7 @@ class THEOplayerRCTAdsEventHandler {
166
166
  let ad = event.ad {
167
167
  forwardedAdEvent([
168
168
  AD_EVENT_PROP_TYPE: EVENT_TYPE_AD_LOADED,
169
- AD_EVENT_PROP_AD: THEOplayerRCTAdAggregator.aggregateAd(ad: ad)
169
+ AD_EVENT_PROP_AD: THEOplayerRCTAdAdapter.fromAd(ad: ad)
170
170
  ])
171
171
  }
172
172
  }
@@ -0,0 +1,159 @@
1
+ // THEOplayerRCTAdsNative.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ class NativeAd: THEOplayerSDK.Ad {
7
+ /** A reference to the `AdBreak` of which the ad is a part of.*/
8
+ var adBreak: AdBreak? = nil
9
+ /** An array of `CompanionAd`s associated to the ad, if available within the same Creatives element.*/
10
+ var companions: [THEOplayerSDK.CompanionAd?] = []
11
+ /** Either 'linear' or 'nonlinear', depending on the concrete implementer.*/
12
+ var type: String = ""
13
+ /** The identifier of the creative, provided in the VAST-file.*/
14
+ var id: String? = nil
15
+ /** When the Ad can be skipped, in seconds.*/
16
+ var skipOffset: Int? = nil
17
+ /**The URI of the the ad content.*/
18
+ var resourceURI: String? = nil
19
+ /** The width of the advertisement, in pixels.*/
20
+ var width: Int? = nil
21
+ /** The height of the advertisement, in pixels.*/
22
+ var height: Int? = nil
23
+ /** The kind of the ad integration.*/
24
+ var integration: THEOplayerSDK.AdIntegrationKind = THEOplayerSDK.AdIntegrationKind.defaultKind
25
+
26
+ init(adBreak: AdBreak? = nil, companions: [THEOplayerSDK.CompanionAd?], type: String, id: String? = nil, skipOffset: Int? = nil, resourceURI: String? = nil, width: Int? = nil, height: Int? = nil, integration: THEOplayerSDK.AdIntegrationKind) {
27
+ self.adBreak = adBreak
28
+ self.companions = companions
29
+ self.type = type
30
+ self.id = id
31
+ self.skipOffset = skipOffset
32
+ self.resourceURI = resourceURI
33
+ self.width = width
34
+ self.height = height
35
+ self.integration = integration
36
+ }
37
+ }
38
+
39
+ class NativeLinearAd: NativeAd, THEOplayerSDK.LinearAd {
40
+ /** The duration of the LinearAd, as provided by the VAST file, in seconds.*/
41
+ var duration: Int? = 0
42
+ /** An array of mediafiles, which provides some meta data retrieved from the VAST file.*/
43
+ var mediaFiles: [THEOplayerSDK.MediaFile] = []
44
+
45
+ init(adBreak: AdBreak? = nil, companions: [THEOplayerSDK.CompanionAd?], type: String, id: String? = nil, skipOffset: Int? = nil, resourceURI: String? = nil, width: Int? = nil, height: Int? = nil, integration: THEOplayerSDK.AdIntegrationKind, duration: Int? = 0, mediaFiles: [THEOplayerSDK.MediaFile] = []) {
46
+
47
+ self.duration = duration
48
+ self.mediaFiles = mediaFiles
49
+
50
+ super.init(adBreak:adBreak,
51
+ companions: companions,
52
+ type: type,
53
+ id: id,
54
+ skipOffset: skipOffset,
55
+ resourceURI: resourceURI,
56
+ width: width,
57
+ height: height,
58
+ integration: integration)
59
+ }
60
+ }
61
+
62
+ class NativeLinearGoogleImaAd: NativeLinearAd, THEOplayerSDK.GoogleImaAd {
63
+ /** The source ad server information included in the ad response.*/
64
+ var adSystem: String? = nil
65
+ /** The identifier of the selected creative for the ad.*/
66
+ var creativeId: String? = nil
67
+ /** The list of wrapper ad identifiers as specified in the VAST response.*/
68
+ var wrapperAdIds: [String] = []
69
+ /** The list of wrapper ad systems as specified in the VAST response.*/
70
+ var wrapperAdSystems: [String] = []
71
+ /** The list of wrapper creative identifiers.*/
72
+ var wrapperCreativeIds: [String] = []
73
+ /** The bitrate of the currently playing creative as listed in the VAST response.*/
74
+ var vastMediaBitrate: Int = 0
75
+ /** The list of universal ad ID information of the selected creative for the ad.*/
76
+ var universalAdIds: [UniversalAdId] = []
77
+ /** The String representing custom trafficking parameters from the VAST response.*/
78
+ var traffickingParameters: String = ""
79
+
80
+ init(adBreak: AdBreak? = nil, companions: [THEOplayerSDK.CompanionAd?], type: String, id: String? = nil, skipOffset: Int? = nil, resourceURI: String? = nil, width: Int? = nil, height: Int? = nil, integration: THEOplayerSDK.AdIntegrationKind, duration: Int? = 0, mediaFiles: [THEOplayerSDK.MediaFile] = [], adSystem: String? = nil, creativeId: String? = nil, wrapperAdIds: [String], wrapperAdSystems: [String], wrapperCreativeIds: [String], vastMediaBitrate: Int, universalAdIds: [UniversalAdId], traffickingParameters: String) {
81
+ self.adSystem = adSystem
82
+ self.creativeId = creativeId
83
+ self.wrapperAdIds = wrapperAdIds
84
+ self.wrapperAdSystems = wrapperAdSystems
85
+ self.wrapperCreativeIds = wrapperCreativeIds
86
+ self.vastMediaBitrate = vastMediaBitrate
87
+ self.universalAdIds = universalAdIds
88
+ self.traffickingParameters = traffickingParameters
89
+
90
+ super.init(adBreak: adBreak,
91
+ companions: companions,
92
+ type: type,
93
+ id: id,
94
+ skipOffset: skipOffset,
95
+ resourceURI: resourceURI,
96
+ width: width,
97
+ height: height,
98
+ integration:integration,
99
+ duration: duration,
100
+ mediaFiles: mediaFiles)
101
+ }
102
+ }
103
+
104
+ class NativeAdBreak: THEOplayerSDK.AdBreak {
105
+ /** An array of all the ads that are available in the current AdBreak.*/
106
+ var ads: [Ad] = []
107
+ /**Indicates the duration of the ad break, in seconds.*/
108
+ var maxDuration: Int = -1
109
+ /** Indicates the remaining duration of the ad break, in seconds.*/
110
+ var maxRemainingDuration: Double = -1
111
+ /** The time offset at which point the content will be paused to play the ad break, in seconds.*/
112
+ var timeOffset: Int = 0
113
+
114
+ init(ads: [Ad], maxDuration: Int, maxRemainingDuration: Double, timeOffset: Int) {
115
+ self.ads = ads
116
+ self.maxDuration = maxDuration
117
+ self.maxRemainingDuration = maxRemainingDuration
118
+ self.timeOffset = timeOffset
119
+ }
120
+ }
121
+
122
+ class NativeCompanionAd: THEOplayerSDK.CompanionAd {
123
+ /** An identifier of the element in which the companion ad should be appended, if available.*/
124
+ var adSlotId: String? = nil
125
+ /** An alternative description for the companion ad.*/
126
+ var altText: String? = nil
127
+ /** The website of the advertisement.*/
128
+ var clickThrough: String? = nil
129
+ /** The height of the companion ad, in pixels.*/
130
+ var height: Int? = nil
131
+ /** The URI of the ad content.*/
132
+ var resourceURI: String? = nil
133
+ /** The width of the companion ad, in pixels.*/
134
+ var width: Int? = nil
135
+ /** The type of the companion ad.*/
136
+ var type: String = ""
137
+
138
+ init(adSlotId: String? = nil, altText: String? = nil, clickThrough: String? = nil, height: Int? = nil, resourceURI: String? = nil, width: Int? = nil, type: String) {
139
+ self.adSlotId = adSlotId
140
+ self.altText = altText
141
+ self.clickThrough = clickThrough
142
+ self.height = height
143
+ self.resourceURI = resourceURI
144
+ self.width = width
145
+ self.type = type
146
+ }
147
+ }
148
+
149
+ class NativeUniversalAdId: THEOplayerSDK.UniversalAdId {
150
+ /** The Universal Ad identifier of the selected creative for the ad.*/
151
+ var adIdValue: String = ""
152
+ /** The registry associated with cataloging the UniversalAdId of the selected creative for the ad.*/
153
+ var adIdRegistry: String = ""
154
+
155
+ init(adIdValue: String, adIdRegistry: String) {
156
+ self.adIdValue = adIdValue
157
+ self.adIdRegistry = adIdRegistry
158
+ }
159
+ }
@@ -0,0 +1,99 @@
1
+ //
2
+ // THEOplayerRCTBroadcastEventHandler.swift
3
+ //
4
+
5
+ import Foundation
6
+ import THEOplayerSDK
7
+
8
+ let EVENT_PROP_TYPE: String = "type"
9
+
10
+ public class THEOplayerRCTBroadcastEventHandler: DefaultEventDispatcher {
11
+ public func broadcastEvent(eventData: NSDictionary) {
12
+ if let nativeEvent = self.toEvent(eventData: eventData) {
13
+ self.dispatchEvent(event: nativeEvent)
14
+ }
15
+ }
16
+
17
+ private func toEvent(eventData: NSDictionary) -> THEOplayerSDK.EventProtocol? {
18
+ if let type = eventData[EVENT_PROP_TYPE] as? String {
19
+ switch (type) {
20
+ case "adevent": return THEOplayerRCTAdEventAdapter.toAdEvent(eventData: eventData)
21
+ // more cases to be added on demand...
22
+ default: return nil
23
+ }
24
+ }
25
+
26
+ return nil
27
+ }
28
+ }
29
+
30
+ public class DefaultEventDispatcher: NSObject, THEOplayerSDK.EventDispatcherProtocol, THEOplayerSDK.DispatchDispatch {
31
+ private var eventListeners = [String: [EventListenerWrapper]]()
32
+
33
+ public func addEventListener<E>(type: THEOplayerSDK.EventType<E>, listener: @escaping (_ : E) -> ()) -> THEOplayerSDK.EventListener {
34
+ let eventListener = DefaultEventListenerWrapper(target: self, listener: listener)
35
+ if self.eventListeners[type.name] != nil {
36
+ self.eventListeners[type.name]?.append(eventListener)
37
+ } else {
38
+ self.eventListeners[type.name] = [eventListener]
39
+ }
40
+ return eventListener
41
+ }
42
+
43
+ public func removeEventListener<E>(type: THEOplayerSDK.EventType<E>, listener: THEOplayerSDK.EventListener) {
44
+ guard let eventListener = listener as? EventListenerWrapper else { return }
45
+ self.eventListeners[type.name]?.removeAll { $0 === eventListener }
46
+ }
47
+
48
+ public func dispatchEvent(event: THEOplayerSDK.EventProtocol) {
49
+ if let listeners = self.eventListeners[event.type] {
50
+ for listener in listeners {
51
+ listener.invoke(event: event)
52
+ }
53
+ }
54
+ }
55
+
56
+ public func removeEventListeners() {
57
+ for listeners in self.eventListeners.values {
58
+ for listener in listeners {
59
+ listener.destroy()
60
+ }
61
+ }
62
+ self.eventListeners = [:]
63
+ }
64
+
65
+ func contains<E>(type: THEOplayerSDK.EventType<E>, listener: THEOplayerSDK.EventListener) -> Bool {
66
+ guard let listeners: [EventListenerWrapper] = self.eventListeners[type.name] else {
67
+ return false
68
+ }
69
+
70
+ return listeners.first { $0 === listener } != nil
71
+ }
72
+ }
73
+
74
+ class DefaultEventListenerWrapper<T: DefaultEventDispatcher, E: THEOplayerSDK.EventProtocol>: EventListenerWrapper, THEOplayerSDK.EventListener {
75
+ weak private var target: T?
76
+ var listener: ((T) -> (E) -> ())?
77
+
78
+ init(target: T, listener: @escaping (E) -> ()) {
79
+ self.target = target
80
+ func wrappedListener(_:T) -> (E) -> () { return listener }
81
+ self.listener = wrappedListener
82
+ }
83
+
84
+ func invoke(event: THEOplayerSDK.EventProtocol) {
85
+ if let target = self.target {
86
+ listener?(target)(event as! E)
87
+ }
88
+ }
89
+
90
+ func destroy() {
91
+ self.listener = nil
92
+ }
93
+ }
94
+
95
+ protocol EventListenerWrapper: AnyObject {
96
+ func invoke(event: THEOplayerSDK.EventProtocol)
97
+ func destroy()
98
+ }
99
+
@@ -0,0 +1,33 @@
1
+ //
2
+ // THEOplayerRCTPlayerAPI.swift
3
+ //
4
+
5
+ import Foundation
6
+ import THEOplayerSDK
7
+
8
+ protocol EventReceiver {
9
+ func onReceivedEvent()
10
+ }
11
+
12
+ @objc(THEOplayerRCTEventBroadcastAPI)
13
+ class THEOplayerRCTBroadcastAPI: NSObject, RCTBridgeModule {
14
+ @objc var bridge: RCTBridge!
15
+
16
+
17
+ static func moduleName() -> String! {
18
+ return "EventBroadcastModule"
19
+ }
20
+
21
+ static func requiresMainQueueSetup() -> Bool {
22
+ return false
23
+ }
24
+
25
+ @objc(broadcastEvent:event:)
26
+ func broadcastEvent(_ node: NSNumber, event: NSDictionary) -> Void {
27
+ DispatchQueue.main.async {
28
+ if let theView = self.bridge.uiManager.view(forReactTag: node) as? THEOplayerRCTView {
29
+ theView.broadcastEventHandler.broadcastEvent(eventData: event)
30
+ }
31
+ }
32
+ }
33
+ }