react-native-applovin-max 6.5.0 → 7.0.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 (238) hide show
  1. package/android/build.gradle +46 -100
  2. package/android/gradle.properties +4 -4
  3. package/android/src/main/AndroidManifest.xml +2 -2
  4. package/android/src/main/AndroidManifestNew.xml +2 -0
  5. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdView.java +123 -163
  6. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdViewManager.java +24 -17
  7. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXAdViewUiComponent.java +242 -0
  8. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXModule.java +297 -336
  9. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXNativeAdView.java +13 -12
  10. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXNativeAdViewManager.java +11 -14
  11. package/android/src/main/java/com/applovin/reactnative/AppLovinMAXPackage.java +3 -3
  12. package/ios/AppLovinMAX.h +1 -1
  13. package/ios/AppLovinMAX.m +62 -12
  14. package/ios/AppLovinMAXAdView.h +12 -0
  15. package/ios/AppLovinMAXAdView.m +120 -142
  16. package/ios/AppLovinMAXAdViewUIComponent.h +27 -0
  17. package/ios/AppLovinMAXAdViewUIComponent.m +199 -0
  18. package/lib/commonjs/AdView.js +348 -0
  19. package/lib/commonjs/AdView.js.map +1 -0
  20. package/lib/commonjs/AppLovinMAX.js +52 -0
  21. package/lib/commonjs/AppLovinMAX.js.map +1 -0
  22. package/lib/commonjs/AppOpenAd.js +102 -0
  23. package/lib/commonjs/AppOpenAd.js.map +1 -0
  24. package/lib/commonjs/BannerAd.js +139 -0
  25. package/lib/commonjs/BannerAd.js.map +1 -0
  26. package/lib/commonjs/EventEmitter.js +32 -0
  27. package/lib/commonjs/EventEmitter.js.map +1 -0
  28. package/lib/commonjs/InterstitialAd.js +102 -0
  29. package/lib/commonjs/InterstitialAd.js.map +1 -0
  30. package/lib/commonjs/MRecAd.js +117 -0
  31. package/lib/commonjs/MRecAd.js.map +1 -0
  32. package/lib/commonjs/Privacy.js +12 -0
  33. package/lib/commonjs/Privacy.js.map +1 -0
  34. package/lib/commonjs/RewardedAd.js +116 -0
  35. package/lib/commonjs/RewardedAd.js.map +1 -0
  36. package/lib/commonjs/TargetingData.js +179 -0
  37. package/lib/commonjs/TargetingData.js.map +1 -0
  38. package/lib/commonjs/index.js +256 -0
  39. package/lib/commonjs/index.js.map +1 -0
  40. package/lib/commonjs/nativeAd/NativeAdView.js +147 -0
  41. package/lib/commonjs/nativeAd/NativeAdView.js.map +1 -0
  42. package/lib/commonjs/nativeAd/NativeAdViewComponents.js +197 -0
  43. package/lib/commonjs/nativeAd/NativeAdViewComponents.js.map +1 -0
  44. package/lib/commonjs/nativeAd/NativeAdViewProvider.js +37 -0
  45. package/lib/commonjs/nativeAd/NativeAdViewProvider.js.map +1 -0
  46. package/lib/commonjs/types/AdEvent.js +6 -0
  47. package/lib/commonjs/types/AdEvent.js.map +1 -0
  48. package/lib/commonjs/types/AdInfo.js +48 -0
  49. package/lib/commonjs/types/AdInfo.js.map +1 -0
  50. package/lib/commonjs/types/AdProps.js +6 -0
  51. package/lib/commonjs/types/AdProps.js.map +1 -0
  52. package/lib/commonjs/types/AdViewProps.js +6 -0
  53. package/lib/commonjs/types/AdViewProps.js.map +1 -0
  54. package/lib/commonjs/types/AppLovinMAX.js +6 -0
  55. package/lib/commonjs/types/AppLovinMAX.js.map +1 -0
  56. package/lib/commonjs/types/AppOpenAd.js +6 -0
  57. package/lib/commonjs/types/AppOpenAd.js.map +1 -0
  58. package/lib/commonjs/types/BannerAd.js +6 -0
  59. package/lib/commonjs/types/BannerAd.js.map +1 -0
  60. package/lib/commonjs/types/CMPError.js +6 -0
  61. package/lib/commonjs/types/CMPError.js.map +1 -0
  62. package/lib/commonjs/types/Configuration.js +6 -0
  63. package/lib/commonjs/types/Configuration.js.map +1 -0
  64. package/lib/commonjs/types/FullscreenAd.js +6 -0
  65. package/lib/commonjs/types/FullscreenAd.js.map +1 -0
  66. package/lib/commonjs/types/InterstitialAd.js +6 -0
  67. package/lib/commonjs/types/InterstitialAd.js.map +1 -0
  68. package/lib/commonjs/types/MRecAd.js +6 -0
  69. package/lib/commonjs/types/MRecAd.js.map +1 -0
  70. package/lib/commonjs/types/NativeAd.js +2 -0
  71. package/lib/commonjs/types/NativeAd.js.map +1 -0
  72. package/lib/commonjs/types/NativeAdViewProps.js +6 -0
  73. package/lib/commonjs/types/NativeAdViewProps.js.map +1 -0
  74. package/lib/commonjs/types/Privacy.js +2 -0
  75. package/lib/commonjs/types/Privacy.js.map +1 -0
  76. package/lib/commonjs/types/RewardedAd.js +6 -0
  77. package/lib/commonjs/types/RewardedAd.js.map +1 -0
  78. package/lib/commonjs/types/TargetingData.js +6 -0
  79. package/lib/commonjs/types/TargetingData.js.map +1 -0
  80. package/lib/commonjs/types/ViewAd.js +6 -0
  81. package/lib/commonjs/types/ViewAd.js.map +1 -0
  82. package/lib/commonjs/types/index.js +61 -0
  83. package/lib/commonjs/types/index.js.map +1 -0
  84. package/lib/module/AdView.js +335 -0
  85. package/lib/module/AdView.js.map +1 -0
  86. package/lib/module/AppLovinMAX.js +48 -0
  87. package/lib/module/AppLovinMAX.js.map +1 -0
  88. package/lib/module/AppOpenAd.js +96 -0
  89. package/lib/module/AppOpenAd.js.map +1 -0
  90. package/lib/module/BannerAd.js +133 -0
  91. package/lib/module/BannerAd.js.map +1 -0
  92. package/lib/module/EventEmitter.js +24 -0
  93. package/lib/module/EventEmitter.js.map +1 -0
  94. package/lib/module/InterstitialAd.js +96 -0
  95. package/lib/module/InterstitialAd.js.map +1 -0
  96. package/lib/module/MRecAd.js +111 -0
  97. package/lib/module/MRecAd.js.map +1 -0
  98. package/lib/module/Privacy.js +6 -0
  99. package/lib/module/Privacy.js.map +1 -0
  100. package/lib/module/RewardedAd.js +110 -0
  101. package/lib/module/RewardedAd.js.map +1 -0
  102. package/lib/module/TargetingData.js +175 -0
  103. package/lib/module/TargetingData.js.map +1 -0
  104. package/lib/module/index.js +14 -0
  105. package/lib/module/index.js.map +1 -0
  106. package/lib/module/nativeAd/NativeAdView.js +139 -0
  107. package/lib/module/nativeAd/NativeAdView.js.map +1 -0
  108. package/lib/module/nativeAd/NativeAdViewComponents.js +181 -0
  109. package/lib/module/nativeAd/NativeAdViewComponents.js.map +1 -0
  110. package/lib/module/nativeAd/NativeAdViewProvider.js +28 -0
  111. package/lib/module/nativeAd/NativeAdViewProvider.js.map +1 -0
  112. package/lib/module/types/AdEvent.js +2 -0
  113. package/lib/module/types/AdEvent.js.map +1 -0
  114. package/lib/module/types/AdInfo.js +52 -0
  115. package/lib/module/types/AdInfo.js.map +1 -0
  116. package/lib/module/types/AdProps.js +2 -0
  117. package/lib/module/types/AdProps.js.map +1 -0
  118. package/lib/module/types/AdViewProps.js +2 -0
  119. package/lib/module/types/AdViewProps.js.map +1 -0
  120. package/lib/module/types/AppLovinMAX.js +2 -0
  121. package/lib/module/types/AppLovinMAX.js.map +1 -0
  122. package/lib/module/types/AppOpenAd.js +2 -0
  123. package/lib/module/types/AppOpenAd.js.map +1 -0
  124. package/lib/module/types/BannerAd.js +2 -0
  125. package/lib/module/types/BannerAd.js.map +1 -0
  126. package/lib/module/types/CMPError.js +2 -0
  127. package/lib/module/types/CMPError.js.map +1 -0
  128. package/lib/module/types/Configuration.js +2 -0
  129. package/lib/module/types/Configuration.js.map +1 -0
  130. package/lib/module/types/FullscreenAd.js +2 -0
  131. package/lib/module/types/FullscreenAd.js.map +1 -0
  132. package/lib/module/types/InterstitialAd.js +2 -0
  133. package/lib/module/types/InterstitialAd.js.map +1 -0
  134. package/lib/module/types/MRecAd.js +2 -0
  135. package/lib/module/types/MRecAd.js.map +1 -0
  136. package/lib/module/types/NativeAd.js +2 -0
  137. package/lib/module/types/NativeAd.js.map +1 -0
  138. package/lib/module/types/NativeAdViewProps.js +2 -0
  139. package/lib/module/types/NativeAdViewProps.js.map +1 -0
  140. package/lib/module/types/Privacy.js +2 -0
  141. package/lib/module/types/Privacy.js.map +1 -0
  142. package/lib/module/types/RewardedAd.js +2 -0
  143. package/lib/module/types/RewardedAd.js.map +1 -0
  144. package/lib/module/types/TargetingData.js +2 -0
  145. package/lib/module/types/TargetingData.js.map +1 -0
  146. package/lib/module/types/ViewAd.js +2 -0
  147. package/lib/module/types/ViewAd.js.map +1 -0
  148. package/lib/module/types/index.js +6 -0
  149. package/lib/module/types/index.js.map +1 -0
  150. package/lib/typescript/src/AdView.d.ts +115 -0
  151. package/lib/typescript/src/AdView.d.ts.map +1 -0
  152. package/lib/typescript/src/AppLovinMAX.d.ts +73 -0
  153. package/lib/typescript/src/AppLovinMAX.d.ts.map +1 -0
  154. package/lib/typescript/src/AppOpenAd.d.ts +4 -0
  155. package/lib/typescript/src/AppOpenAd.d.ts.map +1 -0
  156. package/lib/typescript/src/BannerAd.d.ts +4 -0
  157. package/lib/typescript/src/BannerAd.d.ts.map +1 -0
  158. package/lib/typescript/src/EventEmitter.d.ts +4 -0
  159. package/lib/typescript/src/EventEmitter.d.ts.map +1 -0
  160. package/lib/typescript/src/InterstitialAd.d.ts +4 -0
  161. package/lib/typescript/src/InterstitialAd.d.ts.map +1 -0
  162. package/lib/typescript/src/MRecAd.d.ts +4 -0
  163. package/lib/typescript/src/MRecAd.d.ts.map +1 -0
  164. package/lib/typescript/src/Privacy.d.ts +3 -0
  165. package/lib/typescript/src/Privacy.d.ts.map +1 -0
  166. package/lib/typescript/src/RewardedAd.d.ts +4 -0
  167. package/lib/typescript/src/RewardedAd.d.ts.map +1 -0
  168. package/lib/typescript/src/TargetingData.d.ts +26 -0
  169. package/lib/typescript/src/TargetingData.d.ts.map +1 -0
  170. package/lib/typescript/src/index.d.ts +14 -0
  171. package/lib/typescript/src/index.d.ts.map +1 -0
  172. package/lib/typescript/src/nativeAd/NativeAdView.d.ts +42 -0
  173. package/lib/typescript/src/nativeAd/NativeAdView.d.ts.map +1 -0
  174. package/lib/typescript/src/nativeAd/NativeAdViewComponents.d.ts +11 -0
  175. package/lib/typescript/src/nativeAd/NativeAdViewComponents.d.ts.map +1 -0
  176. package/lib/typescript/src/nativeAd/NativeAdViewProvider.d.ts +16 -0
  177. package/lib/typescript/src/nativeAd/NativeAdViewProvider.d.ts.map +1 -0
  178. package/lib/typescript/src/types/AdEvent.d.ts +15 -0
  179. package/lib/typescript/src/types/AdEvent.d.ts.map +1 -0
  180. package/lib/typescript/src/types/AdInfo.d.ts +295 -0
  181. package/lib/typescript/src/types/AdInfo.d.ts.map +1 -0
  182. package/lib/typescript/src/types/AdProps.d.ts +58 -0
  183. package/lib/typescript/src/types/AdProps.d.ts.map +1 -0
  184. package/lib/typescript/src/types/AdViewProps.d.ts +73 -0
  185. package/lib/typescript/src/types/AdViewProps.d.ts.map +1 -0
  186. package/lib/typescript/src/types/AppLovinMAX.d.ts +133 -0
  187. package/lib/typescript/src/types/AppLovinMAX.d.ts.map +1 -0
  188. package/lib/typescript/src/types/AppOpenAd.d.ts +3 -0
  189. package/lib/typescript/src/types/AppOpenAd.d.ts.map +1 -0
  190. package/lib/typescript/src/types/BannerAd.d.ts +42 -0
  191. package/lib/typescript/src/types/BannerAd.d.ts.map +1 -0
  192. package/lib/typescript/src/types/CMPError.d.ts +20 -0
  193. package/lib/typescript/src/types/CMPError.d.ts.map +1 -0
  194. package/lib/typescript/src/types/Configuration.d.ts +33 -0
  195. package/lib/typescript/src/types/Configuration.d.ts.map +1 -0
  196. package/lib/typescript/src/types/FullscreenAd.d.ts +123 -0
  197. package/lib/typescript/src/types/FullscreenAd.d.ts.map +1 -0
  198. package/lib/typescript/src/types/InterstitialAd.d.ts +3 -0
  199. package/lib/typescript/src/types/InterstitialAd.d.ts.map +1 -0
  200. package/lib/typescript/src/types/MRecAd.d.ts +12 -0
  201. package/lib/typescript/src/types/MRecAd.d.ts.map +1 -0
  202. package/lib/typescript/src/types/NativeAd.d.ts +42 -0
  203. package/lib/typescript/src/types/NativeAd.d.ts.map +1 -0
  204. package/lib/typescript/src/types/NativeAdViewProps.d.ts +15 -0
  205. package/lib/typescript/src/types/NativeAdViewProps.d.ts.map +1 -0
  206. package/lib/typescript/src/types/Privacy.d.ts +35 -0
  207. package/lib/typescript/src/types/Privacy.d.ts.map +1 -0
  208. package/lib/typescript/src/types/RewardedAd.d.ts +18 -0
  209. package/lib/typescript/src/types/RewardedAd.d.ts.map +1 -0
  210. package/lib/typescript/src/types/TargetingData.d.ts +43 -0
  211. package/lib/typescript/src/types/TargetingData.d.ts.map +1 -0
  212. package/lib/typescript/src/types/ViewAd.d.ts +141 -0
  213. package/lib/typescript/src/types/ViewAd.d.ts.map +1 -0
  214. package/lib/typescript/src/types/index.d.ts +6 -0
  215. package/lib/typescript/src/types/index.d.ts.map +1 -0
  216. package/package.json +102 -21
  217. package/react-native-applovin-max.podspec +29 -5
  218. package/src/AdView.tsx +83 -26
  219. package/src/AppLovinMAX.ts +1 -1
  220. package/src/InterstitialAd.ts +1 -3
  221. package/src/MRecAd.ts +2 -8
  222. package/src/TargetingData.ts +2 -15
  223. package/src/index.ts +9 -10
  224. package/src/nativeAd/NativeAdView.tsx +33 -49
  225. package/src/nativeAd/NativeAdViewComponents.tsx +22 -31
  226. package/src/types/AdViewProps.ts +29 -1
  227. package/android/.project +0 -17
  228. package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
  229. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  230. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  231. package/android/gradlew +0 -172
  232. package/android/gradlew.bat +0 -84
  233. package/ios/AppLovinMAX.xcodeproj/project.pbxproj +0 -368
  234. package/ios/AppLovinMAX.xcodeproj/xcshareddata/xcschemes/AppLovinMAX.xcscheme +0 -67
  235. package/ios/AppLovinMAX.xcworkspace/contents.xcworkspacedata +0 -10
  236. package/ios/AppLovinMAX.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  237. package/ios/Podfile +0 -40
  238. package/ios/Podfile.lock +0 -373
