react-native-daro 1.0.15 → 2.0.0-rc.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 (241) hide show
  1. package/README.md +2 -5
  2. package/android/build.gradle +17 -14
  3. package/android/src/main/java/com/daro/reactnative/DaroMediaViewManager.kt +25 -0
  4. package/android/src/main/java/com/daro/reactnative/DaroRNAdBannerViewManager.kt +105 -0
  5. package/android/src/main/java/com/daro/reactnative/DaroRNAdNativeViewManager.kt +163 -0
  6. package/android/src/main/java/com/daro/reactnative/DaroRNModule.kt +376 -0
  7. package/android/src/main/java/com/daro/reactnative/DaroRNPackage.kt +45 -0
  8. package/android/src/main/java/com/daro/reactnative/DaroSdkBridge.kt +52 -0
  9. package/android/src/main/java/com/daro/reactnative/constants/{InternalDaroMBannerSize.kt → InternalDaroRNBannerSize.kt} +2 -2
  10. package/android/src/main/java/com/daro/reactnative/event/{DaroMEvent.kt → DaroRNEvent.kt} +22 -11
  11. package/android/src/main/java/com/daro/reactnative/impl/{DaroMBannerViewModuleImpl.kt → DaroRNBannerViewModuleImpl.kt} +3 -3
  12. package/android/src/main/java/com/daro/reactnative/impl/{DaroMInterstitialModuleImpl.kt → DaroRNInterstitialModuleImpl.kt} +4 -4
  13. package/android/src/main/java/com/daro/reactnative/impl/{DaroMLightPopupModuleImpl.kt → DaroRNLightPopupModuleImpl.kt} +4 -4
  14. package/android/src/main/java/com/daro/reactnative/impl/{DaroMRewardedAdModuleImpl.kt → DaroRNRewardedAdModuleImpl.kt} +4 -4
  15. package/android/src/main/java/com/daro/reactnative/util/AdInfoUtil.kt +12 -0
  16. package/android/src/main/java/com/daro/reactnative/util/DaroQaProbe.kt +147 -0
  17. package/android/src/main/java/com/daro/reactnative/util/EventEmitterUtil.kt +20 -7
  18. package/android/src/main/java/com/daro/reactnative/view/DaroMediaView.kt +123 -0
  19. package/android/src/main/java/com/daro/reactnative/view/{DaroMAdBannerViewContainer.kt → DaroRNAdBannerViewContainer.kt} +2 -3
  20. package/android/src/main/java/com/daro/reactnative/view/DaroRNAdNativeViewContainer.kt +623 -0
  21. package/android/src/newarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +6 -0
  22. package/android/src/oldarch/java/com/daro/reactnative/DaroRNModuleSpec.kt +119 -0
  23. package/ios/{DaroMModule+AppOpen.swift → DaroRNModule+AppOpen.swift} +22 -20
  24. package/ios/DaroRNModule+Consent.swift +88 -0
  25. package/ios/{DaroMModule+Interstitial.swift → DaroRNModule+Interstitial.swift} +21 -18
  26. package/ios/{DaroMModule+LightPopup.swift → DaroRNModule+LightPopup.swift} +18 -15
  27. package/ios/DaroRNModule+Qa.swift +158 -0
  28. package/ios/{DaroMModule+Rewarded.swift → DaroRNModule+Rewarded.swift} +22 -19
  29. package/ios/DaroRNModule.mm +88 -0
  30. package/ios/{DaroMModule.swift → DaroRNModule.swift} +24 -10
  31. package/ios/Fabric/DaroRNAdBannerComponentView.mm +219 -0
  32. package/ios/Fabric/DaroRNFabricEventSink.mm +31 -0
  33. package/ios/Fabric/DaroRNFabricPropApplier.mm +123 -0
  34. package/ios/Fabric/DaroRNNativeAdComponentView.mm +306 -0
  35. package/ios/{DaroMAdBannerViewManager.m → Paper/DaroRNAdBannerViewManager.m} +4 -2
  36. package/ios/Paper/DaroRNAdBannerViewManager.swift +21 -0
  37. package/ios/{DaroMNativeAdViewManager.m → Paper/DaroRNNativeAdViewManager.m} +3 -2
  38. package/ios/Paper/DaroRNNativeAdViewManager.swift +22 -0
  39. package/ios/Shared/DaroMediationDebugger.swift +14 -0
  40. package/ios/{mediation/admob → Shared}/DaroMediationTypes.swift +1 -0
  41. package/ios/Shared/DaroRNAdEventSink.swift +24 -0
  42. package/ios/Shared/DaroRNBannerAdView.swift +188 -0
  43. package/ios/Shared/DaroRNNativeAdLoadCoordinator.swift +49 -0
  44. package/ios/Shared/DaroRNNativeAdView.swift +575 -0
  45. package/ios/Shared/DaroRNNativeAssetResolver.swift +53 -0
  46. package/lib/commonjs/AdBannerView.js +20 -41
  47. package/lib/commonjs/AdBannerView.js.map +1 -1
  48. package/lib/commonjs/AppOpenAd.js +45 -12
  49. package/lib/commonjs/AppOpenAd.js.map +1 -1
  50. package/lib/commonjs/DaroMediaViewNativeComponent.ts +9 -0
  51. package/lib/commonjs/DaroRNAdBannerViewNativeComponent.ts +50 -0
  52. package/lib/commonjs/DaroRNNativeAdViewNativeComponent.ts +65 -0
  53. package/lib/commonjs/EventEmitter.js +4 -5
  54. package/lib/commonjs/EventEmitter.js.map +1 -1
  55. package/lib/commonjs/InterstitialAd.js +9 -11
  56. package/lib/commonjs/InterstitialAd.js.map +1 -1
  57. package/lib/commonjs/LightPopupAd.js +11 -12
  58. package/lib/commonjs/LightPopupAd.js.map +1 -1
  59. package/lib/commonjs/NativeDaroModule.js +9 -0
  60. package/lib/commonjs/NativeDaroModule.js.map +1 -0
  61. package/lib/commonjs/RewardedAd.js +9 -11
  62. package/lib/commonjs/RewardedAd.js.map +1 -1
  63. package/lib/commonjs/codegen-env.d.js +2 -0
  64. package/lib/commonjs/codegen-env.d.js.map +1 -0
  65. package/lib/commonjs/hooks/useInterstitialAd.js +110 -0
  66. package/lib/commonjs/hooks/useInterstitialAd.js.map +1 -0
  67. package/lib/commonjs/hooks/useLightPopupAd.js +114 -0
  68. package/lib/commonjs/hooks/useLightPopupAd.js.map +1 -0
  69. package/lib/commonjs/hooks/useRewardedAd.js +113 -0
  70. package/lib/commonjs/hooks/useRewardedAd.js.map +1 -0
  71. package/lib/commonjs/index.js +150 -13
  72. package/lib/commonjs/index.js.map +1 -1
  73. package/lib/commonjs/nativeAd/NativeAdView.js +23 -22
  74. package/lib/commonjs/nativeAd/NativeAdView.js.map +1 -1
  75. package/lib/commonjs/nativeAd/NativeAdViewComponents.js +43 -31
  76. package/lib/commonjs/nativeAd/NativeAdViewComponents.js.map +1 -1
  77. package/lib/commonjs/nativeAd/NativeAdViewProvider.js +34 -7
  78. package/lib/commonjs/nativeAd/NativeAdViewProvider.js.map +1 -1
  79. package/lib/module/AdBannerView.js +19 -42
  80. package/lib/module/AdBannerView.js.map +1 -1
  81. package/lib/module/AppOpenAd.js +45 -13
  82. package/lib/module/AppOpenAd.js.map +1 -1
  83. package/lib/module/DaroMediaViewNativeComponent.ts +9 -0
  84. package/lib/module/DaroRNAdBannerViewNativeComponent.ts +50 -0
  85. package/lib/module/DaroRNNativeAdViewNativeComponent.ts +65 -0
  86. package/lib/module/EventEmitter.js +4 -6
  87. package/lib/module/EventEmitter.js.map +1 -1
  88. package/lib/module/InterstitialAd.js +8 -11
  89. package/lib/module/InterstitialAd.js.map +1 -1
  90. package/lib/module/LightPopupAd.js +11 -13
  91. package/lib/module/LightPopupAd.js.map +1 -1
  92. package/lib/module/NativeDaroModule.js +5 -0
  93. package/lib/module/NativeDaroModule.js.map +1 -0
  94. package/lib/module/RewardedAd.js +8 -11
  95. package/lib/module/RewardedAd.js.map +1 -1
  96. package/lib/module/codegen-env.d.js +2 -0
  97. package/lib/module/codegen-env.d.js.map +1 -0
  98. package/lib/module/hooks/useInterstitialAd.js +106 -0
  99. package/lib/module/hooks/useInterstitialAd.js.map +1 -0
  100. package/lib/module/hooks/useLightPopupAd.js +110 -0
  101. package/lib/module/hooks/useLightPopupAd.js.map +1 -0
  102. package/lib/module/hooks/useRewardedAd.js +109 -0
  103. package/lib/module/hooks/useRewardedAd.js.map +1 -0
  104. package/lib/module/index.js +108 -13
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/nativeAd/NativeAdView.js +22 -23
  107. package/lib/module/nativeAd/NativeAdView.js.map +1 -1
  108. package/lib/module/nativeAd/NativeAdViewComponents.js +45 -34
  109. package/lib/module/nativeAd/NativeAdViewComponents.js.map +1 -1
  110. package/lib/module/nativeAd/NativeAdViewProvider.js +35 -8
  111. package/lib/module/nativeAd/NativeAdViewProvider.js.map +1 -1
  112. package/lib/typescript/commonjs/plugin/src/index.d.ts +2 -6
  113. package/lib/typescript/commonjs/plugin/src/index.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts +2 -6
  115. package/lib/typescript/commonjs/plugin/src/withAndroid.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/plugin/src/withIos.d.ts +2 -6
  117. package/lib/typescript/commonjs/plugin/src/withIos.d.ts.map +1 -1
  118. package/lib/typescript/commonjs/src/AdBannerView.d.ts +2 -2
  119. package/lib/typescript/commonjs/src/AdBannerView.d.ts.map +1 -1
  120. package/lib/typescript/commonjs/src/AppOpenAd.d.ts +2 -2
  121. package/lib/typescript/commonjs/src/AppOpenAd.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts +6 -0
  123. package/lib/typescript/commonjs/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
  125. package/lib/typescript/commonjs/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
  127. package/lib/typescript/commonjs/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/src/EventEmitter.d.ts.map +1 -1
  129. package/lib/typescript/commonjs/src/InterstitialAd.d.ts.map +1 -1
  130. package/lib/typescript/commonjs/src/LightPopupAd.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/src/NativeDaroModule.d.ts +70 -0
  132. package/lib/typescript/commonjs/src/NativeDaroModule.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/src/RewardedAd.d.ts.map +1 -1
  134. package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts +19 -0
  135. package/lib/typescript/commonjs/src/hooks/useInterstitialAd.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts +23 -0
  137. package/lib/typescript/commonjs/src/hooks/useLightPopupAd.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts +20 -0
  139. package/lib/typescript/commonjs/src/hooks/useRewardedAd.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/src/index.d.ts +86 -1
  141. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts +1 -0
  143. package/lib/typescript/commonjs/src/nativeAd/NativeAdView.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
  145. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
  146. package/lib/typescript/commonjs/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
  147. package/lib/typescript/commonjs/src/types/AdInfo.d.ts +15 -0
  148. package/lib/typescript/commonjs/src/types/AdInfo.d.ts.map +1 -1
  149. package/lib/typescript/commonjs/src/types/AdProps.d.ts +0 -1
  150. package/lib/typescript/commonjs/src/types/AdProps.d.ts.map +1 -1
  151. package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts +2 -0
  152. package/lib/typescript/commonjs/src/types/NativeAdViewProps.d.ts.map +1 -1
  153. package/lib/typescript/module/plugin/src/index.d.ts +2 -6
  154. package/lib/typescript/module/plugin/src/index.d.ts.map +1 -1
  155. package/lib/typescript/module/plugin/src/withAndroid.d.ts +2 -6
  156. package/lib/typescript/module/plugin/src/withAndroid.d.ts.map +1 -1
  157. package/lib/typescript/module/plugin/src/withIos.d.ts +2 -6
  158. package/lib/typescript/module/plugin/src/withIos.d.ts.map +1 -1
  159. package/lib/typescript/module/src/AdBannerView.d.ts +2 -2
  160. package/lib/typescript/module/src/AdBannerView.d.ts.map +1 -1
  161. package/lib/typescript/module/src/AppOpenAd.d.ts +2 -2
  162. package/lib/typescript/module/src/AppOpenAd.d.ts.map +1 -1
  163. package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts +6 -0
  164. package/lib/typescript/module/src/DaroMediaViewNativeComponent.d.ts.map +1 -0
  165. package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts +33 -0
  166. package/lib/typescript/module/src/DaroRNAdBannerViewNativeComponent.d.ts.map +1 -0
  167. package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts +43 -0
  168. package/lib/typescript/module/src/DaroRNNativeAdViewNativeComponent.d.ts.map +1 -0
  169. package/lib/typescript/module/src/EventEmitter.d.ts.map +1 -1
  170. package/lib/typescript/module/src/InterstitialAd.d.ts.map +1 -1
  171. package/lib/typescript/module/src/LightPopupAd.d.ts.map +1 -1
  172. package/lib/typescript/module/src/NativeDaroModule.d.ts +70 -0
  173. package/lib/typescript/module/src/NativeDaroModule.d.ts.map +1 -0
  174. package/lib/typescript/module/src/RewardedAd.d.ts.map +1 -1
  175. package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts +19 -0
  176. package/lib/typescript/module/src/hooks/useInterstitialAd.d.ts.map +1 -0
  177. package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts +23 -0
  178. package/lib/typescript/module/src/hooks/useLightPopupAd.d.ts.map +1 -0
  179. package/lib/typescript/module/src/hooks/useRewardedAd.d.ts +20 -0
  180. package/lib/typescript/module/src/hooks/useRewardedAd.d.ts.map +1 -0
  181. package/lib/typescript/module/src/index.d.ts +86 -1
  182. package/lib/typescript/module/src/index.d.ts.map +1 -1
  183. package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts +1 -0
  184. package/lib/typescript/module/src/nativeAd/NativeAdView.d.ts.map +1 -1
  185. package/lib/typescript/module/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -1
  186. package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts +11 -5
  187. package/lib/typescript/module/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -1
  188. package/lib/typescript/module/src/types/AdInfo.d.ts +15 -0
  189. package/lib/typescript/module/src/types/AdInfo.d.ts.map +1 -1
  190. package/lib/typescript/module/src/types/AdProps.d.ts +0 -1
  191. package/lib/typescript/module/src/types/AdProps.d.ts.map +1 -1
  192. package/lib/typescript/module/src/types/NativeAdViewProps.d.ts +2 -0
  193. package/lib/typescript/module/src/types/NativeAdViewProps.d.ts.map +1 -1
  194. package/package.json +12 -5
  195. package/plugin/build/index.d.ts +2 -6
  196. package/plugin/build/index.js +21 -56
  197. package/plugin/build/withAndroid.d.ts +2 -6
  198. package/plugin/build/withAndroid.js +123 -83
  199. package/plugin/build/withIos.d.ts +2 -6
  200. package/plugin/build/withIos.js +37 -34
  201. package/react-native-daro.podspec +4 -2
  202. package/src/AdBannerView.tsx +24 -63
  203. package/src/AppOpenAd.ts +48 -17
  204. package/src/DaroMediaViewNativeComponent.ts +9 -0
  205. package/src/DaroRNAdBannerViewNativeComponent.ts +50 -0
  206. package/src/DaroRNNativeAdViewNativeComponent.ts +65 -0
  207. package/src/EventEmitter.ts +4 -5
  208. package/src/InterstitialAd.ts +8 -10
  209. package/src/LightPopupAd.ts +11 -12
  210. package/src/NativeDaroModule.ts +106 -0
  211. package/src/RewardedAd.ts +8 -10
  212. package/src/codegen-env.d.ts +45 -0
  213. package/src/hooks/useInterstitialAd.ts +117 -0
  214. package/src/hooks/useLightPopupAd.ts +132 -0
  215. package/src/hooks/useRewardedAd.ts +122 -0
  216. package/src/index.tsx +157 -22
  217. package/src/nativeAd/NativeAdView.tsx +41 -54
  218. package/src/nativeAd/NativeAdViewComponents.tsx +80 -42
  219. package/src/nativeAd/NativeAdViewProvider.tsx +75 -17
  220. package/src/types/AdInfo.ts +17 -0
  221. package/src/types/AdProps.ts +0 -2
  222. package/src/types/NativeAdViewProps.ts +7 -0
  223. package/android/src/admob/java/com/daro/reactnative/DaroSdkBridge.kt +0 -23
  224. package/android/src/main/java/com/daro/reactnative/DaroMAdBannerViewManager.kt +0 -132
  225. package/android/src/main/java/com/daro/reactnative/DaroMAdNativeViewManager.kt +0 -136
  226. package/android/src/main/java/com/daro/reactnative/DaroMModule.kt +0 -202
  227. package/android/src/main/java/com/daro/reactnative/DaroMPackage.kt +0 -21
  228. package/android/src/main/java/com/daro/reactnative/view/DaroMAdNativeViewContainer.kt +0 -375
  229. package/ios/DaroMAdBannerViewManager.swift +0 -91
  230. package/ios/DaroMModule.mm +0 -45
  231. package/ios/DaroMNativeAdViewManager.swift +0 -291
  232. package/ios/mediation/admob/DaroMediationDebugger.swift +0 -11
  233. package/lib/commonjs/types/DaroMMobileAds.js +0 -2
  234. package/lib/commonjs/types/DaroMMobileAds.js.map +0 -1
  235. package/lib/module/types/DaroMMobileAds.js +0 -2
  236. package/lib/module/types/DaroMMobileAds.js.map +0 -1
  237. package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts +0 -6
  238. package/lib/typescript/commonjs/src/types/DaroMMobileAds.d.ts.map +0 -1
  239. package/lib/typescript/module/src/types/DaroMMobileAds.d.ts +0 -6
  240. package/lib/typescript/module/src/types/DaroMMobileAds.d.ts.map +0 -1
  241. package/src/types/DaroMMobileAds.ts +0 -5
