update: 升级 MAXSDK 至 6.4.1 双端 a:12.4.2 i: 12.4.1
# Conflicts: # MaxSdk/Mediation.meta # MaxSdk/Mediation/BidMachine.meta # MaxSdk/Mediation/BidMachine/Editor.meta # MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml.meta # MaxSdk/Mediation/ByteDance.meta # MaxSdk/Mediation/ByteDance/Editor.meta # MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Chartboost.meta # MaxSdk/Mediation/Chartboost/Editor.meta # MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Facebook.meta # MaxSdk/Mediation/Facebook/Editor.meta # MaxSdk/Mediation/Facebook/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Fyber.meta # MaxSdk/Mediation/Fyber/Editor.meta # MaxSdk/Mediation/Fyber/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Google.meta # MaxSdk/Mediation/Google/Editor.meta # MaxSdk/Mediation/Google/Editor/Dependencies.xml.meta # MaxSdk/Mediation/GoogleAdManager.meta # MaxSdk/Mediation/GoogleAdManager/Editor.meta # MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml.meta # MaxSdk/Mediation/InMobi.meta # MaxSdk/Mediation/InMobi/Editor.meta # MaxSdk/Mediation/InMobi/Editor/Dependencies.xml.meta # MaxSdk/Mediation/IronSource.meta # MaxSdk/Mediation/IronSource/Editor.meta # MaxSdk/Mediation/IronSource/Editor/Dependencies.xml.meta # MaxSdk/Mediation/MediationAdapters.txt.meta # MaxSdk/Mediation/Mintegral.meta # MaxSdk/Mediation/Mintegral/Editor.meta # MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml.meta # MaxSdk/Mediation/MobileFuse.meta # MaxSdk/Mediation/MobileFuse/Editor.meta # MaxSdk/Mediation/MobileFuse/Editor/Dependencies.xml.meta # MaxSdk/Mediation/OguryPresage.meta # MaxSdk/Mediation/OguryPresage/Editor.meta # MaxSdk/Mediation/OguryPresage/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Smaato.meta # MaxSdk/Mediation/Smaato/Editor.meta # MaxSdk/Mediation/Smaato/Editor/Dependencies.xml.meta # MaxSdk/Mediation/UnityAds.meta # MaxSdk/Mediation/UnityAds/Editor.meta # MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Verve.meta # MaxSdk/Mediation/Verve/Editor.meta # MaxSdk/Mediation/Verve/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Vungle.meta # MaxSdk/Mediation/Vungle/Editor.meta # MaxSdk/Mediation/Vungle/Editor/Dependencies.xml.meta # MaxSdk/Mediation/Yandex.meta # MaxSdk/Mediation/Yandex/Editor.meta # MaxSdk/Mediation/Yandex/Editor/Dependencies.xml.meta # MaxSdk/Mediation~HEADdev
							parent
							
								
									cd00d7bda0
								
							
						
					
					
						commit
						6a5002f40a
					
				|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin:applovin-sdk:12.1.0" /> |         <androidPackage spec="com.applovin:applovin-sdk:12.4.2" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinSDK" version="12.1.0" /> |         <iosPod name="AppLovinSDK" version="12.4.1" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							|  | @ -49,14 +49,6 @@ typedef void (*ALUnityBackgroundCallback)(const char* args); | ||||||
| - (void)updateMRecPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | - (void)updateMRecPosition:(CGFloat)xOffset y:(CGFloat)yOffset forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | ||||||
| - (NSString *)mrecLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | - (NSString *)mrecLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | ||||||
| 
 | 
 | ||||||
| - (void)createCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset width:(CGFloat)width height:(CGFloat)height rotation:(CGFloat)rotation; |  | ||||||
| - (void)setCrossPromoAdPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; |  | ||||||
| - (void)showCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; |  | ||||||
| - (void)destroyCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; |  | ||||||
| - (void)hideCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; |  | ||||||
| - (void)updateCrossPromoAdPositionForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset width:(CGFloat)width height:(CGFloat)height rotation:(CGFloat)rotation; |  | ||||||
| - (NSString *)crossPromoAdLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; |  | ||||||
| 
 |  | ||||||