@@ -8,10 +8,11 @@
8
8
  #import <AppLovinSDK/AppLovinSDK.h>
9
9
  #import "AppLovinMAX.h"
10
10
  #import "AppLovinMAXAdView.h"
11
+ #import "AppLovinMAXAdViewUIComponent.h"
11
12
 
12
- @interface AppLovinMAXAdView()<MAAdViewAdDelegate, MAAdRevenueDelegate>
13
+ @interface AppLovinMAXAdView()
13
14
 
14
- @property (nonatomic, strong, nullable) MAAdView *adView; // nil when unmounted
15
+ @property (nonatomic, strong, nullable) AppLovinMAXAdViewUIComponent *uiComponent; // nil when unmounted
15
16
 
16
17
  // The following properties are updated from RN layer via the view manager
17
18
  @property (nonatomic, copy) NSString *adUnitId;
@@ -24,51 +25,90 @@
24
25
  @property (nonatomic, copy, nullable) NSDictionary *extraParameters;
25
26
  @property (nonatomic, copy, nullable) NSDictionary *localExtraParameters;
26
27
 
27
- @property (nonatomic, copy) RCTDirectEventBlock onAdLoadedEvent;
28
- @property (nonatomic, copy) RCTDirectEventBlock onAdLoadFailedEvent;
29
- @property (nonatomic, copy) RCTDirectEventBlock onAdDisplayFailedEvent;
30
- @property (nonatomic, copy) RCTDirectEventBlock onAdClickedEvent;
31
- @property (nonatomic, copy) RCTDirectEventBlock onAdExpandedEvent;
32
- @property (nonatomic, copy) RCTDirectEventBlock onAdCollapsedEvent;
33
- @property (nonatomic, copy) RCTDirectEventBlock onAdRevenuePaidEvent;
34
-
35
28
  @end