@@ -0,0 +1,147 @@
1
+ package com.daro.reactnative.util
2
+
3
+ import android.content.Context
4
+ import com.applovin.sdk.AppLovinSdk
5
+ import com.facebook.react.bridge.Arguments
6
+ import com.facebook.react.bridge.WritableArray
7
+ import com.facebook.react.bridge.WritableMap
8
+ import com.google.android.gms.ads.MobileAds
9
+ import com.google.android.gms.ads.VersionInfo
10
+ import com.google.android.gms.ads.initialization.AdapterStatus.State
11
+ import com.google.android.gms.ads.mediation.Adapter
12
+ import droom.daro.core.model.DaroMediationType
13
+ import droom.daro.core.routing.MediationReadiness
14
+ import java.util.concurrent.ConcurrentHashMap
15
+
16
+ // daro-android-qa 의 MediationStatusProbe 와 같은 축 — 초기화 판정은 라우팅이 쓰는
17
+ // SDK 값(@Keep MediationReadiness)을 그대로 읽고, 서브네트워크 어댑터 목록은 SDK 가
18
+ // 갖지 않으므로 벤더에 직접 묻는다. 여기서 다시 추론하면 화면과 실제 라우팅이 갈린다.
19
+ object DaroQaProbe {
20
+
21
+ // GMA 의 adapterStatusMap 은 초기화된 것만 담는다 — 탑재 여부는 클래스로,
22
+ // 버전은 어댑터에게, 초기화 상태는 맵에서 따로 읽는다.
23
+ private val ADMOB_ADAPTERS = listOf(
24
+ "AppLovin" to "com.google.ads.mediation.applovin.AppLovinMediationAdapter",
25
+ "DT Exchange" to "com.google.ads.mediation.fyber.FyberMediationAdapter",
26
+ "InMobi" to "com.google.ads.mediation.inmobi.InMobiMediationAdapter",
27
+ "LINE" to "com.google.ads.mediation.line.LineMediationAdapter",
28
+ "Meta" to "com.google.ads.mediation.facebook.FacebookMediationAdapter",
29
+ "Mintegral" to "com.google.ads.mediation.mintegral.MintegralMediationAdapter",
30
+ "Moloco" to "com.google.ads.mediation.moloco.MolocoMediationAdapter",
31
+ "Pangle" to "com.google.ads.mediation.pangle.PangleMediationAdapter",
32
+ "PubMatic" to "com.google.ads.mediation.pubmatic.PubMaticMediationAdapter",
33
+ "Unity Ads" to "com.google.ads.mediation.unity.UnityMediationAdapter",
34
+ "Vungle" to "com.google.ads.mediation.vungle.VungleMediationAdapter",
35
+ "ironSource" to "com.google.ads.mediation.ironsource.IronSourceMediationAdapter",
36
+ )
37
+
38
+ fun mediationStatuses(): WritableArray {
39
+ val statuses = Arguments.createArray()
40
+ listOf(DaroMediationType.Daro, DaroMediationType.DaroM).forEach { mediation ->
41
+ val ready = MediationReadiness.isReady(mediation)
42
+ statuses.pushMap(
43
+ Arguments.createMap().apply {
44
+ // **공개 어휘(publicName)를 쓴다** — `daroa`/`darom` (DARO-1587).
45
+ // 이 값은 getMediationStatuses() 로 소비자에게 나가므로 DaroAdInfo.mediationPlatform
46
+ // 과 같은 어휘여야 한다. 갈리면 한 앱 안에서 두 이름이 돌아다닌다.
47
+ // iOS 는 DaroMediationState 가 provider.publicName 을 쓰는 것과 같은 자리다.
48
+ putString("mediationPlatform", mediation.publicName)
49
+ putBoolean("isReady", ready == true)
50
+ putBoolean("hasFailed", ready == false)
51
+ }
52
+ )
53
+ }
54
+ return statuses
55
+ }
56
+
57
+ fun adapterInventory(context: Context): WritableMap =
58
+ Arguments.createMap().apply {
59
+ putArray("admob", adMobAdapters())
60
+ putArray("applovin", appLovinAdapters(context))
61
+ }
62
+
63
+ private fun adapterRow(name: String, detail: String, isReady: Boolean): WritableMap =
64
+ Arguments.createMap().apply {
65
+ putString("name", name)
66
+ putString("detail", detail)
67
+ putBoolean("isReady", isReady)
68
+ }
69
+
70
+ private fun adMobAdapters(): WritableArray {
71
+ val initStates = runCatching {
72
+ MobileAds.getInitializationStatus()?.adapterStatusMap.orEmpty()
73
+ }.getOrDefault(emptyMap())
74
+
75
+ val rows = Arguments.createArray()
76
+ ADMOB_ADAPTERS.forEach { (name, className) ->
77
+ val version = adapterVersion(className)
78
+ val state = initStates[className]?.initializationState
79
+ rows.pushMap(
80
+ adapterRow(
81
+ name = name,
82
+ detail = when {
83
+ version == null -> "미탑재"
84
+ state == State.READY -> "$version · READY"
85
+ state == State.NOT_READY -> "$version · NOT_READY"
86
+ else -> "$version · 미초기화"
87
+ },
88
+ isReady = version != null,
89
+ )
90
+ )
91
+ }
92
+ return rows
93
+ }
94
+
95
+ // 탑재된 어댑터의 버전은 바이너리가 정하므로 안 바뀐다 — 호출마다 12종을
96
+ // Class.forName + newInstance 하면 직렬화된 NativeModules 스레드를 잡아먹는다.
97
+ //
98
+ // **성공과 '진짜 미탑재'만 캐시한다.** 실패를 전부 캐시하면 다른 이유로 한 번 실패한
99
+ // 프로브가(벤더 SDK 로드 전 생성자 예외·클래스로더 문제) 프로세스 수명 동안 가짜
100
+ // '미탑재'로 굳는다 — 이 프로브가 배제하려던 오신호다. 반대로 아무것도 캐시하지
101
+ // 않으면 없는 어댑터마다 매 호출 ClassNotFoundException 을 던져(직렬 브리지 스레드다)
102
+ // 펼칠 때마다 12번 반복한다. 클래스 부재는 바이너리가 정하므로 그것만 캐시한다.
103
+ private val adapterVersionCache = ConcurrentHashMap<String, String>()
104
+ private val absentAdapters = ConcurrentHashMap.newKeySet<String>()
105
+
106
+ private fun adapterVersion(className: String): String? {
107
+ adapterVersionCache[className]?.let { return it }
108
+ if (className in absentAdapters) {
109
+ return null
110
+ }
111
+
112
+ return try {
113
+ val adapter = Class.forName(className).getDeclaredConstructor().newInstance() as Adapter
114
+ adapter.versionInfo.format().also { adapterVersionCache[className] = it }
115
+ } catch (ignored: ClassNotFoundException) {
116
+ // 바이너리에 없다 — 이 프로세스에서 생길 리 없으니 기억한다.
117
+ absentAdapters.add(className)
118
+ null
119
+ } catch (ignored: Throwable) {
120
+ // 그 밖의 실패는 일시적일 수 있다 — 다음 조회에서 다시 시도한다.
121
+ null
122
+ }
123
+ }
124
+
125
+ // GMA 는 4자리 어댑터 버전을 3필드에 담는다 — micro 가 "patch*100 + build" 다.
126
+ private fun VersionInfo.format() =
127
+ "$majorVersion.$minorVersion.${microVersion / 100}.${microVersion % 100}"
128
+
129
+ // MAX 는 어댑터별 초기화 상태를 내주지 않는다 — 실린 어댑터와 버전만 안다.
130
+ private fun appLovinAdapters(context: Context): WritableArray {
131
+ val rows = Arguments.createArray()
132
+ runCatching {
133
+ AppLovinSdk.getInstance(context).availableMediatedNetworks
134
+ .sortedBy { it.name }
135
+ .forEach {
136
+ rows.pushMap(
137
+ adapterRow(
138
+ name = it.name,
139
+ detail = it.adapterVersion.ifBlank { "미탑재" },
140
+ isReady = it.adapterVersion.isNotBlank(),
141
+ )
142
+ )
143
+ }
144
+ }
145
+ return rows
146
+ }
147
+ }
@@ -1,24 +1,37 @@
1
1
  package com.daro.reactnative.util