| - (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | - (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | ||||||
| - (BOOL)isInterstitialReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | - (BOOL)isInterstitialReadyWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier; | ||||||
| - (void)showInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData; | - (void)showInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier placement:(nullable NSString *)placement customData:(nullable NSString *)customData; | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
| 
 | 
 | ||||||
| #import "MAUnityAdManager.h" | #import "MAUnityAdManager.h" | ||||||
| 
 | 
 | ||||||
| #define VERSION @"6.1.2" | #define VERSION @"6.4.3" | ||||||
| 
 | 
 | ||||||
| #define KEY_WINDOW [UIApplication sharedApplication].keyWindow | #define KEY_WINDOW [UIApplication sharedApplication].keyWindow | ||||||
| #define DEVICE_SPECIFIC_ADVIEW_AD_FORMAT ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) ? MAAdFormat.leader : MAAdFormat.banner | #define DEVICE_SPECIFIC_ADVIEW_AD_FORMAT ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) ? MAAdFormat.leader : MAAdFormat.banner | ||||||
|  | @ -24,6 +24,12 @@ extern "C" { | ||||||
|     void UnityPause(int pause); |     void UnityPause(int pause); | ||||||
|     void UnitySendMessage(const char* obj, const char* method, const char* msg); |     void UnitySendMessage(const char* obj, const char* method, const char* msg); | ||||||
|      |      | ||||||
|  |     static const char * cStringCopy(NSString *string) | ||||||
|  |     { | ||||||
|  |         const char *value = string.UTF8String; | ||||||
|  |         return value ? strdup(value) : NULL; | ||||||
|  |     } | ||||||
|  |      | ||||||
|     void max_unity_dispatch_on_main_thread(dispatch_block_t block) |     void max_unity_dispatch_on_main_thread(dispatch_block_t block) | ||||||
|     { |     { | ||||||
|         if ( block ) |         if ( block ) | ||||||
|  | @ -59,8 +65,6 @@ extern "C" { | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSString *> *adViewPositions; | @property (nonatomic, strong) NSMutableDictionary<NSString *, NSString *> *adViewPositions; | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSValue *> *adViewOffsets; | @property (nonatomic, strong) NSMutableDictionary<NSString *, NSValue *> *adViewOffsets; | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *adViewWidths; | @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *adViewWidths; | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *crossPromoAdViewHeights; |  | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *crossPromoAdViewRotations; |  | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, MAAdFormat *> *verticalAdViewFormats; | @property (nonatomic, strong) NSMutableDictionary<NSString *, MAAdFormat *> *verticalAdViewFormats; | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSArray<NSLayoutConstraint *> *> *adViewConstraints; | @property (nonatomic, strong) NSMutableDictionary<NSString *, NSArray<NSLayoutConstraint *> *> *adViewConstraints; | ||||||
| @property (nonatomic, strong) NSMutableDictionary<NSString *, NSMutableDictionary<NSString *, NSString *> *> *adViewExtraParametersToSetAfterCreate; | @property (nonatomic, strong) NSMutableDictionary<NSString *, NSMutableDictionary<NSString *, NSString *> *> *adViewExtraParametersToSetAfterCreate; | ||||||
|  | @ -117,8 +121,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         self.adViewPositions = [NSMutableDictionary dictionaryWithCapacity: 2]; |         self.adViewPositions = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|         self.adViewOffsets = [NSMutableDictionary dictionaryWithCapacity: 2]; |         self.adViewOffsets = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|         self.adViewWidths = [NSMutableDictionary dictionaryWithCapacity: 2]; |         self.adViewWidths = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|         self.crossPromoAdViewHeights = [NSMutableDictionary dictionaryWithCapacity: 2]; |  | ||||||
|         self.crossPromoAdViewRotations = [NSMutableDictionary dictionaryWithCapacity: 2]; |  | ||||||
|         self.verticalAdViewFormats = [NSMutableDictionary dictionaryWithCapacity: 2]; |         self.verticalAdViewFormats = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|         self.adViewConstraints = [NSMutableDictionary dictionaryWithCapacity: 2]; |         self.adViewConstraints = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|         self.adViewExtraParametersToSetAfterCreate = [NSMutableDictionary dictionaryWithCapacity: 1]; |         self.adViewExtraParametersToSetAfterCreate = [NSMutableDictionary dictionaryWithCapacity: 1]; | ||||||
|  | @ -188,19 +190,21 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     self.sdk.mediationProvider = @"max"; |     self.sdk.mediationProvider = @"max"; | ||||||
|     [self.sdk initializeSdkWithCompletionHandler:^(ALSdkConfiguration *configuration) |     [self.sdk initializeSdkWithCompletionHandler:^(ALSdkConfiguration *configuration) | ||||||
|      { |      { | ||||||
|         // Note: internal state should be updated first |         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|         completionHandler( configuration ); |             // Note: internal state should be updated first | ||||||
|          |             completionHandler( configuration ); | ||||||
|         NSString *consentFlowUserGeographyStr = @(configuration.consentFlowUserGeography).stringValue; |              | ||||||
|         NSString *consentDialogStateStr = @(configuration.consentDialogState).stringValue; |             NSString *consentFlowUserGeographyStr = @(configuration.consentFlowUserGeography).stringValue; | ||||||
|         NSString *appTrackingStatus = @(configuration.appTrackingTransparencyStatus).stringValue; // Deliberately name it `appTrackingStatus` to be a bit more generic (in case Android introduces a similar concept) |             NSString *consentDialogStateStr = @(configuration.consentDialogState).stringValue; | ||||||
|         [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : @"OnSdkInitializedEvent", |             NSString *appTrackingStatus = @(configuration.appTrackingTransparencyStatus).stringValue; // Deliberately name it `appTrackingStatus` to be a bit more generic (in case Android introduces a similar concept) | ||||||
|                                                        @"consentFlowUserGeography" : consentFlowUserGeographyStr, |             [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : @"OnSdkInitializedEvent", | ||||||
|                                                        @"consentDialogState" : consentDialogStateStr, |                                                            @"consentFlowUserGeography" : consentFlowUserGeographyStr, | ||||||
|                                                        @"countryCode" : configuration.countryCode, |                                                            @"consentDialogState" : consentDialogStateStr, | ||||||
|                                                        @"appTrackingStatus" : appTrackingStatus, |                                                            @"countryCode" : configuration.countryCode, | ||||||
|                                                        @"isSuccessfullyInitialized" : @([self.sdk isInitialized]), |                                                            @"appTrackingStatus" : appTrackingStatus, | ||||||
|                                                        @"isTestModeEnabled" : @([configuration isTestModeEnabled])}]; |                                                            @"isSuccessfullyInitialized" : @([self.sdk isInitialized]), | ||||||
|  |                                                            @"isTestModeEnabled" : @([configuration isTestModeEnabled])}]; | ||||||
|  |         }); | ||||||
|     }]; |     }]; | ||||||
|      |      | ||||||
|     return self.sdk; |     return self.sdk; | ||||||
|  | @ -387,49 +391,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     return [self adViewLayoutForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec]; |     return [self adViewLayoutForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.mrec]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #pragma mark - Cross Promo Ads |  | ||||||
| 
 |  | ||||||
| - (void)createCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset width:(CGFloat)width height:(CGFloat)height rotation:(CGFloat)rotation |  | ||||||
| { |  | ||||||
|     self.adViewWidths[adUnitIdentifier] = @(width); |  | ||||||
|     self.crossPromoAdViewHeights[adUnitIdentifier] = @(height); |  | ||||||
|     self.crossPromoAdViewRotations[adUnitIdentifier] = @(rotation); |  | ||||||
|     [self createAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo atPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset)]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)setCrossPromoAdPlacement:(nullable NSString *)placement forAdUnitIdentifier:(nullable NSString *)adUnitIdentifier |  | ||||||
| { |  | ||||||
|     [self setAdViewPlacement: placement forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)updateCrossPromoAdPositionForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier x:(CGFloat)xOffset y:(CGFloat)yOffset width:(CGFloat)width height:(CGFloat)height rotation:(CGFloat)rotation |  | ||||||
| { |  | ||||||
|     self.adViewWidths[adUnitIdentifier] = @(width); |  | ||||||
|     self.crossPromoAdViewHeights[adUnitIdentifier] = @(height); |  | ||||||
|     self.crossPromoAdViewRotations[adUnitIdentifier] = @(rotation); |  | ||||||
|     [self updateAdViewPosition: DEFAULT_AD_VIEW_POSITION withOffset: CGPointMake(xOffset, yOffset) forAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)showCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier |  | ||||||
| { |  | ||||||
|     [self showAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)destroyCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier |  | ||||||
| { |  | ||||||
|     [self destroyAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)hideCrossPromoAdWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier |  | ||||||
| { |  | ||||||
|     [self hideAdViewWithAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (NSString *)crossPromoAdLayoutForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier |  | ||||||
| { |  | ||||||
|     return [self adViewLayoutForAdUnitIdentifier: adUnitIdentifier adFormat: MAAdFormat.crossPromo]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #pragma mark - Interstitials | #pragma mark - Interstitials | ||||||
| 
 | 
 | ||||||
| - (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier | - (void)loadInterstitialWithAdUnitIdentifier:(nullable NSString *)adUnitIdentifier | ||||||
|  | @ -594,7 +555,7 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
| 
 | 
 | ||||||
| - (NSString *)adInfoForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier | - (NSString *)adInfoForAdUnitIdentifier:(nullable NSString *)adUnitIdentifier | ||||||
| { | { | ||||||
|     if ( [adUnitIdentifier al_isValidString] ) return @""; |     if ( ![adUnitIdentifier al_isValidString] ) return @""; | ||||||
|      |      | ||||||
|     MAAd *ad = [self adWithAdUnitIdentifier: adUnitIdentifier]; |     MAAd *ad = [self adWithAdUnitIdentifier: adUnitIdentifier]; | ||||||
|     if ( !ad ) return @""; |     if ( !ad ) return @""; | ||||||
|  | @ -613,6 +574,7 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|              @"revenue" : [@(ad.revenue) stringValue], |              @"revenue" : [@(ad.revenue) stringValue], | ||||||
|              @"revenuePrecision" : ad.revenuePrecision, |              @"revenuePrecision" : ad.revenuePrecision, | ||||||
|              @"waterfallInfo" : [self createAdWaterfallInfo: ad.waterfall], |              @"waterfallInfo" : [self createAdWaterfallInfo: ad.waterfall], | ||||||
|  |              @"latencyMillis" : [self requestLatencyMillisFromRequestLatency: ad.requestLatency], | ||||||
|              @"dspName" : ad.DSPName ?: @""}; |              @"dspName" : ad.DSPName ?: @""}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -631,11 +593,9 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     { |     { | ||||||
|         [networkResponsesArray addObject: [self createNetworkResponseInfo: response]]; |         [networkResponsesArray addObject: [self createNetworkResponseInfo: response]]; | ||||||
|     } |     } | ||||||
|     waterfallInfoDict[@"networkResponses"] = networkResponsesArray; |  | ||||||
|      |      | ||||||
|     // Convert latency from seconds to milliseconds to match Android. |     waterfallInfoDict[@"networkResponses"] = networkResponsesArray; | ||||||
|     long latencyMillis = waterfallInfo.latency * 1000; |     waterfallInfoDict[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: waterfallInfo.latency]; | ||||||
|     waterfallInfoDict[@"latencyMillis"] = @(latencyMillis).stringValue; |  | ||||||
|      |      | ||||||
|     return waterfallInfoDict; |     return waterfallInfoDict; | ||||||
| } | } | ||||||
|  | @ -668,13 +628,12 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         errorObject[@"errorMessage"] = error.message; |         errorObject[@"errorMessage"] = error.message; | ||||||
|         errorObject[@"adLoadFailure"] = error.adLoadFailureInfo; |         errorObject[@"adLoadFailure"] = error.adLoadFailureInfo; | ||||||
|         errorObject[@"errorCode"] = @(error.code).stringValue; |         errorObject[@"errorCode"] = @(error.code).stringValue; | ||||||
|  |         errorObject[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: error.requestLatency]; | ||||||
|          |          | ||||||
|         networkResponseDict[@"error"] = errorObject; |         networkResponseDict[@"error"] = errorObject; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     // Convert latency from seconds to milliseconds to match Android. |     networkResponseDict[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: response.latency]; | ||||||
|     long latencySeconds = response.latency * 1000; |  | ||||||
|     networkResponseDict[@"latencyMillis"] = @(latencySeconds).stringValue; |  | ||||||
|      |      | ||||||
|     return networkResponseDict; |     return networkResponseDict; | ||||||
| } | } | ||||||
|  | @ -708,10 +667,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         { |         { | ||||||
|             name = @"OnMRecAdLoadedEvent"; |             name = @"OnMRecAdLoadedEvent"; | ||||||
|         } |         } | ||||||
|         else if ( MAAdFormat.crossPromo == adFormat ) |  | ||||||
|         { |  | ||||||
|             name = @"OnCrossPromoAdLoadedEvent"; |  | ||||||
|         } |  | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             name = @"OnBannerAdLoadedEvent"; |             name = @"OnBannerAdLoadedEvent"; | ||||||
|  | @ -747,115 +702,117 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     @synchronized ( self.adInfoDictLock ) |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     { |          | ||||||
|         self.adInfoDict[ad.adUnitIdentifier] = ad; |         @synchronized ( self.adInfoDictLock ) | ||||||
|     } |         { | ||||||
|      |             self.adInfoDict[ad.adUnitIdentifier] = ad; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         } | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |          | ||||||
|  |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error | - (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error | ||||||
| { | { | ||||||
|     if ( !adUnitIdentifier ) |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     { |          | ||||||
|         [self log: @"adUnitIdentifier cannot be nil from %@", [NSThread callStackSymbols]]; |         if ( !adUnitIdentifier ) | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     NSString *name; |  | ||||||
|     if ( self.adViews[adUnitIdentifier] ) |  | ||||||
|     { |  | ||||||
|         MAAdFormat *adFormat = self.adViewAdFormats[adUnitIdentifier]; |  | ||||||
|         if ( MAAdFormat.mrec == adFormat ) |  | ||||||
|         { |         { | ||||||
|             name = @"OnMRecAdLoadFailedEvent"; |             [self log: @"adUnitIdentifier cannot be nil from %@", [NSThread callStackSymbols]]; | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|         else if ( MAAdFormat.crossPromo == adFormat ) |          | ||||||
|  |         NSString *name; | ||||||
|  |         if ( self.adViews[adUnitIdentifier] ) | ||||||
|         { |         { | ||||||
|             name = @"OnCrossPromoAdLoadFailedEvent"; |             MAAdFormat *adFormat = self.adViewAdFormats[adUnitIdentifier]; | ||||||
|  |             if ( MAAdFormat.mrec == adFormat ) | ||||||
|  |             { | ||||||
|  |                 name = @"OnMRecAdLoadFailedEvent"; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 name = @"OnBannerAdLoadFailedEvent"; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else if ( self.interstitials[adUnitIdentifier] ) | ||||||
|  |         { | ||||||
|  |             name = @"OnInterstitialLoadFailedEvent"; | ||||||
|  |         } | ||||||
|  |         else if ( self.appOpenAds[adUnitIdentifier] ) | ||||||
|  |         { | ||||||
|  |             name = @"OnAppOpenAdLoadFailedEvent"; | ||||||
|  |         } | ||||||
|  |         else if ( self.rewardedAds[adUnitIdentifier] ) | ||||||
|  |         { | ||||||
|  |             name = @"OnRewardedAdLoadFailedEvent"; | ||||||
|  |         } | ||||||
|  |         else if ( self.rewardedInterstitialAds[adUnitIdentifier] ) | ||||||
|  |         { | ||||||
|  |             name = @"OnRewardedInterstitialAdLoadFailedEvent"; | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             name = @"OnBannerAdLoadFailedEvent"; |             [self log: @"invalid adUnitId from %@", [NSThread callStackSymbols]]; | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|     } |          | ||||||
|     else if ( self.interstitials[adUnitIdentifier] ) |         @synchronized ( self.adInfoDictLock ) | ||||||
|     { |         { | ||||||
|         name = @"OnInterstitialLoadFailedEvent"; |             [self.adInfoDict removeObjectForKey: adUnitIdentifier]; | ||||||
|     } |         } | ||||||
|     else if ( self.appOpenAds[adUnitIdentifier] ) |          | ||||||
|     { |         [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : name, | ||||||
|         name = @"OnAppOpenAdLoadFailedEvent"; |                                                        @"adUnitId" : adUnitIdentifier, | ||||||
|     } |                                                        @"errorCode" : [@(error.code) stringValue], | ||||||
|     else if ( self.rewardedAds[adUnitIdentifier] ) |                                                        @"errorMessage" : error.message, | ||||||
|     { |                                                        @"waterfallInfo" : [self createAdWaterfallInfo: error.waterfall], | ||||||
|         name = @"OnRewardedAdLoadFailedEvent"; |                                                        @"adLoadFailureInfo" : error.adLoadFailureInfo ?: @"", | ||||||
|     } |                                                        @"latencyMillis" : [self requestLatencyMillisFromRequestLatency: error.requestLatency]}]; | ||||||
|     else if ( self.rewardedInterstitialAds[adUnitIdentifier] ) |     }); | ||||||
|     { |  | ||||||
|         name = @"OnRewardedInterstitialAdLoadFailedEvent"; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         [self log: @"invalid adUnitId from %@", [NSThread callStackSymbols]]; |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     @synchronized ( self.adInfoDictLock ) |  | ||||||
|     { |  | ||||||
|         [self.adInfoDict removeObjectForKey: adUnitIdentifier]; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : name, |  | ||||||
|                                                    @"adUnitId" : adUnitIdentifier, |  | ||||||
|                                                    @"errorCode" : [@(error.code) stringValue], |  | ||||||
|                                                    @"errorMessage" : error.message, |  | ||||||
|                                                    @"waterfallInfo" : [self createAdWaterfallInfo: error.waterfall], |  | ||||||
|                                                    @"adLoadFailureInfo" : error.adLoadFailureInfo ?: @""}]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didClickAd:(MAAd *)ad | - (void)didClickAd:(MAAd *)ad | ||||||
| { | { | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     MAAdFormat *adFormat = ad.format; |          | ||||||
|     if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) |         NSString *name; | ||||||
|     { |         MAAdFormat *adFormat = ad.format; | ||||||
|         name = @"OnBannerAdClickedEvent"; |         if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.mrec == adFormat ) |             name = @"OnBannerAdClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnMRecAdClickedEvent"; |         else if ( MAAdFormat.mrec == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.crossPromo == adFormat ) |             name = @"OnMRecAdClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnCrossPromoAdClickedEvent"; |         else if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.interstitial == adFormat ) |             name = @"OnInterstitialClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnInterstitialClickedEvent"; |         else if ( MAAdFormat.appOpen == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.appOpen == adFormat ) |             name = @"OnAppOpenAdClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnAppOpenAdClickedEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnRewardedAdClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdClickedEvent"; |         else if ( MAAdFormat.rewardedInterstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewardedInterstitial == adFormat ) |             name = @"OnRewardedInterstitialAdClickedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdClickedEvent"; |         else | ||||||
|     } |         { | ||||||
|     else |             [self logInvalidAdFormat: adFormat]; | ||||||
|     { |             return; | ||||||
|         [self logInvalidAdFormat: adFormat]; |         } | ||||||
|         return; |          | ||||||
|     } |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|      |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |     }); | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didDisplayAd:(MAAd *)ad | - (void)didDisplayAd:(MAAd *)ad | ||||||
|  | @ -864,63 +821,71 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     MAAdFormat *adFormat = ad.format; |     MAAdFormat *adFormat = ad.format; | ||||||
|     if ( ![adFormat isFullscreenAd] ) return; |     if ( ![adFormat isFullscreenAd] ) return; | ||||||
|      |      | ||||||
|  |     // UnityPause needs to be called on the main thread. | ||||||
| #if !IS_TEST_APP | #if !IS_TEST_APP | ||||||
|     UnityPause(1); |     UnityPause(1); | ||||||
| #endif | #endif | ||||||
|      |      | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     if ( MAAdFormat.interstitial == adFormat ) |          | ||||||
|     { |         NSString *name; | ||||||
|         name = @"OnInterstitialDisplayedEvent"; |         if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.appOpen == adFormat ) |             name = @"OnInterstitialDisplayedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnAppOpenAdDisplayedEvent"; |         else if ( MAAdFormat.appOpen == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnAppOpenAdDisplayedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdDisplayedEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else // rewarded inters |             name = @"OnRewardedAdDisplayedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdDisplayedEvent"; |         else // rewarded inters | ||||||
|     } |         { | ||||||
|      |             name = @"OnRewardedInterstitialAdDisplayedEvent"; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         } | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |          | ||||||
|  |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didFailToDisplayAd:(MAAd *)ad withError:(MAError *)error | - (void)didFailToDisplayAd:(MAAd *)ad withError:(MAError *)error | ||||||
| { | { | ||||||
|     // BMLs do not support [DISPLAY] events in Unity |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     MAAdFormat *adFormat = ad.format; |          | ||||||
|     if ( ![adFormat isFullscreenAd] ) return; |         // BMLs do not support [DISPLAY] events in Unity | ||||||
|      |         MAAdFormat *adFormat = ad.format; | ||||||
|     NSString *name; |         if ( ![adFormat isFullscreenAd] ) return; | ||||||
|     if ( MAAdFormat.interstitial == adFormat ) |          | ||||||
|     { |         NSString *name; | ||||||
|         name = @"OnInterstitialAdFailedToDisplayEvent"; |         if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.appOpen == adFormat ) |             name = @"OnInterstitialAdFailedToDisplayEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnAppOpenAdFailedToDisplayEvent"; |         else if ( MAAdFormat.appOpen == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnAppOpenAdFailedToDisplayEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdFailedToDisplayEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else // rewarded inters |             name = @"OnRewardedAdFailedToDisplayEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdFailedToDisplayEvent"; |         else // rewarded inters | ||||||
|     } |         { | ||||||
|      |             name = @"OnRewardedInterstitialAdFailedToDisplayEvent"; | ||||||
|     NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         } | ||||||
|     args[@"errorCode"] = [@(error.code) stringValue]; |          | ||||||
|     args[@"errorMessage"] = error.message; |         NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|     args[@"mediatedNetworkErrorCode"] = [@(error.mediatedNetworkErrorCode) stringValue]; |         args[@"errorCode"] = [@(error.code) stringValue]; | ||||||
|     args[@"mediatedNetworkErrorMessage"] = error.mediatedNetworkErrorMessage; |         args[@"errorMessage"] = error.message; | ||||||
|     args[@"waterfallInfo"] = [self createAdWaterfallInfo: error.waterfall]; |         args[@"mediatedNetworkErrorCode"] = [@(error.mediatedNetworkErrorCode) stringValue]; | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |         args[@"mediatedNetworkErrorMessage"] = error.mediatedNetworkErrorMessage; | ||||||
|  |         args[@"waterfallInfo"] = [self createAdWaterfallInfo: error.waterfall]; | ||||||
|  |         args[@"latencyMillis"] = [self requestLatencyMillisFromRequestLatency: error.requestLatency]; | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didHideAd:(MAAd *)ad | - (void)didHideAd:(MAAd *)ad | ||||||
|  | @ -929,30 +894,34 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     MAAdFormat *adFormat = ad.format; |     MAAdFormat *adFormat = ad.format; | ||||||
|     if ( ![adFormat isFullscreenAd] ) return; |     if ( ![adFormat isFullscreenAd] ) return; | ||||||
|      |      | ||||||
|  |     // UnityPause needs to be called on the main thread. | ||||||
| #if !IS_TEST_APP | #if !IS_TEST_APP | ||||||
|     UnityPause(0); |     UnityPause(0); | ||||||
| #endif | #endif | ||||||
|      |      | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     if ( MAAdFormat.interstitial == adFormat ) |          | ||||||
|     { |         NSString *name; | ||||||
|         name = @"OnInterstitialHiddenEvent"; |         if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.appOpen == adFormat ) |             name = @"OnInterstitialHiddenEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnAppOpenAdHiddenEvent"; |         else if ( MAAdFormat.appOpen == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnAppOpenAdHiddenEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdHiddenEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else // rewarded inters |             name = @"OnRewardedAdHiddenEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdHiddenEvent"; |         else // rewarded inters | ||||||
|     } |         { | ||||||
|      |             name = @"OnRewardedInterstitialAdHiddenEvent"; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         } | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |          | ||||||
|  |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didExpandAd:(MAAd *)ad | - (void)didExpandAd:(MAAd *)ad | ||||||
|  | @ -964,26 +933,26 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     // UnityPause needs to be called on the main thread. | ||||||
| #if !IS_TEST_APP | #if !IS_TEST_APP | ||||||
|     UnityPause(1); |     UnityPause(1); | ||||||
| #endif | #endif | ||||||
|      |      | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     if ( MAAdFormat.mrec == adFormat ) |          | ||||||
|     { |         NSString *name; | ||||||
|         name = @"OnMRecAdExpandedEvent"; |         if ( MAAdFormat.mrec == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.crossPromo == adFormat ) |             name = @"OnMRecAdExpandedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnCrossPromoAdExpandedEvent"; |         else | ||||||
|     } |         { | ||||||
|     else |             name = @"OnBannerAdExpandedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnBannerAdExpandedEvent"; |          | ||||||
|     } |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|      |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |     }); | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didCollapseAd:(MAAd *)ad | - (void)didCollapseAd:(MAAd *)ad | ||||||
|  | @ -995,26 +964,26 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     // UnityPause needs to be called on the main thread. | ||||||
| #if !IS_TEST_APP | #if !IS_TEST_APP | ||||||
|     UnityPause(0); |     UnityPause(0); | ||||||
| #endif | #endif | ||||||
|      |      | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     if ( MAAdFormat.mrec == adFormat ) |          | ||||||
|     { |         NSString *name; | ||||||
|         name = @"OnMRecAdCollapsedEvent"; |         if ( MAAdFormat.mrec == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.crossPromo == adFormat ) |             name = @"OnMRecAdCollapsedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnCrossPromoAdCollapsedEvent"; |         else | ||||||
|     } |         { | ||||||
|     else |             name = @"OnBannerAdCollapsedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnBannerAdCollapsedEvent"; |          | ||||||
|     } |         NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|      |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |     }); | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didStartRewardedVideoForAd:(MAAd *)ad | - (void)didStartRewardedVideoForAd:(MAAd *)ad | ||||||
|  | @ -1029,103 +998,110 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
| 
 | 
 | ||||||
| - (void)didRewardUserForAd:(MAAd *)ad withReward:(MAReward *)reward | - (void)didRewardUserForAd:(MAAd *)ad withReward:(MAReward *)reward | ||||||
| { | { | ||||||
|     MAAdFormat *adFormat = ad.format; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     if ( adFormat != MAAdFormat.rewarded && adFormat != MAAdFormat.rewardedInterstitial ) |          | ||||||
|     { |         MAAdFormat *adFormat = ad.format; | ||||||
|         [self logInvalidAdFormat: adFormat]; |         if ( adFormat != MAAdFormat.rewarded && adFormat != MAAdFormat.rewardedInterstitial ) | ||||||
|         return; |         { | ||||||
|     } |             [self logInvalidAdFormat: adFormat]; | ||||||
|      |             return; | ||||||
|     NSString *rewardLabel = reward ? reward.label : @""; |         } | ||||||
|     NSInteger rewardAmountInt = reward ? reward.amount : 0; |          | ||||||
|     NSString *rewardAmount = [@(rewardAmountInt) stringValue]; |         NSString *rewardLabel = reward ? reward.label : @""; | ||||||
|      |         NSInteger rewardAmountInt = reward ? reward.amount : 0; | ||||||
|     NSString *name = (adFormat == MAAdFormat.rewarded) ? @"OnRewardedAdReceivedRewardEvent" : @"OnRewardedInterstitialAdReceivedRewardEvent"; |         NSString *rewardAmount = [@(rewardAmountInt) stringValue]; | ||||||
|      |          | ||||||
|      |         NSString *name = (adFormat == MAAdFormat.rewarded) ? @"OnRewardedAdReceivedRewardEvent" : @"OnRewardedInterstitialAdReceivedRewardEvent"; | ||||||
|     NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |          | ||||||
|     args[@"rewardLabel"] = rewardLabel; |          | ||||||
|     args[@"rewardAmount"] = rewardAmount; |         NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args]; |         args[@"rewardLabel"] = rewardLabel; | ||||||
|  |         args[@"rewardAmount"] = rewardAmount; | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didPayRevenueForAd:(MAAd *)ad | - (void)didPayRevenueForAd:(MAAd *)ad | ||||||
| { | { | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     MAAdFormat *adFormat = ad.format; |          | ||||||
|     if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) |         NSString *name; | ||||||
|     { |         MAAdFormat *adFormat = ad.format; | ||||||
|         name = @"OnBannerAdRevenuePaidEvent"; |         if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.mrec == adFormat ) |             name = @"OnBannerAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnMRecAdRevenuePaidEvent"; |         else if ( MAAdFormat.mrec == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.crossPromo == adFormat ) |             name = @"OnMRecAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnCrossPromoAdRevenuePaidEvent"; |         else if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.interstitial == adFormat ) |             name = @"OnInterstitialAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnInterstitialAdRevenuePaidEvent"; |         else if ( MAAdFormat.appOpen == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.appOpen == adFormat ) |             name = @"OnAppOpenAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnAppOpenAdRevenuePaidEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnRewardedAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdRevenuePaidEvent"; |         else if ( MAAdFormat.rewardedInterstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewardedInterstitial == adFormat ) |             name = @"OnRewardedInterstitialAdRevenuePaidEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdRevenuePaidEvent"; |         else | ||||||
|     } |         { | ||||||
|     else |             [self logInvalidAdFormat: adFormat]; | ||||||
|     { |             return; | ||||||
|         [self logInvalidAdFormat: adFormat]; |         } | ||||||
|         return; |          | ||||||
|     } |         NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|      |         args[@"keepInBackground"] = @([adFormat isFullscreenAd]); | ||||||
|     NSDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args forwardInBackground: [adFormat isFullscreenAd]]; |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (void)didGenerateCreativeIdentifier:(NSString *)creativeIdentifier forAd:(MAAd *)ad | - (void)didGenerateCreativeIdentifier:(NSString *)creativeIdentifier forAd:(MAAd *)ad | ||||||
| { | { | ||||||
|     NSString *name; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|     MAAdFormat *adFormat = ad.format; |          | ||||||
|     if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) |         NSString *name; | ||||||
|     { |         MAAdFormat *adFormat = ad.format; | ||||||
|         name = @"OnBannerAdReviewCreativeIdGeneratedEvent"; |         if ( MAAdFormat.banner == adFormat || MAAdFormat.leader == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.mrec == adFormat ) |             name = @"OnBannerAdReviewCreativeIdGeneratedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnMRecAdReviewCreativeIdGeneratedEvent"; |         else if ( MAAdFormat.mrec == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.interstitial == adFormat ) |             name = @"OnMRecAdReviewCreativeIdGeneratedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnInterstitialAdReviewCreativeIdGeneratedEvent"; |         else if ( MAAdFormat.interstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewarded == adFormat ) |             name = @"OnInterstitialAdReviewCreativeIdGeneratedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedAdReviewCreativeIdGeneratedEvent"; |         else if ( MAAdFormat.rewarded == adFormat ) | ||||||
|     } |         { | ||||||
|     else if ( MAAdFormat.rewardedInterstitial == adFormat ) |             name = @"OnRewardedAdReviewCreativeIdGeneratedEvent"; | ||||||
|     { |         } | ||||||
|         name = @"OnRewardedInterstitialAdReviewCreativeIdGeneratedEvent"; |         else if ( MAAdFormat.rewardedInterstitial == adFormat ) | ||||||
|     } |         { | ||||||
|     else |             name = @"OnRewardedInterstitialAdReviewCreativeIdGeneratedEvent"; | ||||||
|     { |         } | ||||||
|         [self logInvalidAdFormat: adFormat]; |         else | ||||||
|         return; |         { | ||||||
|     } |             [self logInvalidAdFormat: adFormat]; | ||||||
|      |             return; | ||||||
|     NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; |         } | ||||||
|     args[@"adReviewCreativeId"] = creativeIdentifier; |          | ||||||
|      |         NSMutableDictionary<NSString *, id> *args = [self defaultAdEventParametersForName: name withAd: ad]; | ||||||
|     // Forward the event in background for fullscreen ads so that the user gets the callback even while the ad is playing. |         args[@"adReviewCreativeId"] = creativeIdentifier; | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args forwardInBackground: [adFormat isFullscreenAd]]; |         args[@"keepInBackground"] = @([adFormat isFullscreenAd]); | ||||||
|  | 
 | ||||||
|  |         // Forward the event in background for fullscreen ads so that the user gets the callback even while the ad is playing. | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| - (NSMutableDictionary<NSString *, id> *)defaultAdEventParametersForName:(NSString *)name withAd:(MAAd *)ad | - (NSMutableDictionary<NSString *, id> *)defaultAdEventParametersForName:(NSString *)name withAd:(MAAd *)ad | ||||||
|  | @ -1537,8 +1513,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         [self.adViewPositions removeObjectForKey: adUnitIdentifier]; |         [self.adViewPositions removeObjectForKey: adUnitIdentifier]; | ||||||
|         [self.adViewOffsets removeObjectForKey: adUnitIdentifier]; |         [self.adViewOffsets removeObjectForKey: adUnitIdentifier]; | ||||||
|         [self.adViewWidths removeObjectForKey: adUnitIdentifier]; |         [self.adViewWidths removeObjectForKey: adUnitIdentifier]; | ||||||
|         [self.crossPromoAdViewHeights removeObjectForKey: adUnitIdentifier]; |  | ||||||
|         [self.crossPromoAdViewRotations removeObjectForKey: adUnitIdentifier]; |  | ||||||
|         [self.verticalAdViewFormats removeObjectForKey: adUnitIdentifier]; |         [self.verticalAdViewFormats removeObjectForKey: adUnitIdentifier]; | ||||||
|         [self.disabledAdaptiveBannerAdUnitIdentifiers removeObject: adUnitIdentifier]; |         [self.disabledAdaptiveBannerAdUnitIdentifiers removeObject: adUnitIdentifier]; | ||||||
|     }); |     }); | ||||||
|  | @ -1678,8 +1652,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         CGPoint adViewOffset = [adViewPositionValue CGPointValue]; |         CGPoint adViewOffset = [adViewPositionValue CGPointValue]; | ||||||
|         BOOL isAdaptiveBannerDisabled = [self.disabledAdaptiveBannerAdUnitIdentifiers containsObject: adUnitIdentifier]; |         BOOL isAdaptiveBannerDisabled = [self.disabledAdaptiveBannerAdUnitIdentifiers containsObject: adUnitIdentifier]; | ||||||
|         BOOL isWidthPtsOverridden = self.adViewWidths[adUnitIdentifier] != nil; |         BOOL isWidthPtsOverridden = self.adViewWidths[adUnitIdentifier] != nil; | ||||||
|         BOOL isCrossPromoHeightPtsOverridden = self.crossPromoAdViewHeights[adUnitIdentifier] != nil; |  | ||||||
|         BOOL isCrossPromoRotationOverridden = self.crossPromoAdViewRotations[adUnitIdentifier] != nil; |  | ||||||
|          |          | ||||||
|         UIView *superview = adView.superview; |         UIView *superview = adView.superview; | ||||||
|         if ( !superview ) return; |         if ( !superview ) return; | ||||||
|  | @ -1727,11 +1699,7 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|         // |         // | ||||||
|         CGFloat adViewHeight; |         CGFloat adViewHeight; | ||||||
|          |          | ||||||
|         if ( isCrossPromoHeightPtsOverridden ) |         if ( (adFormat == MAAdFormat.banner || adFormat == MAAdFormat.leader) && !isAdaptiveBannerDisabled ) | ||||||
|         { |  | ||||||
|             adViewHeight = self.crossPromoAdViewHeights[adUnitIdentifier].floatValue; |  | ||||||
|         } |  | ||||||
|         else if ( (adFormat == MAAdFormat.banner || adFormat == MAAdFormat.leader) && !isAdaptiveBannerDisabled ) |  | ||||||
|         { |         { | ||||||
|             adViewHeight = [adFormat adaptiveSizeForWidth: adViewWidth].height; |             adViewHeight = [adFormat adaptiveSizeForWidth: adViewWidth].height; | ||||||
|         } |         } | ||||||
|  | @ -1959,11 +1927,6 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         if ( isCrossPromoRotationOverridden ) |  | ||||||
|         { |  | ||||||
|             adView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DEGREES_TO_RADIANS(self.crossPromoAdViewRotations[adUnitIdentifier].floatValue)); |  | ||||||
|         } |  | ||||||
|          |  | ||||||
|         self.adViewConstraints[adUnitIdentifier] = constraints; |         self.adViewConstraints[adUnitIdentifier] = constraints; | ||||||
|          |          | ||||||
|         [NSLayoutConstraint activateConstraints: constraints]; |         [NSLayoutConstraint activateConstraints: constraints]; | ||||||
|  | @ -1977,21 +1940,21 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| + (void)forwardUnityEventWithArgs:(NSDictionary<NSString *, id> *)args | + (void)forwardUnityEventWithArgs:(NSDictionary<NSString *, id> *)args | ||||||
| { |  | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: args forwardInBackground: NO]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| + (void)forwardUnityEventWithArgs:(NSDictionary<NSString *, id> *)args forwardInBackground:(BOOL)forwardInBackground |  | ||||||
| { | { | ||||||
| #if !IS_TEST_APP | #if !IS_TEST_APP | ||||||
|     char *serializedParameters = [self serializeParameters: args].UTF8String; |     void (^runnable)(void) = ^{ | ||||||
|     if ( forwardInBackground ) |         const char *serializedParameters = cStringCopy([self serializeParameters: args]); | ||||||
|     { |  | ||||||
|         backgroundCallback(serializedParameters); |         backgroundCallback(serializedParameters); | ||||||
|  |     }; | ||||||
|  |      | ||||||
|  |     // Always forward in background - we push it back to the main thread in Unity | ||||||
|  |     if ( [NSThread isMainThread] ) | ||||||
|  |     { | ||||||
|  |         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), runnable); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         UnitySendMessage("MaxSdkCallbacks", "ForwardEvent", serializedParameters); |         runnable(); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  | @ -2036,11 +1999,20 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | - (NSString *)requestLatencyMillisFromRequestLatency:(NSTimeInterval)requestLatency | ||||||
|  | { | ||||||
|  |     // Convert latency from seconds to milliseconds to match Android. | ||||||
|  |     long requestLatencyMillis = requestLatency * 1000; | ||||||
|  |     return @(requestLatencyMillis).stringValue; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #pragma mark - User Service | #pragma mark - User Service | ||||||
| 
 | 
 | ||||||
| - (void)didDismissUserConsentDialog | - (void)didDismissUserConsentDialog | ||||||
| { | { | ||||||
|     [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : @"OnSdkConsentDialogDismissedEvent"}]; |     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|  |         [MAUnityAdManager forwardUnityEventWithArgs: @{@"name" : @"OnSdkConsentDialogDismissedEvent"}]; | ||||||
|  |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #pragma mark - CMP Service | #pragma mark - CMP Service | ||||||
|  | @ -2048,19 +2020,22 @@ static ALUnityBackgroundCallback backgroundCallback; | ||||||
| - (void)showCMPForExistingUser | - (void)showCMPForExistingUser | ||||||
| { | { | ||||||
|     [self.sdk.cmpService showCMPForExistingUserWithCompletion:^(ALCMPError * _Nullable error) { |     [self.sdk.cmpService showCMPForExistingUserWithCompletion:^(ALCMPError * _Nullable error) { | ||||||
|          |      | ||||||
|         NSMutableDictionary<NSString *, id> *args = [NSMutableDictionary dictionaryWithCapacity: 2]; |         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | ||||||
|         args[@"name"] = @"OnCmpCompletedEvent"; |             NSMutableDictionary<NSString *, id> *args = [NSMutableDictionary dictionaryWithCapacity: 2]; | ||||||
|          |             args[@"name"] = @"OnCmpCompletedEvent"; | ||||||
|         if ( error ) |              | ||||||
|         { |             if ( error ) | ||||||
|             args[@"error"] = @{@"code": @(error.code), |             { | ||||||
|                                @"message": error.message, |                 args[@"error"] = @{@"code": @(error.code), | ||||||
|                                @"cmpCode": @(error.cmpCode), |                                    @"message": error.message, | ||||||
|                                @"cmpMessage": error.cmpMessage}; |                                    @"cmpCode": @(error.cmpCode), | ||||||
|         } |                                    @"cmpMessage": error.cmpMessage, | ||||||
|          |                                    @"keepInBackground": @(YES)}; | ||||||
|         [MAUnityAdManager forwardUnityEventWithArgs: args forwardInBackground: YES]; |             } | ||||||
|  |              | ||||||
|  |             [MAUnityAdManager forwardUnityEventWithArgs: args]; | ||||||
|  |         }); | ||||||
|     }]; |     }]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,13 +15,13 @@ | ||||||
| @property (assign, readonly, getter=al_isValidString) BOOL al_validString; | @property (assign, readonly, getter=al_isValidString) BOOL al_validString; | ||||||
| @end | @end | ||||||
| 
 | 
 | ||||||
| UIView* UnityGetGLView(); |  | ||||||
| 
 |  | ||||||
| // When native code plugin is implemented in .mm / .cpp file, then functions | // When native code plugin is implemented in .mm / .cpp file, then functions | ||||||
| // should be surrounded with extern "C" block to conform C function naming rules | // should be surrounded with extern "C" block to conform C function naming rules | ||||||
| extern "C" | extern "C" | ||||||
| { | { | ||||||
|     static NSString *const TAG = @"MAUnityPlugin"; |     static NSString *const TAG = @"MAUnityPlugin"; | ||||||
|  | 
 | ||||||
|  |     UIView* UnityGetGLView(); | ||||||
|      |      | ||||||
|     static ALSdk *_sdk; |     static ALSdk *_sdk; | ||||||
|     static MAUnityAdManager *_adManager; |     static MAUnityAdManager *_adManager; | ||||||
|  | @ -52,6 +52,18 @@ extern "C" | ||||||
|     static const char * cStringCopy(NSString *string); |     static const char * cStringCopy(NSString *string); | ||||||
|     // Helper method to log errors |     // Helper method to log errors | ||||||
|     void logUninitializedAccessError(const char *callingMethod); |     void logUninitializedAccessError(const char *callingMethod); | ||||||
|  | 
 | ||||||
|  |     int getConsentStatusValue(NSNumber *consentStatus) | ||||||
|  |     { | ||||||
|  |         if ( consentStatus ) | ||||||
|  |         { | ||||||
|  |             return consentStatus.intValue; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|      |      | ||||||
|     bool isPluginInitialized() |     bool isPluginInitialized() | ||||||
|     { |     { | ||||||
|  | @ -785,51 +797,6 @@ extern "C" | ||||||
|          |          | ||||||
|         return cStringCopy([_adManager mrecLayoutForAdUnitIdentifier: NSSTRING(adUnitIdentifier)]); |         return cStringCopy([_adManager mrecLayoutForAdUnitIdentifier: NSSTRING(adUnitIdentifier)]); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     void _MaxCreateCrossPromoAd(const char *adUnitIdentifier, const float x, const float y, const float width, const float height, const float rotation) |  | ||||||
|     { |  | ||||||
|         if (!isPluginInitialized()) return; |  | ||||||
|          |  | ||||||
|         [_adManager createCrossPromoAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier) x: x y: y width: width height: height rotation: rotation]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void _MaxSetCrossPromoAdPlacement(const char *adUnitIdentifier, const char *placement) |  | ||||||
|     { |  | ||||||
|         [_adManager setCrossPromoAdPlacement: NSSTRING(placement) forAdUnitIdentifier: NSSTRING(adUnitIdentifier)]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void _MaxUpdateCrossPromoAdPosition(const char *adUnitIdentifier, const float x, const float y, const float width, const float height, const float rotation) |  | ||||||
|     { |  | ||||||
|         [_adManager updateCrossPromoAdPositionForAdUnitIdentifier: NSSTRING(adUnitIdentifier) x: x y: y width: width height: height rotation: rotation]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void _MaxShowCrossPromoAd(const char *adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         if (!isPluginInitialized()) return; |  | ||||||
|          |  | ||||||
|         [_adManager showCrossPromoAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void _MaxDestroyCrossPromoAd(const char *adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         if (!isPluginInitialized()) return; |  | ||||||
|          |  | ||||||
|         [_adManager destroyCrossPromoAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void _MaxHideCrossPromoAd(const char *adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         if (!isPluginInitialized()) return; |  | ||||||
|          |  | ||||||
|         [_adManager hideCrossPromoAdWithAdUnitIdentifier: NSSTRING(adUnitIdentifier)]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const char * _MaxGetCrossPromoAdLayout(const char *adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         if (!isPluginInitialized()) return cStringCopy(@""); |  | ||||||
|          |  | ||||||
|         return cStringCopy([_adManager crossPromoAdLayoutForAdUnitIdentifier: NSSTRING(adUnitIdentifier)]); |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|     void _MaxLoadInterstitial(const char *adUnitIdentifier) |     void _MaxLoadInterstitial(const char *adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -1060,30 +1027,28 @@ extern "C" | ||||||
|         return !ALUtils.simulator; |         return !ALUtils.simulator; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     int _MaxGetTcfConsentStatus(int vendorIdentifier) |     int _MaxGetTcfVendorConsentStatus(int vendorIdentifier) | ||||||
|     { |     { | ||||||
|         NSNumber *consentStatus = [ALUtils tcfConsentStatusForVendorIdentifier: vendorIdentifier]; |         NSNumber *consentStatus = [ALPrivacySettings tcfVendorConsentStatusForIdentifier: vendorIdentifier]; | ||||||
|         if ( consentStatus ) |         return getConsentStatusValue(consentStatus); | ||||||
|         { |  | ||||||
|             return consentStatus.intValue; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return -1; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     int _MaxGetAdditionalConsentStatus(int atpIdentifier) |     int _MaxGetAdditionalConsentStatus(int atpIdentifier) | ||||||
|     { |     { | ||||||
|         NSNumber *consentStatus = [ALUtils additionalConsentStatusForATPIdentifier: atpIdentifier]; |         NSNumber *consentStatus = [ALPrivacySettings additionalConsentStatusForIdentifier: atpIdentifier]; | ||||||
|         if ( consentStatus ) |         return getConsentStatusValue(consentStatus); | ||||||
|         { |     } | ||||||
|             return consentStatus.intValue; | 
 | ||||||
|         } |     int _MaxGetPurposeConsentStatus(int purposeIdentifier) | ||||||
|        else |     { | ||||||
|        { |         NSNumber *consentStatus = [ALPrivacySettings purposeConsentStatusForIdentifier: purposeIdentifier]; | ||||||
|            return -1; |         return getConsentStatusValue(consentStatus); | ||||||
|        } |     } | ||||||
|  | 
 | ||||||
|  |     int _MaxGetSpecialFeatureOptInStatus(int specialFeatureIdentifier) | ||||||
|  |     { | ||||||
|  |         NSNumber *consentStatus = [ALPrivacySettings specialFeatureOptInStatusForIdentifier: specialFeatureIdentifier]; | ||||||
|  |         return getConsentStatusValue(consentStatus); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     static const char * cStringCopy(NSString *string) |     static const char * cStringCopy(NSString *string) | ||||||
|  | @ -1229,6 +1194,13 @@ extern "C" | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     int * _MaxGetSafeAreaInsets() | ||||||
|  |     { | ||||||
|  |         UIEdgeInsets safeAreaInsets = UnityGetGLView().safeAreaInsets; | ||||||
|  |         static int insets[4] = {(int) safeAreaInsets.left, (int) safeAreaInsets.top, (int) safeAreaInsets.right, (int) safeAreaInsets.bottom}; | ||||||
|  |         return insets; | ||||||
|  |     } | ||||||
|      |      | ||||||
|     void _MaxShowCmpForExistingUser() |     void _MaxShowCmpForExistingUser() | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: a8ba4aafafc4142d8872c03c93ed10e2 | guid: dcf2020c4018447c9b91170c0f62d799 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation | - al_max_export_path-MaxSdk/Mediation | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 5a4e6c1e82db1462f8a77b375f310066 | guid: 6b9d9d3ca994442dcb2c1abcd31077ad | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/BidMachine | - al_max_export_path-MaxSdk/Mediation/BidMachine | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ab3608d83ecb4446a81e1f3cceda3413 | guid: 527c65004f8c84edbb4c14b8a2a04c5d | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/BidMachine/Editor | - al_max_export_path-MaxSdk/Mediation/BidMachine/Editor | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:bidmachine-adapter:2.3.2.0"> |         <androidPackage spec="com.applovin.mediation:bidmachine-adapter:2.6.0.1"> | ||||||
|              <repositories> |              <repositories> | ||||||
|                  <repository>https://artifactory.bidmachine.io/bidmachine</repository> |                  <repository>https://artifactory.bidmachine.io/bidmachine</repository> | ||||||
|              </repositories> |              </repositories> | ||||||
|          </androidPackage> |          </androidPackage> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationBidMachineAdapter" version="2.3.0.2.0"/> |         <iosPod name="AppLovinMediationBidMachineAdapter" version="2.6.0.0.0"/> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 123f162bdccf1417d8283effdde4fdbd | guid: 98a383532dccb495aa31190874842cbe | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/BidMachine/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: b8e9d79594b7846daaa13430b88ceafd | guid: a0fd9165dea16454ea59da2bf05462d2 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/ByteDance | - al_max_export_path-MaxSdk/Mediation/ByteDance | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: b88237e7390c0473caf663fb2ec2093a | guid: ef8467ffb0e4447b79a8804884a7520a | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/ByteDance/Editor | - al_max_export_path-MaxSdk/Mediation/ByteDance/Editor | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:bytedance-adapter:5.6.0.1.0"> |         <androidPackage spec="com.applovin.mediation:bytedance-adapter:5.9.0.2.0"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://artifact.bytedance.com/repository/pangle</repository> |                 <repository>https://artifact.bytedance.com/repository/pangle</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|         </androidPackage> |         </androidPackage> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationByteDanceAdapter" version="5.5.0.9.0" /> |         <iosPod name="AppLovinMediationByteDanceAdapter" version="5.8.0.8.1" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: e40f7461260e84fce92b6baa166d3ac5 | guid: 0828555cb1ce94702a4af6f3dce3d735 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/ByteDance/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 736e27be8f4514d63bb1f9e77e789d71 | guid: 3647332764da440ae8d4de79ebf72832 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Chartboost | - al_max_export_path-MaxSdk/Mediation/Chartboost | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 5fc6a042b090a4a41af5345f13644aef | guid: a90f13141c35746f5a2996c8ad068fe9 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Chartboost/Editor | - al_max_export_path-MaxSdk/Mediation/Chartboost/Editor | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:chartboost-adapter:9.4.1.0"> |         <androidPackage spec="com.applovin.mediation:chartboost-adapter:9.7.0.0"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://cboost.jfrog.io/artifactory/chartboost-ads/</repository> |                 <repository>https://cboost.jfrog.io/artifactory/chartboost-ads/</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|  | @ -9,6 +9,6 @@ | ||||||
|         <androidPackage spec="com.google.android.gms:play-services-base:16.1.0" /> |         <androidPackage spec="com.google.android.gms:play-services-base:16.1.0" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationChartboostAdapter" version="9.4.0.0" /> |         <iosPod name="AppLovinMediationChartboostAdapter" version="9.7.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ce9cd7b936c30476a80116051627795e | guid: 93b0a4618bd884871af0981a7867bb2f | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Chartboost/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: c12845df8707d4636928493032036922 | guid: 27b0caf5a05a845018297e973b16537e | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Facebook | - al_max_export_path-MaxSdk/Mediation/Facebook | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: d41a4deeadbbe49b4abdb8c33ed8adff | guid: 28880992a399a48b7abe95b66649d711 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Facebook/Editor | - al_max_export_path-MaxSdk/Mediation/Facebook/Editor | ||||||
|  | @ -5,9 +5,9 @@ | ||||||
|              Since FAN SDK depends on older versions of a few support and play service versions |              Since FAN SDK depends on older versions of a few support and play service versions | ||||||
|              `com.applovin.mediation:facebook-adapter:x.y.z.a` resolves to `com.applovin.mediation:facebook-adapter:+` which pulls down the beta versions of FAN SDK. |              `com.applovin.mediation:facebook-adapter:x.y.z.a` resolves to `com.applovin.mediation:facebook-adapter:+` which pulls down the beta versions of FAN SDK. | ||||||
|              Note that forcing the adapter is enough to stop Jar Resolver from pulling the latest FAN SDK. --> |              Note that forcing the adapter is enough to stop Jar Resolver from pulling the latest FAN SDK. --> | ||||||
|         <androidPackage spec="com.applovin.mediation:facebook-adapter:[6.16.0.2]" /> |         <androidPackage spec="com.applovin.mediation:facebook-adapter:[6.17.0.0]" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationFacebookAdapter" version="6.12.0.3" /> |         <iosPod name="AppLovinMediationFacebookAdapter" version="6.15.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 6b42926a78dd2468db1fc059229e6fa2 | guid: aea9bdf974328420db5ae118ef0d2b87 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Facebook/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Facebook/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 2ddb16b7ed77641b0b48e4dcb5eb9313 | guid: 6aac123ddaf4f490f95b78bf39ca18d1 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Fyber | - al_max_export_path-MaxSdk/Mediation/Fyber | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: d1f48f8173f79496ab742e75fc4cbc93 | guid: e076e4ef7e2874ba69b108cc7a346c2a | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Fyber/Editor | - al_max_export_path-MaxSdk/Mediation/Fyber/Editor | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:fyber-adapter:8.2.3.3"/> |         <androidPackage spec="com.applovin.mediation:fyber-adapter:8.2.7.1"/> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationFyberAdapter" version="8.2.4.0"/> |         <iosPod name="AppLovinMediationFyberAdapter" version="8.2.7.0"/> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ab63c200561ab4506b77e71f6019ca9a | guid: 5e123cdc08e804dffb2c40c4fbc83caf | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Fyber/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Fyber/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 4c314c382c139449288577824fed1f00 | guid: 5b3d3bc3aa8a546de8fdd5ded2b7e050 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Google | - al_max_export_path-MaxSdk/Mediation/Google | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 81a5cd1881bd74bb18b6a4e152979ad9 | guid: e8015bd045cea462c8f39c8a05867d08 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Google/Editor | - al_max_export_path-MaxSdk/Mediation/Google/Editor | ||||||
|  | @ -2,9 +2,9 @@ | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <!-- Ensure that Resolver doesn't inadvertently pull the latest Play Services Ads' SDK that we haven't certified against. --> |         <!-- Ensure that Resolver doesn't inadvertently pull the latest Play Services Ads' SDK that we haven't certified against. --> | ||||||
|         <androidPackage spec="com.applovin.mediation:google-adapter:[22.3.0.0]" /> |         <androidPackage spec="com.applovin.mediation:google-adapter:[23.0.0.1]" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationGoogleAdapter" version="10.9.0.0" /> |         <iosPod name="AppLovinMediationGoogleAdapter" version="11.3.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ac3c45d913a734c548c6a8a224624bc9 | guid: 053b810d3594744e38b6fd0fa378fb57 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Google/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Google/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 0f32d9bbb13cf4fca977f251fe8ae54e | guid: 468d376e1f39442e8a96601e563b7e2a | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/GoogleAdManager | - al_max_export_path-MaxSdk/Mediation/GoogleAdManager | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 309e4978918794c339a5b06630ca4380 | guid: 3e1635bfb5b164c389d38eb1e5e6e909 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor | - al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor | ||||||
|  | @ -2,9 +2,9 @@ | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <!-- Ensure that Resolver doesn't inadvertently pull the latest Play Services Ads' SDK that we haven't certified against. --> |         <!-- Ensure that Resolver doesn't inadvertently pull the latest Play Services Ads' SDK that we haven't certified against. --> | ||||||
|         <androidPackage spec="com.applovin.mediation:google-ad-manager-adapter:[22.3.0.0]" /> |         <androidPackage spec="com.applovin.mediation:google-ad-manager-adapter:[23.0.0.1]" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationGoogleAdManagerAdapter" version="10.9.0.0" /> |         <iosPod name="AppLovinMediationGoogleAdManagerAdapter" version="11.3.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ec7fdc0ed9424436a9dc4b3ec60c4d45 | guid: aebbf5e9af66e431fa6078021b2f762f | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/GoogleAdManager/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: d1f591c6c71fe43c39ebd8362cdee42f | guid: 5b17efb66f23c412ca4516e426406bdc | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/InMobi | - al_max_export_path-MaxSdk/Mediation/InMobi | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: f0ca013590c6e4cada30f485e014d804 | guid: a141703acd55a48c2a3e6e6599f90c64 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/InMobi/Editor | - al_max_export_path-MaxSdk/Mediation/InMobi/Editor | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:inmobi-adapter:10.6.3.0" /> |         <androidPackage spec="com.applovin.mediation:inmobi-adapter:10.6.7.0" /> | ||||||
|         <androidPackage spec="com.squareup.picasso:picasso:2.71828" /> |         <androidPackage spec="com.squareup.picasso:picasso:2.71828" /> | ||||||
|         <androidPackage spec="com.android.support:recyclerview-v7:28.+" /> |         <androidPackage spec="com.android.support:recyclerview-v7:28.+" /> | ||||||
|         <androidPackage spec="com.android.support:customtabs:28.+" /> |         <androidPackage spec="com.android.support:customtabs:28.+" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationInMobiAdapter" version="10.6.0.0" /> |         <iosPod name="AppLovinMediationInMobiAdapter" version="10.7.1.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: fc006bb35419a4f759875a1db7b0c002 | guid: bc66a0ef4503843ee9b1bf1b1e867367 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/InMobi/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/InMobi/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 29324d5f5bc2a4b25a629f8172371077 | guid: 7e5d22a01f68c4ee49f7ae312d187aa9 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/IronSource | - al_max_export_path-MaxSdk/Mediation/IronSource | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: bc7cc0a01f21649f5beb12578ad01088 | guid: 531d860cac61f47d19e32f526470ae43 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/IronSource/Editor | - al_max_export_path-MaxSdk/Mediation/IronSource/Editor | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:ironsource-adapter:7.5.0.0.1"> |         <androidPackage spec="com.applovin.mediation:ironsource-adapter:7.9.0.0.0"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://android-sdk.is.com/</repository> |                 <repository>https://android-sdk.is.com/</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|         </androidPackage> |         </androidPackage> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationIronSourceAdapter" version="7.4.0.0.1" /> |         <iosPod name="AppLovinMediationIronSourceAdapter" version="7.9.1.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 3877ffad630d74094a5bc7f0ce771e9d | guid: 19262406303f04f05b14b31b3c734d35 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/IronSource/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/IronSource/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 9a04a93e5a00046f498986cbab8a41ce | guid: 9a8f83e97729443c86120be3bb24190d | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/MediationAdapters.txt | - al_max_export_path-MaxSdk/Mediation/MediationAdapters.txt | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 6f2161264cc274e589af866b30e9c171 | guid: 3efc678797bb440b4b754a4593b4a7bc | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Mintegral | - al_max_export_path-MaxSdk/Mediation/Mintegral | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 050a1eb04323a43ae89766193d45c211 | guid: db1de4066dc4e4290b3879b34fa87de2 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Mintegral/Editor | - al_max_export_path-MaxSdk/Mediation/Mintegral/Editor | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:mintegral-adapter:16.6.51.1"> |         <androidPackage spec="com.applovin.mediation:mintegral-adapter:16.7.11.0"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea</repository> |                 <repository>https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|  | @ -9,6 +9,6 @@ | ||||||
|         <androidPackage spec="androidx.recyclerview:recyclerview:1.2.1" /> |         <androidPackage spec="androidx.recyclerview:recyclerview:1.2.1" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationMintegralAdapter" version="7.4.2.0.0" /> |         <iosPod name="AppLovinMediationMintegralAdapter" version="7.6.2.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 424c8ca120d1c445fa71535de1415d06 | guid: 221b2a20a58a04f2cb4afb0779587206 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Mintegral/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: cdd55135b2b1445ff98507c60a6e8fb3 | guid: 1f51aa0efd73a4c5dabd3bd20504fd98 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/MobileFuse | - al_max_export_path-MaxSdk/Mediation/MobileFuse | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: a428cd8127ca14c1eb4c36b44d66c00d | guid: 5b294b15bf20e4100bb8fd4f2865870a | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/MobileFuse/Editor | - al_max_export_path-MaxSdk/Mediation/MobileFuse/Editor | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:mobilefuse-adapter:1.7.1.0" /> |         <androidPackage spec="com.applovin.mediation:mobilefuse-adapter:1.7.3.0" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationMobileFuseAdapter" version="1.7.1.0" /> |         <iosPod name="AppLovinMediationMobileFuseAdapter" version="1.7.3.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 4b1c644f7bf454f848c5d23b2f83f994 | guid: 4dd9dbd046b334929bcb7f80b7ae9eb4 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/MobileFuse/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/MobileFuse/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 1498439a98d054421a655f46c1b0a979 | guid: 09a110e66ea38428a8a388a48813529f | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/OguryPresage | - al_max_export_path-MaxSdk/Mediation/OguryPresage | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 89202f48ff6c24437ab9b72c14e6592c | guid: deb1bc473b7934f93b82938ea36d0878 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/OguryPresage/Editor | - al_max_export_path-MaxSdk/Mediation/OguryPresage/Editor | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:ogury-presage-adapter:5.6.0.0"> |         <androidPackage spec="com.applovin.mediation:ogury-presage-adapter:5.6.2.1"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://maven.ogury.co</repository> |                 <repository>https://maven.ogury.co</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|         </androidPackage> |         </androidPackage> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationOguryPresageAdapter" version="4.1.2.1" /> |         <iosPod name="AppLovinMediationOguryPresageAdapter" version="4.2.3.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 44e217a01f9b04d3c9a17d8e95b9e2c8 | guid: 4733055cb7d01490e9c36862b7d10163 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/OguryPresage/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/OguryPresage/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: f03bf15dfdfd444a7a8ef23206461549 | guid: 6035ebab3b5094cc2851242130f8724b | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Smaato | - al_max_export_path-MaxSdk/Mediation/Smaato | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 55478c656b4ea4a1b9fa81760007214c | guid: d6ab91d259c064997b6b26c1739ef87d | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Smaato/Editor | - al_max_export_path-MaxSdk/Mediation/Smaato/Editor | ||||||
|  | @ -1,13 +1,13 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:smaato-adapter:22.5.1.0"> |         <androidPackage spec="com.applovin.mediation:smaato-adapter:22.6.1.0"> | ||||||
|             <repositories> |             <repositories> | ||||||
|                 <repository>https://s3.amazonaws.com/smaato-sdk-releases/</repository> |                 <repository>https://s3.amazonaws.com/smaato-sdk-releases/</repository> | ||||||
|             </repositories> |             </repositories> | ||||||
|         </androidPackage> |         </androidPackage> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationSmaatoAdapter" version="22.5.0.0" /> |         <iosPod name="AppLovinMediationSmaatoAdapter" version="22.8.3.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: b74b1ad0814994aef880c11dc374a1b3 | guid: f6c345cc57a514902ba5fb68436f852f | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Smaato/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Smaato/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 34596ba2f74a64f4692da45ed21c7d2f | guid: 7fb60924642d44bed95c2cc730a87327 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/UnityAds | - al_max_export_path-MaxSdk/Mediation/UnityAds | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 66b580ac41d5c4e9f8b96348f42cdef6 | guid: 30751f2dc322a40e588edfb7c978c9c0 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/UnityAds/Editor | - al_max_export_path-MaxSdk/Mediation/UnityAds/Editor | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:unityads-adapter:4.9.2.0" /> |         <androidPackage spec="com.applovin.mediation:unityads-adapter:4.10.0.0" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationUnityAdsAdapter" version="4.9.2.0" /> |         <iosPod name="AppLovinMediationUnityAdsAdapter" version="4.10.0.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: d5d70db07cd3d4c90866131f5ff2ec5e | guid: 9950f1cb0da1e43efbeca604db142076 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/UnityAds/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 465b78190ecd34d2ebb66bbdb663b8f7 | guid: a988eefd0908441f799ba02f389b0164 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Verve | - al_max_export_path-MaxSdk/Mediation/Verve | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 1c0f8f4536e924c7daeb4e07b8a89fbd | guid: 942a73b8f38284e55849bd9986aefee8 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Verve/Editor | - al_max_export_path-MaxSdk/Mediation/Verve/Editor | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:verve-adapter:2.21.1.0"/> |         <androidPackage spec="com.applovin.mediation:verve-adapter:3.0.0.0"/> | ||||||
|         <repositories> |         <repositories> | ||||||
|                 <repository>https://verve.jfrog.io/artifactory/verve-gradle-release</repository> |                 <repository>https://verve.jfrog.io/artifactory/verve-gradle-release</repository> | ||||||
|         </repositories> |         </repositories> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationVerveAdapter" version="2.21.1.0"/> |         <iosPod name="AppLovinMediationVerveAdapter" version="3.0.0.0"/> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: ecb5509aa8c6f4e1781b9658779c7f70 | guid: bce11a786f6b54963a8085520a643ce8 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Verve/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Verve/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 08ce07f8736a1441499e151152b0a8c8 | guid: e5a58f58ec6b64f2d8c8061c4051244c | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Vungle | - al_max_export_path-MaxSdk/Mediation/Vungle | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 415ba661fb43149518f25c225fc5486a | guid: 77b6ea05736a9458f8ef8762ee9b64bb | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Vungle/Editor | - al_max_export_path-MaxSdk/Mediation/Vungle/Editor | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:vungle-adapter:6.11.0.1" /> |         <androidPackage spec="com.applovin.mediation:vungle-adapter:7.3.1.2" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationVungleAdapter" version="7.0.1.0" /> |         <iosPod name="AppLovinMediationVungleAdapter" version="7.3.1.0" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: d8eb42a2c132f43e59186bc28da6006e | guid: 0d8ad3a6ddc4f44fab2efe607fe14f26 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Vungle/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Vungle/Editor/Dependencies.xml | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 927af5b2250834fd5be82687e53be6ba | guid: 5d02f768bae96461c9a46ed20e652f8d | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Yandex | - al_max_export_path-MaxSdk/Mediation/Yandex | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 57d88d0ec30464840aa603ef3533b7f6 | guid: 277e2383262e844708fc74a6104f4985 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Yandex/Editor | - al_max_export_path-MaxSdk/Mediation/Yandex/Editor | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <dependencies> | <dependencies> | ||||||
|     <androidPackages> |     <androidPackages> | ||||||
|         <androidPackage spec="com.applovin.mediation:yandex-adapter:5.10.0.0" /> |         <androidPackage spec="com.applovin.mediation:yandex-adapter:6.4.1.0" /> | ||||||
|     </androidPackages> |     </androidPackages> | ||||||
|     <iosPods> |     <iosPods> | ||||||
|         <iosPod name="AppLovinMediationYandexAdapter" version="5.6.0.0" /> |         <iosPod name="AppLovinMediationYandexAdapter" version="6.1.0.3" /> | ||||||
|     </iosPods> |     </iosPods> | ||||||
| </dependencies> | </dependencies> | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: eac827b694b384eedb459cbb1637e3f1 | guid: a77aaf886990c4e6ba469a4f083b9284 | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Mediation/Yandex/Editor/Dependencies.xml | - al_max_export_path-MaxSdk/Mediation/Yandex/Editor/Dependencies.xml | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| fileFormatVersion: 2 |  | ||||||
| guid: b6903b66cb8984df289e6d66f9c52ddc |  | ||||||
| labels: |  | ||||||
| - al_max |  | ||||||
| - al_max_export_path-MaxSdk/Scripts/Editor |  | ||||||
| folderAsset: yes |  | ||||||
| DefaultImporter: |  | ||||||
|   externalObjects: {} |  | ||||||
|   userData:  |  | ||||||
|   assetBundleName:  |  | ||||||
|   assetBundleVariant:  |  | ||||||
|  | @ -1,14 +0,0 @@ | ||||||
| fileFormatVersion: 2 |  | ||||||
| guid: 75fed160a41749d4990cee871ee618a4 |  | ||||||
| labels: |  | ||||||
| - al_max |  | ||||||
| - al_max_export_path-MaxSdk/Scripts/Editor/MaxPostProcessBuildAndroid.cs |  | ||||||
| MonoImporter: |  | ||||||
|   externalObjects: {} |  | ||||||
|   serializedVersion: 2 |  | ||||||
|   defaultReferences: [] |  | ||||||
|   executionOrder: 0 |  | ||||||
|   icon: {instanceID: 0} |  | ||||||
|   userData:  |  | ||||||
|   assetBundleName:  |  | ||||||
|   assetBundleVariant:  |  | ||||||
|  | @ -1,590 +0,0 @@ | ||||||
| // |  | ||||||
| //  MaxPostProcessBuildiOS.cs |  | ||||||
| //  AppLovin MAX Unity Plugin |  | ||||||
| // |  | ||||||
| //  Created by Santosh Bagadi on 8/5/20. |  | ||||||
| //  Copyright © 2020 AppLovin. All rights reserved. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| #if UNITY_IOS || UNITY_IPHONE |  | ||||||
| 
 |  | ||||||
| using AppLovinMax.Scripts.IntegrationManager.Editor; |  | ||||||
| #if UNITY_2019_3_OR_NEWER |  | ||||||
| using UnityEditor.iOS.Xcode.Extensions; |  | ||||||
| #endif |  | ||||||
| using UnityEngine.Networking; |  | ||||||
| using System; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.IO; |  | ||||||
| using UnityEditor; |  | ||||||
| using UnityEditor.Callbacks; |  | ||||||
| using UnityEditor.iOS.Xcode; |  | ||||||
| using UnityEngine; |  | ||||||
| 
 |  | ||||||
| namespace AppLovinMax.Scripts.Editor |  | ||||||
| { |  | ||||||
|     [Serializable] |  | ||||||
|     public class SkAdNetworkData |  | ||||||
|     { |  | ||||||
|         [SerializeField] public string[] SkAdNetworkIds; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public class MaxPostProcessBuildiOS |  | ||||||
|     { |  | ||||||
| #if !UNITY_2019_3_OR_NEWER |  | ||||||
|         private const string UnityMainTargetName = "Unity-iPhone"; |  | ||||||
| #endif |  | ||||||
|         private const string TargetUnityIphonePodfileLine = "target 'Unity-iPhone' do"; |  | ||||||
|         private const string LegacyResourcesDirectoryName = "Resources"; |  | ||||||
|         private const string AppLovinMaxResourcesDirectoryName = "AppLovinMAXResources"; |  | ||||||
|         private const string AppLovinAdvertisingAttributionEndpoint = "https://postbacks-app.com"; |  | ||||||
| 
 |  | ||||||
|         private const string AppLovinSettingsPlistFileName = "AppLovin-Settings.plist"; |  | ||||||
|         private const string KeyConsentFlowInfo = "ConsentFlowInfo"; |  | ||||||
|         private const string KeyConsentFlowEnabled = "ConsentFlowEnabled"; |  | ||||||
|         private const string KeyConsentFlowTermsOfService = "ConsentFlowTermsOfService"; |  | ||||||
|         private const string KeyConsentFlowPrivacyPolicy = "ConsentFlowPrivacyPolicy"; |  | ||||||
|         private const string KeyConsentFlowDebugUserGeography = "ConsentFlowDebugUserGeography"; |  | ||||||
| 
 |  | ||||||
|         private static readonly List<string> DynamicLibrariesToEmbed = new List<string> |  | ||||||
|         { |  | ||||||
|             "DTBiOSSDK.xcframework", |  | ||||||
|             "FBAEMKit.xcframework", |  | ||||||
|             "FBSDKCoreKit_Basics.xcframework", |  | ||||||
|             "FBSDKCoreKit.xcframework", |  | ||||||
|             "FBSDKGamingServicesKit.xcframework", |  | ||||||
|             "FBSDKLoginKit.xcframework", |  | ||||||
|             "FBSDKShareKit.xcframework", |  | ||||||
|             "HyprMX.xcframework", |  | ||||||
|             "LinkedinAudienceNetwork.xcframework", |  | ||||||
|             "IASDKCore.xcframework", |  | ||||||
|             "Maio.xcframework", |  | ||||||
|             "MobileFuseSDK.xcframework", |  | ||||||
|             "OMSDK_Appodeal.xcframework", |  | ||||||
|             "OMSDK_Ogury.xcframework", |  | ||||||
|             "OMSDK_Pubnativenet.xcframework", |  | ||||||
|             "OMSDK_Smaato.xcframework" |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         private static string PluginMediationDirectory |  | ||||||
|         { |  | ||||||
|             get |  | ||||||
|             { |  | ||||||
|                 var pluginParentDir = AppLovinIntegrationManager.MediationSpecificPluginParentDirectory; |  | ||||||
|                 return Path.Combine(pluginParentDir, "MaxSdk/Mediation/"); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [PostProcessBuildAttribute(int.MaxValue)] |  | ||||||
|         public static void MaxPostProcessPbxProject(BuildTarget buildTarget, string buildPath) |  | ||||||
|         { |  | ||||||
|             var projectPath = PBXProject.GetPBXProjectPath(buildPath); |  | ||||||
|             var project = new PBXProject(); |  | ||||||
|             project.ReadFromFile(projectPath); |  | ||||||
| 
 |  | ||||||
| #if UNITY_2019_3_OR_NEWER |  | ||||||
|             var unityMainTargetGuid = project.GetUnityMainTargetGuid(); |  | ||||||
|             var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid(); |  | ||||||
| #else |  | ||||||
|             var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); |  | ||||||
|             var unityFrameworkTargetGuid = project.TargetGuidByName(UnityMainTargetName); |  | ||||||
| #endif |  | ||||||
|             EmbedDynamicLibrariesIfNeeded(buildPath, project, unityMainTargetGuid); |  | ||||||
| 
 |  | ||||||
|             var internalSettingsEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled; |  | ||||||
|             var userTrackingUsageDescriptionDe = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionDe : AppLovinSettings.Instance.UserTrackingUsageDescriptionDe; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionDe, "de", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionEn = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn : AppLovinSettings.Instance.UserTrackingUsageDescriptionEn; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionEn, "en", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionEs = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEs : AppLovinSettings.Instance.UserTrackingUsageDescriptionEs; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionEs, "es", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionFr = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionFr : AppLovinSettings.Instance.UserTrackingUsageDescriptionFr; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionFr, "fr", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionJa = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionJa : AppLovinSettings.Instance.UserTrackingUsageDescriptionJa; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionJa, "ja", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionKo = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionKo : AppLovinSettings.Instance.UserTrackingUsageDescriptionKo; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionKo, "ko", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionZhHans = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHans : AppLovinSettings.Instance.UserTrackingUsageDescriptionZhHans; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionZhHans, "zh-Hans", buildPath, project, unityMainTargetGuid); |  | ||||||
|             var userTrackingUsageDescriptionZhHant = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHant : AppLovinSettings.Instance.UserTrackingUsageDescriptionZhHant; |  | ||||||
|             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionZhHant, "zh-Hant", buildPath, project, unityMainTargetGuid); |  | ||||||
| 
 |  | ||||||
|             AddSwiftSupport(buildPath, project, unityFrameworkTargetGuid, unityMainTargetGuid); |  | ||||||
|             AddYandexSettingsIfNeeded(project, unityMainTargetGuid); |  | ||||||
| 
 |  | ||||||
|             project.WriteToFile(projectPath); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void EmbedDynamicLibrariesIfNeeded(string buildPath, PBXProject project, string targetGuid) |  | ||||||
|         { |  | ||||||
|             // Check that the Pods directory exists (it might not if a publisher is building with Generate Podfile setting disabled in EDM). |  | ||||||
|             var podsDirectory = Path.Combine(buildPath, "Pods"); |  | ||||||
|             if (!Directory.Exists(podsDirectory)) return; |  | ||||||
| 
 |  | ||||||
|             var dynamicLibraryPathsPresentInProject = new List<string>(); |  | ||||||
|             foreach (var dynamicLibraryToSearch in DynamicLibrariesToEmbed) |  | ||||||
|             { |  | ||||||
|                 // both .framework and .xcframework are directories, not files |  | ||||||
|                 var directories = Directory.GetDirectories(podsDirectory, dynamicLibraryToSearch, SearchOption.AllDirectories); |  | ||||||
|                 if (directories.Length <= 0) continue; |  | ||||||
| 
 |  | ||||||
|                 var dynamicLibraryAbsolutePath = directories[0]; |  | ||||||
|                 var index = dynamicLibraryAbsolutePath.LastIndexOf("Pods"); |  | ||||||
|                 var relativePath = dynamicLibraryAbsolutePath.Substring(index); |  | ||||||
|                 dynamicLibraryPathsPresentInProject.Add(relativePath); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (dynamicLibraryPathsPresentInProject.Count <= 0) return; |  | ||||||
| 
 |  | ||||||
| #if UNITY_2019_3_OR_NEWER |  | ||||||
|             // Embed framework only if the podfile does not contain target `Unity-iPhone`. |  | ||||||
|             if (!ContainsUnityIphoneTargetInPodfile(buildPath)) |  | ||||||
|             { |  | ||||||
|                 foreach (var dynamicLibraryPath in dynamicLibraryPathsPresentInProject) |  | ||||||
|                 { |  | ||||||
|                     var fileGuid = project.AddFile(dynamicLibraryPath, dynamicLibraryPath); |  | ||||||
|                     project.AddFileToEmbedFrameworks(targetGuid, fileGuid); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| #else |  | ||||||
|             string runpathSearchPaths; |  | ||||||
|             runpathSearchPaths = project.GetBuildPropertyForAnyConfig(targetGuid, "LD_RUNPATH_SEARCH_PATHS"); |  | ||||||
|             runpathSearchPaths += string.IsNullOrEmpty(runpathSearchPaths) ? "" : " "; |  | ||||||
| 
 |  | ||||||
|             // Check if runtime search paths already contains the required search paths for dynamic libraries. |  | ||||||
|             if (runpathSearchPaths.Contains("@executable_path/Frameworks")) return; |  | ||||||
| 
 |  | ||||||
|             runpathSearchPaths += "@executable_path/Frameworks"; |  | ||||||
|             project.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", runpathSearchPaths); |  | ||||||
| #endif |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void LocalizeUserTrackingDescriptionIfNeeded(string localizedUserTrackingDescription, string localeCode, string buildPath, PBXProject project, string targetGuid) |  | ||||||
|         { |  | ||||||
|             // Use the legacy resources directory name if the build is being appended (the "Resources" directory already exists if it is an incremental build). |  | ||||||
|             var resourcesDirectoryName = Directory.Exists(Path.Combine(buildPath, LegacyResourcesDirectoryName)) ? LegacyResourcesDirectoryName : AppLovinMaxResourcesDirectoryName; |  | ||||||
|             var resourcesDirectoryPath = Path.Combine(buildPath, resourcesDirectoryName); |  | ||||||
|             var localeSpecificDirectoryName = localeCode + ".lproj"; |  | ||||||
|             var localeSpecificDirectoryPath = Path.Combine(resourcesDirectoryPath, localeSpecificDirectoryName); |  | ||||||
|             var infoPlistStringsFilePath = Path.Combine(localeSpecificDirectoryPath, "InfoPlist.strings"); |  | ||||||
| 
 |  | ||||||
|             // Check if localization has been disabled between builds, and remove them as needed. |  | ||||||
|             if (ShouldRemoveLocalization(localizedUserTrackingDescription)) |  | ||||||
|             { |  | ||||||
|                 if (!File.Exists(infoPlistStringsFilePath)) return; |  | ||||||
| 
 |  | ||||||
|                 File.Delete(infoPlistStringsFilePath); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Create intermediate directories as needed. |  | ||||||
|             if (!Directory.Exists(resourcesDirectoryPath)) |  | ||||||
|             { |  | ||||||
|                 Directory.CreateDirectory(resourcesDirectoryPath); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (!Directory.Exists(localeSpecificDirectoryPath)) |  | ||||||
|             { |  | ||||||
|                 Directory.CreateDirectory(localeSpecificDirectoryPath); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var localizedDescriptionLine = "\"NSUserTrackingUsageDescription\" = \"" + localizedUserTrackingDescription + "\";\n"; |  | ||||||
|             // File already exists, update it in case the value changed between builds. |  | ||||||
|             if (File.Exists(infoPlistStringsFilePath)) |  | ||||||
|             { |  | ||||||
|                 var output = new List<string>(); |  | ||||||
|                 var lines = File.ReadAllLines(infoPlistStringsFilePath); |  | ||||||
|                 var keyUpdated = false; |  | ||||||
|                 foreach (var line in lines) |  | ||||||
|                 { |  | ||||||
|                     if (line.Contains("NSUserTrackingUsageDescription")) |  | ||||||
|                     { |  | ||||||
|                         output.Add(localizedDescriptionLine); |  | ||||||
|                         keyUpdated = true; |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         output.Add(line); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (!keyUpdated) |  | ||||||
|                 { |  | ||||||
|                     output.Add(localizedDescriptionLine); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 File.WriteAllText(infoPlistStringsFilePath, string.Join("\n", output.ToArray()) + "\n"); |  | ||||||
|             } |  | ||||||
|             // File doesn't exist, create one. |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 File.WriteAllText(infoPlistStringsFilePath, "/* Localized versions of Info.plist keys - Generated by AL MAX plugin */\n" + localizedDescriptionLine); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var localeSpecificDirectoryRelativePath = Path.Combine(resourcesDirectoryName, localeSpecificDirectoryName); |  | ||||||
|             var guid = project.AddFolderReference(localeSpecificDirectoryRelativePath, localeSpecificDirectoryRelativePath); |  | ||||||
|             project.AddFileToBuild(targetGuid, guid); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static bool ShouldRemoveLocalization(string localizedUserTrackingDescription) |  | ||||||
|         { |  | ||||||
|             if (string.IsNullOrEmpty(localizedUserTrackingDescription)) return true; |  | ||||||
| 
 |  | ||||||
|             var settings = AppLovinSettings.Instance; |  | ||||||
|             var internalSettings = AppLovinInternalSettings.Instance; |  | ||||||
| 
 |  | ||||||
|             return (!internalSettings.ConsentFlowEnabled || !internalSettings.UserTrackingUsageLocalizationEnabled) |  | ||||||
|                 && !settings.ConsentFlowEnabled || !settings.UserTrackingUsageLocalizationEnabled; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void AddSwiftSupport(string buildPath, PBXProject project, string unityFrameworkTargetGuid, string unityMainTargetGuid) |  | ||||||
|         { |  | ||||||
|             var swiftFileRelativePath = "Classes/MAXSwiftSupport.swift"; |  | ||||||
|             var swiftFilePath = Path.Combine(buildPath, swiftFileRelativePath); |  | ||||||
| 
 |  | ||||||
|             // Add Swift file |  | ||||||
|             CreateSwiftFile(swiftFilePath); |  | ||||||
|             var swiftFileGuid = project.AddFile(swiftFileRelativePath, swiftFileRelativePath, PBXSourceTree.Source); |  | ||||||
|             project.AddFileToBuild(unityFrameworkTargetGuid, swiftFileGuid); |  | ||||||
| 
 |  | ||||||
|             // Add Swift version property if needed |  | ||||||
|             var swiftVersion = project.GetBuildPropertyForAnyConfig(unityFrameworkTargetGuid, "SWIFT_VERSION"); |  | ||||||
|             if (string.IsNullOrEmpty(swiftVersion)) |  | ||||||
|             { |  | ||||||
|                 project.SetBuildProperty(unityFrameworkTargetGuid, "SWIFT_VERSION", "5.0"); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Enable Swift modules |  | ||||||
|             project.AddBuildProperty(unityFrameworkTargetGuid, "CLANG_ENABLE_MODULES", "YES"); |  | ||||||
|             project.AddBuildProperty(unityMainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void CreateSwiftFile(string swiftFilePath) |  | ||||||
|         { |  | ||||||
|             if (File.Exists(swiftFilePath)) return; |  | ||||||
| 
 |  | ||||||
|             // Create a file to write to. |  | ||||||
|             using (var writer = File.CreateText(swiftFilePath)) |  | ||||||
|             { |  | ||||||
|                 writer.WriteLine("//\n//  MAXSwiftSupport.swift\n//"); |  | ||||||
|                 writer.WriteLine("\nimport Foundation\n"); |  | ||||||
|                 writer.WriteLine("// This file ensures the project includes Swift support."); |  | ||||||
|                 writer.WriteLine("// It is automatically generated by the MAX Unity Plugin."); |  | ||||||
|                 writer.Close(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         [PostProcessBuildAttribute(int.MaxValue)] |  | ||||||
|         public static void MaxPostProcessPlist(BuildTarget buildTarget, string path) |  | ||||||
|         { |  | ||||||
|             var plistPath = Path.Combine(path, "Info.plist"); |  | ||||||
|             var plist = new PlistDocument(); |  | ||||||
|             plist.ReadFromFile(plistPath); |  | ||||||
| 
 |  | ||||||
|             SetSdkKeyIfNeeded(plist); |  | ||||||
|             SetAttributionReportEndpointIfNeeded(plist); |  | ||||||
| 
 |  | ||||||
|             EnableVerboseLoggingIfNeeded(plist); |  | ||||||
|             AddGoogleApplicationIdIfNeeded(plist); |  | ||||||
| 
 |  | ||||||
|             AddSdkSettingsIfNeeded(plist, path); |  | ||||||
|             EnableTermsFlowIfNeeded(plist); |  | ||||||
|             AddSkAdNetworksInfoIfNeeded(plist); |  | ||||||
| 
 |  | ||||||
|             plist.WriteToFile(plistPath); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void SetSdkKeyIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             var sdkKey = AppLovinSettings.Instance.SdkKey; |  | ||||||
|             if (string.IsNullOrEmpty(sdkKey)) return; |  | ||||||
| 
 |  | ||||||
|             const string AppLovinVerboseLoggingOnKey = "AppLovinSdkKey"; |  | ||||||
|             plist.root.SetString(AppLovinVerboseLoggingOnKey, sdkKey); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void SetAttributionReportEndpointIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             if (AppLovinSettings.Instance.SetAttributionReportEndpoint) |  | ||||||
|             { |  | ||||||
|                 plist.root.SetString("NSAdvertisingAttributionReportEndpoint", AppLovinAdvertisingAttributionEndpoint); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 PlistElement attributionReportEndPoint; |  | ||||||
|                 plist.root.values.TryGetValue("NSAdvertisingAttributionReportEndpoint", out attributionReportEndPoint); |  | ||||||
| 
 |  | ||||||
|                 // Check if we had previously set the attribution endpoint and un-set it. |  | ||||||
|                 if (attributionReportEndPoint != null && AppLovinAdvertisingAttributionEndpoint.Equals(attributionReportEndPoint.AsString())) |  | ||||||
|                 { |  | ||||||
|                     plist.root.values.Remove("NSAdvertisingAttributionReportEndpoint"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void EnableVerboseLoggingIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             if (!EditorPrefs.HasKey(MaxSdkLogger.KeyVerboseLoggingEnabled)) return; |  | ||||||
| 
 |  | ||||||
|             var enabled = EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled); |  | ||||||
|             const string AppLovinVerboseLoggingOnKey = "AppLovinVerboseLoggingOn"; |  | ||||||
|             if (enabled) |  | ||||||
|             { |  | ||||||
|                 plist.root.SetBoolean(AppLovinVerboseLoggingOnKey, enabled); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 plist.root.values.Remove(AppLovinVerboseLoggingOnKey); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void AddGoogleApplicationIdIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             if (!AppLovinIntegrationManager.IsAdapterInstalled("Google") && !AppLovinIntegrationManager.IsAdapterInstalled("GoogleAdManager")) return; |  | ||||||
| 
 |  | ||||||
|             const string googleApplicationIdentifier = "GADApplicationIdentifier"; |  | ||||||
|             var appId = AppLovinSettings.Instance.AdMobIosAppId; |  | ||||||
|             // Log error if the App ID is not set. |  | ||||||
|             if (string.IsNullOrEmpty(appId) || !appId.StartsWith("ca-app-pub-")) |  | ||||||
|             { |  | ||||||
|                 Debug.LogError("[AppLovin MAX] Google App ID is not set. Please enter a valid app ID within the AppLovin Integration Manager window."); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             plist.root.SetString(googleApplicationIdentifier, appId); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void AddYandexSettingsIfNeeded(PBXProject project, string unityMainTargetGuid) |  | ||||||
|         { |  | ||||||
|             if (!AppLovinIntegrationManager.IsAdapterInstalled("Yandex")) return; |  | ||||||
| 
 |  | ||||||
|             if (MaxSdkUtils.CompareVersions(PlayerSettings.iOS.targetOSVersionString, "12.0") == MaxSdkUtils.VersionComparisonResult.Lesser) |  | ||||||
|             { |  | ||||||
|                 Debug.LogWarning("Your iOS target version is under the minimum required version by Yandex. Please update it to 12.0 or newer in your ProjectSettings and rebuild your project."); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             project.SetBuildProperty(unityMainTargetGuid, "GENERATE_INFOPLIST_FILE", "NO"); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void AddSdkSettingsIfNeeded(PlistDocument infoPlist, string buildPath) |  | ||||||
|         { |  | ||||||
|             // Right now internal settings is only needed for Consent Flow. Remove this setting once we add more settings. |  | ||||||
|             if (!AppLovinInternalSettings.Instance.ConsentFlowEnabled) return; |  | ||||||
| 
 |  | ||||||
|             var sdkSettingsPlistPath = Path.Combine(buildPath, AppLovinSettingsPlistFileName); |  | ||||||
|             var sdkSettingsPlist = new PlistDocument(); |  | ||||||
|             if (File.Exists(sdkSettingsPlistPath)) |  | ||||||
|             { |  | ||||||
|                 sdkSettingsPlist.ReadFromFile(sdkSettingsPlistPath); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             EnableConsentFlowIfNeeded(sdkSettingsPlist, infoPlist); |  | ||||||
| 
 |  | ||||||
|             sdkSettingsPlist.WriteToFile(sdkSettingsPlistPath); |  | ||||||
| 
 |  | ||||||
|             var projectPath = PBXProject.GetPBXProjectPath(buildPath); |  | ||||||
|             var project = new PBXProject(); |  | ||||||
|             project.ReadFromFile(projectPath); |  | ||||||
| 
 |  | ||||||
| #if UNITY_2019_3_OR_NEWER |  | ||||||
|             var unityMainTargetGuid = project.GetUnityMainTargetGuid(); |  | ||||||
| #else |  | ||||||
|             var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|             var guid = project.AddFile(AppLovinSettingsPlistFileName, AppLovinSettingsPlistFileName, PBXSourceTree.Source); |  | ||||||
|             project.AddFileToBuild(unityMainTargetGuid, guid); |  | ||||||
|             project.WriteToFile(projectPath); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void EnableConsentFlowIfNeeded(PlistDocument applovinSettingsPlist, PlistDocument infoPlist) |  | ||||||
|         { |  | ||||||
|             var consentFlowEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled; |  | ||||||
|             var userTrackingUsageDescription = AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn; |  | ||||||
|             var privacyPolicyUrl = AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl; |  | ||||||
|             if (string.IsNullOrEmpty(userTrackingUsageDescription) || string.IsNullOrEmpty(privacyPolicyUrl)) |  | ||||||
|             { |  | ||||||
|                 AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL and the `User Tracking Usage Description` in the AppLovin Integration Manager. \n\n" + |  | ||||||
|                                                                   "Both values must be included to enable the SDK's consent flow."); |  | ||||||
| 
 |  | ||||||
|                 // No need to update the info.plist here. Default consent flow state will be determined on the SDK side. |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var consentFlowInfoRoot = applovinSettingsPlist.root.CreateDict(KeyConsentFlowInfo); |  | ||||||
|             consentFlowInfoRoot.SetBoolean(KeyConsentFlowEnabled, consentFlowEnabled); |  | ||||||
|             consentFlowInfoRoot.SetString(KeyConsentFlowPrivacyPolicy, privacyPolicyUrl); |  | ||||||
| 
 |  | ||||||
|             var termsOfServiceUrl = AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl; |  | ||||||
|             if (MaxSdkUtils.IsValidString(termsOfServiceUrl)) |  | ||||||
|             { |  | ||||||
|                 consentFlowInfoRoot.SetString(KeyConsentFlowTermsOfService, termsOfServiceUrl); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var debugUserGeography = AppLovinInternalSettings.Instance.DebugUserGeography; |  | ||||||
|             if (debugUserGeography == MaxSdkBase.ConsentFlowUserGeography.Gdpr) |  | ||||||
|             { |  | ||||||
|                 consentFlowInfoRoot.SetString(KeyConsentFlowDebugUserGeography, "gdpr"); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             infoPlist.root.SetString("NSUserTrackingUsageDescription", userTrackingUsageDescription); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void EnableTermsFlowIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             // Check if terms flow is enabled. No need to update info.plist if consent flow is disabled. |  | ||||||
|             var consentFlowEnabled = AppLovinSettings.Instance.ConsentFlowEnabled; |  | ||||||
|             if (!consentFlowEnabled) return; |  | ||||||
| 
 |  | ||||||
|             // Check if terms flow is enabled for this format. |  | ||||||
|             var consentFlowPlatform = AppLovinSettings.Instance.ConsentFlowPlatform; |  | ||||||
|             if (consentFlowPlatform != Platform.All && consentFlowPlatform != Platform.iOS) return; |  | ||||||
| 
 |  | ||||||
|             var userTrackingUsageDescription = AppLovinSettings.Instance.UserTrackingUsageDescriptionEn; |  | ||||||
|             var privacyPolicyUrl = AppLovinSettings.Instance.ConsentFlowPrivacyPolicyUrl; |  | ||||||
|             if (string.IsNullOrEmpty(userTrackingUsageDescription) || string.IsNullOrEmpty(privacyPolicyUrl)) |  | ||||||
|             { |  | ||||||
|                 AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL and the `User Tracking Usage Description` in the AppLovin Integration Manager. \n\n" + |  | ||||||
|                                                                   "Both values must be included to enable the SDK's consent flow."); |  | ||||||
| 
 |  | ||||||
|                 // No need to update the info.plist here. Default consent flow state will be determined on the SDK side. |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             var consentFlowInfoRoot = plist.root.CreateDict("AppLovinConsentFlowInfo"); |  | ||||||
|             consentFlowInfoRoot.SetBoolean("AppLovinConsentFlowEnabled", consentFlowEnabled); |  | ||||||
|             consentFlowInfoRoot.SetString("AppLovinConsentFlowPrivacyPolicy", privacyPolicyUrl); |  | ||||||
| 
 |  | ||||||
|             var termsOfServiceUrl = AppLovinSettings.Instance.ConsentFlowTermsOfServiceUrl; |  | ||||||
|             if (!string.IsNullOrEmpty(termsOfServiceUrl)) |  | ||||||
|             { |  | ||||||
|                 consentFlowInfoRoot.SetString("AppLovinConsentFlowTermsOfService", termsOfServiceUrl); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             plist.root.SetString("NSUserTrackingUsageDescription", userTrackingUsageDescription); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static void AddSkAdNetworksInfoIfNeeded(PlistDocument plist) |  | ||||||
|         { |  | ||||||
|             var skAdNetworkData = GetSkAdNetworkData(); |  | ||||||
|             var skAdNetworkIds = skAdNetworkData.SkAdNetworkIds; |  | ||||||
|             // Check if we have a valid list of SKAdNetworkIds that need to be added. |  | ||||||
|             if (skAdNetworkIds == null || skAdNetworkIds.Length < 1) return; |  | ||||||
| 
 |  | ||||||
|             // |  | ||||||
|             // Add the SKAdNetworkItems to the plist. It should look like following: |  | ||||||
|             // |  | ||||||
|             //    <key>SKAdNetworkItems</key> |  | ||||||
|             //    <array> |  | ||||||
|             //        <dict> |  | ||||||
|             //            <key>SKAdNetworkIdentifier</key> |  | ||||||
|             //            <string>ABC123XYZ.skadnetwork</string> |  | ||||||
|             //        </dict> |  | ||||||
|             //        <dict> |  | ||||||
|             //            <key>SKAdNetworkIdentifier</key> |  | ||||||
|             //            <string>123QWE456.skadnetwork</string> |  | ||||||
|             //        </dict> |  | ||||||
|             //        <dict> |  | ||||||
|             //            <key>SKAdNetworkIdentifier</key> |  | ||||||
|             //            <string>987XYZ123.skadnetwork</string> |  | ||||||
|             //        </dict> |  | ||||||
|             //    </array> |  | ||||||
|             // |  | ||||||
|             PlistElement skAdNetworkItems; |  | ||||||
|             plist.root.values.TryGetValue("SKAdNetworkItems", out skAdNetworkItems); |  | ||||||
|             var existingSkAdNetworkIds = new HashSet<string>(); |  | ||||||
|             // Check if SKAdNetworkItems array is already in the Plist document and collect all the IDs that are already present. |  | ||||||
|             if (skAdNetworkItems != null && skAdNetworkItems.GetType() == typeof(PlistElementArray)) |  | ||||||
|             { |  | ||||||
|                 var plistElementDictionaries = skAdNetworkItems.AsArray().values.Where(plistElement => plistElement.GetType() == typeof(PlistElementDict)); |  | ||||||
|                 foreach (var plistElement in plistElementDictionaries) |  | ||||||
|                 { |  | ||||||
|                     PlistElement existingId; |  | ||||||
|                     plistElement.AsDict().values.TryGetValue("SKAdNetworkIdentifier", out existingId); |  | ||||||
|                     if (existingId == null || existingId.GetType() != typeof(PlistElementString) || string.IsNullOrEmpty(existingId.AsString())) continue; |  | ||||||
| 
 |  | ||||||
|                     existingSkAdNetworkIds.Add(existingId.AsString()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             // Else, create an array of SKAdNetworkItems into which we will add our IDs. |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 skAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems"); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             foreach (var skAdNetworkId in skAdNetworkIds) |  | ||||||
|             { |  | ||||||
|                 // Skip adding IDs that are already in the array. |  | ||||||
|                 if (existingSkAdNetworkIds.Contains(skAdNetworkId)) continue; |  | ||||||
| 
 |  | ||||||
|                 var skAdNetworkItemDict = skAdNetworkItems.AsArray().AddDict(); |  | ||||||
|                 skAdNetworkItemDict.SetString("SKAdNetworkIdentifier", skAdNetworkId); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         private static SkAdNetworkData GetSkAdNetworkData() |  | ||||||
|         { |  | ||||||
|             var uriBuilder = new UriBuilder("https://unity.applovin.com/max/1.0/skadnetwork_ids"); |  | ||||||
| 
 |  | ||||||
|             // Get the list of installed ad networks to be passed up |  | ||||||
|             var maxMediationDirectory = PluginMediationDirectory; |  | ||||||
|             if (Directory.Exists(maxMediationDirectory)) |  | ||||||
|             { |  | ||||||
|                 var mediationNetworkDirectories = Directory.GetDirectories(maxMediationDirectory); |  | ||||||
|                 var installedNetworks = mediationNetworkDirectories.Select(Path.GetFileName).ToList(); |  | ||||||
|                 if (AppLovinSettings.Instance.AddApsSkAdNetworkIds) |  | ||||||
|                 { |  | ||||||
|                     installedNetworks.Add("AmazonPublisherServices"); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 var adNetworks = string.Join(",", installedNetworks.ToArray()); |  | ||||||
|                 if (!string.IsNullOrEmpty(adNetworks)) |  | ||||||
|                 { |  | ||||||
|                     uriBuilder.Query += string.Format("ad_networks={0}", adNetworks); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             using (var unityWebRequest = UnityWebRequest.Get(uriBuilder.ToString())) |  | ||||||
|             { |  | ||||||
|                 var operation = unityWebRequest.SendWebRequest(); |  | ||||||
|                 // Wait for the download to complete or the request to timeout. |  | ||||||
|                 while (!operation.isDone) { } |  | ||||||
| 
 |  | ||||||
| #if UNITY_2020_1_OR_NEWER |  | ||||||
|                 if (unityWebRequest.result != UnityWebRequest.Result.Success) |  | ||||||
| #else |  | ||||||
|                 if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) |  | ||||||
| #endif |  | ||||||
|                 { |  | ||||||
|                     MaxSdkLogger.UserError("Failed to retrieve SKAdNetwork IDs with error: " + unityWebRequest.error); |  | ||||||
|                     return new SkAdNetworkData(); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try |  | ||||||
|                 { |  | ||||||
|                     return JsonUtility.FromJson<SkAdNetworkData>(unityWebRequest.downloadHandler.text); |  | ||||||
|                 } |  | ||||||
|                 catch (Exception exception) |  | ||||||
|                 { |  | ||||||
|                     MaxSdkLogger.UserError("Failed to parse data '" + unityWebRequest.downloadHandler.text + "' with exception: " + exception); |  | ||||||
|                     return new SkAdNetworkData(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
| #if UNITY_2019_3_OR_NEWER |  | ||||||
|         private static bool ContainsUnityIphoneTargetInPodfile(string buildPath) |  | ||||||
|         { |  | ||||||
|             var podfilePath = Path.Combine(buildPath, "Podfile"); |  | ||||||
|             if (!File.Exists(podfilePath)) return false; |  | ||||||
| 
 |  | ||||||
|             var lines = File.ReadAllLines(podfilePath); |  | ||||||
|             return lines.Any(line => line.Contains(TargetUnityIphonePodfileLine)); |  | ||||||
|         } |  | ||||||
| #endif |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
|  | @ -1,14 +0,0 @@ | ||||||
| fileFormatVersion: 2 |  | ||||||
| guid: 29959b3cd36c484a9d57d6b7ca7f7bfa |  | ||||||
| labels: |  | ||||||
| - al_max |  | ||||||
| - al_max_export_path-MaxSdk/Scripts/Editor/MaxPostProcessBuildiOS.cs |  | ||||||
| MonoImporter: |  | ||||||
|   externalObjects: {} |  | ||||||
|   serializedVersion: 2 |  | ||||||
|   defaultReferences: [] |  | ||||||
|   executionOrder: 0 |  | ||||||
|   icon: {instanceID: 0} |  | ||||||
|   userData:  |  | ||||||
|   assetBundleName:  |  | ||||||
|   assetBundleVariant:  |  | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| { |  | ||||||
|     "name": "MaxSdk.Scripts.Editor", |  | ||||||
|     "references": [ |  | ||||||
|         "MaxSdk.Scripts", |  | ||||||
|         "MaxSdk.Scripts.IntegrationManager.Editor" |  | ||||||
|     ], |  | ||||||
|     "includePlatforms": [ |  | ||||||
|         "Editor" |  | ||||||
|     ], |  | ||||||
|     "excludePlatforms": [] |  | ||||||
| } |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| fileFormatVersion: 2 |  | ||||||
| guid: 691e0eb4b7a542dba2219d48c3254f1c |  | ||||||
| labels: |  | ||||||
| - al_max |  | ||||||
| - al_max_export_path-MaxSdk/Scripts/Editor/MaxSdk.Scripts.Editor.asmdef |  | ||||||
| timeCreated: 1591749791 |  | ||||||
|  | @ -26,7 +26,6 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|         // TODO: Make this list dynamic. |         // TODO: Make this list dynamic. | ||||||
|         public static readonly Dictionary<string, string> MinAdapterVersions = new Dictionary<string, string>() |         public static readonly Dictionary<string, string> MinAdapterVersions = new Dictionary<string, string>() | ||||||
|         { |         { | ||||||
|             {"ADCOLONY_NETWORK", "android_4.2.3.1_ios_4.3.1.1"}, |  | ||||||
|             {"ADMOB_NETWORK", "android_19.3.0.3_ios_7.65.0.0"}, |             {"ADMOB_NETWORK", "android_19.3.0.3_ios_7.65.0.0"}, | ||||||
|             {"CHARTBOOST_NETWORK", "android_8.1.0.7_ios_8.2.1.3"}, |             {"CHARTBOOST_NETWORK", "android_8.1.0.7_ios_8.2.1.3"}, | ||||||
|             {"FACEBOOK_MEDIATE", "android_6.0.0.1_ios_6.0.0.3"}, |             {"FACEBOOK_MEDIATE", "android_6.0.0.1_ios_6.0.0.3"}, | ||||||
|  | @ -38,7 +37,6 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|             {"SMAATO_NETWORK", "android_21.5.2.5_ios_21.5.2.3"}, |             {"SMAATO_NETWORK", "android_21.5.2.5_ios_21.5.2.3"}, | ||||||
|             {"TIKTOK_NETWORK", "android_3.1.0.1.6_ios_3.2.5.1.1"}, |             {"TIKTOK_NETWORK", "android_3.1.0.1.6_ios_3.2.5.1.1"}, | ||||||
|             {"UNITY_NETWORK", "android_3.4.8.2_ios_3.4.8.2"}, |             {"UNITY_NETWORK", "android_3.4.8.2_ios_3.4.8.2"}, | ||||||
|             {"VERIZON_NETWORK", "android_1.6.0.5_ios_1.7.1.1"}, |  | ||||||
|             {"VUNGLE_NETWORK", "android_6.7.1.2_ios_6.7.1.3"}, |             {"VUNGLE_NETWORK", "android_6.7.1.2_ios_6.7.1.3"}, | ||||||
|             {"YANDEX_NETWORK", "android_2.170.2_ios_2.18.0.1"} |             {"YANDEX_NETWORK", "android_2.170.2_ios_2.18.0.1"} | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|  | @ -12,13 +12,16 @@ using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using UnityEditor; | using UnityEditor; | ||||||
| 
 | 
 | ||||||
| namespace AppLovinMax.Scripts.Editor | namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
| { | { | ||||||
|     [InitializeOnLoad] |     [InitializeOnLoad] | ||||||
|     public class MaxInitialize |     public class AppLovinInitialize | ||||||
|     { |     { | ||||||
|         private static readonly List<string> ObsoleteNetworks = new List<string> |         private static readonly List<string> ObsoleteNetworks = new List<string> | ||||||
|         { |         { | ||||||
|  |             "AdColony", | ||||||
|  |             "Criteo", | ||||||
|  |             "Nend", | ||||||
|             "Snap", |             "Snap", | ||||||
|             "Tapjoy", |             "Tapjoy", | ||||||
|             "VerizonAds", |             "VerizonAds", | ||||||
|  | @ -27,6 +30,10 @@ namespace AppLovinMax.Scripts.Editor | ||||||
| 
 | 
 | ||||||
|         private static readonly List<string> ObsoleteFileExportPathsToDelete = new List<string> |         private static readonly List<string> ObsoleteFileExportPathsToDelete = new List<string> | ||||||
|         { |         { | ||||||
|  |             // The `MaxSdk/Scripts/Editor` folder contents have been moved into `MaxSdk/Scripts/IntegrationManager/Editor`. | ||||||
|  |             "MaxSdk/Scripts/Editor", | ||||||
|  |             "MaxSdk/Scripts/Editor.meta", | ||||||
|  | 
 | ||||||
|             // The `EventSystemChecker` has been renamed to `MaxEventSystemChecker`. |             // The `EventSystemChecker` has been renamed to `MaxEventSystemChecker`. | ||||||
|             "MaxSdk/Scripts/EventSystemChecker.cs", |             "MaxSdk/Scripts/EventSystemChecker.cs", | ||||||
|             "MaxSdk/Scripts/EventSystemChecker.cs.meta", |             "MaxSdk/Scripts/EventSystemChecker.cs.meta", | ||||||
|  | @ -54,7 +61,7 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|             "MaxSdk/Mediation/GoogleAdManager/Editor/MaxSdk.Mediation.GoogleAdManager.Editor.asmdef.meta", |             "MaxSdk/Mediation/GoogleAdManager/Editor/MaxSdk.Mediation.GoogleAdManager.Editor.asmdef.meta", | ||||||
|             "Plugins/Android/MaxMediationGoogleAdManager.androidlib", |             "Plugins/Android/MaxMediationGoogleAdManager.androidlib", | ||||||
|             "Plugins/Android/MaxMediationGoogleAdManager.androidlib.meta", |             "Plugins/Android/MaxMediationGoogleAdManager.androidlib.meta", | ||||||
|                  | 
 | ||||||
|             // The `VariableService` has been removed. |             // The `VariableService` has been removed. | ||||||
|             "MaxSdk/Scripts/MaxVariableServiceAndroid.cs", |             "MaxSdk/Scripts/MaxVariableServiceAndroid.cs", | ||||||
|             "MaxSdk/Scripts/MaxVariableServiceAndroid.cs.meta", |             "MaxSdk/Scripts/MaxVariableServiceAndroid.cs.meta", | ||||||
|  | @ -64,7 +71,7 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|             "MaxSdk/Scripts/MaxVariableServiceUnityEditor.cs.meta" |             "MaxSdk/Scripts/MaxVariableServiceUnityEditor.cs.meta" | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         static MaxInitialize() |         static AppLovinInitialize() | ||||||
|         { |         { | ||||||
| #if UNITY_IOS | #if UNITY_IOS | ||||||
|             // Check that the publisher is targeting iOS 9.0+ |             // Check that the publisher is targeting iOS 9.0+ | ||||||
|  | @ -467,19 +467,37 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|         /// Checks whether or not an adapter with the given version or newer exists. |         /// Checks whether or not an adapter with the given version or newer exists. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="adapterName">The name of the network (the root adapter folder name in "MaxSdk/Mediation/" folder.</param> |         /// <param name="adapterName">The name of the network (the root adapter folder name in "MaxSdk/Mediation/" folder.</param> | ||||||
|         /// <param name="version">The min adapter version to check for. Can be <c>null</c> if we want to check for any version.</param> |         /// <param name="iosVersion">The min adapter version to check for. Can be <c>null</c> if we want to check for any version.</param> | ||||||
|         /// <returns><c>true</c> if an adapter with the min version is installed.</returns> |         /// <returns><c>true</c> if an adapter with the min version is installed.</returns> | ||||||
|         public static bool IsAdapterInstalled(string adapterName, string version = null) |         public static bool IsAdapterInstalled(string adapterName, string iosVersion = null) // TODO: Add Android version check. | ||||||
|         { |         { | ||||||
|             var dependencyFilePath = MaxSdkUtils.GetAssetPathForExportPath("MaxSdk/Mediation/" + adapterName + "/Editor/Dependencies.xml"); |             var dependencyFilePath = MaxSdkUtils.GetAssetPathForExportPath("MaxSdk/Mediation/" + adapterName + "/Editor/Dependencies.xml"); | ||||||
|             if (!File.Exists(dependencyFilePath)) return false; |             if (!File.Exists(dependencyFilePath)) return false; | ||||||
| 
 | 
 | ||||||
|             // If version is null, we just need the adapter installed. We don't have to check for a specific version. |             // If version is null, we just need the adapter installed. We don't have to check for a specific version. | ||||||
|             if (version == null) return true; |             if (iosVersion == null) return true; | ||||||
| 
 | 
 | ||||||
|             var currentVersion = AppLovinIntegrationManager.GetCurrentVersions(dependencyFilePath); |             var currentVersion = GetCurrentVersions(dependencyFilePath); | ||||||
|             var iosVersionComparison = MaxSdkUtils.CompareVersions(currentVersion.Ios, version); |             var iosVersionComparison = MaxSdkUtils.CompareVersions(currentVersion.Ios, iosVersion); | ||||||
|             return iosVersionComparison != MaxSdkUtils.VersionComparisonResult.Lesser; |             return iosVersionComparison != VersionComparisonResult.Lesser; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Checks whether or not an adapter older than the given version exists. | ||||||
|  |         /// | ||||||
|  |         /// TODO: Consolidate this method with <see cref="IsAdapterInstalled"/> and return a state enum. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="adapterName">The name of the network (the root adapter folder name in "MaxSdk/Mediation/" folder.</param> | ||||||
|  |         /// <param name="iosVersion">The adapter version to check for.</param> | ||||||
|  |         /// <returns><c>true</c> if an adapter older than the provided version is installed.</returns> | ||||||
|  |         public static bool IsAdapterOlderThanMinVersionInstalled(string adapterName, string iosVersion) // TODO: Add Android version check. | ||||||
|  |         { | ||||||
|  |             var dependencyFilePath = MaxSdkUtils.GetAssetPathForExportPath("MaxSdk/Mediation/" + adapterName + "/Editor/Dependencies.xml"); | ||||||
|  |             if (!File.Exists(dependencyFilePath)) return false; | ||||||
|  | 
 | ||||||
|  |             var currentVersion = GetCurrentVersions(dependencyFilePath); | ||||||
|  |             var iosVersionComparison = MaxSdkUtils.CompareVersions(currentVersion.Ios, iosVersion); | ||||||
|  |             return iosVersionComparison == VersionComparisonResult.Lesser; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         #region Utility Methods |         #region Utility Methods | ||||||
|  |  | ||||||
|  | @ -35,6 +35,9 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|         private const string qualityServiceRequiresGradleBuildErrorMsg = "AppLovin Quality Service integration via AppLovin Integration Manager requires Custom Gradle Template enabled or Unity 2018.2 or higher.\n" + |         private const string qualityServiceRequiresGradleBuildErrorMsg = "AppLovin Quality Service integration via AppLovin Integration Manager requires Custom Gradle Template enabled or Unity 2018.2 or higher.\n" + | ||||||
|                                                                          "If you would like to continue using your existing setup, please add Quality Service Plugin to your build.gradle manually."; |                                                                          "If you would like to continue using your existing setup, please add Quality Service Plugin to your build.gradle manually."; | ||||||
| 
 | 
 | ||||||
|  |         private const string customGradleVersionTooltip = "To set the version to 6.9.3, set the field to: https://services.gradle.org/distributions/gradle-6.9.3-bin.zip"; | ||||||
|  |         private const string customGradleToolsVersionTooltip = "To set the version to 4.2.0, set the field to: 4.2.0"; | ||||||
|  | 
 | ||||||
|         private readonly string[] termsFlowPlatforms = new string[3] {"Both", "Android", "iOS"}; |         private readonly string[] termsFlowPlatforms = new string[3] {"Both", "Android", "iOS"}; | ||||||
|         private readonly string[] debugUserGeographies = new string[2] {"Not Set", "GDPR"}; |         private readonly string[] debugUserGeographies = new string[2] {"Not Set", "GDPR"}; | ||||||
| 
 | 
 | ||||||
|  | @ -142,6 +145,26 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private void OnEnable() |         private void OnEnable() | ||||||
|  |         { | ||||||
|  |             // Script reloads can cause AppLovinSettings.Instance to be null for one frame, | ||||||
|  |             // so we load the Integration Manager on the following frame | ||||||
|  |             if (AppLovinSettings.Instance == null) | ||||||
|  |             { | ||||||
|  |                 AppLovinEditorCoroutine.StartCoroutine(WaitForNextFrameForEnable()); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 OnWindowEnabled(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private IEnumerator WaitForNextFrameForEnable() | ||||||
|  |         { | ||||||
|  |             yield return new WaitForEndOfFrame(); | ||||||
|  |             OnWindowEnabled(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void OnWindowEnabled() | ||||||
|         { |         { | ||||||
|             AppLovinIntegrationManager.downloadPluginProgressCallback = OnDownloadPluginProgress; |             AppLovinIntegrationManager.downloadPluginProgressCallback = OnDownloadPluginProgress; | ||||||
| 
 | 
 | ||||||
|  | @ -431,7 +454,7 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|         private void DrawNetworkDetailRow(Network network) |         private void DrawNetworkDetailRow(Network network) | ||||||
|         { |         { | ||||||
|             string action; |             string action; | ||||||
|             var currentVersion = network.CurrentVersions.Unity; |             var currentVersion = network.CurrentVersions != null ? network.CurrentVersions.Unity : ""; | ||||||
|             var latestVersion = network.LatestVersions.Unity; |             var latestVersion = network.LatestVersions.Unity; | ||||||
|             bool isActionEnabled; |             bool isActionEnabled; | ||||||
|             bool isInstalled; |             bool isInstalled; | ||||||
|  | @ -621,11 +644,12 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|             GUILayout.EndHorizontal(); |             GUILayout.EndHorizontal(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private string DrawTextField(string fieldTitle, string text, GUILayoutOption labelWidth, GUILayoutOption textFieldWidthOption = null, bool isTextFieldEditable = true) |         private string DrawTextField(string fieldTitle, string text, GUILayoutOption labelWidth, GUILayoutOption textFieldWidthOption = null, bool isTextFieldEditable = true, string tooltip = "") | ||||||
|         { |         { | ||||||
|             GUILayout.BeginHorizontal(); |             GUILayout.BeginHorizontal(); | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|             EditorGUILayout.LabelField(new GUIContent(fieldTitle), labelWidth); |             var guiContent = MaxSdkUtils.IsValidString(tooltip) ? new GUIContent(fieldTitle, tooltip) : new GUIContent(fieldTitle); | ||||||
|  |             EditorGUILayout.LabelField(guiContent, labelWidth); | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|             if (isTextFieldEditable) |             if (isTextFieldEditable) | ||||||
|             { |             { | ||||||
|  | @ -687,6 +711,7 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|                 AppLovinInternalSettings.Instance.ConsentFlowEnabled = true; |                 AppLovinInternalSettings.Instance.ConsentFlowEnabled = true; | ||||||
|                 AppLovinSettings.Instance.ConsentFlowEnabled = false; |                 AppLovinSettings.Instance.ConsentFlowEnabled = false; | ||||||
|             } |             } | ||||||
|  | 
 | ||||||
|             GUILayout.FlexibleSpace(); |             GUILayout.FlexibleSpace(); | ||||||
|             GUILayout.EndHorizontal(); |             GUILayout.EndHorizontal(); | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|  | @ -750,7 +775,6 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|                 Application.OpenURL(userTrackingUsageDescriptionDocsLink); |                 Application.OpenURL(userTrackingUsageDescriptionDocsLink); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|             GUILayout.EndHorizontal(); |             GUILayout.EndHorizontal(); | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|  | @ -782,6 +806,7 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|             { |             { | ||||||
|                 Application.OpenURL(documentationTermsAndPrivacyPolicyFlow); |                 Application.OpenURL(documentationTermsAndPrivacyPolicyFlow); | ||||||
|             } |             } | ||||||
|  | 
 | ||||||
|             GUILayout.Space(4); |             GUILayout.Space(4); | ||||||
|             GUILayout.EndHorizontal(); |             GUILayout.EndHorizontal(); | ||||||
| 
 | 
 | ||||||
|  | @ -880,6 +905,9 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|                 var verboseLoggingEnabled = DrawOtherSettingsToggle(EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, false), "  Enable Verbose Logging"); |                 var verboseLoggingEnabled = DrawOtherSettingsToggle(EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, false), "  Enable Verbose Logging"); | ||||||
|                 EditorPrefs.SetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, verboseLoggingEnabled); |                 EditorPrefs.SetBool(MaxSdkLogger.KeyVerboseLoggingEnabled, verboseLoggingEnabled); | ||||||
|                 GUILayout.Space(5); |                 GUILayout.Space(5); | ||||||
|  |                 AppLovinSettings.Instance.CustomGradleVersionUrl = DrawTextField("Custom Gradle Version URL", AppLovinSettings.Instance.CustomGradleVersionUrl, GUILayout.Width(privacySettingLabelWidth), privacySettingFieldWidthOption, tooltip: customGradleVersionTooltip); | ||||||
|  |                 AppLovinSettings.Instance.CustomGradleToolsVersion = DrawTextField("Custom Gradle Tools Version", AppLovinSettings.Instance.CustomGradleToolsVersion, GUILayout.Width(privacySettingLabelWidth), privacySettingFieldWidthOption, tooltip: customGradleToolsVersionTooltip); | ||||||
|  |                 EditorGUILayout.HelpBox("This will overwrite the gradle build tools version in your base gradle template.", MessageType.Info); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             GUILayout.Space(5); |             GUILayout.Space(5); | ||||||
|  |  | ||||||
|  | @ -1,10 +0,0 @@ | ||||||
| fileFormatVersion: 2 |  | ||||||
| guid: 028aec80942df459ab226487b786042c |  | ||||||
| labels: |  | ||||||
| - al_max |  | ||||||
| - al_max_export_path-MaxSdk/Scripts/IntegrationManager/Editor/AppLovinMenuItems.cs.backup |  | ||||||
| DefaultImporter: |  | ||||||
|   externalObjects: {} |  | ||||||
|   userData:  |  | ||||||
|   assetBundleName:  |  | ||||||
|   assetBundleVariant:  |  | ||||||
|  | @ -12,8 +12,8 @@ using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.IO; | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using System.Text.RegularExpressions; | ||||||
| using System.Xml.Linq; | using System.Xml.Linq; | ||||||
| using AppLovinMax.ThirdParty.MiniJson; |  | ||||||
| using UnityEditor; | using UnityEditor; | ||||||
| using UnityEditor.Android; | using UnityEditor.Android; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
|  | @ -23,7 +23,7 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// A post processor used to update the Android project once it is generated. |     /// A post processor used to update the Android project once it is generated. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public class MaxPostProcessBuildAndroid : IPostGenerateGradleAndroidProject |     public class AppLovinPostProcessAndroid : IPostGenerateGradleAndroidProject | ||||||
|     { |     { | ||||||
| #if UNITY_2019_3_OR_NEWER | #if UNITY_2019_3_OR_NEWER | ||||||
|         private const string PropertyAndroidX = "android.useAndroidX"; |         private const string PropertyAndroidX = "android.useAndroidX"; | ||||||
|  | @ -36,7 +36,23 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|         private const string KeyMetaDataAppLovinSdkKey = "applovin.sdk.key"; |         private const string KeyMetaDataAppLovinSdkKey = "applovin.sdk.key"; | ||||||
|         private const string KeyMetaDataAppLovinVerboseLoggingOn = "applovin.sdk.verbose_logging"; |         private const string KeyMetaDataAppLovinVerboseLoggingOn = "applovin.sdk.verbose_logging"; | ||||||
|         private const string KeyMetaDataGoogleApplicationId = "com.google.android.gms.ads.APPLICATION_ID"; |         private const string KeyMetaDataGoogleApplicationId = "com.google.android.gms.ads.APPLICATION_ID"; | ||||||
|         private const string KeyMetaDataGoogleAdManagerApp = "com.google.android.gms.ads.AD_MANAGER_APP"; |         private const string KeyMetaDataGoogleOptimizeInitialization = "com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"; | ||||||
|  |         private const string KeyMetaDataGoogleOptimizeAdLoading = "com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"; | ||||||
|  | 
 | ||||||
|  |         private const string KeyMetaDataMobileFuseAutoInit = "com.mobilefuse.sdk.disable_auto_init"; | ||||||
|  |         private const string KeyMetaDataMyTargetAutoInit = "com.my.target.autoInitMode"; | ||||||
|  | 
 | ||||||
|  | #if UNITY_2022_3_OR_NEWER | ||||||
|  |         // To match "'com.android.library' version '7.3.1'" line in build.gradle | ||||||
|  |         private static readonly Regex TokenGradleVersionLibrary = new Regex(".*id ['\"]com\\.android\\.library['\"] version"); | ||||||
|  |         private static readonly Regex TokenGradleVersion = new Regex(".*id ['\"]com\\.android\\.application['\"] version"); | ||||||
|  | #else | ||||||
|  |         // To match "classpath 'com.android.tools.build:gradle:4.0.1'" line in build.gradle | ||||||
|  |         private static readonly Regex TokenGradleVersion = new Regex(".*classpath ['\"]com\\.android\\.tools\\.build:gradle:.*"); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |         // To match "distributionUrl=..." in gradle-wrapper.properties file | ||||||
|  |         private static readonly Regex TokenDistributionUrl = new Regex(".*distributionUrl.*"); | ||||||
| 
 | 
 | ||||||
|         private static readonly XNamespace AndroidNamespace = "http://schemas.android.com/apk/res/android"; |         private static readonly XNamespace AndroidNamespace = "http://schemas.android.com/apk/res/android"; | ||||||
| 
 | 
 | ||||||
|  | @ -52,10 +68,17 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|         public void OnPostGenerateGradleAndroidProject(string path) |         public void OnPostGenerateGradleAndroidProject(string path) | ||||||
|         { |         { | ||||||
| #if UNITY_2019_3_OR_NEWER | #if UNITY_2019_3_OR_NEWER | ||||||
|  |             var rootGradleBuildFilePath = Path.Combine(path, "../build.gradle"); | ||||||
|             var gradlePropertiesPath = Path.Combine(path, "../gradle.properties"); |             var gradlePropertiesPath = Path.Combine(path, "../gradle.properties"); | ||||||
|  |             var gradleWrapperPropertiesPath = Path.Combine(path, "../gradle/wrapper/gradle-wrapper.properties"); | ||||||
| #else | #else | ||||||
|  |             var rootGradleBuildFilePath = Path.Combine(path, "build.gradle"); | ||||||
|             var gradlePropertiesPath = Path.Combine(path, "gradle.properties"); |             var gradlePropertiesPath = Path.Combine(path, "gradle.properties"); | ||||||
|  |             var gradleWrapperPropertiesPath = Path.Combine(path, "gradle/wrapper/gradle-wrapper.properties"); | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  |             UpdateGradleVersionsIfNeeded(gradleWrapperPropertiesPath, rootGradleBuildFilePath); | ||||||
|  | 
 | ||||||
|             var gradlePropertiesUpdated = new List<string>(); |             var gradlePropertiesUpdated = new List<string>(); | ||||||
| 
 | 
 | ||||||
|             // If the gradle properties file already exists, make sure to add any previous properties. |             // If the gradle properties file already exists, make sure to add any previous properties. | ||||||
|  | @ -144,6 +167,8 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|             AddSdkKeyIfNeeded(elementApplication); |             AddSdkKeyIfNeeded(elementApplication); | ||||||
|             EnableVerboseLoggingIfNeeded(elementApplication); |             EnableVerboseLoggingIfNeeded(elementApplication); | ||||||
|             AddGoogleApplicationIdIfNeeded(elementApplication, metaDataElements); |             AddGoogleApplicationIdIfNeeded(elementApplication, metaDataElements); | ||||||
|  |             AddGoogleOptimizationFlagsIfNeeded(elementApplication, metaDataElements); | ||||||
|  |             DisableAutoInitIfNeeded(elementApplication, metaDataElements); | ||||||
| 
 | 
 | ||||||
|             // Save the updated manifest file. |             // Save the updated manifest file. | ||||||
|             manifest.Save(manifestPath); |             manifest.Save(manifestPath); | ||||||
|  | @ -235,6 +260,101 @@ namespace AppLovinMax.Scripts.Editor | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         private static void AddGoogleOptimizationFlagsIfNeeded(XElement elementApplication, IEnumerable<XElement> metaDataElements) | ||||||
|  |         { | ||||||
|  |             if (!AppLovinIntegrationManager.IsAdapterInstalled("Google") && !AppLovinIntegrationManager.IsAdapterInstalled("GoogleAdManager")) return; | ||||||
|  | 
 | ||||||
|  |             var googleOptimizeInitializationMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataGoogleOptimizeInitialization); | ||||||
|  |             // If meta data doesn't exist, add it | ||||||
|  |             if (googleOptimizeInitializationMetaData == null) | ||||||
|  |             { | ||||||
|  |                 elementApplication.Add(CreateMetaDataElement(KeyMetaDataGoogleOptimizeInitialization, true)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var googleOptimizeAdLoadingMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataGoogleOptimizeAdLoading); | ||||||
|  |             // If meta data doesn't exist, add it | ||||||
|  |             if (googleOptimizeAdLoadingMetaData == null) | ||||||
|  |             { | ||||||
|  |                 elementApplication.Add(CreateMetaDataElement(KeyMetaDataGoogleOptimizeAdLoading, true)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void DisableAutoInitIfNeeded(XElement elementApplication, IEnumerable<XElement> metaDataElements) | ||||||
|  |         { | ||||||
|  |             if (AppLovinIntegrationManager.IsAdapterInstalled("MobileFuse")) | ||||||
|  |             { | ||||||
|  |                 var mobileFuseMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataMobileFuseAutoInit); | ||||||
|  |                 // If MobileFuse meta data doesn't exist, add it | ||||||
|  |                 if (mobileFuseMetaData == null) | ||||||
|  |                 { | ||||||
|  |                     elementApplication.Add(CreateMetaDataElement(KeyMetaDataMobileFuseAutoInit, true)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (AppLovinIntegrationManager.IsAdapterInstalled("MyTarget")) | ||||||
|  |             { | ||||||
|  |                 var myTargetMetaData = GetMetaDataElement(metaDataElements, KeyMetaDataMyTargetAutoInit); | ||||||
|  |                 // If MyTarget meta data doesn't exist, add it | ||||||
|  |                 if (myTargetMetaData == null) | ||||||
|  |                 { | ||||||
|  |                     elementApplication.Add(CreateMetaDataElement(KeyMetaDataMyTargetAutoInit, 0)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void UpdateGradleVersionsIfNeeded(string gradleWrapperPropertiesPath, string rootGradleBuildFilePath) | ||||||
|  |         { | ||||||
|  |             var customGradleVersionUrl = AppLovinSettings.Instance.CustomGradleVersionUrl; | ||||||
|  |             var customGradleToolsVersion = AppLovinSettings.Instance.CustomGradleToolsVersion; | ||||||
|  | 
 | ||||||
|  |             if (MaxSdkUtils.IsValidString(customGradleVersionUrl)) | ||||||
|  |             { | ||||||
|  |                 var newDistributionUrl = string.Format("distributionUrl={0}", customGradleVersionUrl); | ||||||
|  |                 if (ReplaceStringInFile(gradleWrapperPropertiesPath, TokenDistributionUrl, newDistributionUrl)) | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.D("Distribution url set to " + newDistributionUrl); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.E("Failed to set distribution URL"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (MaxSdkUtils.IsValidString(customGradleToolsVersion)) | ||||||
|  |             { | ||||||
|  | #if UNITY_2022_3_OR_NEWER | ||||||
|  |                 // Unity 2022.3+ requires Gradle Plugin version 7.1.2+. | ||||||
|  |                 if (MaxSdkUtils.CompareVersions(customGradleToolsVersion, "7.1.2") == MaxSdkUtils.VersionComparisonResult.Lesser) | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.E("Failed to set gradle plugin version. Unity 2022.3+ requires gradle plugin version 7.1.2+"); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 var newGradleVersionLibraryLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("id 'com.android.library' version '{0}' apply false", customGradleToolsVersion)); | ||||||
|  |                 if (ReplaceStringInFile(rootGradleBuildFilePath, TokenGradleVersionLibrary, newGradleVersionLibraryLine)) | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.D("Gradle library version set to " + newGradleVersionLibraryLine); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.E("Failed to set gradle library version"); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 var newGradleVersionLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("id 'com.android.application' version '{0}' apply false", customGradleToolsVersion)); | ||||||
|  | #else | ||||||
|  |                 var newGradleVersionLine = AppLovinProcessGradleBuildFile.GetFormattedBuildScriptLine(string.Format("classpath 'com.android.tools.build:gradle:{0}'", customGradleToolsVersion)); | ||||||
|  | #endif | ||||||
|  |                 if (ReplaceStringInFile(rootGradleBuildFilePath, TokenGradleVersion, newGradleVersionLine)) | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.D("Gradle version set to " + newGradleVersionLine); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.E("Failed to set gradle plugin version"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Creates and returns a <c>meta-data</c> element with the given name and value.  |         /// Creates and returns a <c>meta-data</c> element with the given name and value.  | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | @ -265,6 +385,31 @@ namespace AppLovinMax.Scripts.Editor | ||||||
| 
 | 
 | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Finds the first line that contains regexToMatch and replaces the whole line with replacement | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="path">Path to the file you want to replace a line in</param> | ||||||
|  |         /// <param name="regexToMatch">Regex to search for in the line you want to replace</param> | ||||||
|  |         /// <param name="replacement">String that you want as the new line</param> | ||||||
|  |         /// <returns>Returns whether the string was successfully replaced or not</returns> | ||||||
|  |         private static bool ReplaceStringInFile(string path, Regex regexToMatch, string replacement) | ||||||
|  |         { | ||||||
|  |             if (!File.Exists(path)) return false; | ||||||
|  | 
 | ||||||
|  |             var lines = File.ReadAllLines(path); | ||||||
|  |             for (var i = 0; i < lines.Length; i++) | ||||||
|  |             { | ||||||
|  |                 if (regexToMatch.IsMatch(lines[i])) | ||||||
|  |                 { | ||||||
|  |                     lines[i] = replacement; | ||||||
|  |                     File.WriteAllLines(path, lines); | ||||||
|  |                     return true; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -8,25 +8,107 @@ | ||||||
| 
 | 
 | ||||||
| #if UNITY_IOS || UNITY_IPHONE | #if UNITY_IOS || UNITY_IPHONE | ||||||
| 
 | 
 | ||||||
| using System.Text; | using System; | ||||||
| using UnityEngine.Networking; | using System.Collections.Generic; | ||||||
| using Debug = UnityEngine.Debug; |  | ||||||
| using System.IO; | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
| using UnityEditor; | using UnityEditor; | ||||||
| using UnityEditor.Callbacks; | using UnityEditor.Callbacks; | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  | using UnityEditor.iOS.Xcode.Extensions; | ||||||
|  | #endif | ||||||
|  | using UnityEditor.iOS.Xcode; | ||||||
|  | using UnityEngine; | ||||||
|  | using Debug = UnityEngine.Debug; | ||||||
|  | using UnityEngine.Networking; | ||||||
| 
 | 
 | ||||||
| namespace AppLovinMax.Scripts.IntegrationManager.Editor | namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
| { | { | ||||||
|     /// <summary> |     [Serializable] | ||||||
|     /// Adds AppLovin Quality Service to the iOS project once the project has been exported. |     public class SkAdNetworkData | ||||||
|     /// |     { | ||||||
|     /// 1. Downloads the Quality Service ruby script. |         [SerializeField] public string[] SkAdNetworkIds; | ||||||
|     /// 2. Runs the script using Ruby which integrates AppLovin Quality Service to the project. |     } | ||||||
|     /// </summary> | 
 | ||||||
|     public class AppLovinPostProcessiOS |     public class AppLovinPostProcessiOS | ||||||
|     { |     { | ||||||
|         private const string OutputFileName = "AppLovinQualityServiceSetup.rb"; |         private const string OutputFileName = "AppLovinQualityServiceSetup.rb"; | ||||||
| 
 | 
 | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  |         private const string TargetUnityIphonePodfileLine = "target 'Unity-iPhone' do"; | ||||||
|  |         private const string UseFrameworksPodfileLine = "use_frameworks!"; | ||||||
|  |         private const string UseFrameworksDynamicPodfileLine = "use_frameworks! :linkage => :dynamic"; | ||||||
|  |         private const string UseFrameworksStaticPodfileLine = "use_frameworks! :linkage => :static"; | ||||||
|  | #else | ||||||
|  |         private const string UnityMainTargetName = "Unity-iPhone"; | ||||||
|  | #endif | ||||||
|  |         private const string LegacyResourcesDirectoryName = "Resources"; | ||||||
|  |         private const string AppLovinMaxResourcesDirectoryName = "AppLovinMAXResources"; | ||||||
|  |         private const string AppLovinAdvertisingAttributionEndpoint = "https://postbacks-app.com"; | ||||||
|  | 
 | ||||||
|  |         private const string AppLovinSettingsPlistFileName = "AppLovin-Settings.plist"; | ||||||
|  |         private const string KeyConsentFlowInfo = "ConsentFlowInfo"; | ||||||
|  |         private const string KeyConsentFlowEnabled = "ConsentFlowEnabled"; | ||||||
|  |         private const string KeyConsentFlowTermsOfService = "ConsentFlowTermsOfService"; | ||||||
|  |         private const string KeyConsentFlowPrivacyPolicy = "ConsentFlowPrivacyPolicy"; | ||||||
|  |         private const string KeyConsentFlowDebugUserGeography = "ConsentFlowDebugUserGeography"; | ||||||
|  | 
 | ||||||
|  |         private static List<string> DynamicLibrariesToEmbed | ||||||
|  |         { | ||||||
|  |             get | ||||||
|  |             { | ||||||
|  |                 var dynamicLibrariesToEmbed = new List<string> | ||||||
|  |                 { | ||||||
|  |                     "AppLovinSDK.xcframework", | ||||||
|  |                     "DTBiOSSDK.xcframework", | ||||||
|  |                     "FBAEMKit.xcframework", | ||||||
|  |                     "FBSDKCoreKit_Basics.xcframework", | ||||||
|  |                     "FBSDKCoreKit.xcframework", | ||||||
|  |                     "FBSDKGamingServicesKit.xcframework", | ||||||
|  |                     "FBSDKLoginKit.xcframework", | ||||||
|  |                     "FBSDKShareKit.xcframework", | ||||||
|  |                     "HyprMX.xcframework", | ||||||
|  |                     "Maio.xcframework", | ||||||
|  |                     "MobileFuseSDK.xcframework", | ||||||
|  |                     "MolocoSDK.xcframework", | ||||||
|  |                     "OMSDK_Appodeal.xcframework", | ||||||
|  |                     "OMSDK_Ogury.xcframework", | ||||||
|  |                     "OMSDK_Pubnativenet.xcframework", | ||||||
|  |                     "OMSDK_Smaato.xcframework" | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 // LinkedIn Audience Network SDK is distributed as a static library starting version 1.2.0 | ||||||
|  |                 if (AppLovinIntegrationManager.IsAdapterOlderThanMinVersionInstalled("LinkedIn", "1.2.0.0")) | ||||||
|  |                 { | ||||||
|  |                     dynamicLibrariesToEmbed.Add("LinkedinAudienceNetwork.xcframework"); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // Fyber/IA SDK is distributed as a static library starting version 8.2.7 | ||||||
|  |                 if (AppLovinIntegrationManager.IsAdapterOlderThanMinVersionInstalled("Fyber", "8.2.7.0")) | ||||||
|  |                 { | ||||||
|  |                     dynamicLibrariesToEmbed.Add("IASDKCore.xcframework"); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 return dynamicLibrariesToEmbed; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static string PluginMediationDirectory | ||||||
|  |         { | ||||||
|  |             get | ||||||
|  |             { | ||||||
|  |                 var pluginParentDir = AppLovinIntegrationManager.MediationSpecificPluginParentDirectory; | ||||||
|  |                 return Path.Combine(pluginParentDir, "MaxSdk/Mediation/"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Adds AppLovin Quality Service to the iOS project once the project has been exported. | ||||||
|  |         /// | ||||||
|  |         /// 1. Downloads the Quality Service ruby script. | ||||||
|  |         /// 2. Runs the script using Ruby which integrates AppLovin Quality Service to the project. | ||||||
|  |         /// </summary> | ||||||
|         [PostProcessBuild(int.MaxValue)] // We want to run Quality Service script last. |         [PostProcessBuild(int.MaxValue)] // We want to run Quality Service script last. | ||||||
|         public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath) |         public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath) | ||||||
|         { |         { | ||||||
|  | @ -92,6 +174,537 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|                 MaxSdkLogger.UserDebug(result.Message); |                 MaxSdkLogger.UserDebug(result.Message); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         [PostProcessBuildAttribute(int.MaxValue)] | ||||||
|  |         public static void MaxPostProcessPbxProject(BuildTarget buildTarget, string buildPath) | ||||||
|  |         { | ||||||
|  |             var projectPath = PBXProject.GetPBXProjectPath(buildPath); | ||||||
|  |             var project = new PBXProject(); | ||||||
|  |             project.ReadFromFile(projectPath); | ||||||
|  | 
 | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  |             var unityMainTargetGuid = project.GetUnityMainTargetGuid(); | ||||||
|  |             var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid(); | ||||||
|  | #else | ||||||
|  |             var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); | ||||||
|  |             var unityFrameworkTargetGuid = project.TargetGuidByName(UnityMainTargetName); | ||||||
|  | #endif | ||||||
|  |             EmbedDynamicLibrariesIfNeeded(buildPath, project, unityMainTargetGuid); | ||||||
|  | 
 | ||||||
|  |             var internalSettingsEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled; | ||||||
|  |             var userTrackingUsageDescriptionDe = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionDe : AppLovinSettings.Instance.UserTrackingUsageDescriptionDe; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionDe, "de", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionEn = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn : AppLovinSettings.Instance.UserTrackingUsageDescriptionEn; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionEn, "en", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionEs = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEs : AppLovinSettings.Instance.UserTrackingUsageDescriptionEs; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionEs, "es", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionFr = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionFr : AppLovinSettings.Instance.UserTrackingUsageDescriptionFr; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionFr, "fr", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionJa = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionJa : AppLovinSettings.Instance.UserTrackingUsageDescriptionJa; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionJa, "ja", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionKo = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionKo : AppLovinSettings.Instance.UserTrackingUsageDescriptionKo; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionKo, "ko", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionZhHans = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHans : AppLovinSettings.Instance.UserTrackingUsageDescriptionZhHans; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionZhHans, "zh-Hans", buildPath, project, unityMainTargetGuid); | ||||||
|  |             var userTrackingUsageDescriptionZhHant = internalSettingsEnabled ? AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionZhHant : AppLovinSettings.Instance.UserTrackingUsageDescriptionZhHant; | ||||||
|  |             LocalizeUserTrackingDescriptionIfNeeded(userTrackingUsageDescriptionZhHant, "zh-Hant", buildPath, project, unityMainTargetGuid); | ||||||
|  | 
 | ||||||
|  |             AddSwiftSupport(buildPath, project, unityFrameworkTargetGuid, unityMainTargetGuid); | ||||||
|  |             AddYandexSettingsIfNeeded(project, unityMainTargetGuid); | ||||||
|  | 
 | ||||||
|  |             project.WriteToFile(projectPath); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void EmbedDynamicLibrariesIfNeeded(string buildPath, PBXProject project, string targetGuid) | ||||||
|  |         { | ||||||
|  |             // Check that the Pods directory exists (it might not if a publisher is building with Generate Podfile setting disabled in EDM). | ||||||
|  |             var podsDirectory = Path.Combine(buildPath, "Pods"); | ||||||
|  |             if (!Directory.Exists(podsDirectory)) return; | ||||||
|  | 
 | ||||||
|  |             var dynamicLibraryPathsPresentInProject = new List<string>(); | ||||||
|  |             foreach (var dynamicLibraryToSearch in DynamicLibrariesToEmbed) | ||||||
|  |             { | ||||||
|  |                 // both .framework and .xcframework are directories, not files | ||||||
|  |                 var directories = Directory.GetDirectories(podsDirectory, dynamicLibraryToSearch, SearchOption.AllDirectories); | ||||||
|  |                 if (directories.Length <= 0) continue; | ||||||
|  | 
 | ||||||
|  |                 var dynamicLibraryAbsolutePath = directories[0]; | ||||||
|  |                 var index = dynamicLibraryAbsolutePath.LastIndexOf("Pods"); | ||||||
|  |                 var relativePath = dynamicLibraryAbsolutePath.Substring(index); | ||||||
|  |                 dynamicLibraryPathsPresentInProject.Add(relativePath); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (dynamicLibraryPathsPresentInProject.Count <= 0) return; | ||||||
|  | 
 | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  |             if (ShouldEmbedDynamicLibraries(buildPath)) | ||||||
|  |             { | ||||||
|  |                 foreach (var dynamicLibraryPath in dynamicLibraryPathsPresentInProject) | ||||||
|  |                 { | ||||||
|  |                     var fileGuid = project.AddFile(dynamicLibraryPath, dynamicLibraryPath); | ||||||
|  |                     project.AddFileToEmbedFrameworks(targetGuid, fileGuid); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | #else | ||||||
|  |             string runpathSearchPaths; | ||||||
|  |             runpathSearchPaths = project.GetBuildPropertyForAnyConfig(targetGuid, "LD_RUNPATH_SEARCH_PATHS"); | ||||||
|  |             runpathSearchPaths += string.IsNullOrEmpty(runpathSearchPaths) ? "" : " "; | ||||||
|  | 
 | ||||||
|  |             // Check if runtime search paths already contains the required search paths for dynamic libraries. | ||||||
|  |             if (runpathSearchPaths.Contains("@executable_path/Frameworks")) return; | ||||||
|  | 
 | ||||||
|  |             runpathSearchPaths += "@executable_path/Frameworks"; | ||||||
|  |             project.SetBuildProperty(targetGuid, "LD_RUNPATH_SEARCH_PATHS", runpathSearchPaths); | ||||||
|  | #endif | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void LocalizeUserTrackingDescriptionIfNeeded(string localizedUserTrackingDescription, string localeCode, string buildPath, PBXProject project, string targetGuid) | ||||||
|  |         { | ||||||
|  |             // Use the legacy resources directory name if the build is being appended (the "Resources" directory already exists if it is an incremental build). | ||||||
|  |             var resourcesDirectoryName = Directory.Exists(Path.Combine(buildPath, LegacyResourcesDirectoryName)) ? LegacyResourcesDirectoryName : AppLovinMaxResourcesDirectoryName; | ||||||
|  |             var resourcesDirectoryPath = Path.Combine(buildPath, resourcesDirectoryName); | ||||||
|  |             var localeSpecificDirectoryName = localeCode + ".lproj"; | ||||||
|  |             var localeSpecificDirectoryPath = Path.Combine(resourcesDirectoryPath, localeSpecificDirectoryName); | ||||||
|  |             var infoPlistStringsFilePath = Path.Combine(localeSpecificDirectoryPath, "InfoPlist.strings"); | ||||||
|  | 
 | ||||||
|  |             // Check if localization has been disabled between builds, and remove them as needed. | ||||||
|  |             if (ShouldRemoveLocalization(localizedUserTrackingDescription)) | ||||||
|  |             { | ||||||
|  |                 if (!File.Exists(infoPlistStringsFilePath)) return; | ||||||
|  | 
 | ||||||
|  |                 File.Delete(infoPlistStringsFilePath); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // Create intermediate directories as needed. | ||||||
|  |             if (!Directory.Exists(resourcesDirectoryPath)) | ||||||
|  |             { | ||||||
|  |                 Directory.CreateDirectory(resourcesDirectoryPath); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (!Directory.Exists(localeSpecificDirectoryPath)) | ||||||
|  |             { | ||||||
|  |                 Directory.CreateDirectory(localeSpecificDirectoryPath); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var localizedDescriptionLine = "\"NSUserTrackingUsageDescription\" = \"" + localizedUserTrackingDescription + "\";\n"; | ||||||
|  |             // File already exists, update it in case the value changed between builds. | ||||||
|  |             if (File.Exists(infoPlistStringsFilePath)) | ||||||
|  |             { | ||||||
|  |                 var output = new List<string>(); | ||||||
|  |                 var lines = File.ReadAllLines(infoPlistStringsFilePath); | ||||||
|  |                 var keyUpdated = false; | ||||||
|  |                 foreach (var line in lines) | ||||||
|  |                 { | ||||||
|  |                     if (line.Contains("NSUserTrackingUsageDescription")) | ||||||
|  |                     { | ||||||
|  |                         output.Add(localizedDescriptionLine); | ||||||
|  |                         keyUpdated = true; | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         output.Add(line); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (!keyUpdated) | ||||||
|  |                 { | ||||||
|  |                     output.Add(localizedDescriptionLine); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 File.WriteAllText(infoPlistStringsFilePath, string.Join("\n", output.ToArray()) + "\n"); | ||||||
|  |             } | ||||||
|  |             // File doesn't exist, create one. | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 File.WriteAllText(infoPlistStringsFilePath, "/* Localized versions of Info.plist keys - Generated by AL MAX plugin */\n" + localizedDescriptionLine); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var localeSpecificDirectoryRelativePath = Path.Combine(resourcesDirectoryName, localeSpecificDirectoryName); | ||||||
|  |             var guid = project.AddFolderReference(localeSpecificDirectoryRelativePath, localeSpecificDirectoryRelativePath); | ||||||
|  |             project.AddFileToBuild(targetGuid, guid); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static bool ShouldRemoveLocalization(string localizedUserTrackingDescription) | ||||||
|  |         { | ||||||
|  |             if (string.IsNullOrEmpty(localizedUserTrackingDescription)) return true; | ||||||
|  | 
 | ||||||
|  |             var settings = AppLovinSettings.Instance; | ||||||
|  |             var internalSettings = AppLovinInternalSettings.Instance; | ||||||
|  | 
 | ||||||
|  |             return (!internalSettings.ConsentFlowEnabled || !internalSettings.UserTrackingUsageLocalizationEnabled) | ||||||
|  |                    && (!settings.ConsentFlowEnabled || !settings.UserTrackingUsageLocalizationEnabled); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void AddSwiftSupport(string buildPath, PBXProject project, string unityFrameworkTargetGuid, string unityMainTargetGuid) | ||||||
|  |         { | ||||||
|  |             var swiftFileRelativePath = "Classes/MAXSwiftSupport.swift"; | ||||||
|  |             var swiftFilePath = Path.Combine(buildPath, swiftFileRelativePath); | ||||||
|  | 
 | ||||||
|  |             // Add Swift file | ||||||
|  |             CreateSwiftFile(swiftFilePath); | ||||||
|  |             var swiftFileGuid = project.AddFile(swiftFileRelativePath, swiftFileRelativePath, PBXSourceTree.Source); | ||||||
|  |             project.AddFileToBuild(unityFrameworkTargetGuid, swiftFileGuid); | ||||||
|  | 
 | ||||||
|  |             // Add Swift version property if needed | ||||||
|  |             var swiftVersion = project.GetBuildPropertyForAnyConfig(unityFrameworkTargetGuid, "SWIFT_VERSION"); | ||||||
|  |             if (string.IsNullOrEmpty(swiftVersion)) | ||||||
|  |             { | ||||||
|  |                 project.SetBuildProperty(unityFrameworkTargetGuid, "SWIFT_VERSION", "5.0"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // Enable Swift modules | ||||||
|  |             project.AddBuildProperty(unityFrameworkTargetGuid, "CLANG_ENABLE_MODULES", "YES"); | ||||||
|  |             project.AddBuildProperty(unityMainTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void CreateSwiftFile(string swiftFilePath) | ||||||
|  |         { | ||||||
|  |             if (File.Exists(swiftFilePath)) return; | ||||||
|  | 
 | ||||||
|  |             // Create a file to write to. | ||||||
|  |             using (var writer = File.CreateText(swiftFilePath)) | ||||||
|  |             { | ||||||
|  |                 writer.WriteLine("//\n//  MAXSwiftSupport.swift\n//"); | ||||||
|  |                 writer.WriteLine("\nimport Foundation\n"); | ||||||
|  |                 writer.WriteLine("// This file ensures the project includes Swift support."); | ||||||
|  |                 writer.WriteLine("// It is automatically generated by the MAX Unity Plugin."); | ||||||
|  |                 writer.Close(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [PostProcessBuildAttribute(int.MaxValue)] | ||||||
|  |         public static void MaxPostProcessPlist(BuildTarget buildTarget, string path) | ||||||
|  |         { | ||||||
|  |             var plistPath = Path.Combine(path, "Info.plist"); | ||||||
|  |             var plist = new PlistDocument(); | ||||||
|  |             plist.ReadFromFile(plistPath); | ||||||
|  | 
 | ||||||
|  |             SetSdkKeyIfNeeded(plist); | ||||||
|  |             SetAttributionReportEndpointIfNeeded(plist); | ||||||
|  | 
 | ||||||
|  |             EnableVerboseLoggingIfNeeded(plist); | ||||||
|  |             AddGoogleApplicationIdIfNeeded(plist); | ||||||
|  | 
 | ||||||
|  |             AddSdkSettingsIfNeeded(plist, path); | ||||||
|  |             EnableTermsFlowIfNeeded(plist); | ||||||
|  |             AddSkAdNetworksInfoIfNeeded(plist); | ||||||
|  | 
 | ||||||
|  |             plist.WriteToFile(plistPath); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void SetSdkKeyIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             var sdkKey = AppLovinSettings.Instance.SdkKey; | ||||||
|  |             if (string.IsNullOrEmpty(sdkKey)) return; | ||||||
|  | 
 | ||||||
|  |             const string AppLovinVerboseLoggingOnKey = "AppLovinSdkKey"; | ||||||
|  |             plist.root.SetString(AppLovinVerboseLoggingOnKey, sdkKey); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void SetAttributionReportEndpointIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             if (AppLovinSettings.Instance.SetAttributionReportEndpoint) | ||||||
|  |             { | ||||||
|  |                 plist.root.SetString("NSAdvertisingAttributionReportEndpoint", AppLovinAdvertisingAttributionEndpoint); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 PlistElement attributionReportEndPoint; | ||||||
|  |                 plist.root.values.TryGetValue("NSAdvertisingAttributionReportEndpoint", out attributionReportEndPoint); | ||||||
|  | 
 | ||||||
|  |                 // Check if we had previously set the attribution endpoint and un-set it. | ||||||
|  |                 if (attributionReportEndPoint != null && AppLovinAdvertisingAttributionEndpoint.Equals(attributionReportEndPoint.AsString())) | ||||||
|  |                 { | ||||||
|  |                     plist.root.values.Remove("NSAdvertisingAttributionReportEndpoint"); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void EnableVerboseLoggingIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             if (!EditorPrefs.HasKey(MaxSdkLogger.KeyVerboseLoggingEnabled)) return; | ||||||
|  | 
 | ||||||
|  |             var enabled = EditorPrefs.GetBool(MaxSdkLogger.KeyVerboseLoggingEnabled); | ||||||
|  |             const string AppLovinVerboseLoggingOnKey = "AppLovinVerboseLoggingOn"; | ||||||
|  |             if (enabled) | ||||||
|  |             { | ||||||
|  |                 plist.root.SetBoolean(AppLovinVerboseLoggingOnKey, enabled); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 plist.root.values.Remove(AppLovinVerboseLoggingOnKey); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void AddGoogleApplicationIdIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             if (!AppLovinIntegrationManager.IsAdapterInstalled("Google") && !AppLovinIntegrationManager.IsAdapterInstalled("GoogleAdManager")) return; | ||||||
|  | 
 | ||||||
|  |             const string googleApplicationIdentifier = "GADApplicationIdentifier"; | ||||||
|  |             var appId = AppLovinSettings.Instance.AdMobIosAppId; | ||||||
|  |             // Log error if the App ID is not set. | ||||||
|  |             if (string.IsNullOrEmpty(appId) || !appId.StartsWith("ca-app-pub-")) | ||||||
|  |             { | ||||||
|  |                 Debug.LogError("[AppLovin MAX] Google App ID is not set. Please enter a valid app ID within the AppLovin Integration Manager window."); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             plist.root.SetString(googleApplicationIdentifier, appId); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void AddYandexSettingsIfNeeded(PBXProject project, string unityMainTargetGuid) | ||||||
|  |         { | ||||||
|  |             if (!AppLovinIntegrationManager.IsAdapterInstalled("Yandex")) return; | ||||||
|  | 
 | ||||||
|  |             if (MaxSdkUtils.CompareVersions(PlayerSettings.iOS.targetOSVersionString, "12.0") == MaxSdkUtils.VersionComparisonResult.Lesser) | ||||||
|  |             { | ||||||
|  |                 Debug.LogWarning("Your iOS target version is under the minimum required version by Yandex. Please update it to 12.0 or newer in your ProjectSettings and rebuild your project."); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             project.SetBuildProperty(unityMainTargetGuid, "GENERATE_INFOPLIST_FILE", "NO"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void AddSdkSettingsIfNeeded(PlistDocument infoPlist, string buildPath) | ||||||
|  |         { | ||||||
|  |             // Right now internal settings is only needed for Consent Flow. Remove this setting once we add more settings. | ||||||
|  |             if (!AppLovinInternalSettings.Instance.ConsentFlowEnabled) return; | ||||||
|  | 
 | ||||||
|  |             var sdkSettingsPlistPath = Path.Combine(buildPath, AppLovinSettingsPlistFileName); | ||||||
|  |             var sdkSettingsPlist = new PlistDocument(); | ||||||
|  |             if (File.Exists(sdkSettingsPlistPath)) | ||||||
|  |             { | ||||||
|  |                 sdkSettingsPlist.ReadFromFile(sdkSettingsPlistPath); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             EnableConsentFlowIfNeeded(sdkSettingsPlist, infoPlist); | ||||||
|  | 
 | ||||||
|  |             sdkSettingsPlist.WriteToFile(sdkSettingsPlistPath); | ||||||
|  | 
 | ||||||
|  |             var projectPath = PBXProject.GetPBXProjectPath(buildPath); | ||||||
|  |             var project = new PBXProject(); | ||||||
|  |             project.ReadFromFile(projectPath); | ||||||
|  | 
 | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  |             var unityMainTargetGuid = project.GetUnityMainTargetGuid(); | ||||||
|  | #else | ||||||
|  |             var unityMainTargetGuid = project.TargetGuidByName(UnityMainTargetName); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |             var guid = project.AddFile(AppLovinSettingsPlistFileName, AppLovinSettingsPlistFileName, PBXSourceTree.Source); | ||||||
|  |             project.AddFileToBuild(unityMainTargetGuid, guid); | ||||||
|  |             project.WriteToFile(projectPath); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void EnableConsentFlowIfNeeded(PlistDocument applovinSettingsPlist, PlistDocument infoPlist) | ||||||
|  |         { | ||||||
|  |             var consentFlowEnabled = AppLovinInternalSettings.Instance.ConsentFlowEnabled; | ||||||
|  |             var userTrackingUsageDescription = AppLovinInternalSettings.Instance.UserTrackingUsageDescriptionEn; | ||||||
|  |             var privacyPolicyUrl = AppLovinInternalSettings.Instance.ConsentFlowPrivacyPolicyUrl; | ||||||
|  |             if (string.IsNullOrEmpty(userTrackingUsageDescription) || string.IsNullOrEmpty(privacyPolicyUrl)) | ||||||
|  |             { | ||||||
|  |                 AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL and the `User Tracking Usage Description` in the AppLovin Integration Manager. \n\n" + | ||||||
|  |                                                                   "Both values must be included to enable the SDK's consent flow."); | ||||||
|  | 
 | ||||||
|  |                 // No need to update the info.plist here. Default consent flow state will be determined on the SDK side. | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var consentFlowInfoRoot = applovinSettingsPlist.root.CreateDict(KeyConsentFlowInfo); | ||||||
|  |             consentFlowInfoRoot.SetBoolean(KeyConsentFlowEnabled, consentFlowEnabled); | ||||||
|  |             consentFlowInfoRoot.SetString(KeyConsentFlowPrivacyPolicy, privacyPolicyUrl); | ||||||
|  | 
 | ||||||
|  |             var termsOfServiceUrl = AppLovinInternalSettings.Instance.ConsentFlowTermsOfServiceUrl; | ||||||
|  |             if (MaxSdkUtils.IsValidString(termsOfServiceUrl)) | ||||||
|  |             { | ||||||
|  |                 consentFlowInfoRoot.SetString(KeyConsentFlowTermsOfService, termsOfServiceUrl); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var debugUserGeography = AppLovinInternalSettings.Instance.DebugUserGeography; | ||||||
|  |             if (debugUserGeography == MaxSdkBase.ConsentFlowUserGeography.Gdpr) | ||||||
|  |             { | ||||||
|  |                 consentFlowInfoRoot.SetString(KeyConsentFlowDebugUserGeography, "gdpr"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             infoPlist.root.SetString("NSUserTrackingUsageDescription", userTrackingUsageDescription); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void EnableTermsFlowIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             // Check if terms flow is enabled. No need to update info.plist if consent flow is disabled. | ||||||
|  |             var consentFlowEnabled = AppLovinSettings.Instance.ConsentFlowEnabled; | ||||||
|  |             if (!consentFlowEnabled) return; | ||||||
|  | 
 | ||||||
|  |             // Check if terms flow is enabled for this format. | ||||||
|  |             var consentFlowPlatform = AppLovinSettings.Instance.ConsentFlowPlatform; | ||||||
|  |             if (consentFlowPlatform != Platform.All && consentFlowPlatform != Platform.iOS) return; | ||||||
|  | 
 | ||||||
|  |             var userTrackingUsageDescription = AppLovinSettings.Instance.UserTrackingUsageDescriptionEn; | ||||||
|  |             var privacyPolicyUrl = AppLovinSettings.Instance.ConsentFlowPrivacyPolicyUrl; | ||||||
|  |             if (string.IsNullOrEmpty(userTrackingUsageDescription) || string.IsNullOrEmpty(privacyPolicyUrl)) | ||||||
|  |             { | ||||||
|  |                 AppLovinIntegrationManager.ShowBuildFailureDialog("You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL and the `User Tracking Usage Description` in the AppLovin Integration Manager. \n\n" + | ||||||
|  |                                                                   "Both values must be included to enable the SDK's consent flow."); | ||||||
|  | 
 | ||||||
|  |                 // No need to update the info.plist here. Default consent flow state will be determined on the SDK side. | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             var consentFlowInfoRoot = plist.root.CreateDict("AppLovinConsentFlowInfo"); | ||||||
|  |             consentFlowInfoRoot.SetBoolean("AppLovinConsentFlowEnabled", consentFlowEnabled); | ||||||
|  |             consentFlowInfoRoot.SetString("AppLovinConsentFlowPrivacyPolicy", privacyPolicyUrl); | ||||||
|  | 
 | ||||||
|  |             var termsOfServiceUrl = AppLovinSettings.Instance.ConsentFlowTermsOfServiceUrl; | ||||||
|  |             if (!string.IsNullOrEmpty(termsOfServiceUrl)) | ||||||
|  |             { | ||||||
|  |                 consentFlowInfoRoot.SetString("AppLovinConsentFlowTermsOfService", termsOfServiceUrl); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             plist.root.SetString("NSUserTrackingUsageDescription", userTrackingUsageDescription); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void AddSkAdNetworksInfoIfNeeded(PlistDocument plist) | ||||||
|  |         { | ||||||
|  |             var skAdNetworkData = GetSkAdNetworkData(); | ||||||
|  |             var skAdNetworkIds = skAdNetworkData.SkAdNetworkIds; | ||||||
|  |             // Check if we have a valid list of SKAdNetworkIds that need to be added. | ||||||
|  |             if (skAdNetworkIds == null || skAdNetworkIds.Length < 1) return; | ||||||
|  | 
 | ||||||
|  |             // | ||||||
|  |             // Add the SKAdNetworkItems to the plist. It should look like following: | ||||||
|  |             // | ||||||
|  |             //    <key>SKAdNetworkItems</key> | ||||||
|  |             //    <array> | ||||||
|  |             //        <dict> | ||||||
|  |             //            <key>SKAdNetworkIdentifier</key> | ||||||
|  |             //            <string>ABC123XYZ.skadnetwork</string> | ||||||
|  |             //        </dict> | ||||||
|  |             //        <dict> | ||||||
|  |             //            <key>SKAdNetworkIdentifier</key> | ||||||
|  |             //            <string>123QWE456.skadnetwork</string> | ||||||
|  |             //        </dict> | ||||||
|  |             //        <dict> | ||||||
|  |             //            <key>SKAdNetworkIdentifier</key> | ||||||
|  |             //            <string>987XYZ123.skadnetwork</string> | ||||||
|  |             //        </dict> | ||||||
|  |             //    </array> | ||||||
|  |             // | ||||||
|  |             PlistElement skAdNetworkItems; | ||||||
|  |             plist.root.values.TryGetValue("SKAdNetworkItems", out skAdNetworkItems); | ||||||
|  |             var existingSkAdNetworkIds = new HashSet<string>(); | ||||||
|  |             // Check if SKAdNetworkItems array is already in the Plist document and collect all the IDs that are already present. | ||||||
|  |             if (skAdNetworkItems != null && skAdNetworkItems.GetType() == typeof(PlistElementArray)) | ||||||
|  |             { | ||||||
|  |                 var plistElementDictionaries = skAdNetworkItems.AsArray().values.Where(plistElement => plistElement.GetType() == typeof(PlistElementDict)); | ||||||
|  |                 foreach (var plistElement in plistElementDictionaries) | ||||||
|  |                 { | ||||||
|  |                     PlistElement existingId; | ||||||
|  |                     plistElement.AsDict().values.TryGetValue("SKAdNetworkIdentifier", out existingId); | ||||||
|  |                     if (existingId == null || existingId.GetType() != typeof(PlistElementString) || string.IsNullOrEmpty(existingId.AsString())) continue; | ||||||
|  | 
 | ||||||
|  |                     existingSkAdNetworkIds.Add(existingId.AsString()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             // Else, create an array of SKAdNetworkItems into which we will add our IDs. | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 skAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             foreach (var skAdNetworkId in skAdNetworkIds) | ||||||
|  |             { | ||||||
|  |                 // Skip adding IDs that are already in the array. | ||||||
|  |                 if (existingSkAdNetworkIds.Contains(skAdNetworkId)) continue; | ||||||
|  | 
 | ||||||
|  |                 var skAdNetworkItemDict = skAdNetworkItems.AsArray().AddDict(); | ||||||
|  |                 skAdNetworkItemDict.SetString("SKAdNetworkIdentifier", skAdNetworkId); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static SkAdNetworkData GetSkAdNetworkData() | ||||||
|  |         { | ||||||
|  |             var uriBuilder = new UriBuilder("https://unity.applovin.com/max/1.0/skadnetwork_ids"); | ||||||
|  | 
 | ||||||
|  |             // Get the list of installed ad networks to be passed up | ||||||
|  |             var maxMediationDirectory = PluginMediationDirectory; | ||||||
|  |             if (Directory.Exists(maxMediationDirectory)) | ||||||
|  |             { | ||||||
|  |                 var mediationNetworkDirectories = Directory.GetDirectories(maxMediationDirectory); | ||||||
|  |                 var installedNetworks = mediationNetworkDirectories.Select(Path.GetFileName).ToList(); | ||||||
|  |                 if (AppLovinSettings.Instance.AddApsSkAdNetworkIds) | ||||||
|  |                 { | ||||||
|  |                     installedNetworks.Add("AmazonPublisherServices"); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 var adNetworks = string.Join(",", installedNetworks.ToArray()); | ||||||
|  |                 if (!string.IsNullOrEmpty(adNetworks)) | ||||||
|  |                 { | ||||||
|  |                     uriBuilder.Query += string.Format("ad_networks={0}", adNetworks); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             using (var unityWebRequest = UnityWebRequest.Get(uriBuilder.ToString())) | ||||||
|  |             { | ||||||
|  |                 var operation = unityWebRequest.SendWebRequest(); | ||||||
|  |                 // Wait for the download to complete or the request to timeout. | ||||||
|  |                 while (!operation.isDone) { } | ||||||
|  | 
 | ||||||
|  | #if UNITY_2020_1_OR_NEWER | ||||||
|  |                 if (unityWebRequest.result != UnityWebRequest.Result.Success) | ||||||
|  | #else | ||||||
|  |                 if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) | ||||||
|  | #endif | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.UserError("Failed to retrieve SKAdNetwork IDs with error: " + unityWebRequest.error); | ||||||
|  |                     return new SkAdNetworkData(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     return JsonUtility.FromJson<SkAdNetworkData>(unityWebRequest.downloadHandler.text); | ||||||
|  |                 } | ||||||
|  |                 catch (Exception exception) | ||||||
|  |                 { | ||||||
|  |                     MaxSdkLogger.UserError("Failed to parse data '" + unityWebRequest.downloadHandler.text + "' with exception: " + exception); | ||||||
|  |                     return new SkAdNetworkData(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | #if UNITY_2019_3_OR_NEWER | ||||||
|  |         /// <summary> | ||||||
|  |         /// |-----------------------------------------------------------------------------------------------------------------------------------------------------| | ||||||
|  |         /// |         embed             |  use_frameworks! (:linkage => :dynamic)  |  use_frameworks! :linkage => :static  |  `use_frameworks!` line not present  | | ||||||
|  |         /// |---------------------------|------------------------------------------|---------------------------------------|--------------------------------------| | ||||||
|  |         /// | Unity-iPhone present      | Do not embed dynamic libraries           | Embed dynamic libraries               | Do not embed dynamic libraries       | | ||||||
|  |         /// | Unity-iPhone not present  | Embed dynamic libraries                  | Embed dynamic libraries               | Embed dynamic libraries              | | ||||||
|  |         /// |-----------------------------------------------------------------------------------------------------------------------------------------------------| | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="buildPath">An iOS build path</param> | ||||||
|  |         /// <returns>Whether or not the dynamic libraries should be embedded.</returns> | ||||||
|  |         private static bool ShouldEmbedDynamicLibraries(string buildPath) | ||||||
|  |         { | ||||||
|  |             var podfilePath = Path.Combine(buildPath, "Podfile"); | ||||||
|  |             if (!File.Exists(podfilePath)) return false; | ||||||
|  | 
 | ||||||
|  |             // If the Podfile doesn't have a `Unity-iPhone` target, we should embed the dynamic libraries. | ||||||
|  |             var lines = File.ReadAllLines(podfilePath); | ||||||
|  |             var containsUnityIphoneTarget = lines.Any(line => line.Contains(TargetUnityIphonePodfileLine)); | ||||||
|  |             if (!containsUnityIphoneTarget) return true; | ||||||
|  | 
 | ||||||
|  |             // If the Podfile does not have a `use_frameworks! :linkage => static` line, we should not embed the dynamic libraries. | ||||||
|  |             var useFrameworksStaticLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksStaticPodfileLine)); | ||||||
|  |             if (useFrameworksStaticLineIndex == -1) return false; | ||||||
|  | 
 | ||||||
|  |             // If more than one of the `use_frameworks!` lines are present, CocoaPods will use the last one. | ||||||
|  |             var useFrameworksLineIndex = Array.FindIndex(lines, line => line.Trim() == UseFrameworksPodfileLine); // Check for exact line to avoid matching `use_frameworks! :linkage => static/dynamic` | ||||||
|  |             var useFrameworksDynamicLineIndex = Array.FindIndex(lines, line => line.Contains(UseFrameworksDynamicPodfileLine)); | ||||||
|  | 
 | ||||||
|  |             // Check if `use_frameworks! :linkage => :static` is the last line of the three. If it is, we should embed the dynamic libraries. | ||||||
|  |             return useFrameworksLineIndex < useFrameworksStaticLineIndex && useFrameworksDynamicLineIndex < useFrameworksStaticLineIndex; | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -544,7 +544,7 @@ namespace AppLovinMax.Scripts.IntegrationManager.Editor | ||||||
|             return outputLines; |             return outputLines; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static string GetFormattedBuildScriptLine(string buildScriptLine) |         public static string GetFormattedBuildScriptLine(string buildScriptLine) | ||||||
|         { |         { | ||||||
| #if UNITY_2022_2_OR_NEWER | #if UNITY_2022_2_OR_NEWER | ||||||
|             return "        " |             return "        " | ||||||
|  |  | ||||||
|  | @ -60,6 +60,9 @@ public class AppLovinSettings : ScriptableObject | ||||||
|     [SerializeField] private bool setAttributionReportEndpoint; |     [SerializeField] private bool setAttributionReportEndpoint; | ||||||
|     [SerializeField] private bool addApsSkAdNetworkIds; |     [SerializeField] private bool addApsSkAdNetworkIds; | ||||||
| 
 | 
 | ||||||
|  |     [SerializeField] private string customGradleVersionUrl; | ||||||
|  |     [SerializeField] private string customGradleToolsVersion; | ||||||
|  | 
 | ||||||
|     [SerializeField] private bool consentFlowEnabled; |     [SerializeField] private bool consentFlowEnabled; | ||||||
|     [SerializeField] private Platform consentFlowPlatform; |     [SerializeField] private Platform consentFlowPlatform; | ||||||
|     [SerializeField] private string consentFlowPrivacyPolicyUrl = string.Empty; |     [SerializeField] private string consentFlowPrivacyPolicyUrl = string.Empty; | ||||||
|  | @ -128,9 +131,13 @@ public class AppLovinSettings : ScriptableObject | ||||||
|                     Directory.CreateDirectory(settingsDir); |                     Directory.CreateDirectory(settingsDir); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 instance = CreateInstance<AppLovinSettings>(); |                 // On script reload AssetDatabase.FindAssets() can fail and will overwrite AppLovinSettings without this check | ||||||
|                 AssetDatabase.CreateAsset(instance, settingsFilePath); |                 if (!File.Exists(settingsFilePath)) | ||||||
|                 MaxSdkLogger.D("Creating new AppLovinSettings asset at path: " + settingsFilePath); |                 { | ||||||
|  |                     instance = CreateInstance<AppLovinSettings>(); | ||||||
|  |                     AssetDatabase.CreateAsset(instance, settingsFilePath); | ||||||
|  |                     MaxSdkLogger.D("Creating new AppLovinSettings asset at path: " + settingsFilePath); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return instance; |             return instance; | ||||||
|  | @ -173,6 +180,24 @@ public class AppLovinSettings : ScriptableObject | ||||||
|         set { Instance.addApsSkAdNetworkIds = value; } |         set { Instance.addApsSkAdNetworkIds = value; } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// A URL to set the distributionUrl in the gradle-wrapper.properties file (ex: https\://services.gradle.org/distributions/gradle-6.9.3-bin.zip) | ||||||
|  |     /// </summary> | ||||||
|  |     public string CustomGradleVersionUrl | ||||||
|  |     { | ||||||
|  |         get { return Instance.customGradleVersionUrl;  } | ||||||
|  |         set { Instance.customGradleVersionUrl = value; } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// A string to set the custom gradle tools version (ex: com.android.tools.build:gradle:4.2.0) | ||||||
|  |     /// </summary> | ||||||
|  |     public string CustomGradleToolsVersion | ||||||
|  |     { | ||||||
|  |         get { return Instance.customGradleToolsVersion;  } | ||||||
|  |         set { Instance.customGradleToolsVersion = value; } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Whether or not AppLovin Consent Flow is enabled. |     /// Whether or not AppLovin Consent Flow is enabled. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,108 @@ | ||||||
|  | // | ||||||
|  | //  MaxEventExecutor.cs | ||||||
|  | //  Max Unity Plugin | ||||||
|  | // | ||||||
|  | //  Created by Jonathan Liu on 1/22/2024. | ||||||
|  | //  Copyright © 2024 AppLovin. All rights reserved. | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using UnityEngine; | ||||||
|  | using UnityEngine.Events; | ||||||
|  | 
 | ||||||
|  | namespace AppLovinMax.Internal | ||||||
|  | { | ||||||
|  |     public class MaxEventExecutor : MonoBehaviour | ||||||
|  |     { | ||||||
|  |         private static MaxEventExecutor instance; | ||||||
|  |         private static List<MaxAction> adEventsQueue = new List<MaxAction>(); | ||||||
|  | 
 | ||||||
|  |         private static volatile bool adEventsQueueEmpty = true; | ||||||
|  | 
 | ||||||
|  |         struct MaxAction | ||||||
|  |         { | ||||||
|  |             public Action action; | ||||||
|  |             public string eventName; | ||||||
|  | 
 | ||||||
|  |             public MaxAction(Action actionToExecute, string nameOfEvent) | ||||||
|  |             { | ||||||
|  |                 action = actionToExecute; | ||||||
|  |                 eventName = nameOfEvent; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static void InitializeIfNeeded() | ||||||
|  |         { | ||||||
|  |             if (instance != null) return; | ||||||
|  | 
 | ||||||
|  |             var executor = new GameObject("MaxEventExecutor"); | ||||||
|  |             executor.hideFlags = HideFlags.HideAndDontSave; | ||||||
|  |             DontDestroyOnLoad(executor); | ||||||
|  |             instance = executor.AddComponent<MaxEventExecutor>(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         #region Public API | ||||||
|  | 
 | ||||||
|  | #if UNITY_EDITOR | ||||||
|  |         public static MaxEventExecutor Instance | ||||||
|  |         { | ||||||
|  |             get | ||||||
|  |             { | ||||||
|  |                 InitializeIfNeeded(); | ||||||
|  |                 return instance; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |         public static void ExecuteOnMainThread(Action action, string eventName) | ||||||
|  |         { | ||||||
|  |             lock (adEventsQueue) | ||||||
|  |             { | ||||||
|  |                 adEventsQueue.Add(new MaxAction(action, eventName)); | ||||||
|  |                 adEventsQueueEmpty = false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static void InvokeOnMainThread(UnityEvent unityEvent, string eventName) | ||||||
|  |         { | ||||||
|  |             ExecuteOnMainThread(() => unityEvent.Invoke(), eventName); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         #endregion | ||||||
|  | 
 | ||||||
|  |         public void Update() | ||||||
|  |         { | ||||||
|  |             if (adEventsQueueEmpty) return; | ||||||
|  | 
 | ||||||
|  |             var actionsToExecute = new List<MaxAction>(); | ||||||
|  |             lock (adEventsQueue) | ||||||
|  |             { | ||||||
|  |                 actionsToExecute.AddRange(adEventsQueue); | ||||||
|  |                 adEventsQueue.Clear(); | ||||||
|  |                 adEventsQueueEmpty = true; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             foreach (var maxAction in actionsToExecute) | ||||||
|  |             { | ||||||
|  |                 if (maxAction.action.Target != null) | ||||||
|  |                 { | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         maxAction.action.Invoke(); | ||||||
|  |                     } | ||||||
|  |                     catch (Exception exception) | ||||||
|  |                     { | ||||||
|  |                         MaxSdkLogger.UserError("Caught exception in publisher event: " + maxAction.eventName + ", exception: " + exception); | ||||||
|  |                         Debug.LogException(exception); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void Disable() | ||||||
|  |         { | ||||||
|  |             instance = null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: bc0c5693335e0408a95293c0d7b61137 | guid: 4715dd62632564dc4810a4dc98243f4a | ||||||
| labels: | labels: | ||||||
| - al_max | - al_max | ||||||
| - al_max_export_path-MaxSdk/Scripts/Editor/MaxInitialization.cs | - al_max_export_path-MaxSdk/Scripts/MaxEventExecutor.cs | ||||||
| MonoImporter: | MonoImporter: | ||||||
|   externalObjects: {} |   externalObjects: {} | ||||||
|   serializedVersion: 2 |   serializedVersion: 2 | ||||||
|  | @ -18,7 +18,7 @@ public class MaxSdk : | ||||||
|     MaxSdkUnityEditor |     MaxSdkUnityEditor | ||||||
| #endif | #endif | ||||||
| { | { | ||||||
|     private const string _version = "6.1.2"; |     private const string _version = "6.4.3"; | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Returns the current plugin version. |     /// Returns the current plugin version. | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
| 
 | 
 | ||||||
|     static MaxSdkAndroid() |     static MaxSdkAndroid() | ||||||
|     { |     { | ||||||
|         InitCallbacks(); |         InitializeEventExecutor(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #region Initialization |     #region Initialization | ||||||
|  | @ -30,6 +30,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// |     /// | ||||||
|     /// This method must be called before any other SDK operation |     /// This method must be called before any other SDK operation | ||||||
|     /// </summary> |     /// </summary> | ||||||
|  |     /// <param name="sdkKey">AppLovin SDK Key. Must not be null.</param> | ||||||
|     public static void SetSdkKey(string sdkKey) |     public static void SetSdkKey(string sdkKey) | ||||||
|     { |     { | ||||||
|         MaxUnityPluginClass.CallStatic("setSdkKey", sdkKey); |         MaxUnityPluginClass.CallStatic("setSdkKey", sdkKey); | ||||||
|  | @ -69,7 +70,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// For example, a username or email. We'll include this in the postback when we ping your currency endpoint from our server. |     /// For example, a username or email. We'll include this in the postback when we ping your currency endpoint from our server. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     ///  |     ///  | ||||||
|     /// <param name="userId">The user identifier to be set.</param> |     /// <param name="userId">The user identifier to be set. Must not be null.</param> | ||||||
|     public static void SetUserId(string userId) |     public static void SetUserId(string userId) | ||||||
|     { |     { | ||||||
|         MaxUnityPluginClass.CallStatic("setUserId", userId); |         MaxUnityPluginClass.CallStatic("setUserId", userId); | ||||||
|  | @ -131,8 +132,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Returns the arbitrary ad value for a given ad unit identifier with key. Returns null if no ad is loaded. |     /// Returns the arbitrary ad value for a given ad unit identifier with key. Returns null if no ad is loaded. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier"></param> |     /// <param name="adUnitIdentifier">Ad unit identifier for which to get the ad value for. Must not be null.</param> | ||||||
|     /// <param name="key">Ad value key</param> |     /// <param name="key">Ad value key. Must not be null.</param> | ||||||
|     /// <returns>Arbitrary ad value for a given key, or null if no ad is loaded.</returns> |     /// <returns>Arbitrary ad value for a given key, or null if no ad is loaded.</returns> | ||||||
|     public static string GetAdValue(string adUnitIdentifier, string key) |     public static string GetAdValue(string adUnitIdentifier, string key) | ||||||
|     { |     { | ||||||
|  | @ -247,8 +248,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new banner. |     /// Create a new banner. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create. Must not be null.</param> | ||||||
|     /// <param name="bannerPosition">Banner position</param> |     /// <param name="bannerPosition">Banner position. Must not be null.</param> | ||||||
|     public static void CreateBanner(string adUnitIdentifier, BannerPosition bannerPosition) |     public static void CreateBanner(string adUnitIdentifier, BannerPosition bannerPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "create banner"); | ||||||
|  | @ -258,7 +259,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new banner with a custom position. |     /// Create a new banner with a custom position. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetBannerLayout"> |     /// <seealso cref="GetBannerLayout"> | ||||||
|  | @ -275,7 +276,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// NOTE: The <see cref="CreateBanner()"/> method loads the first banner ad and initiates an automated banner refresh process. |     /// NOTE: The <see cref="CreateBanner()"/> method loads the first banner ad and initiates an automated banner refresh process. | ||||||
|     /// You only need to call this method if you pause banner refresh. |     /// You only need to call this method if you pause banner refresh. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to load. Must not be null.</param> | ||||||
|     public static void LoadBanner(string adUnitIdentifier) |     public static void LoadBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load banner"); | ||||||
|  | @ -285,7 +286,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set the banner placement for an ad unit identifier to tie the future ad events to. |     /// Set the banner placement for an ad unit identifier to tie the future ad events to. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the placement for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the placement for. Must not be null.</param> | ||||||
|     /// <param name="placement">Placement to set</param> |     /// <param name="placement">Placement to set</param> | ||||||
|     public static void SetBannerPlacement(string adUnitIdentifier, string placement) |     public static void SetBannerPlacement(string adUnitIdentifier, string placement) | ||||||
|     { |     { | ||||||
|  | @ -296,7 +297,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Starts or resumes auto-refreshing of the banner for the given ad unit identifier. |     /// Starts or resumes auto-refreshing of the banner for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to start auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to start auto-refresh. Must not be null.</param> | ||||||
|     public static void StartBannerAutoRefresh(string adUnitIdentifier) |     public static void StartBannerAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "start banner auto-refresh"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "start banner auto-refresh"); | ||||||
|  | @ -306,7 +307,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Pauses auto-refreshing of the banner for the given ad unit identifier. |     /// Pauses auto-refreshing of the banner for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to stop auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to stop auto-refresh. Must not be null.</param> | ||||||
|     public static void StopBannerAutoRefresh(string adUnitIdentifier) |     public static void StopBannerAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "stop banner auto-refresh"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "stop banner auto-refresh"); | ||||||
|  | @ -316,8 +317,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the banner to the new position provided. |     /// Updates the position of the banner to the new position provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="bannerPosition">A new position for the banner</param> |     /// <param name="bannerPosition">A new position for the banner. Must not be null.</param> | ||||||
|     public static void UpdateBannerPosition(string adUnitIdentifier, BannerPosition bannerPosition) |     public static void UpdateBannerPosition(string adUnitIdentifier, BannerPosition bannerPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "update banner position"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "update banner position"); | ||||||
|  | @ -327,7 +328,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the banner to the new coordinates provided. |     /// Updates the position of the banner to the new coordinates provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetBannerLayout"> |     /// <seealso cref="GetBannerLayout"> | ||||||
|  | @ -342,7 +343,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Overrides the width of the banner in dp. |     /// Overrides the width of the banner in dp. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to override the width for</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to override the width for. Must not be null.</param> | ||||||
|     /// <param name="width">The desired width of the banner in dp</param> |     /// <param name="width">The desired width of the banner in dp</param> | ||||||
|     public static void SetBannerWidth(string adUnitIdentifier, float width) |     public static void SetBannerWidth(string adUnitIdentifier, float width) | ||||||
|     { |     { | ||||||
|  | @ -353,7 +354,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Show banner at a position determined by the 'CreateBanner' call. |     /// Show banner at a position determined by the 'CreateBanner' call. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to show. Must not be null.</param> | ||||||
|     public static void ShowBanner(string adUnitIdentifier) |     public static void ShowBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "show banner"); | ||||||
|  | @ -363,7 +364,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Remove banner from the ad view and destroy it. |     /// Remove banner from the ad view and destroy it. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to destroy</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to destroy. Must not be null.</param> | ||||||
|     public static void DestroyBanner(string adUnitIdentifier) |     public static void DestroyBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy banner"); | ||||||
|  | @ -373,8 +374,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Hide banner. |     /// Hide banner. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to hide</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to hide. Must not be null.</param> | ||||||
|     /// <returns></returns> |  | ||||||
|     public static void HideBanner(string adUnitIdentifier) |     public static void HideBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "hide banner"); | ||||||
|  | @ -384,9 +384,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set non-transparent background color for banners to be fully functional. |     /// Set non-transparent background color for banners to be fully functional. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set background color for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set background color for. Must not be null.</param> | ||||||
|     /// <param name="color">A background color to set for the ad</param> |     /// <param name="color">A background color to set for the ad. Must not be null.</param> | ||||||
|     /// <returns></returns> |  | ||||||
|     public static void SetBannerBackgroundColor(string adUnitIdentifier, Color color) |     public static void SetBannerBackgroundColor(string adUnitIdentifier, Color color) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "set background color"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "set background color"); | ||||||
|  | @ -396,8 +395,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the banner ad. |     /// Set an extra parameter for the banner ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetBannerExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetBannerExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -408,8 +407,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the banner ad. |     /// Set a local extra parameter for the banner ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -428,7 +427,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The custom data to tie the showing banner ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. |     /// The custom data to tie the showing banner ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Banner ad unit identifier of the banner to set the custom data for.</param> |     /// <param name="adUnitIdentifier">Banner ad unit identifier of the banner to set the custom data for. Must not be null.</param> | ||||||
|     /// <param name="customData">The custom data to be set.</param> |     /// <param name="customData">The custom data to be set.</param> | ||||||
|     public static void SetBannerCustomData(string adUnitIdentifier, string customData) |     public static void SetBannerCustomData(string adUnitIdentifier, string customData) | ||||||
|     { |     { | ||||||
|  | @ -440,7 +439,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// The banner position on the screen. When setting the banner position via <see cref="CreateBanner(string, float, float)"/> or <see cref="UpdateBannerPosition(string, float, float)"/>, |     /// The banner position on the screen. When setting the banner position via <see cref="CreateBanner(string, float, float)"/> or <see cref="UpdateBannerPosition(string, float, float)"/>, | ||||||
|     /// the banner is placed within the safe area of the screen. This returns the absolute position of the banner on screen. |     /// the banner is placed within the safe area of the screen. This returns the absolute position of the banner on screen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to get the position on screen.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to get the position on screen. Must not be null.</param> | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> | ||||||
|     public static Rect GetBannerLayout(string adUnitIdentifier) |     public static Rect GetBannerLayout(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -456,8 +455,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new MREC. |     /// Create a new MREC. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create. Must not be null.</param> | ||||||
|     /// <param name="mrecPosition">MREC position</param> |     /// <param name="mrecPosition">MREC position. Must not be null.</param> | ||||||
|     public static void CreateMRec(string adUnitIdentifier, AdViewPosition mrecPosition) |     public static void CreateMRec(string adUnitIdentifier, AdViewPosition mrecPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "create MREC"); | ||||||
|  | @ -467,7 +466,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new MREC with a custom position. |     /// Create a new MREC with a custom position. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetMRecLayout"> |     /// <seealso cref="GetMRecLayout"> | ||||||
|  | @ -484,7 +483,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// NOTE: The <see cref="CreateMRec()"/> method loads the first MREC ad and initiates an automated MREC refresh process. |     /// NOTE: The <see cref="CreateMRec()"/> method loads the first MREC ad and initiates an automated MREC refresh process. | ||||||
|     /// You only need to call this method if you pause MREC refresh. |     /// You only need to call this method if you pause MREC refresh. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to load. Must not be null.</param> | ||||||
|     public static void LoadMRec(string adUnitIdentifier) |     public static void LoadMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load MREC"); | ||||||
|  | @ -494,7 +493,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set the MREC placement for an ad unit identifier to tie the future ad events to. |     /// Set the MREC placement for an ad unit identifier to tie the future ad events to. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the placement for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the placement for. Must not be null.</param> | ||||||
|     /// <param name="placement">Placement to set</param> |     /// <param name="placement">Placement to set</param> | ||||||
|     public static void SetMRecPlacement(string adUnitIdentifier, string placement) |     public static void SetMRecPlacement(string adUnitIdentifier, string placement) | ||||||
|     { |     { | ||||||
|  | @ -505,7 +504,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Starts or resumes auto-refreshing of the MREC for the given ad unit identifier. |     /// Starts or resumes auto-refreshing of the MREC for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to start auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to start auto-refresh. Must not be null.</param> | ||||||
|     public static void StartMRecAutoRefresh(string adUnitIdentifier) |     public static void StartMRecAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "start MREC auto-refresh"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "start MREC auto-refresh"); | ||||||
|  | @ -515,7 +514,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Pauses auto-refreshing of the MREC for the given ad unit identifier. |     /// Pauses auto-refreshing of the MREC for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to stop auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to stop auto-refresh. Must not be null.</param> | ||||||
|     public static void StopMRecAutoRefresh(string adUnitIdentifier) |     public static void StopMRecAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "stop MREC auto-refresh"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "stop MREC auto-refresh"); | ||||||
|  | @ -525,8 +524,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the MREC to the new position provided. |     /// Updates the position of the MREC to the new position provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="mrecPosition">A new position for the MREC</param> |     /// <param name="mrecPosition">A new position for the MREC. Must not be null.</param> | ||||||
|     public static void UpdateMRecPosition(string adUnitIdentifier, AdViewPosition mrecPosition) |     public static void UpdateMRecPosition(string adUnitIdentifier, AdViewPosition mrecPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "update MREC position"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "update MREC position"); | ||||||
|  | @ -536,7 +535,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the MREC to the new coordinates provided. |     /// Updates the position of the MREC to the new coordinates provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetMRecLayout"> |     /// <seealso cref="GetMRecLayout"> | ||||||
|  | @ -551,7 +550,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Show MREC at a position determined by the 'CreateMRec' call. |     /// Show MREC at a position determined by the 'CreateMRec' call. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to show. Must not be null.</param> | ||||||
|     public static void ShowMRec(string adUnitIdentifier) |     public static void ShowMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "show MREC"); | ||||||
|  | @ -561,7 +560,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Remove MREC from the ad view and destroy it. |     /// Remove MREC from the ad view and destroy it. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to destroy</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to destroy. Must not be null.</param> | ||||||
|     public static void DestroyMRec(string adUnitIdentifier) |     public static void DestroyMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy MREC"); | ||||||
|  | @ -571,7 +570,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Hide MREC. |     /// Hide MREC. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to hide</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to hide. Must not be null.</param> | ||||||
|     public static void HideMRec(string adUnitIdentifier) |     public static void HideMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC"); | ||||||
|  | @ -581,8 +580,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the MREC ad. |     /// Set an extra parameter for the MREC ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetMRecExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetMRecExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -593,8 +592,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the MREC ad. |     /// Set a local extra parameter for the MREC ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -613,7 +612,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The custom data to tie the showing MREC ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. |     /// The custom data to tie the showing MREC ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">MREC Ad unit identifier of the banner to set the custom data for.</param> |     /// <param name="adUnitIdentifier">MREC Ad unit identifier of the banner to set the custom data for. Must not be null.</param> | ||||||
|     /// <param name="customData">The custom data to be set.</param> |     /// <param name="customData">The custom data to be set.</param> | ||||||
|     public static void SetMRecCustomData(string adUnitIdentifier, string customData) |     public static void SetMRecCustomData(string adUnitIdentifier, string customData) | ||||||
|     { |     { | ||||||
|  | @ -625,7 +624,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// The MREC position on the screen. When setting the banner position via <see cref="CreateMRec(string, float, float)"/> or <see cref="UpdateMRecPosition(string, float, float)"/>, |     /// The MREC position on the screen. When setting the banner position via <see cref="CreateMRec(string, float, float)"/> or <see cref="UpdateMRecPosition(string, float, float)"/>, | ||||||
|     /// the banner is placed within the safe area of the screen. This returns the absolute position of the MREC on screen. |     /// the banner is placed within the safe area of the screen. This returns the absolute position of the MREC on screen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to get the position on screen.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to get the position on screen. Must not be null.</param> | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> | ||||||
|     public static Rect GetMRecLayout(string adUnitIdentifier) |     public static Rect GetMRecLayout(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -636,106 +635,12 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
| 
 | 
 | ||||||
|     #endregion |     #endregion | ||||||
| 
 | 
 | ||||||
|     #region Cross Promo Ads |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Create a new cross promo ad with a custom position. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to create</param> |  | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="width">The width of the cross promo ad.</param> |  | ||||||
|     /// <param name="height">The height of the cross promo ad.</param> |  | ||||||
|     /// <param name="rotation">The rotation of the cross promo ad in degrees.</param> |  | ||||||
|     /// <seealso cref="GetCrossPromoAdLayout"> |  | ||||||
|     /// The cross promo is placed within the safe area of the screen. You can use this to get the absolute position Rect of the cross promo ad on screen. |  | ||||||
|     /// </seealso> |  | ||||||
|     public static void CreateCrossPromoAd(string adUnitIdentifier, float x, float y, float width, float height, float rotation) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create cross promo ad"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("createCrossPromoAd", adUnitIdentifier, x, y, width, height, rotation); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Set the cross promo ad placement for an ad unit identifier to tie the future ad events to. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to set the placement for</param> |  | ||||||
|     /// <param name="placement">Placement to set</param> |  | ||||||
|     public static void SetCrossPromoAdPlacement(string adUnitIdentifier, string placement) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "set cross promo ad placement"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("setCrossPromoAdPlacement", adUnitIdentifier, placement); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Updates the position of the cross promo ad to the new coordinates provided. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the cross promo ad for which to update the position</param> |  | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="width">The width of the cross promo ad.</param> |  | ||||||
|     /// <param name="height">The height of the cross promo ad.</param> |  | ||||||
|     /// <param name="rotation">The rotation of the cross promo ad in degrees.</param> |  | ||||||
|     /// <seealso cref="GetCrossPromoAdLayout"> |  | ||||||
|     /// The cross promo ad is placed within the safe area of the screen. You can use this to get the absolute position Rect of the cross promo ad on screen. |  | ||||||
|     /// </seealso> |  | ||||||
|     public static void UpdateCrossPromoAdPosition(string adUnitIdentifier, float x, float y, float width, float height, float rotation) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "update cross promo ad position"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("updateCrossPromoAdPosition", adUnitIdentifier, x, y, width, height, rotation); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Show cross promo ad at a position determined by the 'CreateCrossPromoAd' call. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to show</param> |  | ||||||
|     public static void ShowCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show cross promo ad"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("showCrossPromoAd", adUnitIdentifier); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Remove cross promo ad from the ad view and destroy it. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to destroy</param> |  | ||||||
|     public static void DestroyCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy cross promo ad"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("destroyCrossPromoAd", adUnitIdentifier); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Hide cross promo ad. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to hide</param> |  | ||||||
|     public static void HideCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide cross promo ad"); |  | ||||||
|         MaxUnityPluginClass.CallStatic("hideCrossPromoAd", adUnitIdentifier); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// The cross promo ad position on the screen. When setting the cross promo ad position via <see cref="CreateCrossPromoAd(string, float, float, float, float, float)"/> or <see cref="UpdateCrossPromoAdPosition(string, float, float, float, float, float)"/>, |  | ||||||
|     /// the cross promo ad is placed within the safe area of the screen. This returns the absolute position of the cross promo ad on screen. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad for which to get the position on screen.</param> |  | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |  | ||||||
|     public static Rect GetCrossPromoAdLayout(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "get cross promo ad layout"); |  | ||||||
|         var positionRect = MaxUnityPluginClass.CallStatic<string>("getCrossPromoAdLayout", adUnitIdentifier); |  | ||||||
|         return GetRectFromString(positionRect); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #endregion |  | ||||||
| 
 |  | ||||||
|     #region Interstitials |     #region Interstitials | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an interstitial. |     /// Start loading an interstitial. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load. Must not be null.</param> | ||||||
|     public static void LoadInterstitial(string adUnitIdentifier) |     public static void LoadInterstitial(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load interstitial"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load interstitial"); | ||||||
|  | @ -745,7 +650,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if interstitial ad is loaded and ready to be displayed. |     /// Check if interstitial ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsInterstitialReady(string adUnitIdentifier) |     public static bool IsInterstitialReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -756,7 +661,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded interstitial for a given placement to tie ad events to. Note: if the interstitial is not ready to be displayed nothing will happen. |     /// Present loaded interstitial for a given placement to tie ad events to. Note: if the interstitial is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowInterstitial(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowInterstitial(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -776,8 +681,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetInterstitialExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetInterstitialExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -788,8 +693,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetInterstitialLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetInterstitialLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -812,7 +717,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an app open ad. |     /// Start loading an app open ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     public static void LoadAppOpenAd(string adUnitIdentifier) |     public static void LoadAppOpenAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load app open ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load app open ad"); | ||||||
|  | @ -822,7 +727,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if app open ad ad is loaded and ready to be displayed. |     /// Check if app open ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsAppOpenAdReady(string adUnitIdentifier) |     public static bool IsAppOpenAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -833,7 +738,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded app open ad for a given placement to tie ad events to. Note: if the app open ad is not ready to be displayed nothing will happen. |     /// Present loaded app open ad for a given placement to tie ad events to. Note: if the app open ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowAppOpenAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowAppOpenAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -853,8 +758,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetAppOpenAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetAppOpenAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -865,8 +770,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetAppOpenAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetAppOpenAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -889,7 +794,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an rewarded ad. |     /// Start loading an rewarded ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load. Must not be null.</param> | ||||||
|     public static void LoadRewardedAd(string adUnitIdentifier) |     public static void LoadRewardedAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded ad"); | ||||||
|  | @ -899,7 +804,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if rewarded ad ad is loaded and ready to be displayed. |     /// Check if rewarded ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsRewardedAdReady(string adUnitIdentifier) |     public static bool IsRewardedAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -910,7 +815,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> ready to be |     /// <summary> ready to be | ||||||
|     /// Present loaded rewarded ad for a given placement to tie ad events to. Note: if the rewarded ad is not ready to be displayed nothing will happen. |     /// Present loaded rewarded ad for a given placement to tie ad events to. Note: if the rewarded ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowRewardedAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowRewardedAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -930,8 +835,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetRewardedAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetRewardedAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -942,8 +847,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetRewardedAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetRewardedAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -966,7 +871,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an rewarded interstitial ad. |     /// Start loading an rewarded interstitial ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load. Must not be null.</param> | ||||||
|     public static void LoadRewardedInterstitialAd(string adUnitIdentifier) |     public static void LoadRewardedInterstitialAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded interstitial ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded interstitial ad"); | ||||||
|  | @ -976,7 +881,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if rewarded interstitial ad ad is loaded and ready to be displayed. |     /// Check if rewarded interstitial ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsRewardedInterstitialAdReady(string adUnitIdentifier) |     public static bool IsRewardedInterstitialAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -987,7 +892,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded rewarded interstitial ad for a given placement to tie ad events to. Note: if the rewarded interstitial ad is not ready to be displayed nothing will happen. |     /// Present loaded rewarded interstitial ad for a given placement to tie ad events to. Note: if the rewarded interstitial ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to show. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowRewardedInterstitialAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowRewardedInterstitialAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -1007,8 +912,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetRewardedInterstitialAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetRewardedInterstitialAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -1019,8 +924,8 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> |     /// <param name="value">The value for the extra parameter. Accepts the following types: <see cref="AndroidJavaObject"/>, <c>null</c>, <c>IList</c>, <c>IDictionary</c>, <c>string</c>, primitive types</param> | ||||||
|     public static void SetRewardedInterstitialAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetRewardedInterstitialAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -1043,7 +948,7 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Track an event using AppLovin. |     /// Track an event using AppLovin. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="name">An event from the list of pre-defined events may be found in MaxEvents.cs as part of the AppLovin SDK framework.</param> |     /// <param name="name">An event from the list of pre-defined events may be found in MaxEvents.cs as part of the AppLovin SDK framework. Must not be null.</param> | ||||||
|     /// <param name="parameters">A dictionary containing key-value pairs further describing this event.</param> |     /// <param name="parameters">A dictionary containing key-value pairs further describing this event.</param> | ||||||
|     public static void TrackEvent(string name, IDictionary<string, string> parameters = null) |     public static void TrackEvent(string name, IDictionary<string, string> parameters = null) | ||||||
|     { |     { | ||||||
|  | @ -1149,6 +1054,25 @@ public class MaxSdkAndroid : MaxSdkBase | ||||||
|         MaxUnityPluginClass.CallStatic("setExtraParameter", key, value); |         MaxUnityPluginClass.CallStatic("setExtraParameter", key, value); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// Get the native insets in pixels for the safe area. | ||||||
|  |     /// These insets are used to position ads within the safe area of the screen. | ||||||
|  |     /// </summary> | ||||||
|  |     public static SafeAreaInsets GetSafeAreaInsets() | ||||||
|  |     { | ||||||
|  |         // Use an int array instead of json serialization for performance | ||||||
|  |         var insets = MaxUnityPluginClass.CallStatic<int[]>("getSafeAreaInsets"); | ||||||
|  | 
 | ||||||
|  |         // Convert from points to pixels | ||||||
|  |         var screenDensity = MaxSdkUtils.GetScreenDensity(); | ||||||
|  |         for (var i = 0; i < insets.Length; i++) | ||||||
|  |         { | ||||||
|  |             insets[i] *= (int) screenDensity; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return new SafeAreaInsets(insets); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #endregion |     #endregion | ||||||
| 
 | 
 | ||||||
|     #region Private |     #region Private | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ using System.Globalization; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; | using System.Text; | ||||||
| using AppLovinMax.ThirdParty.MiniJson; | using AppLovinMax.ThirdParty.MiniJson; | ||||||
|  | using AppLovinMax.Internal; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
| 
 | 
 | ||||||
| #if UNITY_IOS && !UNITY_EDITOR | #if UNITY_IOS && !UNITY_EDITOR | ||||||
|  | @ -168,7 +169,6 @@ public abstract class MaxSdkBase | ||||||
|                 sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Unknown; |                 sdkConfiguration.ConsentFlowUserGeography = ConsentFlowUserGeography.Unknown; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #pragma warning disable 0618 | #pragma warning disable 0618 | ||||||
|             var consentDialogStateStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentDialogState", ""); |             var consentDialogStateStr = MaxSdkUtils.GetStringFromDictionary(eventProps, "consentDialogState", ""); | ||||||
|             if ("1".Equals(consentDialogStateStr)) |             if ("1".Equals(consentDialogStateStr)) | ||||||
|  | @ -325,6 +325,7 @@ public abstract class MaxSdkBase | ||||||
|         public double Revenue { get; private set; } |         public double Revenue { get; private set; } | ||||||
|         public string RevenuePrecision { get; private set; } |         public string RevenuePrecision { get; private set; } | ||||||
|         public WaterfallInfo WaterfallInfo { get; private set; } |         public WaterfallInfo WaterfallInfo { get; private set; } | ||||||
|  |         public long LatencyMillis { get; private set; } | ||||||
|         public string DspName { get; private set; } |         public string DspName { get; private set; } | ||||||
| 
 | 
 | ||||||
|         public AdInfo(IDictionary<string, object> adInfoDictionary) |         public AdInfo(IDictionary<string, object> adInfoDictionary) | ||||||
|  | @ -338,6 +339,7 @@ public abstract class MaxSdkBase | ||||||
|             Revenue = MaxSdkUtils.GetDoubleFromDictionary(adInfoDictionary, "revenue", -1); |             Revenue = MaxSdkUtils.GetDoubleFromDictionary(adInfoDictionary, "revenue", -1); | ||||||
|             RevenuePrecision = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "revenuePrecision"); |             RevenuePrecision = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "revenuePrecision"); | ||||||
|             WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(adInfoDictionary, "waterfallInfo", new Dictionary<string, object>())); |             WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(adInfoDictionary, "waterfallInfo", new Dictionary<string, object>())); | ||||||
|  |             LatencyMillis = MaxSdkUtils.GetLongFromDictionary(adInfoDictionary, "latencyMillis"); | ||||||
|             DspName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "dspName"); |             DspName = MaxSdkUtils.GetStringFromDictionary(adInfoDictionary, "dspName"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -351,6 +353,7 @@ public abstract class MaxSdkBase | ||||||
|                    ", placement: " + Placement + |                    ", placement: " + Placement + | ||||||
|                    ", revenue: " + Revenue + |                    ", revenue: " + Revenue + | ||||||
|                    ", revenuePrecision: " + RevenuePrecision + |                    ", revenuePrecision: " + RevenuePrecision + | ||||||
|  |                    ", latency: " + LatencyMillis + | ||||||
|                    ", dspName: " + DspName + "]"; |                    ", dspName: " + DspName + "]"; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -469,6 +472,7 @@ public abstract class MaxSdkBase | ||||||
|         public string MediatedNetworkErrorMessage { get; private set; } |         public string MediatedNetworkErrorMessage { get; private set; } | ||||||
|         public string AdLoadFailureInfo { get; private set; } |         public string AdLoadFailureInfo { get; private set; } | ||||||
|         public WaterfallInfo WaterfallInfo { get; private set; } |         public WaterfallInfo WaterfallInfo { get; private set; } | ||||||
|  |         public long LatencyMillis { get; private set; } | ||||||
| 
 | 
 | ||||||
|         public ErrorInfo(IDictionary<string, object> errorInfoDictionary) |         public ErrorInfo(IDictionary<string, object> errorInfoDictionary) | ||||||
|         { |         { | ||||||
|  | @ -478,6 +482,7 @@ public abstract class MaxSdkBase | ||||||
|             MediatedNetworkErrorMessage = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "mediatedNetworkErrorMessage", ""); |             MediatedNetworkErrorMessage = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "mediatedNetworkErrorMessage", ""); | ||||||
|             AdLoadFailureInfo = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "adLoadFailureInfo", ""); |             AdLoadFailureInfo = MaxSdkUtils.GetStringFromDictionary(errorInfoDictionary, "adLoadFailureInfo", ""); | ||||||
|             WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(errorInfoDictionary, "waterfallInfo", new Dictionary<string, object>())); |             WaterfallInfo = new WaterfallInfo(MaxSdkUtils.GetDictionaryFromDictionary(errorInfoDictionary, "waterfallInfo", new Dictionary<string, object>())); | ||||||
|  |             LatencyMillis = MaxSdkUtils.GetLongFromDictionary(errorInfoDictionary, "latencyMillis"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override string ToString() |         public override string ToString() | ||||||
|  | @ -491,10 +496,42 @@ public abstract class MaxSdkBase | ||||||
|                 stringbuilder.Append(", mediatedNetworkMessage: ").Append(MediatedNetworkErrorMessage); |                 stringbuilder.Append(", mediatedNetworkMessage: ").Append(MediatedNetworkErrorMessage); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             stringbuilder.Append(", latency: ").Append(LatencyMillis); | ||||||
|             return stringbuilder.Append(", adLoadFailureInfo: ").Append(AdLoadFailureInfo).Append("]").ToString(); |             return stringbuilder.Append(", adLoadFailureInfo: ").Append(AdLoadFailureInfo).Append("]").ToString(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// Inset values for the safe area on the screen used to render banner ads. | ||||||
|  |     /// </summary> | ||||||
|  |     public class SafeAreaInsets | ||||||
|  |     { | ||||||
|  |         public int Left { get; private set; } | ||||||
|  |         public int Top { get; private set; } | ||||||
|  |         public int Right { get; private set; } | ||||||
|  |         public int Bottom { get; private set; } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new instance of <see cref="SafeAreaInsets"/>. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="insets">An integer array with insets values in the order of left, top, right, and bottom</param> | ||||||
|  |         internal SafeAreaInsets(int[] insets) | ||||||
|  |         { | ||||||
|  |             Left = insets[0]; | ||||||
|  |             Top = insets[1]; | ||||||
|  |             Right = insets[2]; | ||||||
|  |             Bottom = insets[3]; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override string ToString() | ||||||
|  |         { | ||||||
|  |             return "[SafeAreaInsets: Left: " + Left + | ||||||
|  |                    ", Top: " + Top + | ||||||
|  |                    ", Right: " + Right + | ||||||
|  |                    ", Bottom: " + Bottom + "]"; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The CMP service, which provides direct APIs for interfacing with the Google-certified CMP installed, if any. |     /// The CMP service, which provides direct APIs for interfacing with the Google-certified CMP installed, if any. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|  | @ -511,16 +548,10 @@ public abstract class MaxSdkBase | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Allocate the MaxSdkCallbacks singleton, which receives all callback events from the native SDKs. |     // Allocate the MaxEventExecutor singleton which handles pushing callbacks from the background to the main thread. | ||||||
|     protected static void InitCallbacks() |     protected static void InitializeEventExecutor() | ||||||
|     { |     { | ||||||
|         var type = typeof(MaxSdkCallbacks); |         MaxEventExecutor.InitializeIfNeeded(); | ||||||
|         var mgr = new GameObject("MaxSdkCallbacks", type) |  | ||||||
|             .GetComponent<MaxSdkCallbacks>(); // Its Awake() method sets Instance. |  | ||||||
|         if (MaxSdkCallbacks.Instance != mgr) |  | ||||||
|         { |  | ||||||
|             MaxSdkLogger.UserWarning("It looks like you have the " + type.Name + " on a GameObject in your scene. Please remove the script from your scene."); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | @ -562,7 +593,7 @@ public abstract class MaxSdkBase | ||||||
|     { |     { | ||||||
|         try |         try | ||||||
|         { |         { | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(propsStr); |             MaxSdkCallbacks.ForwardEvent(propsStr); | ||||||
|         } |         } | ||||||
|         catch (Exception exception) |         catch (Exception exception) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -7,30 +7,10 @@ using System.Collections.Generic; | ||||||
| using System.Globalization; | using System.Globalization; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
| using AppLovinMax.ThirdParty.MiniJson; | using AppLovinMax.ThirdParty.MiniJson; | ||||||
|  | using AppLovinMax.Internal; | ||||||
| 
 | 
 | ||||||
| public class MaxSdkCallbacks : MonoBehaviour | public static class MaxSdkCallbacks | ||||||
| { | { | ||||||
| #if UNITY_EDITOR |  | ||||||
|     private static MaxSdkCallbacks instance; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     public static MaxSdkCallbacks Instance |  | ||||||
|     { |  | ||||||
| #if UNITY_EDITOR |  | ||||||
|         get |  | ||||||
|         { |  | ||||||
|             if (instance != null) return instance; |  | ||||||
| 
 |  | ||||||
|             instance = new GameObject("MaxSdkCallbacks", typeof(MaxSdkCallbacks)).GetComponent<MaxSdkCallbacks>(); |  | ||||||
|             DontDestroyOnLoad(instance); |  | ||||||
| 
 |  | ||||||
|             return instance; |  | ||||||
|         } |  | ||||||
| #else |  | ||||||
|         get; private set; |  | ||||||
| #endif |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Fired when the SDK has finished initializing |     // Fired when the SDK has finished initializing | ||||||
|     private static Action<MaxSdkBase.SdkConfiguration> _onSdkInitializedEvent; |     private static Action<MaxSdkBase.SdkConfiguration> _onSdkInitializedEvent; | ||||||
|     public static event Action<MaxSdkBase.SdkConfiguration> OnSdkInitializedEvent |     public static event Action<MaxSdkBase.SdkConfiguration> OnSdkInitializedEvent | ||||||
|  | @ -844,100 +824,6 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static Action<string, MaxSdkBase.AdInfo> _onCrossPromoAdLoadedEvent; |  | ||||||
|     private static Action<string, MaxSdkBase.ErrorInfo> _onCrossPromoAdLoadFailedEvent; |  | ||||||
|     private static Action<string, MaxSdkBase.AdInfo> _onCrossPromoAdClickedEvent; |  | ||||||
|     private static Action<string, MaxSdkBase.AdInfo> _onCrossPromoAdRevenuePaidEvent; |  | ||||||
|     private static Action<string, MaxSdkBase.AdInfo> _onCrossPromoAdExpandedEvent; |  | ||||||
|     private static Action<string, MaxSdkBase.AdInfo> _onCrossPromoAdCollapsedEvent; |  | ||||||
| 
 |  | ||||||
|     public class CrossPromo |  | ||||||
|     { |  | ||||||
|         public static event Action<string, MaxSdkBase.AdInfo> OnAdLoadedEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdLoadedEvent"); |  | ||||||
|                 _onCrossPromoAdLoadedEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdLoadedEvent"); |  | ||||||
|                 _onCrossPromoAdLoadedEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public static event Action<string, MaxSdkBase.ErrorInfo> OnAdLoadFailedEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdLoadFailedEvent"); |  | ||||||
|                 _onCrossPromoAdLoadFailedEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdLoadFailedEvent"); |  | ||||||
|                 _onCrossPromoAdLoadFailedEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public static event Action<string, MaxSdkBase.AdInfo> OnAdClickedEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdClickedEvent"); |  | ||||||
|                 _onCrossPromoAdClickedEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdClickedEvent"); |  | ||||||
|                 _onCrossPromoAdClickedEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public static event Action<string, MaxSdkBase.AdInfo> OnAdRevenuePaidEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdRevenuePaidEvent"); |  | ||||||
|                 _onCrossPromoAdRevenuePaidEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdRevenuePaidEvent"); |  | ||||||
|                 _onCrossPromoAdRevenuePaidEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public static event Action<string, MaxSdkBase.AdInfo> OnAdExpandedEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdExpandedEvent"); |  | ||||||
|                 _onCrossPromoAdExpandedEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdExpandedEvent"); |  | ||||||
|                 _onCrossPromoAdExpandedEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public static event Action<string, MaxSdkBase.AdInfo> OnAdCollapsedEvent |  | ||||||
|         { |  | ||||||
|             add |  | ||||||
|             { |  | ||||||
|                 LogSubscribedToEvent("OnCrossPromoAdCollapsedEvent"); |  | ||||||
|                 _onCrossPromoAdCollapsedEvent += value; |  | ||||||
|             } |  | ||||||
|             remove |  | ||||||
|             { |  | ||||||
|                 LogUnsubscribedToEvent("OnCrossPromoAdCollapsedEvent"); |  | ||||||
|                 _onCrossPromoAdCollapsedEvent -= value; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private static Action<string> _onBannerAdLoadedEvent; |     private static Action<string> _onBannerAdLoadedEvent; | ||||||
|     private static Action<string, int> _onBannerAdLoadFailedEvent; |     private static Action<string, int> _onBannerAdLoadFailedEvent; | ||||||
|     private static Action<string> _onBannerAdClickedEvent; |     private static Action<string> _onBannerAdClickedEvent; | ||||||
|  | @ -1312,18 +1198,7 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #if !UNITY_EDITOR |     public static void ForwardEvent(string eventPropsStr) | ||||||
|     void Awake() |  | ||||||
|     { |  | ||||||
|         if (Instance == null) |  | ||||||
|         { |  | ||||||
|             Instance = this; |  | ||||||
|             DontDestroyOnLoad(gameObject); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     public void ForwardEvent(string eventPropsStr) |  | ||||||
|     { |     { | ||||||
|         var eventProps = Json.Deserialize(eventPropsStr) as Dictionary<string, object>; |         var eventProps = Json.Deserialize(eventPropsStr) as Dictionary<string, object>; | ||||||
|         if (eventProps == null) |         if (eventProps == null) | ||||||
|  | @ -1332,6 +1207,7 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         var keepInBackground = MaxSdkUtils.GetBoolFromDictionary(eventProps, "keepInBackground", false); | ||||||
|         var eventName = MaxSdkUtils.GetStringFromDictionary(eventProps, "name", ""); |         var eventName = MaxSdkUtils.GetStringFromDictionary(eventProps, "name", ""); | ||||||
|         if (eventName == "OnInitialCallbackEvent") |         if (eventName == "OnInitialCallbackEvent") | ||||||
|         { |         { | ||||||
|  | @ -1340,11 +1216,11 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|         else if (eventName == "OnSdkInitializedEvent") |         else if (eventName == "OnSdkInitializedEvent") | ||||||
|         { |         { | ||||||
|             var sdkConfiguration = MaxSdkBase.SdkConfiguration.Create(eventProps); |             var sdkConfiguration = MaxSdkBase.SdkConfiguration.Create(eventProps); | ||||||
|             InvokeEvent(_onSdkInitializedEvent, sdkConfiguration, eventName); |             InvokeEvent(_onSdkInitializedEvent, sdkConfiguration, eventName, keepInBackground); | ||||||
|         } |         } | ||||||
|         else if (eventName == "OnSdkConsentDialogDismissedEvent") |         else if (eventName == "OnSdkConsentDialogDismissedEvent") | ||||||
|         { |         { | ||||||
|             InvokeEvent(_onSdkConsentDialogDismissedEvent, eventName); |             InvokeEvent(_onSdkConsentDialogDismissedEvent, eventName, keepInBackground); | ||||||
|         } |         } | ||||||
|         else if (eventName == "OnCmpCompletedEvent") |         else if (eventName == "OnCmpCompletedEvent") | ||||||
|         { |         { | ||||||
|  | @ -1358,223 +1234,197 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|             var adUnitIdentifier = MaxSdkUtils.GetStringFromDictionary(eventProps, "adUnitId", ""); |             var adUnitIdentifier = MaxSdkUtils.GetStringFromDictionary(eventProps, "adUnitId", ""); | ||||||
|             if (eventName == "OnBannerAdLoadedEvent") |             if (eventName == "OnBannerAdLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onBannerAdLoadedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onBannerAdLoadedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onBannerAdLoadedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onBannerAdLoadedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdLoadFailedEvent") |             else if (eventName == "OnBannerAdLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onBannerAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onBannerAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onBannerAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onBannerAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdClickedEvent") |             else if (eventName == "OnBannerAdClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onBannerAdClickedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onBannerAdClickedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onBannerAdClickedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onBannerAdClickedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdRevenuePaidEvent") |             else if (eventName == "OnBannerAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onBannerAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onBannerAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdReviewCreativeIdGeneratedEvent") |             else if (eventName == "OnBannerAdReviewCreativeIdGeneratedEvent") | ||||||
|             { |             { | ||||||
|                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); |                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); | ||||||
|                 InvokeEvent(_onBannerAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName); |                 InvokeEvent(_onBannerAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdExpandedEvent") |             else if (eventName == "OnBannerAdExpandedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onBannerAdExpandedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onBannerAdExpandedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onBannerAdExpandedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onBannerAdExpandedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnBannerAdCollapsedEvent") |             else if (eventName == "OnBannerAdCollapsedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onBannerAdCollapsedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onBannerAdCollapsedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onBannerAdCollapsedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onBannerAdCollapsedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdLoadedEvent") |             else if (eventName == "OnMRecAdLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onMRecAdLoadedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onMRecAdLoadedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onMRecAdLoadedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onMRecAdLoadedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdLoadFailedEvent") |             else if (eventName == "OnMRecAdLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onMRecAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onMRecAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onMRecAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onMRecAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdClickedEvent") |             else if (eventName == "OnMRecAdClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onMRecAdClickedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onMRecAdClickedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onMRecAdClickedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onMRecAdClickedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdRevenuePaidEvent") |             else if (eventName == "OnMRecAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onMRecAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onMRecAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdReviewCreativeIdGeneratedEvent") |             else if (eventName == "OnMRecAdReviewCreativeIdGeneratedEvent") | ||||||
|             { |             { | ||||||
|                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); |                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); | ||||||
|                 InvokeEvent(_onMRecAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName); |                 InvokeEvent(_onMRecAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdExpandedEvent") |             else if (eventName == "OnMRecAdExpandedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onMRecAdExpandedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onMRecAdExpandedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onMRecAdExpandedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onMRecAdExpandedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnMRecAdCollapsedEvent") |             else if (eventName == "OnMRecAdCollapsedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onMRecAdCollapsedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onMRecAdCollapsedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onMRecAdCollapsedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onMRecAdCollapsedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdLoadedEvent") |  | ||||||
|             { |  | ||||||
|                 InvokeEvent(_onCrossPromoAdLoadedEvent, adUnitIdentifier, adInfo, eventName); |  | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdLoadFailedEvent") |  | ||||||
|             { |  | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |  | ||||||
| 
 |  | ||||||
|                 InvokeEvent(_onCrossPromoAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName); |  | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdClickedEvent") |  | ||||||
|             { |  | ||||||
|                 InvokeEvent(_onCrossPromoAdClickedEvent, adUnitIdentifier, adInfo, eventName); |  | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdRevenuePaidEvent") |  | ||||||
|             { |  | ||||||
|                 InvokeEvent(_onCrossPromoAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |  | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdExpandedEvent") |  | ||||||
|             { |  | ||||||
|                 InvokeEvent(_onCrossPromoAdExpandedEvent, adUnitIdentifier, adInfo, eventName); |  | ||||||
|             } |  | ||||||
|             else if (eventName == "OnCrossPromoAdCollapsedEvent") |  | ||||||
|             { |  | ||||||
|                 InvokeEvent(_onCrossPromoAdCollapsedEvent, adUnitIdentifier, adInfo, eventName); |  | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialLoadedEvent") |             else if (eventName == "OnInterstitialLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onInterstitialAdLoadedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onInterstitialAdLoadedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onInterstitialAdLoadedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdLoadedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialLoadFailedEvent") |             else if (eventName == "OnInterstitialLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onInterstitialLoadFailedEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onInterstitialLoadFailedEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onInterstitialAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onInterstitialAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialHiddenEvent") |             else if (eventName == "OnInterstitialHiddenEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onInterstitialAdHiddenEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onInterstitialAdHiddenEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onInterstitialAdHiddenEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdHiddenEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialDisplayedEvent") |             else if (eventName == "OnInterstitialDisplayedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onInterstitialAdDisplayedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onInterstitialAdDisplayedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onInterstitialAdDisplayedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdDisplayedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialAdFailedToDisplayEvent") |             else if (eventName == "OnInterstitialAdFailedToDisplayEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onInterstitialAdFailedToDisplayEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onInterstitialAdFailedToDisplayEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onInterstitialAdFailedToDisplayEventV2, adUnitIdentifier, errorInfo, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdFailedToDisplayEventV2, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialClickedEvent") |             else if (eventName == "OnInterstitialClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onInterstitialAdClickedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onInterstitialAdClickedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onInterstitialAdClickedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdClickedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialAdRevenuePaidEvent") |             else if (eventName == "OnInterstitialAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onInterstitialAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnInterstitialAdReviewCreativeIdGeneratedEvent") |             else if (eventName == "OnInterstitialAdReviewCreativeIdGeneratedEvent") | ||||||
|             { |             { | ||||||
|                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); |                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); | ||||||
|                 InvokeEvent(_onInterstitialAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName); |                 InvokeEvent(_onInterstitialAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdLoadedEvent") |             else if (eventName == "OnAppOpenAdLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onAppOpenAdLoadedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdLoadFailedEvent") |             else if (eventName == "OnAppOpenAdLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onAppOpenAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onAppOpenAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdHiddenEvent") |             else if (eventName == "OnAppOpenAdHiddenEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onAppOpenAdHiddenEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdHiddenEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdDisplayedEvent") |             else if (eventName == "OnAppOpenAdDisplayedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onAppOpenAdDisplayedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdDisplayedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdFailedToDisplayEvent") |             else if (eventName == "OnAppOpenAdFailedToDisplayEvent") | ||||||
|             { |             { | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onAppOpenAdFailedToDisplayEvent, adUnitIdentifier, errorInfo, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdFailedToDisplayEvent, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdClickedEvent") |             else if (eventName == "OnAppOpenAdClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onAppOpenAdClickedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnAppOpenAdRevenuePaidEvent") |             else if (eventName == "OnAppOpenAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onAppOpenAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onAppOpenAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdLoadedEvent") |             else if (eventName == "OnRewardedAdLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedAdLoadedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onRewardedAdLoadedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onRewardedAdLoadedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedAdLoadedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdLoadFailedEvent") |             else if (eventName == "OnRewardedAdLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onRewardedAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onRewardedAdLoadFailedEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onRewardedAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onRewardedAdLoadFailedEventV2, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdDisplayedEvent") |             else if (eventName == "OnRewardedAdDisplayedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedAdDisplayedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onRewardedAdDisplayedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onRewardedAdDisplayedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedAdDisplayedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdHiddenEvent") |             else if (eventName == "OnRewardedAdHiddenEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedAdHiddenEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onRewardedAdHiddenEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onRewardedAdHiddenEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedAdHiddenEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdClickedEvent") |             else if (eventName == "OnRewardedAdClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedAdClickedEvent, adUnitIdentifier, eventName); |                 InvokeEvent(_onRewardedAdClickedEvent, adUnitIdentifier, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onRewardedAdClickedEventV2, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedAdClickedEventV2, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdRevenuePaidEvent") |             else if (eventName == "OnRewardedAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdReviewCreativeIdGeneratedEvent") |             else if (eventName == "OnRewardedAdReviewCreativeIdGeneratedEvent") | ||||||
|             { |             { | ||||||
|                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); |                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); | ||||||
|                 InvokeEvent(_onRewardedAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName); |                 InvokeEvent(_onRewardedAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdFailedToDisplayEvent") |             else if (eventName == "OnRewardedAdFailedToDisplayEvent") | ||||||
|             { |             { | ||||||
|                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); |                 var errorCode = MaxSdkUtils.GetIntFromDictionary(eventProps, "errorCode", -1); | ||||||
|                 InvokeEvent(_onRewardedAdFailedToDisplayEvent, adUnitIdentifier, errorCode, eventName); |                 InvokeEvent(_onRewardedAdFailedToDisplayEvent, adUnitIdentifier, errorCode, eventName, keepInBackground); | ||||||
| 
 | 
 | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
|                 InvokeEvent(_onRewardedAdFailedToDisplayEventV2, adUnitIdentifier, errorInfo, adInfo, eventName); |                 InvokeEvent(_onRewardedAdFailedToDisplayEventV2, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedAdReceivedRewardEvent") |             else if (eventName == "OnRewardedAdReceivedRewardEvent") | ||||||
|             { |             { | ||||||
|  | @ -1584,45 +1434,45 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|                     Amount = MaxSdkUtils.GetIntFromDictionary(eventProps, "rewardAmount", 0) |                     Amount = MaxSdkUtils.GetIntFromDictionary(eventProps, "rewardAmount", 0) | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 InvokeEvent(_onRewardedAdReceivedRewardEvent, adUnitIdentifier, reward, eventName); |                 InvokeEvent(_onRewardedAdReceivedRewardEvent, adUnitIdentifier, reward, eventName, keepInBackground); | ||||||
|                 InvokeEvent(_onRewardedAdReceivedRewardEventV2, adUnitIdentifier, reward, adInfo, eventName); |                 InvokeEvent(_onRewardedAdReceivedRewardEventV2, adUnitIdentifier, reward, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdLoadedEvent") |             else if (eventName == "OnRewardedInterstitialAdLoadedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdLoadedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdLoadedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdLoadFailedEvent") |             else if (eventName == "OnRewardedInterstitialAdLoadFailedEvent") | ||||||
|             { |             { | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
| 
 | 
 | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdLoadFailedEvent, adUnitIdentifier, errorInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdDisplayedEvent") |             else if (eventName == "OnRewardedInterstitialAdDisplayedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdDisplayedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdDisplayedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdHiddenEvent") |             else if (eventName == "OnRewardedInterstitialAdHiddenEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdHiddenEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdHiddenEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdClickedEvent") |             else if (eventName == "OnRewardedInterstitialAdClickedEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdClickedEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdClickedEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdRevenuePaidEvent") |             else if (eventName == "OnRewardedInterstitialAdRevenuePaidEvent") | ||||||
|             { |             { | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdRevenuePaidEvent, adUnitIdentifier, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdReviewCreativeIdGeneratedEvent") |             else if (eventName == "OnRewardedInterstitialAdReviewCreativeIdGeneratedEvent") | ||||||
|             { |             { | ||||||
|                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); |                 var adReviewCreativeId = MaxSdkUtils.GetStringFromDictionary(eventProps, "adReviewCreativeId", ""); | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdReviewCreativeIdGeneratedEvent, adUnitIdentifier, adReviewCreativeId, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdFailedToDisplayEvent") |             else if (eventName == "OnRewardedInterstitialAdFailedToDisplayEvent") | ||||||
|             { |             { | ||||||
|                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); |                 var errorInfo = new MaxSdkBase.ErrorInfo(eventProps); | ||||||
| 
 | 
 | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdFailedToDisplayEvent, adUnitIdentifier, errorInfo, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdFailedToDisplayEvent, adUnitIdentifier, errorInfo, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else if (eventName == "OnRewardedInterstitialAdReceivedRewardEvent") |             else if (eventName == "OnRewardedInterstitialAdReceivedRewardEvent") | ||||||
|             { |             { | ||||||
|  | @ -1632,7 +1482,7 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|                     Amount = MaxSdkUtils.GetIntFromDictionary(eventProps, "rewardAmount", 0) |                     Amount = MaxSdkUtils.GetIntFromDictionary(eventProps, "rewardAmount", 0) | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 InvokeEvent(_onRewardedInterstitialAdReceivedRewardEvent, adUnitIdentifier, reward, adInfo, eventName); |                 InvokeEvent(_onRewardedInterstitialAdReceivedRewardEvent, adUnitIdentifier, reward, adInfo, eventName, keepInBackground); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|  | @ -1650,36 +1500,96 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     private static void InvokeEvent(Action evt, string eventName) |     private static void InvokeEvent(Action evt, string eventName, bool keepInBackground) | ||||||
|     { |     { | ||||||
|         if (!CanInvokeEvent(evt)) return; |         if (!CanInvokeEvent(evt)) return; | ||||||
| 
 | 
 | ||||||
|         MaxSdkLogger.UserDebug("Invoking event: " + eventName); |         MaxSdkLogger.UserDebug("Invoking event: " + eventName); | ||||||
|         evt(); |         if (keepInBackground) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 evt(); | ||||||
|  |             } | ||||||
|  |             catch (Exception exception) | ||||||
|  |             { | ||||||
|  |                 MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); | ||||||
|  |                 Debug.LogException(exception); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             MaxEventExecutor.ExecuteOnMainThread(evt, eventName); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static void InvokeEvent<T>(Action<T> evt, T param, string eventName) |     private static void InvokeEvent<T>(Action<T> evt, T param, string eventName, bool keepInBackground) | ||||||
|     { |     { | ||||||
|         if (!CanInvokeEvent(evt)) return; |         if (!CanInvokeEvent(evt)) return; | ||||||
| 
 | 
 | ||||||
|         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Param: " + param); |         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Param: " + param); | ||||||
|         evt(param); |         if (keepInBackground) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 evt(param); | ||||||
|  |             } | ||||||
|  |             catch (Exception exception) | ||||||
|  |             { | ||||||
|  |                 MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); | ||||||
|  |                 Debug.LogException(exception); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             MaxEventExecutor.ExecuteOnMainThread(() => evt(param), eventName); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static void InvokeEvent<T1, T2>(Action<T1, T2> evt, T1 param1, T2 param2, string eventName) |     private static void InvokeEvent<T1, T2>(Action<T1, T2> evt, T1 param1, T2 param2, string eventName, bool keepInBackground) | ||||||
|     { |     { | ||||||
|         if (!CanInvokeEvent(evt)) return; |         if (!CanInvokeEvent(evt)) return; | ||||||
| 
 | 
 | ||||||
|         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2); |         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2); | ||||||
|         evt(param1, param2); |         if (keepInBackground) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 evt(param1, param2); | ||||||
|  |             } | ||||||
|  |             catch (Exception exception) | ||||||
|  |             { | ||||||
|  |                 MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); | ||||||
|  |                 Debug.LogException(exception); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             MaxEventExecutor.ExecuteOnMainThread(() => evt(param1, param2), eventName); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static void InvokeEvent<T1, T2, T3>(Action<T1, T2, T3> evt, T1 param1, T2 param2, T3 param3, string eventName) |     private static void InvokeEvent<T1, T2, T3>(Action<T1, T2, T3> evt, T1 param1, T2 param2, T3 param3, string eventName, bool keepInBackground) | ||||||
|     { |     { | ||||||
|         if (!CanInvokeEvent(evt)) return; |         if (!CanInvokeEvent(evt)) return; | ||||||
| 
 | 
 | ||||||
|         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2 + ", " + param3); |         MaxSdkLogger.UserDebug("Invoking event: " + eventName + ". Params: " + param1 + ", " + param2 + ", " + param3); | ||||||
|         evt(param1, param2, param3); |         if (keepInBackground) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 evt(param1, param2, param3); | ||||||
|  |             } | ||||||
|  |             catch (Exception exception) | ||||||
|  |             { | ||||||
|  |                 MaxSdkLogger.UserError("Caught exception in publisher event: " + eventName + ", exception: " + exception); | ||||||
|  |                 Debug.LogException(exception); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             MaxEventExecutor.ExecuteOnMainThread(() => evt(param1, param2, param3), eventName); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static bool CanInvokeEvent(Delegate evt) |     private static bool CanInvokeEvent(Delegate evt) | ||||||
|  | @ -1768,13 +1678,6 @@ public class MaxSdkCallbacks : MonoBehaviour | ||||||
|         _onMRecAdExpandedEventV2 = null; |         _onMRecAdExpandedEventV2 = null; | ||||||
|         _onMRecAdCollapsedEventV2 = null; |         _onMRecAdCollapsedEventV2 = null; | ||||||
| 
 | 
 | ||||||
|         _onCrossPromoAdLoadedEvent = null; |  | ||||||
|         _onCrossPromoAdLoadFailedEvent = null; |  | ||||||
|         _onCrossPromoAdClickedEvent = null; |  | ||||||
|         _onCrossPromoAdRevenuePaidEvent = null; |  | ||||||
|         _onCrossPromoAdExpandedEvent = null; |  | ||||||
|         _onCrossPromoAdCollapsedEvent = null; |  | ||||||
| 
 |  | ||||||
|         _onBannerAdLoadedEvent = null; |         _onBannerAdLoadedEvent = null; | ||||||
|         _onBannerAdLoadFailedEvent = null; |         _onBannerAdLoadFailedEvent = null; | ||||||
|         _onBannerAdClickedEvent = null; |         _onBannerAdClickedEvent = null; | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ using System; | ||||||
| using System.Collections; | using System.Collections; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Globalization; | using System.Globalization; | ||||||
|  | using AppLovinMax.Internal; | ||||||
| using AppLovinMax.ThirdParty.MiniJson; | using AppLovinMax.ThirdParty.MiniJson; | ||||||
| #if UNITY_EDITOR | #if UNITY_EDITOR | ||||||
| using UnityEditor; | using UnityEditor; | ||||||
|  | @ -28,6 +29,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     private static bool _doNotSell = false; |     private static bool _doNotSell = false; | ||||||
|     private static bool _isDoNotSellSet = false; |     private static bool _isDoNotSellSet = false; | ||||||
|     private static bool _showStubAds = true; |     private static bool _showStubAds = true; | ||||||
|  |     private static SafeAreaInsets _safeAreaInsets = new SafeAreaInsets(new int[] {0, 0, 0, 0}); | ||||||
|     private static readonly HashSet<string> RequestedAdUnits = new HashSet<string>(); |     private static readonly HashSet<string> RequestedAdUnits = new HashSet<string>(); | ||||||
|     private static readonly HashSet<string> ReadyAdUnits = new HashSet<string>(); |     private static readonly HashSet<string> ReadyAdUnits = new HashSet<string>(); | ||||||
|     private static readonly Dictionary<string, GameObject> StubBanners = new Dictionary<string, GameObject>(); |     private static readonly Dictionary<string, GameObject> StubBanners = new Dictionary<string, GameObject>(); | ||||||
|  | @ -49,6 +51,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// |     /// | ||||||
|     /// This method must be called before any other SDK operation |     /// This method must be called before any other SDK operation | ||||||
|     /// </summary> |     /// </summary> | ||||||
|  |     /// <param name="sdkKey">AppLovin SDK key. Must not be null.</param> | ||||||
|     public static void SetSdkKey(string sdkKey) |     public static void SetSdkKey(string sdkKey) | ||||||
|     { |     { | ||||||
|         _hasSdkKey = true; |         _hasSdkKey = true; | ||||||
|  | @ -111,7 +114,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// For example, a username or email. We'll include this in the postback when we ping your currency endpoint from our server. |     /// For example, a username or email. We'll include this in the postback when we ping your currency endpoint from our server. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     ///  |     ///  | ||||||
|     /// <param name="userId">The user identifier to be set.</param> |     /// <param name="userId">The user identifier to be set. Must not be null.</param> | ||||||
|     public static void SetUserId(string userId) { } |     public static void SetUserId(string userId) { } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | @ -184,8 +187,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Returns the arbitrary ad value for a given ad unit identifier with key. Returns null if no ad is loaded. |     /// Returns the arbitrary ad value for a given ad unit identifier with key. Returns null if no ad is loaded. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier"></param> |     /// <param name="adUnitIdentifier">Ad unit identifier for which to get the ad value for. Must not be null.</param> | ||||||
|     /// <param name="key">Ad value key</param> |     /// <param name="key">Ad value key. Must not be null.</param> | ||||||
|     /// <returns>Arbitrary ad value for a given key, or null if no ad is loaded.</returns> |     /// <returns>Arbitrary ad value for a given key, or null if no ad is loaded.</returns> | ||||||
|     public static string GetAdValue(string adUnitIdentifier, string key) |     public static string GetAdValue(string adUnitIdentifier, string key) | ||||||
|     { |     { | ||||||
|  | @ -297,8 +300,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new banner. |     /// Create a new banner. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create. Must not be null.</param> | ||||||
|     /// <param name="bannerPosition">Banner position</param> |     /// <param name="bannerPosition">Banner position. Must not be null.</param> | ||||||
|     public static void CreateBanner(string adUnitIdentifier, BannerPosition bannerPosition) |     public static void CreateBanner(string adUnitIdentifier, BannerPosition bannerPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "create banner"); | ||||||
|  | @ -312,14 +315,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         ExecuteWithDelay(1f, () => |         ExecuteWithDelay(1f, () => | ||||||
|         { |         { | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new banner with a custom position. |     /// Create a new banner with a custom position. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to create. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetBannerLayout"> |     /// <seealso cref="GetBannerLayout"> | ||||||
|  | @ -356,7 +359,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// NOTE: The <see cref="CreateBanner()"/> method loads the first banner ad and initiates an automated banner refresh process. |     /// NOTE: The <see cref="CreateBanner()"/> method loads the first banner ad and initiates an automated banner refresh process. | ||||||
|     /// You only need to call this method if you pause banner refresh.  |     /// You only need to call this method if you pause banner refresh.  | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to load. Must not be null.</param> | ||||||
|     public static void LoadBanner(string adUnitIdentifier) |     public static void LoadBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load banner"); | ||||||
|  | @ -364,14 +367,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         ExecuteWithDelay(1f, () => |         ExecuteWithDelay(1f, () => | ||||||
|         { |         { | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnBannerAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set the banner placement for an ad unit identifier to tie the future ad events to. |     /// Set the banner placement for an ad unit identifier to tie the future ad events to. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the placement for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the placement for. Must not be null.</param> | ||||||
|     /// <param name="placement">Placement to set</param> |     /// <param name="placement">Placement to set</param> | ||||||
|     public static void SetBannerPlacement(string adUnitIdentifier, string placement) |     public static void SetBannerPlacement(string adUnitIdentifier, string placement) | ||||||
|     { |     { | ||||||
|  | @ -381,7 +384,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Starts or resumes auto-refreshing of the banner for the given ad unit identifier. |     /// Starts or resumes auto-refreshing of the banner for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to start auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to start auto-refresh. Must not be null.</param> | ||||||
|     public static void StartBannerAutoRefresh(string adUnitIdentifier) |     public static void StartBannerAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         MaxSdkLogger.UserDebug("Starting banner auto refresh."); |         MaxSdkLogger.UserDebug("Starting banner auto refresh."); | ||||||
|  | @ -390,7 +393,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Pauses auto-refreshing of the banner for the given ad unit identifier. |     /// Pauses auto-refreshing of the banner for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to stop auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to stop auto-refresh. Must not be null.</param> | ||||||
|     public static void StopBannerAutoRefresh(string adUnitIdentifier) |     public static void StopBannerAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         MaxSdkLogger.UserDebug("Stopping banner auto refresh."); |         MaxSdkLogger.UserDebug("Stopping banner auto refresh."); | ||||||
|  | @ -399,8 +402,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the banner to the new position provided. |     /// Updates the position of the banner to the new position provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="bannerPosition">A new position for the banner</param> |     /// <param name="bannerPosition">A new position for the banner. Must not be null.</param> | ||||||
|     public static void UpdateBannerPosition(string adUnitIdentifier, BannerPosition bannerPosition) |     public static void UpdateBannerPosition(string adUnitIdentifier, BannerPosition bannerPosition) | ||||||
|     { |     { | ||||||
|         Debug.Log("[AppLovin MAX] Updating banner position to '" + bannerPosition + "' for ad unit id '" + adUnitIdentifier + "'"); |         Debug.Log("[AppLovin MAX] Updating banner position to '" + bannerPosition + "' for ad unit id '" + adUnitIdentifier + "'"); | ||||||
|  | @ -409,7 +412,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the banner to the new coordinates provided. |     /// Updates the position of the banner to the new coordinates provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the banner relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetBannerLayout"> |     /// <seealso cref="GetBannerLayout"> | ||||||
|  | @ -423,7 +426,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Overrides the width of the banner in points/dp. |     /// Overrides the width of the banner in points/dp. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to override the width for</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the banner for which to override the width for. Must not be null.</param> | ||||||
|     /// <param name="width">The desired width of the banner in points/dp</param> |     /// <param name="width">The desired width of the banner in points/dp</param> | ||||||
|     public static void SetBannerWidth(string adUnitIdentifier, float width) |     public static void SetBannerWidth(string adUnitIdentifier, float width) | ||||||
|     { |     { | ||||||
|  | @ -434,7 +437,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Show banner at a position determined by the 'CreateBanner' call. |     /// Show banner at a position determined by the 'CreateBanner' call. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to show. Must not be null.</param> | ||||||
|     public static void ShowBanner(string adUnitIdentifier) |     public static void ShowBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "show banner"); | ||||||
|  | @ -456,7 +459,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Remove banner from the ad view and destroy it. |     /// Remove banner from the ad view and destroy it. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to destroy</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to destroy. Must not be null.</param> | ||||||
|     public static void DestroyBanner(string adUnitIdentifier) |     public static void DestroyBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy banner"); | ||||||
|  | @ -472,8 +475,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Hide banner. |     /// Hide banner. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to hide</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to hide. Must not be null.</param> | ||||||
|     /// <returns></returns> |  | ||||||
|     public static void HideBanner(string adUnitIdentifier) |     public static void HideBanner(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide banner"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "hide banner"); | ||||||
|  | @ -488,9 +490,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set non-transparent background color for banners to be fully functional. |     /// Set non-transparent background color for banners to be fully functional. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set background color for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set background color for. Must not be null.</param> | ||||||
|     /// <param name="color">A background color to set for the ad</param> |     /// <param name="color">A background color to set for the ad. Must not be null.</param> | ||||||
|     /// <returns></returns> |  | ||||||
|     public static void SetBannerBackgroundColor(string adUnitIdentifier, Color color) |     public static void SetBannerBackgroundColor(string adUnitIdentifier, Color color) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "set background color"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "set background color"); | ||||||
|  | @ -505,8 +506,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the banner ad. |     /// Set an extra parameter for the banner ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetBannerExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetBannerExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -516,8 +517,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the banner ad. |     /// Set a local extra parameter for the banner ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the local extra parameter.</param> |     /// <param name="value">The value for the local extra parameter.</param> | ||||||
|     public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetBannerLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -527,7 +528,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The custom data to tie the showing banner ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. |     /// The custom data to tie the showing banner ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Banner ad unit identifier of the banner to set the custom data for.</param> |     /// <param name="adUnitIdentifier">Banner ad unit identifier of the banner to set the custom data for. Must not be null.</param> | ||||||
|     /// <param name="customData">The custom data to be set.</param> |     /// <param name="customData">The custom data to be set.</param> | ||||||
|     public static void SetBannerCustomData(string adUnitIdentifier, string customData) |     public static void SetBannerCustomData(string adUnitIdentifier, string customData) | ||||||
|     { |     { | ||||||
|  | @ -538,7 +539,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// The banner position on the screen. When setting the banner position via <see cref="CreateBanner(string, float, float)"/> or <see cref="UpdateBannerPosition(string, float, float)"/>, |     /// The banner position on the screen. When setting the banner position via <see cref="CreateBanner(string, float, float)"/> or <see cref="UpdateBannerPosition(string, float, float)"/>, | ||||||
|     /// the banner is placed within the safe area of the screen. This returns the absolute position of the banner on screen. |     /// the banner is placed within the safe area of the screen. This returns the absolute position of the banner on screen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to get the position on screen.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the banner for which to get the position on screen. Must not be null.</param> | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> | ||||||
|     public static Rect GetBannerLayout(string adUnitIdentifier) |     public static Rect GetBannerLayout(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -553,8 +554,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new MREC. |     /// Create a new MREC. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create. Must not be null.</param> | ||||||
|     /// <param name="mrecPosition">MREC position</param> |     /// <param name="mrecPosition">MREC position. Must not be null.</param> | ||||||
|     public static void CreateMRec(string adUnitIdentifier, AdViewPosition mrecPosition) |     public static void CreateMRec(string adUnitIdentifier, AdViewPosition mrecPosition) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "create MREC"); | ||||||
|  | @ -563,14 +564,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         ExecuteWithDelay(1f, () => |         ExecuteWithDelay(1f, () => | ||||||
|         { |         { | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Create a new MREC with a custom position. |     /// Create a new MREC with a custom position. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to create. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetMRecLayout"> |     /// <seealso cref="GetMRecLayout"> | ||||||
|  | @ -587,7 +588,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// NOTE: The <see cref="CreateMRec()"/> method loads the first MREC ad and initiates an automated MREC refresh process. |     /// NOTE: The <see cref="CreateMRec()"/> method loads the first MREC ad and initiates an automated MREC refresh process. | ||||||
|     /// You only need to call this method if you pause MREC refresh.  |     /// You only need to call this method if you pause MREC refresh.  | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to load. Must not be null.</param> | ||||||
|     public static void LoadMRec(string adUnitIdentifier) |     public static void LoadMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load MREC"); | ||||||
|  | @ -595,14 +596,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         ExecuteWithDelay(1f, () => |         ExecuteWithDelay(1f, () => | ||||||
|         { |         { | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnMRecAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set the MREC placement for an ad unit identifier to tie the future ad events to. |     /// Set the MREC placement for an ad unit identifier to tie the future ad events to. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the placement for</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the placement for. Must not be null.</param> | ||||||
|     /// <param name="placement">Placement to set</param> |     /// <param name="placement">Placement to set</param> | ||||||
|     public static void SetMRecPlacement(string adUnitIdentifier, string placement) |     public static void SetMRecPlacement(string adUnitIdentifier, string placement) | ||||||
|     { |     { | ||||||
|  | @ -612,7 +613,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Starts or resumes auto-refreshing of the MREC for the given ad unit identifier. |     /// Starts or resumes auto-refreshing of the MREC for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to start auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to start auto-refresh. Must not be null.</param> | ||||||
|     public static void StartMRecAutoRefresh(string adUnitIdentifier) |     public static void StartMRecAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         MaxSdkLogger.UserDebug("Starting banner auto refresh."); |         MaxSdkLogger.UserDebug("Starting banner auto refresh."); | ||||||
|  | @ -621,7 +622,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Pauses auto-refreshing of the MREC for the given ad unit identifier. |     /// Pauses auto-refreshing of the MREC for the given ad unit identifier. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to stop auto-refresh</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to stop auto-refresh. Must not be null.</param> | ||||||
|     public static void StopMRecAutoRefresh(string adUnitIdentifier) |     public static void StopMRecAutoRefresh(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         MaxSdkLogger.UserDebug("Stopping banner auto refresh."); |         MaxSdkLogger.UserDebug("Stopping banner auto refresh."); | ||||||
|  | @ -630,8 +631,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the MREC to the new position provided. |     /// Updates the position of the MREC to the new position provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="mrecPosition">A new position for the MREC</param> |     /// <param name="mrecPosition">A new position for the MREC. Must not be null.</param> | ||||||
|     public static void UpdateMRecPosition(string adUnitIdentifier, AdViewPosition mrecPosition) |     public static void UpdateMRecPosition(string adUnitIdentifier, AdViewPosition mrecPosition) | ||||||
|     { |     { | ||||||
|         MaxSdkLogger.UserDebug("Updating MREC position to '" + mrecPosition + "' for ad unit id '" + adUnitIdentifier + "'"); |         MaxSdkLogger.UserDebug("Updating MREC position to '" + mrecPosition + "' for ad unit id '" + adUnitIdentifier + "'"); | ||||||
|  | @ -640,7 +641,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Updates the position of the MREC to the new coordinates provided. |     /// Updates the position of the MREC to the new coordinates provided. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position</param> |     /// <param name="adUnitIdentifier">The ad unit identifier of the MREC for which to update the position. Must not be null.</param> | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="x">The X coordinate (horizontal position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> |     /// <param name="y">The Y coordinate (vertical position) of the MREC relative to the top left corner of the screen.</param> | ||||||
|     /// <seealso cref="GetMRecLayout"> |     /// <seealso cref="GetMRecLayout"> | ||||||
|  | @ -654,7 +655,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Show MREC at a position determined by the 'CreateMRec' call. |     /// Show MREC at a position determined by the 'CreateMRec' call. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to show. Must not be null.</param> | ||||||
|     public static void ShowMRec(string adUnitIdentifier) |     public static void ShowMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "show MREC"); | ||||||
|  | @ -668,7 +669,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Remove MREC from the ad view and destroy it. |     /// Remove MREC from the ad view and destroy it. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to destroy</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to destroy. Must not be null.</param> | ||||||
|     public static void DestroyMRec(string adUnitIdentifier) |     public static void DestroyMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy MREC"); | ||||||
|  | @ -677,7 +678,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Hide MREC. |     /// Hide MREC. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to hide</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to hide. Must not be null.</param> | ||||||
|     public static void HideMRec(string adUnitIdentifier) |     public static void HideMRec(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "hide MREC"); | ||||||
|  | @ -686,8 +687,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the MREC ad. |     /// Set an extra parameter for the MREC ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetMRecExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetMRecExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -697,8 +698,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the MREC ad. |     /// Set a local extra parameter for the MREC ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the local extra parameter.</param> |     /// <param name="value">The value for the local extra parameter.</param> | ||||||
|     public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetMRecLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -708,7 +709,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The custom data to tie the showing MREC ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. |     /// The custom data to tie the showing MREC ad to, for ILRD and rewarded postbacks via the <c>{CUSTOM_DATA}</c> macro. Maximum size is 8KB. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">MREC Ad unit identifier of the banner to set the custom data for.</param> |     /// <param name="adUnitIdentifier">MREC Ad unit identifier of the banner to set the custom data for. Must not be null.</param> | ||||||
|     /// <param name="customData">The custom data to be set.</param> |     /// <param name="customData">The custom data to be set.</param> | ||||||
|     public static void SetMRecCustomData(string adUnitIdentifier, string customData) |     public static void SetMRecCustomData(string adUnitIdentifier, string customData) | ||||||
|     { |     { | ||||||
|  | @ -719,7 +720,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// The MREC position on the screen. When setting the MREC position via <see cref="CreateMRec(string, float, float)"/> or <see cref="UpdateMRecPosition(string, float, float)"/>, |     /// The MREC position on the screen. When setting the MREC position via <see cref="CreateMRec(string, float, float)"/> or <see cref="UpdateMRecPosition(string, float, float)"/>, | ||||||
|     /// the MREC is placed within the safe area of the screen. This returns the absolute position of the MREC on screen. |     /// the MREC is placed within the safe area of the screen. This returns the absolute position of the MREC on screen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to get the position on screen.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the MREC for which to get the position on screen. Must not be null.</param> | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> | ||||||
|     public static Rect GetMRecLayout(string adUnitIdentifier) |     public static Rect GetMRecLayout(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -729,99 +730,6 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
| 
 | 
 | ||||||
|     #endregion |     #endregion | ||||||
| 
 | 
 | ||||||
|     #region Cross Promo Ads |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Create a new cross promo ad with a custom position. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to create</param> |  | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="width">The width of the cross promo ad.</param> |  | ||||||
|     /// <param name="height">The height of the cross promo ad.</param> |  | ||||||
|     /// <param name="rotation">The rotation of the cross promo ad in degrees.</param> |  | ||||||
|     /// <seealso cref="GetCrossPromoAdLayout"> |  | ||||||
|     /// The cross promo is placed within the safe area of the screen. You can use this to get the absolute position Rect of the cross promo ad on screen. |  | ||||||
|     /// </seealso> |  | ||||||
|     public static void CreateCrossPromoAd(string adUnitIdentifier, float x, float y, float width, float height, float rotation) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "create cross promo ad"); |  | ||||||
|         RequestAdUnit(adUnitIdentifier); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Set the cross promo ad placement for an ad unit identifier to tie the future ad events to. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to set the placement for</param> |  | ||||||
|     /// <param name="placement">Placement to set</param> |  | ||||||
|     public static void SetCrossPromoAdPlacement(string adUnitIdentifier, string placement) |  | ||||||
|     { |  | ||||||
|         MaxSdkLogger.UserDebug("Setting cross promo ad placement to '" + placement + "' for ad unit id '" + adUnitIdentifier + "'"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Updates the position of the cross promo ad to the new coordinates provided. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">The ad unit identifier of the cross promo ad for which to update the position</param> |  | ||||||
|     /// <param name="x">The X coordinate (horizontal position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="y">The Y coordinate (vertical position) of the cross promo ad relative to the top left corner of the screen.</param> |  | ||||||
|     /// <param name="width">The width of the cross promo ad.</param> |  | ||||||
|     /// <param name="height">The height of the cross promo ad.</param> |  | ||||||
|     /// <param name="rotation">The rotation of the cross promo ad in degrees.</param> |  | ||||||
|     /// <seealso cref="GetCrossPromoAdLayout"> |  | ||||||
|     /// The cross promo ad is placed within the safe area of the screen. You can use this to get the absolute position Rect of the cross promo ad on screen. |  | ||||||
|     /// </seealso> |  | ||||||
|     public static void UpdateCrossPromoAdPosition(string adUnitIdentifier, float x, float y, float width, float height, float rotation) |  | ||||||
|     { |  | ||||||
|         MaxSdkLogger.UserDebug("Updating cross promo ad position to (" + x + "," + y + ") with size " + width + " x " + height + " and rotation of " + rotation + " degrees"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Show cross promo ad at a position determined by the 'CreateCrossPromoAd' call. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to show</param> |  | ||||||
|     public static void ShowCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "show cross promo ad"); |  | ||||||
| 
 |  | ||||||
|         if (!IsAdUnitRequested(adUnitIdentifier)) |  | ||||||
|         { |  | ||||||
|             MaxSdkLogger.UserWarning("Cross promo ad '" + adUnitIdentifier + "' was not created, can not show it"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Remove cross promo ad from the ad view and destroy it. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to destroy</param> |  | ||||||
|     public static void DestroyCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "destroy cross promo ad"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// Hide cross promo ad. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad to hide</param> |  | ||||||
|     public static void HideCrossPromoAd(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "hide cross promo ad"); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     /// The cross promo ad position on the screen. When setting the cross promo ad position via <see cref="CreateCrossPromoAd(string, float, float, float, float, float)"/> or <see cref="UpdateCrossPromoAdPosition(string, float, float, float, float, float)"/>, |  | ||||||
|     /// the cross promo ad is placed within the safe area of the screen. This returns the absolute position of the cross promo ad on screen. |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the cross promo ad for which to get the position on screen.</param> |  | ||||||
|     /// <returns>A <see cref="Rect"/> representing the banner position on screen.</returns> |  | ||||||
|     public static Rect GetCrossPromoAdLayout(string adUnitIdentifier) |  | ||||||
|     { |  | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "get cross promo ad layout"); |  | ||||||
|         return Rect.zero; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #endregion |  | ||||||
| 
 |  | ||||||
|     #region Interstitials |     #region Interstitials | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | @ -838,7 +746,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|             AddReadyAdUnit(adUnitIdentifier); |             AddReadyAdUnit(adUnitIdentifier); | ||||||
| 
 | 
 | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -906,12 +814,12 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         closeButton.onClick.AddListener(() => |         closeButton.onClick.AddListener(() => | ||||||
|         { |         { | ||||||
|             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialHiddenEvent", adUnitIdentifier)); |             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialHiddenEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(adHiddenEventProps); |             MaxSdkCallbacks.ForwardEvent(adHiddenEventProps); | ||||||
|             Object.Destroy(stubInterstitial); |             Object.Destroy(stubInterstitial); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialDisplayedEvent", adUnitIdentifier)); |         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnInterstitialDisplayedEvent", adUnitIdentifier)); | ||||||
|         MaxSdkCallbacks.Instance.ForwardEvent(adDisplayedEventProps); |         MaxSdkCallbacks.ForwardEvent(adDisplayedEventProps); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -944,7 +852,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an app open ad. |     /// Start loading an app open ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     public static void LoadAppOpenAd(string adUnitIdentifier) |     public static void LoadAppOpenAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load app open ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load app open ad"); | ||||||
|  | @ -955,14 +863,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|             AddReadyAdUnit(adUnitIdentifier); |             AddReadyAdUnit(adUnitIdentifier); | ||||||
| 
 | 
 | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if app open ad ad is loaded and ready to be displayed. |     /// Check if app open ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsAppOpenAdReady(string adUnitIdentifier) |     public static bool IsAppOpenAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -981,7 +889,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded app open ad for a given placement to tie ad events to. Note: if the app open ad is not ready to be displayed nothing will happen. |     /// Present loaded app open ad for a given placement to tie ad events to. Note: if the app open ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to load. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowAppOpenAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowAppOpenAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -1023,20 +931,20 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         closeButton.onClick.AddListener(() => |         closeButton.onClick.AddListener(() => | ||||||
|         { |         { | ||||||
|             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdHiddenEvent", adUnitIdentifier)); |             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdHiddenEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(adHiddenEventProps); |             MaxSdkCallbacks.ForwardEvent(adHiddenEventProps); | ||||||
|             Object.Destroy(stubAppOpenAd); |             Object.Destroy(stubAppOpenAd); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdDisplayedEvent", adUnitIdentifier)); |         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnAppOpenAdDisplayedEvent", adUnitIdentifier)); | ||||||
|         MaxSdkCallbacks.Instance.ForwardEvent(adDisplayedEventProps); |         MaxSdkCallbacks.ForwardEvent(adDisplayedEventProps); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetAppOpenAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetAppOpenAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -1046,8 +954,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the app open ad to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the local extra parameter.</param> |     /// <param name="value">The value for the local extra parameter.</param> | ||||||
|     public static void SetAppOpenAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetAppOpenAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -1061,7 +969,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an rewarded ad. |     /// Start loading an rewarded ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load. Must not be null.</param> | ||||||
|     public static void LoadRewardedAd(string adUnitIdentifier) |     public static void LoadRewardedAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded ad"); | ||||||
|  | @ -1071,14 +979,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         { |         { | ||||||
|             AddReadyAdUnit(adUnitIdentifier); |             AddReadyAdUnit(adUnitIdentifier); | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if rewarded ad ad is loaded and ready to be displayed. |     /// Check if rewarded ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsRewardedAdReady(string adUnitIdentifier) |     public static bool IsRewardedAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -1097,7 +1005,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded rewarded ad for a given placement to tie ad events to. Note: if the rewarded ad is not ready to be displayed nothing will happen. |     /// Present loaded rewarded ad for a given placement to tie ad events to. Note: if the rewarded ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the interstitial to load. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowRewardedAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowRewardedAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -1147,11 +1055,11 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|                 rewardEventPropsDict["rewardLabel"] = "coins"; |                 rewardEventPropsDict["rewardLabel"] = "coins"; | ||||||
|                 rewardEventPropsDict["rewardAmount"] = "5"; |                 rewardEventPropsDict["rewardAmount"] = "5"; | ||||||
|                 var rewardEventProps = Json.Serialize(rewardEventPropsDict); |                 var rewardEventProps = Json.Serialize(rewardEventPropsDict); | ||||||
|                 MaxSdkCallbacks.Instance.ForwardEvent(rewardEventProps); |                 MaxSdkCallbacks.ForwardEvent(rewardEventProps); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdHiddenEvent", adUnitIdentifier)); |             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdHiddenEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(adHiddenEventProps); |             MaxSdkCallbacks.ForwardEvent(adHiddenEventProps); | ||||||
|             Object.Destroy(stubRewardedAd); |             Object.Destroy(stubRewardedAd); | ||||||
|         }); |         }); | ||||||
|         rewardButton.onClick.AddListener(() => |         rewardButton.onClick.AddListener(() => | ||||||
|  | @ -1161,15 +1069,15 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdDisplayedEvent", adUnitIdentifier)); |         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdDisplayedEvent", adUnitIdentifier)); | ||||||
|         MaxSdkCallbacks.Instance.ForwardEvent(adDisplayedEventProps); |         MaxSdkCallbacks.ForwardEvent(adDisplayedEventProps); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetRewardedAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetRewardedAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -1179,8 +1087,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the local extra parameter.</param> |     /// <param name="value">The value for the local extra parameter.</param> | ||||||
|     public static void SetRewardedAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetRewardedAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -1194,7 +1102,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Start loading an rewarded interstitial ad. |     /// Start loading an rewarded interstitial ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to load. Must not be null.</param> | ||||||
|     public static void LoadRewardedInterstitialAd(string adUnitIdentifier) |     public static void LoadRewardedInterstitialAd(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded interstitial ad"); |         ValidateAdUnitIdentifier(adUnitIdentifier, "load rewarded interstitial ad"); | ||||||
|  | @ -1204,14 +1112,14 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         { |         { | ||||||
|             AddReadyAdUnit(adUnitIdentifier); |             AddReadyAdUnit(adUnitIdentifier); | ||||||
|             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedInterstitialAdLoadedEvent", adUnitIdentifier)); |             var eventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedInterstitialAdLoadedEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(eventProps); |             MaxSdkCallbacks.ForwardEvent(eventProps); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Check if rewarded interstitial ad ad is loaded and ready to be displayed. |     /// Check if rewarded interstitial ad ad is loaded and ready to be displayed. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded ad to load. Must not be null.</param> | ||||||
|     /// <returns>True if the ad is ready to be displayed</returns> |     /// <returns>True if the ad is ready to be displayed</returns> | ||||||
|     public static bool IsRewardedInterstitialAdReady(string adUnitIdentifier) |     public static bool IsRewardedInterstitialAdReady(string adUnitIdentifier) | ||||||
|     { |     { | ||||||
|  | @ -1230,7 +1138,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Present loaded rewarded interstitial ad for a given placement to tie ad events to. Note: if the rewarded interstitial ad is not ready to be displayed nothing will happen. |     /// Present loaded rewarded interstitial ad for a given placement to tie ad events to. Note: if the rewarded interstitial ad is not ready to be displayed nothing will happen. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to show</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial to show. Must not be null.</param> | ||||||
|     /// <param name="placement">The placement to tie the showing ad's events to</param> |     /// <param name="placement">The placement to tie the showing ad's events to</param> | ||||||
|     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> |     /// <param name="customData">The custom data to tie the showing ad's events to. Maximum size is 8KB.</param> | ||||||
|     public static void ShowRewardedInterstitialAd(string adUnitIdentifier, string placement = null, string customData = null) |     public static void ShowRewardedInterstitialAd(string adUnitIdentifier, string placement = null, string customData = null) | ||||||
|  | @ -1280,11 +1188,11 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|                 rewardEventPropsDict["rewardLabel"] = "coins"; |                 rewardEventPropsDict["rewardLabel"] = "coins"; | ||||||
|                 rewardEventPropsDict["rewardAmount"] = "5"; |                 rewardEventPropsDict["rewardAmount"] = "5"; | ||||||
|                 var rewardEventProps = Json.Serialize(rewardEventPropsDict); |                 var rewardEventProps = Json.Serialize(rewardEventPropsDict); | ||||||
|                 MaxSdkCallbacks.Instance.ForwardEvent(rewardEventProps); |                 MaxSdkCallbacks.ForwardEvent(rewardEventProps); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedInterstitialAdHiddenEvent", adUnitIdentifier)); |             var adHiddenEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedInterstitialAdHiddenEvent", adUnitIdentifier)); | ||||||
|             MaxSdkCallbacks.Instance.ForwardEvent(adHiddenEventProps); |             MaxSdkCallbacks.ForwardEvent(adHiddenEventProps); | ||||||
|             Object.Destroy(stubRewardedAd); |             Object.Destroy(stubRewardedAd); | ||||||
|         }); |         }); | ||||||
|         rewardButton.onClick.AddListener(() => |         rewardButton.onClick.AddListener(() => | ||||||
|  | @ -1294,15 +1202,15 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdDisplayedEvent", adUnitIdentifier)); |         var adDisplayedEventProps = Json.Serialize(CreateBaseEventPropsDictionary("OnRewardedAdDisplayedEvent", adUnitIdentifier)); | ||||||
|         MaxSdkCallbacks.Instance.ForwardEvent(adDisplayedEventProps); |         MaxSdkCallbacks.ForwardEvent(adDisplayedEventProps); | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set an extra parameter for the ad. |     /// Set an extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to set the extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to set the extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the extra parameter.</param> |     /// <param name="key">The key for the extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the extra parameter.</param> |     /// <param name="value">The value for the extra parameter.</param> | ||||||
|     public static void SetRewardedInterstitialAdExtraParameter(string adUnitIdentifier, string key, string value) |     public static void SetRewardedInterstitialAdExtraParameter(string adUnitIdentifier, string key, string value) | ||||||
|     { |     { | ||||||
|  | @ -1312,8 +1220,8 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Set a local extra parameter for the ad. |     /// Set a local extra parameter for the ad. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to set the local extra parameter for.</param> |     /// <param name="adUnitIdentifier">Ad unit identifier of the rewarded interstitial ad to set the local extra parameter for. Must not be null.</param> | ||||||
|     /// <param name="key">The key for the local extra parameter.</param> |     /// <param name="key">The key for the local extra parameter. Must not be null.</param> | ||||||
|     /// <param name="value">The value for the local extra parameter.</param> |     /// <param name="value">The value for the local extra parameter.</param> | ||||||
|     public static void SetRewardedInterstitialAdLocalExtraParameter(string adUnitIdentifier, string key, object value) |     public static void SetRewardedInterstitialAdLocalExtraParameter(string adUnitIdentifier, string key, object value) | ||||||
|     { |     { | ||||||
|  | @ -1327,7 +1235,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Track an event using AppLovin. |     /// Track an event using AppLovin. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="name">An event from the list of pre-defined events may be found in MaxEvents.cs as part of the AppLovin SDK framework.</param> |     /// <param name="name">An event from the list of pre-defined events may be found in MaxEvents.cs as part of the AppLovin SDK framework. Must not be null.</param> | ||||||
|     /// <param name="parameters">A dictionary containing key-value pairs further describing this event.</param> |     /// <param name="parameters">A dictionary containing key-value pairs further describing this event.</param> | ||||||
|     public static void TrackEvent(string name, IDictionary<string, string> parameters = null) { } |     public static void TrackEvent(string name, IDictionary<string, string> parameters = null) { } | ||||||
| 
 | 
 | ||||||
|  | @ -1395,7 +1303,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="advertisingIdentifiers">String list of advertising identifiers from devices to receive test ads.</param> |     /// <param name="advertisingIdentifiers">String list of advertising identifiers from devices to receive test ads.</param> | ||||||
|     public static void SetTestDeviceAdvertisingIdentifiers(string[] advertisingIdentifiers) |     public static void SetTestDeviceAdvertisingIdentifiers(string[] advertisingIdentifiers) | ||||||
|     {  |     { | ||||||
|         if (IsInitialized()) |         if (IsInitialized()) | ||||||
|         { |         { | ||||||
|             MaxSdkLogger.UserError("Test Device Advertising Identifiers must be set before SDK initialization."); |             MaxSdkLogger.UserError("Test Device Advertising Identifiers must be set before SDK initialization."); | ||||||
|  | @ -1421,6 +1329,15 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
|     /// <param name="value">The value for the extra parameter. May be null.</param> |     /// <param name="value">The value for the extra parameter. May be null.</param> | ||||||
|     public static void SetExtraParameter(string key, string value) { } |     public static void SetExtraParameter(string key, string value) { } | ||||||
| 
 | 
 | ||||||
|  |     /// <summary> | ||||||
|  |     /// Get the native insets in pixels for the safe area. | ||||||
|  |     /// These insets are used to position ads within the safe area of the screen. | ||||||
|  |     /// </summary> | ||||||
|  |     public static SafeAreaInsets GetSafeAreaInsets() | ||||||
|  |     { | ||||||
|  |         return _safeAreaInsets; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #endregion |     #endregion | ||||||
| 
 | 
 | ||||||
|     #region Internal |     #region Internal | ||||||
|  | @ -1481,7 +1398,7 @@ public class MaxSdkUnityEditor : MaxSdkBase | ||||||
| 
 | 
 | ||||||
|     private static void ExecuteWithDelay(float seconds, Action action) |     private static void ExecuteWithDelay(float seconds, Action action) | ||||||
|     { |     { | ||||||
|         MaxSdkCallbacks.Instance.StartCoroutine(ExecuteAction(seconds, action)); |         MaxEventExecutor.Instance.StartCoroutine(ExecuteAction(seconds, action)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static IEnumerator ExecuteAction(float seconds, Action action) |     private static IEnumerator ExecuteAction(float seconds, Action action) | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue