cloudx-react-native 3.8.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +1 -0
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +10 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +41 -0
  5. package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +1 -0
  6. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +14 -0
  7. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdView.kt +718 -0
  8. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdViewManagerImpl.kt +119 -0
  9. package/android/src/main/java/com/cloudxreactnative/CloudXPackage.kt +4 -1
  10. package/android/src/main/res/layout/cloudx_rn_native_media_banner_template.xml +100 -0
  11. package/android/src/main/res/layout/cloudx_rn_native_medium_template.xml +99 -0
  12. package/android/src/main/res/layout/cloudx_rn_native_small_template.xml +72 -0
  13. package/android/src/main/res/layout/cloudx_rn_native_vertical_media_template.xml +117 -0
  14. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +2 -0
  15. package/android/src/newarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +86 -0
  16. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +2 -0
  17. package/android/src/oldarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +118 -0
  18. package/android/src/test/java/com/cloudxreactnative/CloudXModuleImplArbiterBidsTest.kt +3 -3
  19. package/android/src/test/java/com/cloudxreactnative/CloudXModuleImplThreadingTest.kt +91 -0
  20. package/android/src/test/java/com/cloudxreactnative/FakeReadable.kt +2 -2
  21. package/cloudx-react-native.podspec +2 -1
  22. package/ios/CloudX.h +8 -0
  23. package/ios/CloudX.mm +164 -28
  24. package/ios/CloudXAdView.mm +2 -0
  25. package/ios/CloudXNativeAdView.h +75 -0
  26. package/ios/CloudXNativeAdView.mm +979 -0
  27. package/ios/CloudXNativeAdViewManager.h +12 -0
  28. package/ios/CloudXNativeAdViewManager.mm +119 -0
  29. package/ios/PrivacyInfo.xcprivacy +20 -0
  30. package/lib/commonjs/CloudX.js +4 -0
  31. package/lib/commonjs/CloudX.js.map +1 -1
  32. package/lib/commonjs/CloudXAdViewBase.js +9 -97
  33. package/lib/commonjs/CloudXAdViewBase.js.map +1 -1
  34. package/lib/commonjs/CloudXErrorCode.js +2 -0
  35. package/lib/commonjs/CloudXErrorCode.js.map +1 -1
  36. package/lib/commonjs/CloudXNativeAdView.js +331 -0
  37. package/lib/commonjs/CloudXNativeAdView.js.map +1 -0
  38. package/lib/commonjs/CloudXNativeAdViewComponents.js +252 -0
  39. package/lib/commonjs/CloudXNativeAdViewComponents.js.map +1 -0
  40. package/lib/commonjs/CloudXNativeAdViewProvider.js +117 -0
  41. package/lib/commonjs/CloudXNativeAdViewProvider.js.map +1 -0
  42. package/lib/commonjs/extraParameters.js +52 -0
  43. package/lib/commonjs/extraParameters.js.map +1 -0
  44. package/lib/commonjs/hooks.js +34 -0
  45. package/lib/commonjs/hooks.js.map +1 -1
  46. package/lib/commonjs/index.js +72 -0
  47. package/lib/commonjs/index.js.map +1 -1
  48. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js.map +1 -1
  49. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js +41 -0
  50. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js.map +1 -0
  51. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  52. package/lib/commonjs/types/NativeAd.js +70 -0
  53. package/lib/commonjs/types/NativeAd.js.map +1 -0
  54. package/lib/commonjs/types/index.js +13 -0
  55. package/lib/commonjs/types/index.js.map +1 -1
  56. package/lib/commonjs/useCloudXSdkInitialization.js +75 -0
  57. package/lib/commonjs/useCloudXSdkInitialization.js.map +1 -0
  58. package/lib/commonjs/version.js +1 -1
  59. package/lib/commonjs/version.js.map +1 -1
  60. package/lib/module/CloudX.js +4 -0
  61. package/lib/module/CloudX.js.map +1 -1
  62. package/lib/module/CloudXAdViewBase.js +8 -96
  63. package/lib/module/CloudXAdViewBase.js.map +1 -1
  64. package/lib/module/CloudXErrorCode.js +2 -0
  65. package/lib/module/CloudXErrorCode.js.map +1 -1
  66. package/lib/module/CloudXNativeAdView.js +324 -0
  67. package/lib/module/CloudXNativeAdView.js.map +1 -0
  68. package/lib/module/CloudXNativeAdViewComponents.js +240 -0
  69. package/lib/module/CloudXNativeAdViewComponents.js.map +1 -0
  70. package/lib/module/CloudXNativeAdViewProvider.js +110 -0
  71. package/lib/module/CloudXNativeAdViewProvider.js.map +1 -0
  72. package/lib/module/extraParameters.js +45 -0
  73. package/lib/module/extraParameters.js.map +1 -0
  74. package/lib/module/hooks.js +34 -0
  75. package/lib/module/hooks.js.map +1 -1
  76. package/lib/module/index.js +13 -0
  77. package/lib/module/index.js.map +1 -1
  78. package/lib/module/specs/CloudXAdViewNativeComponent.js.map +1 -1
  79. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js +35 -0
  80. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js.map +1 -0
  81. package/lib/module/specs/NativeCloudX.js.map +1 -1
  82. package/lib/module/types/NativeAd.js +68 -0
  83. package/lib/module/types/NativeAd.js.map +1 -0
  84. package/lib/module/types/index.js +1 -0
  85. package/lib/module/types/index.js.map +1 -1
  86. package/lib/module/useCloudXSdkInitialization.js +68 -0
  87. package/lib/module/useCloudXSdkInitialization.js.map +1 -0
  88. package/lib/module/version.js +1 -1
  89. package/lib/module/version.js.map +1 -1
  90. package/lib/typescript/src/CloudX.d.ts.map +1 -1
  91. package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -1
  92. package/lib/typescript/src/CloudXErrorCode.d.ts +2 -0
  93. package/lib/typescript/src/CloudXErrorCode.d.ts.map +1 -1
  94. package/lib/typescript/src/CloudXNativeAdView.d.ts +24 -0
  95. package/lib/typescript/src/CloudXNativeAdView.d.ts.map +1 -0
  96. package/lib/typescript/src/CloudXNativeAdViewComponents.d.ts +67 -0
  97. package/lib/typescript/src/CloudXNativeAdViewComponents.d.ts.map +1 -0
  98. package/lib/typescript/src/CloudXNativeAdViewProvider.d.ts +72 -0
  99. package/lib/typescript/src/CloudXNativeAdViewProvider.d.ts.map +1 -0
  100. package/lib/typescript/src/extraParameters.d.ts +4 -0
  101. package/lib/typescript/src/extraParameters.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks.d.ts.map +1 -1
  103. package/lib/typescript/src/index.d.ts +4 -1
  104. package/lib/typescript/src/index.d.ts.map +1 -1
  105. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +1 -0
  106. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts.map +1 -1
  107. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts +103 -0
  108. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts.map +1 -0
  109. package/lib/typescript/src/specs/NativeCloudX.d.ts +1 -0
  110. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  111. package/lib/typescript/src/types/AdInfo.d.ts +6 -1
  112. package/lib/typescript/src/types/AdInfo.d.ts.map +1 -1
  113. package/lib/typescript/src/types/CloudX.d.ts +2 -0
  114. package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
  115. package/lib/typescript/src/types/NativeAd.d.ts +114 -0
  116. package/lib/typescript/src/types/NativeAd.d.ts.map +1 -0
  117. package/lib/typescript/src/types/index.d.ts +2 -0
  118. package/lib/typescript/src/types/index.d.ts.map +1 -1
  119. package/lib/typescript/src/useCloudXSdkInitialization.d.ts +16 -0
  120. package/lib/typescript/src/useCloudXSdkInitialization.d.ts.map +1 -0
  121. package/lib/typescript/src/version.d.ts +1 -1
  122. package/lib/typescript/src/version.d.ts.map +1 -1
  123. package/package.json +1 -1
  124. package/src/CloudX.ts +5 -0
  125. package/src/CloudXAdViewBase.tsx +9 -125
  126. package/src/CloudXErrorCode.ts +3 -0
  127. package/src/CloudXNativeAdView.tsx +419 -0
  128. package/src/CloudXNativeAdViewComponents.tsx +203 -0
  129. package/src/CloudXNativeAdViewProvider.tsx +149 -0
  130. package/src/extraParameters.ts +65 -0
  131. package/src/hooks.ts +38 -0
  132. package/src/index.ts +24 -0
  133. package/src/specs/CloudXAdViewNativeComponent.ts +1 -0
  134. package/src/specs/CloudXNativeAdViewNativeComponent.ts +137 -0
  135. package/src/specs/NativeCloudX.ts +1 -0
  136. package/src/types/AdInfo.ts +8 -1
  137. package/src/types/CloudX.ts +3 -0
  138. package/src/types/NativeAd.ts +125 -0
  139. package/src/types/index.ts +7 -0
  140. package/src/useCloudXSdkInitialization.ts +73 -0
  141. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -10,6 +10,7 @@ Full integration docs live in the public docs site. Keep setup guides, ad-format
