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.
- package/CHANGELOG.md +13 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +3 -1
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +2 -1
- package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +295 -4
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +63 -15
- package/android/src/main/java/com/theoplayer/broadcast/DefaultEventDispatcher.kt +27 -0
- package/android/src/main/java/com/theoplayer/broadcast/EventAdapter.kt +23 -0
- package/android/src/main/java/com/theoplayer/broadcast/EventBroadcastAdapter.kt +15 -0
- package/android/src/main/java/com/theoplayer/broadcast/EventBroadcastModule.kt +36 -0
- package/ios/THEOplayerRCTBridge.m +10 -0
- package/ios/THEOplayerRCTTypeUtils.swift +17 -0
- package/ios/THEOplayerRCTView.swift +2 -0
- package/ios/ads/{THEOplayerRCTAdAggregator.swift → THEOplayerRCTAdAdapter.swift} +92 -20
- package/ios/ads/THEOplayerRCTAdEventAdapter.swift +27 -0
- package/ios/ads/THEOplayerRCTAdsAPI.swift +3 -3
- package/ios/ads/THEOplayerRCTAdsEventHandler.swift +9 -9
- package/ios/ads/THEOplayerRCTAdsNative.swift +159 -0
- package/ios/eventBroadcasting/THEOplayerRCTBroadcastEventHandler.swift +99 -0
- package/ios/eventBroadcasting/THEOplayerRCTEventBroadcastAPI.swift +33 -0
- package/lib/commonjs/api/barrel.js +42 -20
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/broadcast/EventBroadcastAPI.js +6 -0
- package/lib/commonjs/api/broadcast/EventBroadcastAPI.js.map +1 -0
- package/lib/commonjs/api/broadcast/barrel.js +17 -0
- package/lib/commonjs/api/broadcast/barrel.js.map +1 -0
- package/lib/commonjs/api/player/THEOplayer.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +9 -0
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +5 -0
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.js +24 -0
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -0
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.web.js +44 -0
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -0
- package/lib/commonjs/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js +72 -0
- package/lib/commonjs/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -0
- package/lib/module/api/barrel.js +2 -0
- package/lib/module/api/barrel.js.map +1 -1
- package/lib/module/api/broadcast/EventBroadcastAPI.js +2 -0
- package/lib/module/api/broadcast/EventBroadcastAPI.js.map +1 -0
- package/lib/module/api/broadcast/barrel.js +2 -0
- package/lib/module/api/broadcast/barrel.js.map +1 -0
- package/lib/module/api/player/THEOplayer.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerAdapter.js +9 -0
- package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js +5 -0
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.js +17 -0
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -0
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.web.js +37 -0
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -0
- package/lib/module/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js +63 -0
- package/lib/module/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -0
- package/lib/typescript/api/barrel.d.ts +2 -0
- package/lib/typescript/api/broadcast/EventBroadcastAPI.d.ts +12 -0
- package/lib/typescript/api/broadcast/barrel.d.ts +1 -0
- package/lib/typescript/api/player/THEOplayer.d.ts +5 -0
- package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +4 -3
- package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +4 -2
- package/lib/typescript/internal/adapter/broadcast/EventBroadcastAdapter.d.ts +7 -0
- package/lib/typescript/internal/adapter/broadcast/EventBroadcastAdapter.web.d.ts +11 -0
- package/lib/typescript/internal/adapter/broadcast/web/DefaultWebEventDispatcher.d.ts +12 -0
- package/package.json +2 -2
- package/react-native-theoplayer.podspec +1 -1
- package/src/api/barrel.ts +2 -0
- package/src/api/broadcast/EventBroadcastAPI.ts +13 -0
- package/src/api/broadcast/barrel.ts +1 -0
- package/src/api/player/THEOplayer.ts +6 -0
- package/src/internal/adapter/THEOplayerAdapter.ts +10 -2
- package/src/internal/adapter/THEOplayerWebAdapter.ts +11 -5
- package/src/internal/adapter/broadcast/EventBroadcastAdapter.ts +20 -0
- package/src/internal/adapter/broadcast/EventBroadcastAdapter.web.ts +44 -0
- package/src/internal/adapter/broadcast/web/DefaultWebEventDispatcher.ts +66 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
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
|
|
41
|
+
class THEOplayerRCTAdAdapter {
|
|
42
42
|
|
|
43
|
-
|
|
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] =
|
|
58
|
+
adData[PROP_AD_BREAK] = THEOplayerRCTAdAdapter.fromAdBreak(adBreak: adBreak)
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
#if os(iOS)
|
|
63
|
-
adData[PROP_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 =
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
+
}
|