2
2
 
3
3
  import android.view.View
4
- import com.daro.reactnative.event.DaroMEvent
4
+ import com.daro.reactnative.event.AdViewEvent
5
+ import com.daro.reactnative.event.DaroRNEvent
5
6
  import com.facebook.react.bridge.ReactContext
6
7
  import com.facebook.react.bridge.WritableMap
7
8
  import com.facebook.react.modules.core.DeviceEventManagerModule
8
- import com.facebook.react.uimanager.events.RCTEventEmitter
9
+ import com.facebook.react.uimanager.UIManagerHelper
10
+ import com.facebook.react.uimanager.events.Event
9
11
 
10
12
  internal object EventEmitterUtil {
11
13
  // React Native Bridge
12
- fun sendReactNativeEvent(reactContext: ReactContext, event: DaroMEvent, params: WritableMap?) {
14
+ fun sendReactNativeEvent(reactContext: ReactContext, event: DaroRNEvent, params: WritableMap?) {
13
15
  reactContext
14
16
  .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
15
17
  .emit(event.value, params)
16
18
  }
17
19
 
18
- fun View.sendNativeViewEvent(reactContext: ReactContext, event: DaroMEvent, params: WritableMap?) {
19
- reactContext
20
- .getJSModule(RCTEventEmitter::class.java)
21
- .receiveEvent(id, event.value, params)
20
+ fun View.sendNativeViewEvent(reactContext: ReactContext, event: AdViewEvent, params: WritableMap?) {
21
+ val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) ?: return
22
+ eventDispatcher.dispatchEvent(
23
+ AdViewDispatchedEvent(UIManagerHelper.getSurfaceId(reactContext), id, event, params)
24
+ )
22
25
  }
23
26
  }
24
27
 
28
+ private class AdViewDispatchedEvent(
29
+ surfaceId: Int,
30
+ viewId: Int,
31
+ private val event: AdViewEvent,
32
+ private val payload: WritableMap?,
33
+ ) : Event<AdViewDispatchedEvent>(surfaceId, viewId) {
34
+ override fun getEventName() = event.value
35
+
36
+ override fun getEventData() = payload
37
+ }
@@ -0,0 +1,123 @@
1
+ package com.daro.reactnative.view
2
+
3
+ import android.content.Context
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import android.view.ViewTreeObserver
7
+ import android.widget.FrameLayout
8
+
9
+ class DaroMediaView(context: Context) : FrameLayout(context) {
10
+
11
+ private var relayoutPending = false
12
+ private var scanZeroCount = 0
13
+ private var scanViewCount = 0
14
+ private var lastZeroSignature = 0L
15
+ private var zeroSizeRelayoutAttempts = 0
16
+
17
+ private companion object {
18
+ private const val MAX_ZERO_SIZE_RELAYOUT_ATTEMPTS = 3
19
+ }
20
+
21
+ private val relayoutRunnable = Runnable {
22
+ relayoutPending = false
23
+ relayoutChildren()
24
+ }
25
+
26
+ private val preDrawListener = ViewTreeObserver.OnPreDrawListener {
27
+ if (width > 0 && height > 0 && childCount > 0) {
28
+ scanZeroCount = 0
29
+ scanViewCount = 0
30
+ scanSubtree(this)
31
+
32
+ if (scanZeroCount == 0) {
33
+ lastZeroSignature = 0L
34
+ zeroSizeRelayoutAttempts = 0
35
+ } else {
36
+ val signature = (scanZeroCount.toLong() shl 32) or scanViewCount.toLong()
37
+ if (signature != lastZeroSignature) {
38
+ lastZeroSignature = signature
39
+ zeroSizeRelayoutAttempts = 0
40
+ }
41
+
42
+ if (zeroSizeRelayoutAttempts < MAX_ZERO_SIZE_RELAYOUT_ATTEMPTS) {
43
+ zeroSizeRelayoutAttempts++
44
+ relayoutChildren()
45
+ }
46
+ }
47
+ }
48
+ true
49
+ }
50
+
51
+ override fun requestLayout() {
52
+ super.requestLayout()
53
+ scheduleRelayout()
54
+ }
55
+
56
+ override fun onViewAdded(child: View?) {
57
+ super.onViewAdded(child)
58
+ relayoutChildren()
59
+ scheduleRelayout()
60
+ }
61
+
62
+ override fun onAttachedToWindow() {
63
+ super.onAttachedToWindow()
64
+ relayoutChildren()
65
+ relayoutPending = false
66
+ removeCallbacks(relayoutRunnable)
67
+ scheduleRelayout()
68
+ viewTreeObserver.addOnPreDrawListener(preDrawListener)
69
+ }
70
+
71
+ override fun onDetachedFromWindow() {
72
+ viewTreeObserver.removeOnPreDrawListener(preDrawListener)
73
+ removeCallbacks(relayoutRunnable)
74
+ relayoutPending = false
75
+ super.onDetachedFromWindow()
76
+ }
77
+
78
+ private fun scheduleRelayout() {
79
+ lastZeroSignature = 0L
80
+ zeroSizeRelayoutAttempts = 0
81
+
82
+ if (relayoutPending) return
83
+
84
+ relayoutPending = true
85
+ post(relayoutRunnable)
86
+ }
87
+
88
+ private fun relayoutChildren() {
89
+ val width = width
90
+ val height = height
91
+
92
+ if (width <= 0 || height <= 0) return
93
+
94
+ for (i in 0 until childCount) {
95
+ val child = getChildAt(i)
96
+ if (child.visibility == GONE) continue
97
+
98
+ forceLayoutRecursive(child)
99
+ child.measure(
100
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
101
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
102
+ )
103
+ child.layout(0, 0, width, height)
104
+ }
105
+ }
106
+
107
+ private fun forceLayoutRecursive(view: View) {
108
+ view.forceLayout()
109
+ if (view is ViewGroup) {
110
+ for (i in 0 until view.childCount) forceLayoutRecursive(view.getChildAt(i))
111
+ }
112
+ }
113
+
114
+ private fun scanSubtree(parent: ViewGroup) {
115
+ for (i in 0 until parent.childCount) {
116
+ val child = parent.getChildAt(i)
117
+ scanViewCount++
118
+ if (child.visibility != View.VISIBLE) continue
119
+ if (child.width <= 0 || child.height <= 0) scanZeroCount++
120
+ if (child is ViewGroup) scanSubtree(child)
121
+ }
122
+ }
123
+ }
@@ -22,7 +22,7 @@ import droom.daro.view.DaroAdViewListener
22
22
  import droom.daro.view.DaroBannerAdView
23
23
 
24
24
  @SuppressLint("ViewConstructor")
25
- class DaroMAdBannerViewContainer(val context: ReactContext) : ReactViewGroup(context),
25
+ class DaroRNAdBannerViewContainer(val context: ReactContext) : ReactViewGroup(context),
26
26
  DaroAdViewListener {
27
27
  private companion object {
28
28
  private const val MAX_PENDING_LOAD_RETRIES = 10
@@ -59,7 +59,7 @@ class DaroMAdBannerViewContainer(val context: ReactContext) : ReactViewGroup(con
59
59
  ViewGroup.LayoutParams.MATCH_PARENT,
60
60
  ViewGroup.LayoutParams.MATCH_PARENT,
61
61
  )
62
- this@DaroMAdBannerViewContainer.addView(this)
62
+ this@DaroRNAdBannerViewContainer.addView(this)
63
63
  }
64
64
 
65
65
  layoutAdView()
@@ -92,7 +92,6 @@ class DaroMAdBannerViewContainer(val context: ReactContext) : ReactViewGroup(con
92
92
  context,
93
93
  DaroBannerAdUnit(
94
94
  key = adUnitId,
95
- placement = adUnitId,
96
95
  bannerSize = adSize!!,
97
96
  )
98
97
  ).also { view ->