2023-12-26 03:47:44 +00:00
/ /
// AppLovinBuildPreProcessor.cs
// AppLovin MAX Unity Plugin
/ /
// Created by Santosh Bagadi on 8/27/19.
// Copyright © 2019 AppLovin. All rights reserved.
/ /
#if UNITY_ANDROID
using System.Linq ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using AppLovinMax.ThirdParty.MiniJson ;
using UnityEditor ;
using UnityEditor.Build ;
using UnityEditor.Build.Reporting ;
using UnityEngine ;
namespace AppLovinMax.Scripts.IntegrationManager.Editor
{
/// <summary>
/// Adds the AppLovin Quality Service plugin to the gradle template file. See <see cref="AppLovinProcessGradleBuildFile"/> for more details.
/// </summary>
2024-01-26 04:24:22 +00:00
public class AppLovinPreProcessAndroid : AppLovinProcessGradleBuildFile , IPreprocessBuildWithReport
2023-12-26 03:47:44 +00:00
{
private const string AppLovinSettingsFileName = "applovin_settings.json" ;
private const string KeyTermsFlowSettings = "terms_flow_settings" ;
private const string KeyTermsFlowEnabled = "terms_flow_enabled" ;
private const string KeyTermsFlowTermsOfService = "terms_flow_terms_of_service" ;
private const string KeyTermsFlowPrivacyPolicy = "terms_flow_privacy_policy" ;
private const string KeyConsentFlowSettings = "consent_flow_settings" ;
private const string KeyConsentFlowEnabled = "consent_flow_enabled" ;
private const string KeyConsentFlowTermsOfService = "consent_flow_terms_of_service" ;
private const string KeyConsentFlowPrivacyPolicy = "consent_flow_privacy_policy" ;
2024-01-26 04:24:22 +00:00
private const string KeyConsentFlowDebugUserGeography = "consent_flow_debug_user_geography" ;
2023-12-26 03:47:44 +00:00
public void OnPreprocessBuild ( BuildReport report )
2024-01-26 04:24:22 +00:00
{
PreprocessAppLovinQualityServicePlugin ( ) ;
AddGoogleCmpDependencyIfNeeded ( ) ;
}
private static void PreprocessAppLovinQualityServicePlugin ( )
2023-12-26 03:47:44 +00:00
{
// We can only process gradle template file here. If it is not available, we will try again in post build on Unity IDEs newer than 2018_2 (see AppLovinPostProcessGradleProject).
if ( ! AppLovinIntegrationManager . GradleTemplateEnabled ) return ;
#if UNITY_2019_3_OR_NEWER
// The publisher could be migrating from older Unity versions to 2019_3 or newer.
// If so, we should delete the plugin from the template. The plugin will be added to the project's application module in the post processing script (AppLovinPostProcessGradleProject).
RemoveAppLovinQualityServiceOrSafeDkPlugin ( AppLovinIntegrationManager . GradleTemplatePath ) ;
# else
AddAppLovinQualityServicePlugin ( AppLovinIntegrationManager . GradleTemplatePath ) ;
# endif
}
public static void EnableConsentFlowIfNeeded ( string rawResourceDirectory )
{
// Check if consent flow is enabled. No need to create the applovin_consent_flow_settings.json if consent flow is disabled.
var consentFlowEnabled = AppLovinInternalSettings . Instance . ConsentFlowEnabled ;
if ( ! consentFlowEnabled )
{
RemoveAppLovinSettingsRawResourceFileIfNeeded ( rawResourceDirectory ) ;
return ;
}
var privacyPolicyUrl = AppLovinInternalSettings . Instance . ConsentFlowPrivacyPolicyUrl ;
if ( string . IsNullOrEmpty ( privacyPolicyUrl ) )
{
AppLovinIntegrationManager . ShowBuildFailureDialog ( "You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL in the AppLovin Integration Manager." ) ;
// No need to update the applovin_consent_flow_settings.json here. Default consent flow state will be determined on the SDK side.
return ;
}
var consentFlowSettings = new Dictionary < string , object > ( ) ;
consentFlowSettings [ KeyConsentFlowEnabled ] = consentFlowEnabled ;
consentFlowSettings [ KeyConsentFlowPrivacyPolicy ] = privacyPolicyUrl ;
var termsOfServiceUrl = AppLovinInternalSettings . Instance . ConsentFlowTermsOfServiceUrl ;
if ( MaxSdkUtils . IsValidString ( termsOfServiceUrl ) )
{
consentFlowSettings [ KeyConsentFlowTermsOfService ] = termsOfServiceUrl ;
}
2024-01-26 04:24:22 +00:00
var debugUserGeography = AppLovinInternalSettings . Instance . DebugUserGeography ;
if ( debugUserGeography = = MaxSdkBase . ConsentFlowUserGeography . Gdpr )
2023-12-26 03:47:44 +00:00
{
2024-01-26 04:24:22 +00:00
consentFlowSettings [ KeyConsentFlowDebugUserGeography ] = "gdpr" ;
2023-12-26 03:47:44 +00:00
}
var applovinSdkSettings = new Dictionary < string , object > ( ) ;
applovinSdkSettings [ KeyConsentFlowSettings ] = consentFlowSettings ;
var applovinSdkSettingsJson = Json . Serialize ( applovinSdkSettings ) ;
WriteAppLovinSettingsRawResourceFile ( applovinSdkSettingsJson , rawResourceDirectory ) ;
}
public static void EnableTermsFlowIfNeeded ( string rawResourceDirectory )
{
2024-01-26 04:24:22 +00:00
if ( AppLovinInternalSettings . Instance . ConsentFlowEnabled ) return ;
2023-12-26 03:47:44 +00:00
// Check if terms flow is enabled for this format. No need to create the applovin_consent_flow_settings.json if consent flow is disabled.
var consentFlowEnabled = AppLovinSettings . Instance . ConsentFlowEnabled ;
var consentFlowPlatform = AppLovinSettings . Instance . ConsentFlowPlatform ;
if ( ! consentFlowEnabled | | ( consentFlowPlatform ! = Platform . All & & consentFlowPlatform ! = Platform . Android ) )
{
RemoveAppLovinSettingsRawResourceFileIfNeeded ( rawResourceDirectory ) ;
return ;
}
var privacyPolicyUrl = AppLovinSettings . Instance . ConsentFlowPrivacyPolicyUrl ;
if ( string . IsNullOrEmpty ( privacyPolicyUrl ) )
{
AppLovinIntegrationManager . ShowBuildFailureDialog ( "You cannot use the AppLovin SDK's consent flow without defining a Privacy Policy URL in the AppLovin Integration Manager." ) ;
// No need to update the applovin_consent_flow_settings.json here. Default consent flow state will be determined on the SDK side.
return ;
}
var consentFlowSettings = new Dictionary < string , object > ( ) ;
consentFlowSettings [ KeyTermsFlowEnabled ] = consentFlowEnabled ;
consentFlowSettings [ KeyTermsFlowPrivacyPolicy ] = privacyPolicyUrl ;
var termsOfServiceUrl = AppLovinSettings . Instance . ConsentFlowTermsOfServiceUrl ;
if ( MaxSdkUtils . IsValidString ( termsOfServiceUrl ) )
{
consentFlowSettings [ KeyTermsFlowTermsOfService ] = termsOfServiceUrl ;
}
var applovinSdkSettings = new Dictionary < string , object > ( ) ;
applovinSdkSettings [ KeyTermsFlowSettings ] = consentFlowSettings ;
var applovinSdkSettingsJson = Json . Serialize ( applovinSdkSettings ) ;
WriteAppLovinSettingsRawResourceFile ( applovinSdkSettingsJson , rawResourceDirectory ) ;
}
private static void WriteAppLovinSettingsRawResourceFile ( string applovinSdkSettingsJson , string rawResourceDirectory )
{
if ( ! Directory . Exists ( rawResourceDirectory ) )
{
Directory . CreateDirectory ( rawResourceDirectory ) ;
}
var consentFlowSettingsFilePath = Path . Combine ( rawResourceDirectory , AppLovinSettingsFileName ) ;
try
{
File . WriteAllText ( consentFlowSettingsFilePath , applovinSdkSettingsJson + "\n" ) ;
}
catch ( Exception exception )
{
MaxSdkLogger . UserError ( "applovin_settings.json file write failed due to: " + exception . Message ) ;
Console . WriteLine ( exception ) ;
}
}
/// <summary>
/// Removes the applovin_settings json file from the build if it exists.
/// </summary>
/// <param name="rawResourceDirectory">The raw resource directory that holds the json file</param>
private static void RemoveAppLovinSettingsRawResourceFileIfNeeded ( string rawResourceDirectory )
{
var consentFlowSettingsFilePath = Path . Combine ( rawResourceDirectory , AppLovinSettingsFileName ) ;
if ( ! File . Exists ( consentFlowSettingsFilePath ) ) return ;
try
{
File . Delete ( consentFlowSettingsFilePath ) ;
}
catch ( Exception exception )
{
MaxSdkLogger . UserError ( "Deleting applovin_settings.json failed due to: " + exception . Message ) ;
Console . WriteLine ( exception ) ;
}
}
2024-01-26 04:24:22 +00:00
private static void AddGoogleCmpDependencyIfNeeded ( )
{
const string umpDependencyLine = "<androidPackage spec=\"com.google.android.ump:user-messaging-platform:2.1.0\" />" ;
const string containerElementString = "androidPackages" ;
if ( AppLovinInternalSettings . Instance . ConsentFlowEnabled )
{
TryAddStringToDependencyFile ( umpDependencyLine , containerElementString ) ;
}
else
{
TryRemoveStringFromDependencyFile ( umpDependencyLine , containerElementString ) ;
}
}
2023-12-26 03:47:44 +00:00
public int callbackOrder
{
get { return int . MaxValue ; }
}
}
}
# endif