36
29
 
37
30
  @implementation AppLovinMAXAdView
38
31
 
39
- static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
32
+ static NSMutableDictionary<NSString *, AppLovinMAXAdViewUIComponent *> *uiComponentInstances;
33
+ static NSMutableDictionary<NSString *, AppLovinMAXAdViewUIComponent *> *preloadedUIComponentInstances;
40
34
 
41
35
  + (void)initialize
42
36
  {
43
37
  [super initialize];
44
- adViewInstances = [NSMutableDictionary dictionaryWithCapacity: 2];
38
+ uiComponentInstances = [NSMutableDictionary dictionaryWithCapacity: 2];
39
+ preloadedUIComponentInstances = [NSMutableDictionary dictionaryWithCapacity: 2];
45
40
  }
46
41
 
47
42
  + (MAAdView *)sharedWithAdUnitIdentifier:(NSString *)adUnitIdentifier
48
43
  {
49
- return adViewInstances[adUnitIdentifier];
44
+ AppLovinMAXAdViewUIComponent *uiComponent = preloadedUIComponentInstances[adUnitIdentifier];
45
+ if ( !uiComponent ) uiComponent = uiComponentInstances[adUnitIdentifier];
46
+ return uiComponent ? uiComponent.adView : nil;
47
+ }
48
+
49
+ + (void)preloadNativeUIComponentAdView:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat placement:(NSString *)placement customData:(NSString *)customData extraParameters:(NSDictionary<NSString *, NSString *> *)extraParameters localExtraParameters:(NSDictionary<NSString *, NSString *> *)localExtraParameters withPromiseResolver:(RCTPromiseResolveBlock)resolve withPromiseRejecter:(RCTPromiseRejectBlock)reject
50
+ {
51
+ AppLovinMAXAdViewUIComponent *preloadedUIComponent = preloadedUIComponentInstances[ adUnitIdentifier];
52
+ if ( preloadedUIComponent )
53
+ {
54
+ reject(RCTErrorUnspecified, @"Cannot preload more than one for a single Ad Unit ID.", nil);
55
+ return;
56
+ }
57
+
58
+ preloadedUIComponent = [[AppLovinMAXAdViewUIComponent alloc] initWithAdUnitIdentifier: adUnitIdentifier adFormat: adFormat];
59
+ preloadedUIComponentInstances[adUnitIdentifier] = preloadedUIComponent;
60
+
61
+ preloadedUIComponent.placement = placement;
62
+ preloadedUIComponent.customData = customData;
63
+ preloadedUIComponent.extraParameters = extraParameters;
64
+ preloadedUIComponent.localExtraParameters = localExtraParameters;
65
+
66
+ [preloadedUIComponent loadAd];
67
+
68
+ resolve(nil);
69
+ }
70
+
71
+ + (void)destroyNativeUIComponentAdView:(NSString *)adUnitIdentifier withPromiseResolver:(RCTPromiseResolveBlock)resolve withPromiseRejecter:(RCTPromiseRejectBlock)reject
72
+ {
73
+ AppLovinMAXAdViewUIComponent *preloadedUIComponent = preloadedUIComponentInstances[adUnitIdentifier];
74
+ if ( !preloadedUIComponent )
75
+ {
76
+ reject(RCTErrorUnspecified, @"No native UI component found to destroy", nil);
77
+ return;
78
+ }
79
+
80
+ if ( [preloadedUIComponent hasContainerView] )
81
+ {
82
+ reject(RCTErrorUnspecified, @"Cannot destroy - currently in use", nil);
83
+ return;
84
+ }
85
+
86
+ [preloadedUIComponentInstances removeObjectForKey: adUnitIdentifier];
87
+
88
+ [preloadedUIComponent detachAdView];
89
+ [preloadedUIComponent destroy];
90
+
91
+ resolve(nil);
50
92
  }
