209 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C#
		
	
	
//
 | 
						|
//  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>
 | 
						|
    public class AppLovinPreProcessAndroid : AppLovinProcessGradleBuildFile, IPreprocessBuildWithReport
 | 
						|
    {
 | 
						|
        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";
 | 
						|
        private const string KeyConsentFlowDebugUserGeography = "consent_flow_debug_user_geography";
 | 
						|
        
 | 
						|
        private const string UmpLegacyDependencyLine = "<androidPackage spec=\"com.google.android.ump:user-messaging-platform:2.1.0\" />";
 | 
						|
        private const string UmpDependencyLine = "<androidPackage spec=\"com.google.android.ump:user-messaging-platform:2.+\" />";
 | 
						|
        private const string AndroidPackagesContainerElementString = "androidPackages";
 | 
						|
 | 
						|
        public void OnPreprocessBuild(BuildReport report)
 | 
						|
        {
 | 
						|
            PreprocessAppLovinQualityServicePlugin();
 | 
						|
            AddGoogleCmpDependencyIfNeeded();
 | 
						|
        }
 | 
						|
 | 
						|
        private static void PreprocessAppLovinQualityServicePlugin()
 | 
						|
        {
 | 
						|
            // 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;
 | 
						|
            }
 | 
						|
 | 
						|
            var debugUserGeography = AppLovinInternalSettings.Instance.DebugUserGeography;
 | 
						|
            if (debugUserGeography == MaxSdkBase.ConsentFlowUserGeography.Gdpr)
 | 
						|
            {
 | 
						|
                consentFlowSettings[KeyConsentFlowDebugUserGeography] = "gdpr";
 | 
						|
            }
 | 
						|
 | 
						|
            var applovinSdkSettings = new Dictionary<string, object>();
 | 
						|
            applovinSdkSettings[KeyConsentFlowSettings] = consentFlowSettings;
 | 
						|
 | 
						|
            var applovinSdkSettingsJson = Json.Serialize(applovinSdkSettings);
 | 
						|
            WriteAppLovinSettingsRawResourceFile(applovinSdkSettingsJson, rawResourceDirectory);
 | 
						|
        }
 | 
						|
 | 
						|
        public static void EnableTermsFlowIfNeeded(string rawResourceDirectory)
 | 
						|
        {
 | 
						|
            if (AppLovinInternalSettings.Instance.ConsentFlowEnabled) return;
 | 
						|
 | 
						|
            // 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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private static void AddGoogleCmpDependencyIfNeeded()
 | 
						|
        {
 | 
						|
            // Remove the legacy fixed UMP version if it exists, we'll add the dependency with a dynamic version below.
 | 
						|
            TryRemoveStringFromDependencyFile(UmpLegacyDependencyLine, AndroidPackagesContainerElementString);
 | 
						|
 | 
						|
            if (AppLovinInternalSettings.Instance.ConsentFlowEnabled)
 | 
						|
            {
 | 
						|
                TryAddStringToDependencyFile(UmpDependencyLine, AndroidPackagesContainerElementString);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                TryRemoveStringFromDependencyFile(UmpDependencyLine, AndroidPackagesContainerElementString);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public int callbackOrder
 | 
						|
        {
 | 
						|
            get { return int.MaxValue; }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |