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.
Files changed (114) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +16 -0
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +14 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +238 -0
  5. package/android/src/main/java/com/cloudxreactnative/CloudXAdViewEvent.kt +28 -0
  6. package/android/src/main/java/com/cloudxreactnative/CloudXAdViewManagerImpl.kt +54 -0
  7. package/android/src/main/java/com/cloudxreactnative/CloudXExtraParameters.kt +101 -0
  8. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +171 -57
  9. package/android/src/main/java/com/cloudxreactnative/CloudXPackage.kt +1 -1
  10. package/android/src/newarch/com/cloudxreactnative/CloudXAdViewManager.kt +52 -0
  11. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  12. package/android/src/oldarch/com/cloudxreactnative/CloudXAdViewManager.kt +46 -0
  13. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  14. package/cloudx-react-native.podspec +3 -3
  15. package/ios/CloudX.h +2 -2
  16. package/ios/CloudX.mm +268 -62
  17. package/ios/CloudXAdView.h +33 -0
  18. package/ios/CloudXAdView.mm +500 -0
  19. package/ios/CloudXAdViewManager.h +12 -0
  20. package/ios/CloudXAdViewManager.mm +38 -0
  21. package/ios/CloudXExtraParameters.h +27 -0
  22. package/ios/CloudXExtraParameters.mm +117 -0
  23. package/lib/commonjs/CloudX.js +5 -1
  24. package/lib/commonjs/CloudX.js.map +1 -1
  25. package/lib/commonjs/CloudXAdViewBase.js +250 -0
  26. package/lib/commonjs/CloudXAdViewBase.js.map +1 -0
  27. package/lib/commonjs/CloudXAppOpenAd.js +98 -0
  28. package/lib/commonjs/CloudXAppOpenAd.js.map +1 -0
  29. package/lib/commonjs/CloudXBannerView.js +27 -0
  30. package/lib/commonjs/CloudXBannerView.js.map +1 -0
  31. package/lib/commonjs/CloudXMRECView.js +27 -0
  32. package/lib/commonjs/CloudXMRECView.js.map +1 -0
  33. package/lib/commonjs/hooks.js +81 -0
  34. package/lib/commonjs/hooks.js.map +1 -1
  35. package/lib/commonjs/index.js +53 -0
  36. package/lib/commonjs/index.js.map +1 -1
  37. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js +30 -0
  38. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js.map +1 -0
  39. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  40. package/lib/commonjs/types/AppOpenAd.js +6 -0
  41. package/lib/commonjs/types/AppOpenAd.js.map +1 -0
  42. package/lib/commonjs/types/RevenueData.js +21 -0
  43. package/lib/commonjs/types/RevenueData.js.map +1 -0
  44. package/lib/commonjs/types/index.js +17 -0
  45. package/lib/commonjs/types/index.js.map +1 -1
  46. package/lib/commonjs/version.js +1 -1
  47. package/lib/module/CloudX.js +5 -1
  48. package/lib/module/CloudX.js.map +1 -1
  49. package/lib/module/CloudXAdViewBase.js +242 -0
  50. package/lib/module/CloudXAdViewBase.js.map +1 -0
  51. package/lib/module/CloudXAppOpenAd.js +91 -0
  52. package/lib/module/CloudXAppOpenAd.js.map +1 -0
  53. package/lib/module/CloudXBannerView.js +19 -0
  54. package/lib/module/CloudXBannerView.js.map +1 -0
  55. package/lib/module/CloudXMRECView.js +19 -0
  56. package/lib/module/CloudXMRECView.js.map +1 -0
  57. package/lib/module/hooks.js +80 -0
  58. package/lib/module/hooks.js.map +1 -1
  59. package/lib/module/index.js +10 -1
  60. package/lib/module/index.js.map +1 -1
  61. package/lib/module/specs/CloudXAdViewNativeComponent.js +27 -0
  62. package/lib/module/specs/CloudXAdViewNativeComponent.js.map +1 -0
  63. package/lib/module/specs/NativeCloudX.js.map +1 -1
  64. package/lib/module/types/AppOpenAd.js +2 -0
  65. package/lib/module/types/AppOpenAd.js.map +1 -0
  66. package/lib/module/types/RevenueData.js +15 -0
  67. package/lib/module/types/RevenueData.js.map +1 -0
  68. package/lib/module/types/index.js +1 -1
  69. package/lib/module/types/index.js.map +1 -1
  70. package/lib/module/version.js +1 -1
  71. package/lib/typescript/src/CloudX.d.ts.map +1 -1
  72. package/lib/typescript/src/CloudXAdViewBase.d.ts +28 -0
  73. package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -0
  74. package/lib/typescript/src/CloudXAppOpenAd.d.ts +4 -0
  75. package/lib/typescript/src/CloudXAppOpenAd.d.ts.map +1 -0
  76. package/lib/typescript/src/CloudXBannerView.d.ts +16 -0
  77. package/lib/typescript/src/CloudXBannerView.d.ts.map +1 -0
  78. package/lib/typescript/src/CloudXMRECView.d.ts +16 -0
  79. package/lib/typescript/src/CloudXMRECView.d.ts.map +1 -0
  80. package/lib/typescript/src/hooks.d.ts +14 -0
  81. package/lib/typescript/src/hooks.d.ts.map +1 -1
  82. package/lib/typescript/src/index.d.ts +9 -3
  83. package/lib/typescript/src/index.d.ts.map +1 -1
  84. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +62 -0
  85. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts.map +1 -0
  86. package/lib/typescript/src/specs/NativeCloudX.d.ts +13 -0
  87. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  88. package/lib/typescript/src/types/AdProps.d.ts +3 -0
  89. package/lib/typescript/src/types/AdProps.d.ts.map +1 -1
  90. package/lib/typescript/src/types/AppOpenAd.d.ts +8 -0
  91. package/lib/typescript/src/types/AppOpenAd.d.ts.map +1 -0
  92. package/lib/typescript/src/types/CloudX.d.ts +6 -0
  93. package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
  94. package/lib/typescript/src/types/RevenueData.d.ts +32 -0
  95. package/lib/typescript/src/types/RevenueData.d.ts.map +1 -0
  96. package/lib/typescript/src/types/index.d.ts +3 -0
  97. package/lib/typescript/src/types/index.d.ts.map +1 -1
  98. package/lib/typescript/src/version.d.ts +1 -1
  99. package/package.json +6 -2
  100. package/src/CloudX.ts +6 -0
  101. package/src/CloudXAdViewBase.tsx +294 -0
  102. package/src/CloudXAppOpenAd.ts +109 -0
  103. package/src/CloudXBannerView.tsx +20 -0
  104. package/src/CloudXMRECView.tsx +20 -0
  105. package/src/hooks.ts +103 -0
  106. package/src/index.ts +22 -2
  107. package/src/specs/CloudXAdViewNativeComponent.ts +84 -0
  108. package/src/specs/NativeCloudX.ts +22 -0
  109. package/src/types/AdProps.ts +4 -0
  110. package/src/types/AppOpenAd.ts +8 -0
  111. package/src/types/CloudX.ts +7 -0
  112. package/src/types/RevenueData.ts +39 -0
  113. package/src/types/index.ts +3 -0
  114. 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
- applyExtraParameters(extraParameters) { key, value ->
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
- applyExtraParameters(extraParameters) { key, value ->
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
- applyExtraParameters(extraParameters) { key, value ->
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
- applyExtraParameters(extraParameters) { key, value ->
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
- for ((key, value) in pending) {
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 emptyList()
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/cloudx-react-native"
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/cloudx-react-native.git", :tag => "#{s.version}" }
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.4.5"
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