51
93
 
52
94
  - (void)setAdUnitId:(NSString *)adUnitId
53
95
  {
54
96
  // Ad Unit ID must be set prior to creating MAAdView
55
- if ( self.adView )
97
+ if ( self.uiComponent )
56
98
  {
57
- [[AppLovinMAX shared] log: @"Attempting to set Ad Unit ID %@ after MAAdView is created", adUnitId];
99
+ [[AppLovinMAX shared] log: @"Attempting to set Ad Unit ID %@ after the native UI component is created", adUnitId];
58
100
  return;
59
101
  }
60
102
 
61
103
  _adUnitId = adUnitId;
62
-
63
- [self attachAdViewIfNeeded];
64
- }
104
+ }
65
105
 
66
106
  - (void)setAdFormat:(NSString *)adFormat
67
107
  {
68
108
  // Ad format must be set prior to creating MAAdView
69
- if ( self.adView )
109
+ if ( self.uiComponent )
70
110
  {
71
- [[AppLovinMAX shared] log: @"Attempting to set ad format %@ after MAAdView is created", adFormat];
111
+ [[AppLovinMAX shared] log: @"Attempting to set ad format %@ after the native UI component is created", adFormat];
72
112
  return;
73
113
  }
74
114
 
@@ -83,19 +123,16 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
83
123
  else
84
124
  {
85
125
  [[AppLovinMAX shared] log: @"Attempting to set an invalid ad format of \"%@\" for %@", adFormat, self.adUnitId];
86
- return;
87
126
  }
88
-
89
- [self attachAdViewIfNeeded];
90
- }
127
+ }
91
128
 