10
10
  - Ad format guides:
11
11
  - [Banner and MREC ads](https://docs.cloudx.io/en/react-native/ad-formats/banner-mrec)
12
12
  - [Interstitial ads](https://docs.cloudx.io/en/react-native/ad-formats/interstitial)
13
+ - [Native ads](https://docs.cloudx.io/en/react-native/ad-formats/native)
13
14
  - [Rewarded ads](https://docs.cloudx.io/en/react-native/ad-formats/rewarded)
14
15
  - [React Native changelog](https://docs.cloudx.io/en/react-native/changelog)
15
16
 
@@ -158,7 +158,7 @@ repositories {
158
158
  dependencies {
159
159
  implementation "com.facebook.react:react-native:0.76.2"
160
160
 
161
- implementation "io.cloudx:sdk:4.6.0"
161
+ implementation "io.cloudx:sdk:4.9.0"
162
162
 
163
163
  testImplementation "junit:junit:4.13.2"
164
164
  testImplementation "io.mockk:mockk:1.13.10"
@@ -52,4 +52,14 @@ object CloudXAdEvents {
52
52
  const val ON_REWARDED_AD_RECEIVED_REWARD_EVENT = "OnRewardedAdReceivedRewardEvent"
53
53
  const val ON_REWARDED_AD_REVENUE_PAID = "OnRewardedAdRevenuePaid"
54
54
 
55
+
56
+ // In-tree Native Ad View component (CloudXNativeAdView) per-view direct events.
57
+ // These strings are both the event key and the JS prop registrationName.
58
+ const val ON_NATIVE_AD_VIEW_LOADED_EVENT = "onAdLoadedEvent"
59
+ const val ON_NATIVE_AD_VIEW_LOAD_FAILED_EVENT = "onAdLoadFailedEvent"
60
+ const val ON_NATIVE_AD_VIEW_DISPLAY_FAILED_EVENT = "onAdDisplayFailedEvent"
61
+ const val ON_NATIVE_AD_VIEW_CLICKED_EVENT = "onAdClickedEvent"
62
+ const val ON_NATIVE_AD_VIEW_EXPIRED_EVENT = "onAdExpiredEvent"
63
+ const val ON_NATIVE_AD_VIEW_CLOSED_EVENT = "onAdClosedEvent"
64
+ const val ON_NATIVE_AD_VIEW_REVENUE_PAID_EVENT = "onAdRevenuePaidEvent"
55
65
  }
@@ -1,9 +1,12 @@
1
1
  package com.cloudxreactnative
2
2
 
3
+ import android.graphics.Bitmap
4
+ import android.util.Base64
3
5
  import com.facebook.react.bridge.Arguments
4
6
  import com.facebook.react.bridge.WritableMap
5
7
  import io.cloudx.sdk.CloudXAd
6
8
  import io.cloudx.sdk.CloudXError
9
+ import java.io.ByteArrayOutputStream
7
10
 
8
11
  fun getAdInfo(ad: CloudXAd): WritableMap {
9
12
  val map = Arguments.createMap()
@@ -12,11 +15,35 @@ fun getAdInfo(ad: CloudXAd): WritableMap {
12
15
  map.putString("networkName", ad.networkName)
13
16
  map.putString("networkPlacement", ad.networkPlacement ?: "")
14
17
  map.putString("placement", ad.placement ?: "")
18
+ map.putString("creativeId", ad.creativeId ?: "")
15
19
  map.putDouble("revenue", ad.revenue)
16
20
  map.putMap("adValues", ad.adValues.toWritableMap())
21
+
17
22
  return map
18
23
  }
19
24
 
25
+ /**
26
+ * Icon encoding for CloudXNativeAdView's codegen-typed `nativeAdJson`
27
+ * direct-event field, which can't carry a nested WritableMap. Capped at 96px
28
+ * because the encoded string crosses the bridge on every native-ad callback.
29
+ */
30
+ internal fun bitmapToBase64Png(bitmap: Bitmap): String? {
31
+ val maxDimension = 96
32
+ val scaled = if (maxOf(bitmap.width, bitmap.height) > maxDimension) {
33
+ val scale = maxDimension.toFloat() / maxOf(bitmap.width, bitmap.height)
34
+ Bitmap.createScaledBitmap(bitmap, (bitmap.width * scale).toInt(), (bitmap.height * scale).toInt(), true)
35
+ } else {
36
+ bitmap
37
+ }
38
+ return try {
39
+ val stream = ByteArrayOutputStream()
40
+ scaled.compress(Bitmap.CompressFormat.PNG, 100, stream)
41
+ Base64.encodeToString(stream.toByteArray(), Base64.NO_WRAP)
42
+ } catch (oom: OutOfMemoryError) {
43
+ null
44
+ }
45
+ }
46
+
20
47
  fun Map<String, String>.toWritableMap(): WritableMap {
21
48
  val map = Arguments.createMap()
22
49
  for ((key, value) in this) {
@@ -40,6 +67,20 @@ fun getAdDisplayFailedInfo(ad: CloudXAd, error: CloudXError): WritableMap {
40
67
  return map
41
68
  }
42
69
 
70
+ /**
71
+ * Minimal `onAdDisplayFailed` payload for paths that have no loaded [CloudXAd]
72
+ * to describe (e.g. `renderNativeAd` called before `onAdLoaded`). Carries the
73
+ * same `{adUnitId, code, message}` shape as [getNoActivityDisplayFailedInfo]
74
+ * but with a real [CloudXError] instead of the sentinel -1 code.
75
+ */
76
+ fun getAdDisplayFailedInfo(adUnitId: String, error: CloudXError): WritableMap {
77
+ val map = Arguments.createMap()
78
+ map.putString("adUnitId", adUnitId)
79
+ map.putInt("code", error.code.code)
80
+ map.putString("message", error.message)
81
+ return map
82
+ }
83
+
43
84
  /**
44
85
  * Synthetic display-failure payload for the no-current-activity show path.
45
86
  * Mirrors the iOS no-view-controller payload ({adUnitId, code: -1, message})
@@ -209,6 +209,7 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
209
209
  map.putString("networkName", ad.networkName)
210
210
  map.putString("networkPlacement", ad.networkPlacement ?: "")
211
211
  map.putString("placement", ad.placement ?: "")
212
+ map.putString("creativeId", ad.creativeId ?: "")
212
213
  map.putDouble("revenue", ad.revenue)
213
214
  /*
214
215
  * The SDK types adValues as Map<String, String>, so the cast is safe
@@ -115,6 +115,18 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
115
115
  }
116
116
  }
117
117
 
118
+ fun showMediationDebugger(promise: Promise) {
119
+ onUiThread {
120
+ if (!CloudX.isInitialized()) {
121
+ promise.resolve(false)
122
+ return@onUiThread
123
+ }
124
+
125
+ CloudX.showMediationDebugger(maybeGetCurrentActivity() ?: reactApplicationContext)
126
+ promise.resolve(true)
127
+ }
128
+ }
129
+
118
130
  fun initialize(pluginVersion: String, appKey: String, promise: Promise) {
119
131
  onUiThread {
120
132
  val config = CloudXInitializationConfiguration.builder(appKey)
@@ -1169,6 +1181,8 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
1169
1181
  override fun onHostPause() {}
1170
1182
 
1171
1183
  override fun onHostDestroy() {
1184
+ // React Native drops its Activity here, so the cached one must go too.
1185
+ currentActivity = null
1172
1186
  // Make copy because destroyAdView() removes from adViews
1173
1187
  val adViewsCopy = HashMap(adViewAdFormats)
1174
1188
  for ((adUnitId, adFormat) in adViewsCopy) {