cloudx-react-native 3.4.6 → 3.6.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.
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +16 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +14 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +238 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXAdViewEvent.kt +28 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXAdViewManagerImpl.kt +54 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXExtraParameters.kt +101 -0
- package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +171 -57
- package/android/src/main/java/com/cloudxreactnative/CloudXPackage.kt +1 -1
- package/android/src/newarch/com/cloudxreactnative/CloudXAdViewManager.kt +52 -0
- package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +7 -0
- package/android/src/oldarch/com/cloudxreactnative/CloudXAdViewManager.kt +46 -0
- package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +7 -0
- package/cloudx-react-native.podspec +3 -3
- package/ios/CloudX.h +2 -2
- package/ios/CloudX.mm +268 -62
- package/ios/CloudXAdView.h +33 -0
- package/ios/CloudXAdView.mm +500 -0
- package/ios/CloudXAdViewManager.h +12 -0
- package/ios/CloudXAdViewManager.mm +38 -0
- package/ios/CloudXExtraParameters.h +27 -0
- package/ios/CloudXExtraParameters.mm +117 -0
- package/lib/commonjs/CloudX.js +5 -1
- package/lib/commonjs/CloudX.js.map +1 -1
- package/lib/commonjs/CloudXAdViewBase.js +250 -0
- package/lib/commonjs/CloudXAdViewBase.js.map +1 -0
- package/lib/commonjs/CloudXAppOpenAd.js +98 -0
- package/lib/commonjs/CloudXAppOpenAd.js.map +1 -0
- package/lib/commonjs/CloudXBannerView.js +27 -0
- package/lib/commonjs/CloudXBannerView.js.map +1 -0
- package/lib/commonjs/CloudXMRECView.js +27 -0
- package/lib/commonjs/CloudXMRECView.js.map +1 -0
- package/lib/commonjs/hooks.js +81 -0
- package/lib/commonjs/hooks.js.map +1 -1
- package/lib/commonjs/index.js +53 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/CloudXAdViewNativeComponent.js +30 -0
- package/lib/commonjs/specs/CloudXAdViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
- package/lib/commonjs/types/AppOpenAd.js +6 -0
- package/lib/commonjs/types/AppOpenAd.js.map +1 -0
- package/lib/commonjs/types/RevenueData.js +21 -0
- package/lib/commonjs/types/RevenueData.js.map +1 -0
- package/lib/commonjs/types/index.js +17 -0
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/module/CloudX.js +5 -1
- package/lib/module/CloudX.js.map +1 -1
- package/lib/module/CloudXAdViewBase.js +242 -0
- package/lib/module/CloudXAdViewBase.js.map +1 -0
- package/lib/module/CloudXAppOpenAd.js +91 -0
- package/lib/module/CloudXAppOpenAd.js.map +1 -0
- package/lib/module/CloudXBannerView.js +19 -0
- package/lib/module/CloudXBannerView.js.map +1 -0
- package/lib/module/CloudXMRECView.js +19 -0
- package/lib/module/CloudXMRECView.js.map +1 -0
- package/lib/module/hooks.js +80 -0
- package/lib/module/hooks.js.map +1 -1
- package/lib/module/index.js +10 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/CloudXAdViewNativeComponent.js +27 -0
- package/lib/module/specs/CloudXAdViewNativeComponent.js.map +1 -0
- package/lib/module/specs/NativeCloudX.js.map +1 -1
- package/lib/module/types/AppOpenAd.js +2 -0
- package/lib/module/types/AppOpenAd.js.map +1 -0
- package/lib/module/types/RevenueData.js +15 -0
- package/lib/module/types/RevenueData.js.map +1 -0
- package/lib/module/types/index.js +1 -1
- package/lib/module/types/index.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/CloudX.d.ts.map +1 -1
- package/lib/typescript/src/CloudXAdViewBase.d.ts +28 -0
- package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -0
- package/lib/typescript/src/CloudXAppOpenAd.d.ts +4 -0
- package/lib/typescript/src/CloudXAppOpenAd.d.ts.map +1 -0
- package/lib/typescript/src/CloudXBannerView.d.ts +16 -0
- package/lib/typescript/src/CloudXBannerView.d.ts.map +1 -0
- package/lib/typescript/src/CloudXMRECView.d.ts +16 -0
- package/lib/typescript/src/CloudXMRECView.d.ts.map +1 -0
- package/lib/typescript/src/hooks.d.ts +14 -0
- package/lib/typescript/src/hooks.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +9 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +62 -0
- package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeCloudX.d.ts +13 -0
- package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
- package/lib/typescript/src/types/AdProps.d.ts +3 -0
- package/lib/typescript/src/types/AdProps.d.ts.map +1 -1
- package/lib/typescript/src/types/AppOpenAd.d.ts +8 -0
- package/lib/typescript/src/types/AppOpenAd.d.ts.map +1 -0
- package/lib/typescript/src/types/CloudX.d.ts +6 -0
- package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
- package/lib/typescript/src/types/RevenueData.d.ts +32 -0
- package/lib/typescript/src/types/RevenueData.d.ts.map +1 -0
- package/lib/typescript/src/types/index.d.ts +3 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +6 -2
- package/src/CloudX.ts +6 -0
- package/src/CloudXAdViewBase.tsx +294 -0
- package/src/CloudXAppOpenAd.ts +109 -0
- package/src/CloudXBannerView.tsx +20 -0
- package/src/CloudXMRECView.tsx +20 -0
- package/src/hooks.ts +103 -0
- package/src/index.ts +22 -2
- package/src/specs/CloudXAdViewNativeComponent.ts +84 -0
- package/src/specs/NativeCloudX.ts +22 -0
- package/src/types/AdProps.ts +4 -0
- package/src/types/AppOpenAd.ts +8 -0
- package/src/types/CloudX.ts +7 -0
- package/src/types/RevenueData.ts +39 -0
- package/src/types/index.ts +3 -0
- package/src/version.ts +1 -1
|
@@ -13,7 +13,6 @@ import com.facebook.react.bridge.Arguments
|
|
|
13
13
|
import com.facebook.react.bridge.LifecycleEventListener
|
|
14
14
|
import com.facebook.react.bridge.Promise
|
|
15
15
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
16
|
-
import com.facebook.react.bridge.ReadableArray
|
|
17
16
|
import com.facebook.react.bridge.ReadableMap
|
|
18
17
|
import com.facebook.react.bridge.ReadableType
|
|
19
18
|
import com.facebook.react.bridge.WritableMap
|
|
@@ -31,9 +30,14 @@ import io.cloudx.sdk.CloudXArbiterResult
|
|
|
31
30
|
import io.cloudx.sdk.CloudXError
|
|
32
31
|
import io.cloudx.sdk.CloudXInitializationConfiguration
|
|
33
32
|
import io.cloudx.sdk.CloudXInitializationListener
|
|
33
|
+
import io.cloudx.sdk.CloudXAppOpenAd
|
|
34
|
+
import io.cloudx.sdk.CloudXAppOpenListener
|
|
34
35
|
import io.cloudx.sdk.CloudXInterstitialAd
|
|
35
36
|
import io.cloudx.sdk.CloudXInterstitialListener
|
|
36
37
|
import io.cloudx.sdk.CloudXLogLevel
|
|
38
|
+
import io.cloudx.sdk.CloudXRevenueData
|
|
39
|
+
import io.cloudx.sdk.CloudXRevenuePlatform
|
|
40
|
+
import io.cloudx.sdk.CloudXRevenuePrecision
|
|
37
41
|
import io.cloudx.sdk.CloudXReward
|
|
38
42
|
import io.cloudx.sdk.CloudXRewardedAd
|
|
39
43
|
import io.cloudx.sdk.CloudXRewardedListener
|
|
@@ -48,6 +52,7 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
private val interstitials = ConcurrentHashMap<String, CloudXInterstitialAd>()
|
|
55
|
+
private val appOpenAds = ConcurrentHashMap<String, CloudXAppOpenAd>()
|
|
51
56
|
private val rewardedAds = ConcurrentHashMap<String, CloudXRewardedAd>()
|
|
52
57
|
private val adViews = ConcurrentHashMap<String, SdkAdView>()
|
|
53
58
|
private val adViewAdFormats = ConcurrentHashMap<String, CloudXAdFormat>()
|
|
@@ -184,6 +189,15 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
184
189
|
})
|
|
185
190
|
}
|
|
186
191
|
|
|
192
|
+
fun reportRevenueData(data: ReadableMap, promise: Promise) {
|
|
193
|
+
val revenueData = data.toRevenueData()
|
|
194
|
+
if (revenueData == null) {
|
|
195
|
+
promise.resolve(false)
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
promise.resolve(CloudX.reportRevenueData(revenueData))
|
|
199
|
+
}
|
|
200
|
+
|
|
187
201
|
// =========================================================================
|
|
188
202
|
// Banner (Programmatic)
|
|
189
203
|
// =========================================================================
|
|
@@ -229,7 +243,7 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
229
243
|
}
|
|
230
244
|
|
|
231
245
|
fun setInterstitialExtraParameters(adUnitId: String, extraParameters: ReadableMap) {
|
|
232
|
-
|
|
246
|
+
CloudXExtraParameters.forEach(extraParameters) { key, value ->
|
|
233
247
|
retrieveInterstitial(adUnitId).setExtraParameter(key, value)
|
|
234
248
|
}
|
|
235
249
|
}
|
|
@@ -244,6 +258,10 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
244
258
|
val activity = maybeGetCurrentActivity()
|
|
245
259
|
if (activity == null) {
|
|
246
260
|
Log.e(TAG, "showInterstitial: no activity available")
|
|
261
|
+
sendReactNativeEvent(
|
|
262
|
+
CloudXAdEvents.ON_INTERSTITIAL_DISPLAY_FAILED_EVENT,
|
|
263
|
+
getNoActivityDisplayFailedInfo(adUnitId),
|
|
264
|
+
)
|
|
247
265
|
return@runOnUiQueueThread
|
|
248
266
|
}
|
|
249
267
|
interstitial.show(activity, placement, customData)
|
|
@@ -260,6 +278,50 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
260
278
|
}
|
|
261
279
|
}
|
|
262
280
|
|
|
281
|
+
// =========================================================================
|
|
282
|
+
// App Open
|
|
283
|
+
// =========================================================================
|
|
284
|
+
|
|
285
|
+
fun loadAppOpen(adUnitId: String) {
|
|
286
|
+
retrieveAppOpen(adUnitId).load()
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) {
|
|
290
|
+
CloudXExtraParameters.forEach(extraParameters) { key, value ->
|
|
291
|
+
retrieveAppOpen(adUnitId).setExtraParameter(key, value)
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
fun isAppOpenReady(adUnitId: String, promise: Promise) {
|
|
296
|
+
promise.resolve(retrieveAppOpen(adUnitId).isAdReady)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
fun showAppOpen(adUnitId: String, placement: String?, customData: String?) {
|
|
300
|
+
reactApplicationContext.runOnUiQueueThread {
|
|
301
|
+
val appOpen = retrieveAppOpen(adUnitId)
|
|
302
|
+
val activity = maybeGetCurrentActivity()
|
|
303
|
+
if (activity == null) {
|
|
304
|
+
Log.e(TAG, "showAppOpen: no activity available")
|
|
305
|
+
sendReactNativeEvent(
|
|
306
|
+
CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT,
|
|
307
|
+
getNoActivityDisplayFailedInfo(adUnitId),
|
|
308
|
+
)
|
|
309
|
+
return@runOnUiQueueThread
|
|
310
|
+
}
|
|
311
|
+
appOpen.show(activity, placement, customData)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
fun destroyAppOpen(adUnitId: String) {
|
|
316
|
+
reactApplicationContext.runOnUiQueueThread {
|
|
317
|
+
appOpenAds.remove(adUnitId)?.let {
|
|
318
|
+
it.listener = null
|
|
319
|
+
it.revenueListener = null
|
|
320
|
+
it.destroy()
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
263
325
|
// =========================================================================
|
|
264
326
|
// Rewarded
|
|
265
327
|
// =========================================================================
|
|
@@ -269,7 +331,7 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
269
331
|
}
|
|
270
332
|
|
|
271
333
|
fun setRewardedExtraParameters(adUnitId: String, extraParameters: ReadableMap) {
|
|
272
|
-
|
|
334
|
+
CloudXExtraParameters.forEach(extraParameters) { key, value ->
|
|
273
335
|
retrieveRewarded(adUnitId).setExtraParameter(key, value)
|
|
274
336
|
}
|
|
275
337
|
}
|
|
@@ -284,6 +346,10 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
284
346
|
val activity = maybeGetCurrentActivity()
|
|
285
347
|
if (activity == null) {
|
|
286
348
|
Log.e(TAG, "showRewarded: no activity available")
|
|
349
|
+
sendReactNativeEvent(
|
|
350
|
+
CloudXAdEvents.ON_REWARDED_AD_DISPLAY_FAILED_EVENT,
|
|
351
|
+
getNoActivityDisplayFailedInfo(adUnitId),
|
|
352
|
+
)
|
|
287
353
|
return@runOnUiQueueThread
|
|
288
354
|
}
|
|
289
355
|
rewarded.show(activity, placement, customData)
|
|
@@ -373,6 +439,29 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
373
439
|
}
|
|
374
440
|
}
|
|
375
441
|
|
|
442
|
+
private fun createAppOpenListener(adUnitId: String): CloudXAppOpenListener {
|
|
443
|
+
return object : CloudXAppOpenListener {
|
|
444
|
+
override fun onAdLoaded(cloudXAd: CloudXAd) {
|
|
445
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_LOADED_EVENT, getAdInfo(cloudXAd))
|
|
446
|
+
}
|
|
447
|
+
override fun onAdLoadFailed(failedAdUnitId: String, cloudXError: CloudXError) {
|
|
448
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_LOAD_FAILED_EVENT, getAdLoadFailedInfo(failedAdUnitId, cloudXError))
|
|
449
|
+
}
|
|
450
|
+
override fun onAdClicked(cloudXAd: CloudXAd) {
|
|
451
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_CLICKED_EVENT, getAdInfo(cloudXAd))
|
|
452
|
+
}
|
|
453
|
+
override fun onAdDisplayed(cloudXAd: CloudXAd) {
|
|
454
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_DISPLAYED_EVENT, getAdInfo(cloudXAd))
|
|
455
|
+
}
|
|
456
|
+
override fun onAdDisplayFailed(cloudXAd: CloudXAd, cloudXError: CloudXError) {
|
|
457
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT, getAdDisplayFailedInfo(cloudXAd, cloudXError))
|
|
458
|
+
}
|
|
459
|
+
override fun onAdHidden(cloudXAd: CloudXAd) {
|
|
460
|
+
sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_HIDDEN_EVENT, getAdInfo(cloudXAd))
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
376
465
|
private fun createRewardedListener(adUnitId: String): CloudXRewardedListener {
|
|
377
466
|
return object : CloudXRewardedListener {
|
|
378
467
|
override fun onAdLoaded(cloudXAd: CloudXAd) {
|
|
@@ -458,14 +547,14 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
458
547
|
reactApplicationContext.runOnUiQueueThread {
|
|
459
548
|
val adView = retrieveAdView(adUnitId, adFormat)
|
|
460
549
|
if (adView != null) {
|
|
461
|
-
|
|
550
|
+
CloudXExtraParameters.forEach(extraParameters) { key, value ->
|
|
462
551
|
adView.setExtraParameter(key, value)
|
|
463
552
|
}
|
|
464
553
|
return@runOnUiQueueThread
|
|
465
554
|
}
|
|
466
555
|
|
|
467
556
|
val pending = adViewExtraParameters.getOrPut(adUnitId) { ConcurrentHashMap() }
|
|
468
|
-
|
|
557
|
+
CloudXExtraParameters.forEach(extraParameters) { key, value ->
|
|
469
558
|
if (value == null) {
|
|
470
559
|
pending.remove(key)
|
|
471
560
|
} else {
|
|
@@ -477,58 +566,7 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
477
566
|
|
|
478
567
|
private fun applyPendingExtraParameters(adUnitId: String, adView: SdkAdView) {
|
|
479
568
|
val pending = adViewExtraParameters[adUnitId] ?: return
|
|
480
|
-
|
|
481
|
-
adView.setExtraParameter(key, value)
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
private fun applyExtraParameters(extraParameters: ReadableMap, apply: (String, Any?) -> Unit) {
|
|
486
|
-
val iterator = extraParameters.keySetIterator()
|
|
487
|
-
while (iterator.hasNextKey()) {
|
|
488
|
-
val key = iterator.nextKey()
|
|
489
|
-
if (key.isBlank()) continue
|
|
490
|
-
apply(key, readableMapValue(extraParameters, key))
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
private fun readableMapValue(map: ReadableMap, key: String): Any? {
|
|
495
|
-
return when (map.getType(key)) {
|
|
496
|
-
ReadableType.Null -> null
|
|
497
|
-
ReadableType.Boolean -> map.getBoolean(key)
|
|
498
|
-
ReadableType.Number -> map.getDouble(key)
|
|
499
|
-
ReadableType.String -> map.getString(key)
|
|
500
|
-
ReadableType.Map -> map.getMap(key)?.let(::readableMapToMap)
|
|
501
|
-
ReadableType.Array -> map.getArray(key)?.let(::readableArrayToList)
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
private fun readableMapToMap(readableMap: ReadableMap): Map<String, Any?> {
|
|
506
|
-
val result = mutableMapOf<String, Any?>()
|
|
507
|
-
val iterator = readableMap.keySetIterator()
|
|
508
|
-
while (iterator.hasNextKey()) {
|
|
509
|
-
val key = iterator.nextKey()
|
|
510
|
-
result[key] = readableMapValue(readableMap, key)
|
|
511
|
-
}
|
|
512
|
-
return result
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
private fun readableArrayToList(readableArray: ReadableArray): List<Any?> {
|
|
516
|
-
val result = mutableListOf<Any?>()
|
|
517
|
-
for (index in 0 until readableArray.size()) {
|
|
518
|
-
result.add(readableArrayValue(readableArray, index))
|
|
519
|
-
}
|
|
520
|
-
return result
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
private fun readableArrayValue(array: ReadableArray, index: Int): Any? {
|
|
524
|
-
return when (array.getType(index)) {
|
|
525
|
-
ReadableType.Null -> null
|
|
526
|
-
ReadableType.Boolean -> array.getBoolean(index)
|
|
527
|
-
ReadableType.Number -> array.getDouble(index)
|
|
528
|
-
ReadableType.String -> array.getString(index)
|
|
529
|
-
ReadableType.Map -> array.getMap(index)?.let(::readableMapToMap)
|
|
530
|
-
ReadableType.Array -> array.getArray(index)?.let(::readableArrayToList)
|
|
531
|
-
}
|
|
569
|
+
CloudXExtraParameters.applyToAdView(adView, pending)
|
|
532
570
|
}
|
|
533
571
|
|
|
534
572
|
private fun arbiterBids(configuration: ReadableMap): List<CloudXArbiterBid> {
|
|
@@ -624,10 +662,63 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
624
662
|
)
|
|
625
663
|
}
|
|
626
664
|
|
|
665
|
+
private fun ReadableMap.toRevenueData(): CloudXRevenueData? {
|
|
666
|
+
val platform = stringValue("platform")
|
|
667
|
+
val revenuePlatform = platform?.toRevenuePlatformOrNull()
|
|
668
|
+
val revenue = doubleValue("revenue")
|
|
669
|
+
val adFormat = stringValue("adFormat")
|
|
670
|
+
if (revenuePlatform == null || revenue == null || adFormat.isNullOrBlank()) {
|
|
671
|
+
Log.w(TAG, "reportRevenueData: ignoring data with missing or invalid required fields")
|
|
672
|
+
return null
|
|
673
|
+
}
|
|
674
|
+
if (!revenue.isFinite()) {
|
|
675
|
+
Log.w(TAG, "reportRevenueData: ignoring data with non-finite revenue=$revenue")
|
|
676
|
+
return null
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return CloudXRevenueData.builder(
|
|
680
|
+
revenuePlatform,
|
|
681
|
+
revenue,
|
|
682
|
+
adFormat,
|
|
683
|
+
)
|
|
684
|
+
.currencyCode(optionalStringValue("currencyCode"))
|
|
685
|
+
.precision(stringValue("precision")?.toRevenuePrecisionOrNull())
|
|
686
|
+
.networkName(optionalStringValue("networkName"))
|
|
687
|
+
.adUnitId(optionalStringValue("adUnitId"))
|
|
688
|
+
.thirdPartyAdPlacementId(optionalStringValue("thirdPartyAdPlacementId"))
|
|
689
|
+
.creativeId(optionalStringValue("creativeId"))
|
|
690
|
+
.networkPlacement(optionalStringValue("networkPlacement"))
|
|
691
|
+
.countryCode(optionalStringValue("countryCode"))
|
|
692
|
+
.userSegment(optionalStringValue("userSegment"))
|
|
693
|
+
.build()
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
private fun String.toRevenuePlatformOrNull(): CloudXRevenuePlatform? {
|
|
697
|
+
val platform = trim()
|
|
698
|
+
if (platform.isBlank()) return null
|
|
699
|
+
return when {
|
|
700
|
+
platform.equals("AdMob", ignoreCase = true) -> CloudXRevenuePlatform.ADMOB
|
|
701
|
+
platform.equals("InMobi", ignoreCase = true) -> CloudXRevenuePlatform.INMOBI
|
|
702
|
+
else -> CloudXRevenuePlatform.custom(platform)
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
private fun String.toRevenuePrecisionOrNull(): CloudXRevenuePrecision? = when (lowercase(Locale.ROOT)) {
|
|
707
|
+
"exact" -> CloudXRevenuePrecision.EXACT
|
|
708
|
+
"estimated" -> CloudXRevenuePrecision.ESTIMATED
|
|
709
|
+
"publisher_defined" -> CloudXRevenuePrecision.PUBLISHER_DEFINED
|
|
710
|
+
"undefined" -> CloudXRevenuePrecision.UNDEFINED
|
|
711
|
+
else -> {
|
|
712
|
+
Log.w(TAG, "reportRevenueData: ignoring unknown precision=$this")
|
|
713
|
+
null
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
627
717
|
private fun String.toCloudXAdFormatOrNull(): CloudXAdFormat? = when (uppercase(Locale.ROOT)) {
|
|
628
718
|
CloudXAdFormat.BANNER.name -> CloudXAdFormat.BANNER
|
|
629
719
|
CloudXAdFormat.MREC.name -> CloudXAdFormat.MREC
|
|
630
720
|
CloudXAdFormat.INTERSTITIAL.name -> CloudXAdFormat.INTERSTITIAL
|
|
721
|
+
CloudXAdFormat.APP_OPEN.name -> CloudXAdFormat.APP_OPEN
|
|
631
722
|
CloudXAdFormat.REWARDED.name -> CloudXAdFormat.REWARDED
|
|
632
723
|
CloudXAdFormat.NATIVE.name -> CloudXAdFormat.NATIVE
|
|
633
724
|
else -> null
|
|
@@ -795,6 +886,17 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
795
886
|
return interstitial
|
|
796
887
|
}
|
|
797
888
|
|
|
889
|
+
private fun retrieveAppOpen(adUnitId: String): CloudXAppOpenAd {
|
|
890
|
+
var appOpen = appOpenAds[adUnitId]
|
|
891
|
+
if (appOpen == null) {
|
|
892
|
+
appOpen = CloudX.createAppOpen(reactApplicationContext, adUnitId)
|
|
893
|
+
appOpen.listener = createAppOpenListener(adUnitId)
|
|
894
|
+
appOpen.revenueListener = createFullscreenRevenueListener(adUnitId, CloudXAdEvents.ON_APPOPEN_AD_REVENUE_PAID)
|
|
895
|
+
appOpenAds[adUnitId] = appOpen
|
|
896
|
+
}
|
|
897
|
+
return appOpen
|
|
898
|
+
}
|
|
899
|
+
|
|
798
900
|
private fun retrieveRewarded(adUnitId: String): CloudXRewardedAd {
|
|
799
901
|
var rewarded = rewardedAds[adUnitId]
|
|
800
902
|
if (rewarded == null) {
|
|
@@ -937,6 +1039,11 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
937
1039
|
}
|
|
938
1040
|
interstitials.clear()
|
|
939
1041
|
|
|
1042
|
+
for (appOpen in appOpenAds.values) {
|
|
1043
|
+
appOpen.destroy()
|
|
1044
|
+
}
|
|
1045
|
+
appOpenAds.clear()
|
|
1046
|
+
|
|
940
1047
|
for (rewarded in rewardedAds.values) {
|
|
941
1048
|
rewarded.destroy()
|
|
942
1049
|
}
|
|
@@ -978,6 +1085,13 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
|
|
|
978
1085
|
"ON_INTERSTITIAL_DISPLAY_FAILED_EVENT" to CloudXAdEvents.ON_INTERSTITIAL_DISPLAY_FAILED_EVENT,
|
|
979
1086
|
"ON_INTERSTITIAL_HIDDEN_EVENT" to CloudXAdEvents.ON_INTERSTITIAL_HIDDEN_EVENT,
|
|
980
1087
|
"ON_INTERSTITIAL_AD_REVENUE_PAID" to CloudXAdEvents.ON_INTERSTITIAL_AD_REVENUE_PAID,
|
|
1088
|
+
"ON_APPOPEN_LOADED_EVENT" to CloudXAdEvents.ON_APPOPEN_LOADED_EVENT,
|
|
1089
|
+
"ON_APPOPEN_LOAD_FAILED_EVENT" to CloudXAdEvents.ON_APPOPEN_LOAD_FAILED_EVENT,
|
|
1090
|
+
"ON_APPOPEN_CLICKED_EVENT" to CloudXAdEvents.ON_APPOPEN_CLICKED_EVENT,
|
|
1091
|
+
"ON_APPOPEN_DISPLAYED_EVENT" to CloudXAdEvents.ON_APPOPEN_DISPLAYED_EVENT,
|
|
1092
|
+
"ON_APPOPEN_DISPLAY_FAILED_EVENT" to CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT,
|
|
1093
|
+
"ON_APPOPEN_HIDDEN_EVENT" to CloudXAdEvents.ON_APPOPEN_HIDDEN_EVENT,
|
|
1094
|
+
"ON_APPOPEN_AD_REVENUE_PAID" to CloudXAdEvents.ON_APPOPEN_AD_REVENUE_PAID,
|
|
981
1095
|
"ON_REWARDED_AD_LOADED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_LOADED_EVENT,
|
|
982
1096
|
"ON_REWARDED_AD_LOAD_FAILED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_LOAD_FAILED_EVENT,
|
|
983
1097
|
"ON_REWARDED_AD_CLICKED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_CLICKED_EVENT,
|
|
@@ -9,7 +9,7 @@ import com.facebook.react.uimanager.ViewManager
|
|
|
9
9
|
|
|
10
10
|
class CloudXPackage : TurboReactPackage() {
|
|
11
11
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
12
|
-
return
|
|
12
|
+
return listOf(CloudXAdViewManager())
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package com.cloudxreactnative
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
4
|
+
import com.facebook.react.bridge.ReadableArray
|
|
5
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
6
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
7
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
8
|
+
import com.facebook.react.viewmanagers.CloudXAdViewManagerDelegate
|
|
9
|
+
import com.facebook.react.viewmanagers.CloudXAdViewManagerInterface
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* New-Architecture (Fabric) view manager for CloudXAdView. Props are routed
|
|
13
|
+
* through the codegen-generated delegate/interface; all logic delegates to the
|
|
14
|
+
* shared CloudXAdViewManagerImpl.
|
|
15
|
+
*/
|
|
16
|
+
@ReactModule(name = CloudXAdViewManagerImpl.NAME)
|
|
17
|
+
class CloudXAdViewManager :
|
|
18
|
+
SimpleViewManager<CloudXAdView>(),
|
|
19
|
+
CloudXAdViewManagerInterface<CloudXAdView> {
|
|
20
|
+
|
|
21
|
+
private val delegate = CloudXAdViewManagerDelegate(this)
|
|
22
|
+
|
|
23
|
+
override fun getDelegate(): ViewManagerDelegate<CloudXAdView> = delegate
|
|
24
|
+
|
|
25
|
+
override fun getName(): String = CloudXAdViewManagerImpl.NAME
|
|
26
|
+
|
|
27
|
+
override fun createViewInstance(reactContext: ThemedReactContext): CloudXAdView =
|
|
28
|
+
CloudXAdViewManagerImpl.createViewInstance(reactContext)
|
|
29
|
+
|
|
30
|
+
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
|
|
31
|
+
CloudXAdViewManagerImpl.getExportedCustomDirectEventTypeConstants()
|
|
32
|
+
|
|
33
|
+
override fun setAdUnitId(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setAdUnitId(view, value)
|
|
34
|
+
|
|
35
|
+
override fun setAdFormat(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setAdFormat(view, value)
|
|
36
|
+
|
|
37
|
+
override fun setPlacement(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setPlacement(view, value)
|
|
38
|
+
|
|
39
|
+
override fun setCustomData(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setCustomData(view, value)
|
|
40
|
+
|
|
41
|
+
override fun setExtraParameters(view: CloudXAdView, value: ReadableArray?) = CloudXAdViewManagerImpl.setExtraParameters(view, value)
|
|
42
|
+
|
|
43
|
+
override fun onAfterUpdateTransaction(view: CloudXAdView) {
|
|
44
|
+
super.onAfterUpdateTransaction(view)
|
|
45
|
+
CloudXAdViewManagerImpl.onAfterUpdateTransaction(view)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override fun onDropViewInstance(view: CloudXAdView) {
|
|
49
|
+
CloudXAdViewManagerImpl.onDropViewInstance(view)
|
|
50
|
+
super.onDropViewInstance(view)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -31,6 +31,7 @@ class CloudXModule(reactContext: ReactApplicationContext) :
|
|
|
31
31
|
@ReactMethod override fun setHasUserConsent(hasUserConsent: Boolean?) = impl.setHasUserConsent(hasUserConsent)
|
|
32
32
|
@ReactMethod override fun setDoNotSell(isDoNotSell: Boolean?) = impl.setDoNotSell(isDoNotSell)
|
|
33
33
|
@ReactMethod override fun arbiter(configuration: ReadableMap, promise: Promise) = impl.arbiter(configuration, promise)
|
|
34
|
+
@ReactMethod override fun reportRevenueData(data: ReadableMap, promise: Promise) = impl.reportRevenueData(data, promise)
|
|
34
35
|
|
|
35
36
|
@ReactMethod override fun createBanner(adUnitId: String, position: String) = impl.createBanner(adUnitId, position)
|
|
36
37
|
@ReactMethod override fun createBannerWithOffsets(adUnitId: String, position: String, xOffset: Double, yOffset: Double) = impl.createBannerWithOffsets(adUnitId, position, xOffset, yOffset)
|
|
@@ -66,6 +67,12 @@ class CloudXModule(reactContext: ReactApplicationContext) :
|
|
|
66
67
|
@ReactMethod override fun showInterstitial(adUnitId: String, placement: String?, customData: String?) = impl.showInterstitial(adUnitId, placement, customData)
|
|
67
68
|
@ReactMethod override fun destroyInterstitial(adUnitId: String) = impl.destroyInterstitial(adUnitId)
|
|
68
69
|
|
|
70
|
+
@ReactMethod override fun loadAppOpen(adUnitId: String) = impl.loadAppOpen(adUnitId)
|
|
71
|
+
@ReactMethod override fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setAppOpenExtraParameters(adUnitId, extraParameters)
|
|
72
|
+
@ReactMethod override fun isAppOpenReady(adUnitId: String, promise: Promise) = impl.isAppOpenReady(adUnitId, promise)
|
|
73
|
+
@ReactMethod override fun showAppOpen(adUnitId: String, placement: String?, customData: String?) = impl.showAppOpen(adUnitId, placement, customData)
|
|
74
|
+
@ReactMethod override fun destroyAppOpen(adUnitId: String) = impl.destroyAppOpen(adUnitId)
|
|
75
|
+
|
|
69
76
|
@ReactMethod override fun loadRewarded(adUnitId: String) = impl.loadRewarded(adUnitId)
|
|
70
77
|
@ReactMethod override fun setRewardedExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setRewardedExtraParameters(adUnitId, extraParameters)
|
|
71
78
|
@ReactMethod override fun isRewardedReady(adUnitId: String, promise: Promise) = impl.isRewardedReady(adUnitId, promise)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
package com.cloudxreactnative
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableArray
|
|
4
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Old-Architecture (Paper) view manager for CloudXAdView. Props are wired via
|
|
10
|
+
* [ReactProp]; all logic delegates to the shared CloudXAdViewManagerImpl.
|
|
11
|
+
*/
|
|
12
|
+
class CloudXAdViewManager : SimpleViewManager<CloudXAdView>() {
|
|
13
|
+
|
|
14
|
+
override fun getName(): String = CloudXAdViewManagerImpl.NAME
|
|
15
|
+
|
|
16
|
+
override fun createViewInstance(reactContext: ThemedReactContext): CloudXAdView =
|
|
17
|
+
CloudXAdViewManagerImpl.createViewInstance(reactContext)
|
|
18
|
+
|
|
19
|
+
override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> =
|
|
20
|
+
CloudXAdViewManagerImpl.getExportedCustomDirectEventTypeConstants()
|
|
21
|
+
|
|
22
|
+
@ReactProp(name = "adUnitId")
|
|
23
|
+
fun setAdUnitId(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setAdUnitId(view, value)
|
|
24
|
+
|
|
25
|
+
@ReactProp(name = "adFormat")
|
|
26
|
+
fun setAdFormat(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setAdFormat(view, value)
|
|
27
|
+
|
|
28
|
+
@ReactProp(name = "placement")
|
|
29
|
+
fun setPlacement(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setPlacement(view, value)
|
|
30
|
+
|
|
31
|
+
@ReactProp(name = "customData")
|
|
32
|
+
fun setCustomData(view: CloudXAdView, value: String?) = CloudXAdViewManagerImpl.setCustomData(view, value)
|
|
33
|
+
|
|
34
|
+
@ReactProp(name = "extraParameters")
|
|
35
|
+
fun setExtraParameters(view: CloudXAdView, value: ReadableArray?) = CloudXAdViewManagerImpl.setExtraParameters(view, value)
|
|
36
|
+
|
|
37
|
+
override fun onAfterUpdateTransaction(view: CloudXAdView) {
|
|
38
|
+
super.onAfterUpdateTransaction(view)
|
|
39
|
+
CloudXAdViewManagerImpl.onAfterUpdateTransaction(view)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
override fun onDropViewInstance(view: CloudXAdView) {
|
|
43
|
+
CloudXAdViewManagerImpl.onDropViewInstance(view)
|
|
44
|
+
super.onDropViewInstance(view)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -46,6 +46,7 @@ class CloudXModule(reactContext: ReactApplicationContext) :
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
@ReactMethod fun arbiter(configuration: ReadableMap, promise: Promise) = impl.arbiter(configuration, promise)
|
|
49
|
+
@ReactMethod fun reportRevenueData(data: ReadableMap, promise: Promise) = impl.reportRevenueData(data, promise)
|
|
49
50
|
|
|
50
51
|
@ReactMethod fun createBanner(adUnitId: String, position: String) = impl.createBanner(adUnitId, position)
|
|
51
52
|
@ReactMethod fun createBannerWithOffsets(adUnitId: String, position: String, xOffset: Double, yOffset: Double) = impl.createBannerWithOffsets(adUnitId, position, xOffset, yOffset)
|
|
@@ -81,6 +82,12 @@ class CloudXModule(reactContext: ReactApplicationContext) :
|
|
|
81
82
|
@ReactMethod fun showInterstitial(adUnitId: String, placement: String?, customData: String?) = impl.showInterstitial(adUnitId, placement, customData)
|
|
82
83
|
@ReactMethod fun destroyInterstitial(adUnitId: String) = impl.destroyInterstitial(adUnitId)
|
|
83
84
|
|
|
85
|
+
@ReactMethod fun loadAppOpen(adUnitId: String) = impl.loadAppOpen(adUnitId)
|
|
86
|
+
@ReactMethod fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setAppOpenExtraParameters(adUnitId, extraParameters)
|
|
87
|
+
@ReactMethod fun isAppOpenReady(adUnitId: String, promise: Promise) = impl.isAppOpenReady(adUnitId, promise)
|
|
88
|
+
@ReactMethod fun showAppOpen(adUnitId: String, placement: String?, customData: String?) = impl.showAppOpen(adUnitId, placement, customData)
|
|
89
|
+
@ReactMethod fun destroyAppOpen(adUnitId: String) = impl.destroyAppOpen(adUnitId)
|
|
90
|
+
|
|
84
91
|
@ReactMethod fun loadRewarded(adUnitId: String) = impl.loadRewarded(adUnitId)
|
|
85
92
|
@ReactMethod fun setRewardedExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setRewardedExtraParameters(adUnitId, extraParameters)
|
|
86
93
|
@ReactMethod fun isRewardedReady(adUnitId: String, promise: Promise) = impl.isRewardedReady(adUnitId, promise)
|
|
@@ -6,15 +6,15 @@ Pod::Spec.new do |s|
|
|
|
6
6
|
s.name = "cloudx-react-native"
|
|
7
7
|
s.version = package["version"]
|
|
8
8
|
s.summary = package["description"]
|
|
9
|
-
s.homepage = "https://github.com/cloudx-io/
|
|
9
|
+
s.homepage = "https://github.com/cloudx-io/mobile/tree/main/react-native"
|
|
10
10
|
s.license = package["license"]
|
|
11
11
|
s.authors = { "CloudX" => "support@cloudx.io" }
|
|
12
12
|
s.platforms = { :ios => "13.0" }
|
|
13
|
-
s.source = { :git => "https://github.com/cloudx-io/
|
|
13
|
+
s.source = { :git => "https://github.com/cloudx-io/mobile.git", :tag => "react-native/sdk/#{s.version}" }
|
|
14
14
|
|
|
15
15
|
s.requires_arc = true
|
|
16
16
|
|
|
17
|
-
s.dependency "CloudXCore", "~> 3.
|
|
17
|
+
s.dependency "CloudXCore", "~> 3.6.0"
|
|
18
18
|
|
|
19
19
|
s.source_files = "ios/**/*.{h,mm}"
|
|
20
20
|
|
package/ios/CloudX.h
CHANGED
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
|
|
12
12
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
13
13
|
#import <CloudXSpec/CloudXSpec.h>
|
|
14
|
-
@interface CloudX : RCTEventEmitter<NativeCloudXSpec, CLXInterstitialDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
|
|
14
|
+
@interface CloudX : RCTEventEmitter<NativeCloudXSpec, CLXInterstitialDelegate, CLXAppOpenDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
|
|
15
15
|
#else
|
|
16
16
|
#import <React/RCTBridgeModule.h>
|
|
17
|
-
@interface CloudX : RCTEventEmitter<RCTBridgeModule, CLXInterstitialDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
|
|
17
|
+
@interface CloudX : RCTEventEmitter<RCTBridgeModule, CLXInterstitialDelegate, CLXAppOpenDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
|
|
18
18
|
#endif
|
|
19
19
|
|
|
20
20
|
NS_ASSUME_NONNULL_BEGIN
|