92
129
  - (void)setPlacement:(NSString *)placement
93
130
  {
94
131
  _placement = placement;
95
132
 
96
- if ( self.adView )
133
+ if ( self.uiComponent )
97
134
  {
98
- self.adView.placement = placement;
135
+ self.uiComponent.placement = placement;
99
136
  }
100
137
  }
101
138
 
@@ -103,9 +140,9 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
103
140
  {
104
141
  _customData = customData;
105
142
 
106
- if ( self.adView )
143
+ if ( self.uiComponent )
107
144
  {
108
- self.adView.customData = customData;
145
+ self.uiComponent.customData = customData;
109
146
  }
110
147
  }
111
148
 
@@ -113,9 +150,9 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
113
150
  {
114
151
  _adaptiveBannerEnabled = adaptiveBannerEnabled;
115
152
 
116
- if ( self.adView )
153
+ if ( self.uiComponent )
117
154
  {
118
- [self.adView setExtraParameterForKey: @"adaptive_banner" value: adaptiveBannerEnabled ? @"true" : @"false"];
155
+ self.uiComponent.adaptiveBannerEnabled = adaptiveBannerEnabled;
119
156
  }
120
157
  }
121
158
 
@@ -123,16 +160,9 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
123
160
  {
124
161
  _autoRefresh = autoRefresh;
125
162
 
126
- if ( self.adView )
163
+ if ( self.uiComponent )
127
164
  {
128
- if ( autoRefresh )
129
- {
130
- [self.adView startAutoRefresh];
131
- }
132
- else
133
- {
134
- [self.adView stopAutoRefresh];
135
- }
165
+ self.uiComponent.autoRefresh = autoRefresh;
136
166
  }
137
167
  }
138
168
 
@@ -141,98 +171,87 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
141
171
  _loadOnMount = loadOnMount;
142
172
  }
143
173
 
174
+ // Invoked after all the JavaScript properties are set when mounting AdView
175
+ - (void)didSetProps:(NSArray<NSString *> *)changedProps
176
+ {
177
+ [self attachAdViewIfNeeded];
178
+ }
179
+
144
180
  - (void)attachAdViewIfNeeded
145
181
  {
146
182
  // Re-assign in case of race condition
147
183
  NSString *adUnitId = self.adUnitId;
148
184
  MAAdFormat *adFormat = self.adFormat;
149
185
 
150
- // Run after 0.25 sec delay to allow all properties to set
151
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
186
+ dispatch_async(dispatch_get_main_queue(), ^{
152
187
 
153
188
  if ( ![AppLovinMAX shared].sdk )
154
189
  {
155
190
  [[AppLovinMAX shared] logUninitializedAccessError: @"AppLovinMAXAdview.attachAdViewIfNeeded"];
156
191
  return;
157
192
  }
158
-
193
+
159
194
  if ( ![adUnitId al_isValidString] )
160
195
  {
161
- [[AppLovinMAX shared] log: @"Attempting to attach MAAdView without Ad Unit ID"];
196
+ [[AppLovinMAX shared] log: @"Attempting to attach a native UI component without Ad Unit ID"];
162
197
  return;
163
198
  }
164
199
 
165
200
  if ( !adFormat )
166
201
  {
167
- [[AppLovinMAX shared] log: @"Attempting to attach MAAdView without ad format"];
202
+ [[AppLovinMAX shared] log: @"Attempting to attach a native UI component without ad format"];
168
203
  return;
169
204
  }
170
205
 
171
- if ( self.adView )
206
+ if ( self.uiComponent )
172
207
  {
173
- [[AppLovinMAX shared] log: @"Attempting to re-attach with existing MAAdView: %@", self.adView];
208
+ [[AppLovinMAX shared] log: @"Attempting to re-attach with existing native UI component: %@", self.uiComponent.adView];
174
209
  return;
175
210
  }
176
211
 
177
- [[AppLovinMAX shared] log: @"Attaching MAAdView for %@", adUnitId];
212
+ [[AppLovinMAX shared] log: @"Attaching a native UI component for %@", adUnitId];
178
213
 
179
- self.adView = [[MAAdView alloc] initWithAdUnitIdentifier: adUnitId
180
- adFormat: adFormat
181
- sdk: [AppLovinMAX shared].sdk];
182
- self.adView.frame = (CGRect) { CGPointZero, self.frame.size };
183
- self.adView.delegate = self;
184
- self.adView.revenueDelegate = self;
185
- self.adView.placement = self.placement;
186
- self.adView.customData = self.customData;
187
- [self.adView setExtraParameterForKey: @"adaptive_banner" value: [self isAdaptiveBannerEnabled] ? @"true" : @"false"];
188
- // Set this extra parameter to work around a SDK bug that ignores calls to stopAutoRefresh()
189
- [self.adView setExtraParameterForKey: @"allow_pause_auto_refresh_immediately" value: @"true"];
190
-
191
- for ( NSString *key in self.extraParameters )
214
+ self.uiComponent = preloadedUIComponentInstances[adUnitId];
215
+ if ( self.uiComponent )
192
216
  {
193
- [self.adView setExtraParameterForKey: key value: self.extraParameters[key]];
217
+ // Attach the preloaded uiComponent if possible, otherwise create a new one for the
218
+ // same adUnitId
219
+ if ( ![self.uiComponent hasContainerView] )
220
+ {
221
+ self.uiComponent.autoRefresh = self.isAutoRefresh;
222
+ [self.uiComponent attachAdView: self];
223
+ return;
224
+ }
194
225
  }
195
226
 
196
- for ( NSString *key in self.localExtraParameters )
197
- {
198
- id value = self.localExtraParameters[key];
199
- [self.adView setLocalExtraParameterForKey: key value: (value != [NSNull null] ? value : nil)];
200
- }
227
+ self.uiComponent = [[AppLovinMAXAdViewUIComponent alloc] initWithAdUnitIdentifier: adUnitId adFormat: adFormat];
228
+ uiComponentInstances[adUnitId] = self.uiComponent;
201
229
 
202
- if ( [self isAutoRefresh] )
203
- {
204
- [self.adView startAutoRefresh];
205
- }
206
- else
207
- {
208
- [self.adView stopAutoRefresh];
209
- }
230
+ self.uiComponent.placement = self.placement;
231
+ self.uiComponent.customData = self.customData;
232
+ self.uiComponent.extraParameters = self.extraParameters;
233
+ self.uiComponent.localExtraParameters = self.localExtraParameters;
234
+ self.uiComponent.adaptiveBannerEnabled = self.isAdaptiveBannerEnabled;
235
+ self.uiComponent.autoRefresh = self.isAutoRefresh;
236
+
237
+ [self.uiComponent attachAdView: self];
210
238
 
211
239
  if ( [self isLoadOnMount] )
212
240
  {
213
- [self.adView loadAd];
241
+ [self.uiComponent loadAd];
214
242
  }
215
-
216
- [self addSubview: self.adView];
217
-
218
- [NSLayoutConstraint activateConstraints: @[[self.adView.widthAnchor constraintEqualToAnchor: self.widthAnchor],
219
- [self.adView.heightAnchor constraintEqualToAnchor: self.heightAnchor],
220
- [self.adView.centerXAnchor constraintEqualToAnchor: self.centerXAnchor],
221
- [self.adView.centerYAnchor constraintEqualToAnchor: self.centerYAnchor]]];
222
-
223
- adViewInstances[adUnitId] = self.adView;
224
243
  });
225
244
  }
226
245
 
227
246
  - (void)loadAd
228
247
  {
229
- if ( !self.adView )
248
+ if ( !self.uiComponent )
230
249
  {
231
- [[AppLovinMAX shared] log: @"Attempting to load uninitialized MAAdView for %@", self.adUnitId];
250
+ [[AppLovinMAX shared] log: @"Attempting to load uninitialized native UI component for %@", self.adUnitId];
232
251
  return;
233
252
  }
234
-
235
- [self.adView loadAd];
253
+
254
+ [self.uiComponent loadAd];
236
255
  }
237
256
 
238
257
  - (void)didMoveToWindow
@@ -242,66 +261,25 @@ static NSMutableDictionary<NSString *, MAAdView *> *adViewInstances;
242
261
  // This view is unmounted
243
262
  if ( !self.window && !self.superview )
244
263
  {
245
- if ( self.adView )
264
+ if ( self.uiComponent )
246
265
  {
247
- [[AppLovinMAX shared] log: @"Unmounting MAAdView: %@", self.adView];
266
+ [[AppLovinMAX shared] log: @"Unmounting the native UI component: %@", self.uiComponent.adView];
248
267
 
249
- [adViewInstances removeObjectForKey: self.adUnitId];
250
-
251
- self.adView.delegate = nil;
252
- self.adView.revenueDelegate = nil;
268
+ [self.uiComponent detachAdView];
253
269
 
254
- [self.adView removeFromSuperview];
270
+ AppLovinMAXAdViewUIComponent *preloadedUIComponent = preloadedUIComponentInstances[self.adUnitId];
255
271
 
256
- self.adView = nil;
272
+ if ( self.uiComponent == preloadedUIComponent )
273
+ {
274
+ self.uiComponent.autoRefresh = NO;
275
+ }
276
+ else
277
+ {
278
+ [uiComponentInstances removeObjectForKey: self.adUnitId];
279
+ [self.uiComponent destroy];
280
+ }
257
281
  }
258
282
  }
259
283
  }
260
284
 
261
- #pragma mark - MAAdDelegate Protocol
262
-
263
- - (void)didLoadAd:(MAAd *)ad
264
- {
265
- self.onAdLoadedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
266
- }
267
-
268
- - (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
269
- {
270
- self.onAdLoadFailedEvent([[AppLovinMAX shared] adLoadFailedInfoForAd: adUnitIdentifier withError: error]);
271
- }
272
-
273
- - (void)didFailToDisplayAd:(MAAd *)ad withError:(MAError *)error
274
- {
275
- self.onAdDisplayFailedEvent([[AppLovinMAX shared] adDisplayFailedInfoForAd: ad withError: error]);
276
- }
277
-
278
- - (void)didClickAd:(MAAd *)ad
279
- {
280
- self.onAdClickedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
281
- }
282
-
283
- #pragma mark - MAAdViewAdDelegate Protocol
284
-
285
- - (void)didExpandAd:(MAAd *)ad
286
- {
287
- self.onAdExpandedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
288
- }
289
-
290
- - (void)didCollapseAd:(MAAd *)ad
291
- {
292
- self.onAdCollapsedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
293
- }
294
-
295
- #pragma mark - MAAdRevenueDelegate Protocol
296
-
297
- - (void)didPayRevenueForAd:(MAAd *)ad
298
- {
299
- self.onAdRevenuePaidEvent([[AppLovinMAX shared] adRevenueInfoForAd: ad]);
300
- }
301
-
302
- #pragma mark - Deprecated Callbacks
303
-
304
- - (void)didDisplayAd:(MAAd *)ad {}
305
- - (void)didHideAd:(MAAd *)ad {}
306
-
307
285
  @end
@@ -0,0 +1,27 @@
1
+ #import <React/RCTUIManager.h>
2
+
3
+ @class MAAdView;
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @interface AppLovinMAXAdViewUIComponent : NSObject
8
+
9
+ @property (nonatomic, strong, readonly) MAAdView *adView;
10
+
11
+ @property (nonatomic, copy, nullable) NSString *placement;
12
+ @property (nonatomic, copy, nullable) NSString *customData;
13
+ @property (nonatomic, copy, nullable) NSDictionary *extraParameters;
14
+ @property (nonatomic, copy, nullable) NSDictionary *localExtraParameters;
15
+ @property (nonatomic, assign) BOOL adaptiveBannerEnabled;
16
+ @property (nonatomic, assign) BOOL autoRefresh;
17
+
18
+ - (instancetype)initWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat;
19
+ - (void)loadAd;
20
+ - (BOOL)hasContainerView;
21
+ - (void)attachAdView:(AppLovinMAXAdView *)view;
22
+ - (void)detachAdView;
23
+ - (void)destroy;
24
+
25
+ @end
26
+
27
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,199 @@
1
+ #import <AppLovinSDK/AppLovinSDK.h>
2
+ #import "AppLovinMAX.h"
3
+ #import "AppLovinMAXAdView.h"
4
+ #import "AppLovinMAXAdViewUIComponent.h"
5
+
6
+ @interface AppLovinMAXAdViewUIComponent()<MAAdViewAdDelegate, MAAdRevenueDelegate>
7
+
8
+ @property (nonatomic, strong) MAAdView *adView;
9
+
10
+ @property (nonatomic, weak, nullable) AppLovinMAXAdView *containerView;
11
+
12
+ @end
13
+
14
+ @implementation AppLovinMAXAdViewUIComponent
15
+
16
+ - (instancetype)initWithAdUnitIdentifier:(NSString *)adUnitIdentifier adFormat:(MAAdFormat *)adFormat
17
+ {
18
+ self = [super init];
19
+ if ( self )
20
+ {
21
+ self.adView = [[MAAdView alloc] initWithAdUnitIdentifier: adUnitIdentifier adFormat: adFormat sdk: [AppLovinMAX shared].sdk];
22
+ self.adView.delegate = self;
23
+ self.adView.revenueDelegate = self;
24
+
25
+ [self.adView setExtraParameterForKey: @"adaptive_banner" value: @"true"];
26
+
27
+ // Set this extra parameter to work around a SDK bug that ignores calls to stopAutoRefresh()
28
+ [self.adView setExtraParameterForKey: @"allow_pause_auto_refresh_immediately" value: @"true"];
29
+
30
+ // Set a frame size to suppress an error of zero area for MAAdView
31
+ self.adView.frame = (CGRect) { CGPointZero, adFormat.size };
32
+ }
33
+ return self;
34
+ }
35
+
36
+ - (void)setPlacement:(NSString *)placement
37
+ {
38
+ self.adView.placement = placement;
39
+ }
40
+
41
+ - (void)setCustomData:(NSString *)customData
42
+ {
43
+ self.adView.customData = customData;
44
+ }
45
+
46
+ - (void)setAdaptiveBannerEnabled:(BOOL)adaptiveBannerEnabled
47
+ {
48
+ [self.adView setExtraParameterForKey: @"adaptive_banner" value: adaptiveBannerEnabled ? @"true" : @"false"];
49
+ }
50
+
51
+ - (void)setAutoRefresh:(BOOL)autoRefresh
52
+ {
53
+ if ( autoRefresh )
54
+ {
55
+ [self.adView startAutoRefresh];
56
+ }
57
+ else
58
+ {
59
+ [self.adView stopAutoRefresh];
60
+ }
61
+ }
62
+
63
+ -(void)setExtraParameters:(NSDictionary<NSString *, id> *)parameterDict
64
+ {
65
+ for (NSString *key in parameterDict)
66
+ {
67
+ NSString *value = (NSString *) parameterDict[key];
68
+ [self.adView setExtraParameterForKey:key value:value];
69
+ }
70
+ }
71
+
72
+ -(void)setLocalExtraParameters:(NSDictionary<NSString *, id> *)parameterDict
73
+ {
74
+ for (NSString *key in parameterDict)
75
+ {
76
+ id value = parameterDict[key];
77
+ [self.adView setLocalExtraParameterForKey:key value:value];
78
+ }
79
+ }
80
+
81
+ - (BOOL)hasContainerView
82
+ {
83
+ return self.containerView != nil;
84
+ }
85
+
86
+ - (void)attachAdView:(AppLovinMAXAdView *)view
87
+ {
88
+ self.containerView = view;
89
+
90
+ self.adView.frame = (CGRect) { CGPointZero, view.frame.size };
91
+
92
+ [view addSubview: self.adView];
93
+
94
+ [NSLayoutConstraint activateConstraints: @[[self.adView.widthAnchor constraintEqualToAnchor: view.widthAnchor],
95
+ [self.adView.heightAnchor constraintEqualToAnchor: view.heightAnchor],
96
+ [self.adView.centerXAnchor constraintEqualToAnchor: view.centerXAnchor],
97
+ [self.adView.centerYAnchor constraintEqualToAnchor: view.centerYAnchor]]];
98
+ }
99
+
100
+ - (void)detachAdView
101
+ {
102
+ self.containerView = nil;
103
+
104
+ [self.adView removeFromSuperview];
105
+ }
106
+
107
+ - (void)loadAd
108
+ {
109
+ [self.adView loadAd];
110
+ }
111
+
112
+ - (void)destroy
113
+ {
114
+ [self detachAdView];
115
+
116
+ self.adView.delegate = nil;
117
+ self.adView.revenueDelegate = nil;
118
+ }
119
+
120
+ #pragma mark - MAAdDelegate Protocol
121
+
122
+ - (void)didLoadAd:(MAAd *)ad
123
+ {
124
+ NSDictionary *adInfo = [[AppLovinMAX shared] adInfoForAd: ad];
125
+
126
+ [[AppLovinMAX shared] sendEventWithName:@"OnNativeUIComponentAdviewAdLoadedEvent" body: adInfo];
127
+
128
+ if ( self.containerView )
129
+ {
130
+ self.containerView.onAdLoadedEvent(adInfo);
131
+ }
132
+ else
133
+ {
134
+ [self setAutoRefresh: NO];
135
+ }
136
+ }
137
+
138
+ - (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
139
+ {
140
+ NSDictionary *adLoadFailedInfo = [[AppLovinMAX shared] adLoadFailedInfoForAd: adUnitIdentifier withError: error];
141
+
142
+ [[AppLovinMAX shared] sendEventWithName:@"OnNativeUIComponentAdviewAdLoadFailedEvent" body: adLoadFailedInfo];
143
+
144
+ if ( self.containerView )
145
+ {
146
+ self.containerView.onAdLoadFailedEvent(adLoadFailedInfo);
147
+ }
148
+ }
149
+
150
+ - (void)didFailToDisplayAd:(MAAd *)ad withError:(MAError *)error
151
+ {
152
+ if ( self.containerView )
153
+ {
154
+ self.containerView.onAdDisplayFailedEvent([[AppLovinMAX shared] adDisplayFailedInfoForAd: ad withError: error]);
155
+ }
156
+ }
157
+
158
+ - (void)didClickAd:(MAAd *)ad
159
+ {
160
+ if ( self.containerView )
161
+ {
162
+ self.containerView.onAdClickedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
163
+ }
164
+ }
165
+
166
+ #pragma mark - MAAdViewAdDelegate Protocol
167
+
168
+ - (void)didExpandAd:(MAAd *)ad
169
+ {
170
+ if ( self.containerView )
171
+ {
172
+ self.containerView.onAdExpandedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
173
+ }
174
+ }
175
+
176
+ - (void)didCollapseAd:(MAAd *)ad
177
+ {
178
+ if ( self.containerView )
179
+ {
180
+ self.containerView.onAdCollapsedEvent([[AppLovinMAX shared] adInfoForAd: ad]);
181
+ }
182
+ }
183
+
184
+ #pragma mark - MAAdRevenueDelegate Protocol
185
+
186
+ - (void)didPayRevenueForAd:(MAAd *)ad
187
+ {
188
+ if ( self.containerView )
189
+ {
190
+ self.containerView.onAdRevenuePaidEvent([[AppLovinMAX shared] adRevenueInfoForAd: ad]);
191
+ }
192
+ }
193
+
194
+ #pragma mark - Deprecated Callbacks
195
+
196
+ - (void)didDisplayAd:(MAAd *)ad {}
197
+ - (void)didHideAd:(MAAd *)ad {}
198
+
199
+ @end