183 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| //
 | |
| //  AppLovinPreProcess.cs
 | |
| //  AppLovin MAX Unity Plugin
 | |
| //
 | |
| //  Created by Jonathan Liu on 10/19/2023.
 | |
| //  Copyright © 2023 AppLovin. All rights reserved.
 | |
| //
 | |
| 
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Linq;
 | |
| using System.Xml;
 | |
| using System.Xml.Linq;
 | |
| 
 | |
| namespace AppLovinMax.Scripts.IntegrationManager.Editor
 | |
| {
 | |
|     public abstract class AppLovinPreProcess
 | |
|     {
 | |
|         // Use a slightly lower value than max value so pubs have the option to run a post process script after ours.
 | |
|         internal const int CallbackOrder = int.MaxValue - 10;
 | |
|         private const string AppLovinDependenciesFileExportPath = "MaxSdk/AppLovin/Editor/Dependencies.xml";
 | |
|         private const string ElementNameDependencies = "dependencies";
 | |
| 
 | |
|         private static readonly XmlWriterSettings DependenciesFileXmlWriterSettings = new XmlWriterSettings
 | |
|         {
 | |
|             Indent = true,
 | |
|             IndentChars = "    ",
 | |
|             NewLineChars = "\n",
 | |
|             NewLineHandling = NewLineHandling.Replace
 | |
|         };
 | |
| 
 | |
|         protected static string AppLovinDependenciesFilePath
 | |
|         {
 | |
|             get { return AppLovinIntegrationManager.IsPluginInPackageManager ? Path.Combine("Assets", AppLovinDependenciesFileExportPath) : MaxSdkUtils.GetAssetPathForExportPath(AppLovinDependenciesFileExportPath); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the AppLovin Dependencies.xml file. If `createIfNotExists` is true, a new file will be created if one does not exist.
 | |
|         /// </summary>
 | |
|         /// <param name="path">The path to the AppLovin Dependencies.xml file</param>
 | |
|         /// <param name="createIfNotExists">Whether to create a new Dependencies.xml file if one does not exist</param>
 | |
|         /// <returns></returns>
 | |
|         protected static XDocument GetAppLovinDependenciesFile(string path, bool createIfNotExists = false)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 if (File.Exists(path))
 | |
|                 {
 | |
|                     return XDocument.Load(path);
 | |
|                 }
 | |
|                 
 | |
|                 if (createIfNotExists)
 | |
|                 {
 | |
|                     return new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
 | |
|                         new XElement(ElementNameDependencies));
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception exception)
 | |
|             {
 | |
|                 MaxSdkLogger.E("Unable to load Dependencies file due to exception: " + exception.Message);
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Updates a dependency if it exists, otherwise adds a new dependency.
 | |
|         /// </summary>
 | |
|         /// <param name="dependenciesDocument">The dependencies document we are writing to</param>
 | |
|         /// <param name="parentTag">The parent tag that we want to search for the dependency. For example, to add a new dependency to Android, pass in "androidPackages"</param>
 | |
|         /// <param name="elementTag">The element we are looking to update/add. For example, to add a new dependency to Android, pass in "androidPackage"</param>
 | |
|         /// <param name="matchAttribute">The attribute name we want in the dependency. For example, to add something to the spec attribute, pass in "spec" </param>
 | |
|         /// <param name="matchValuePrefix">The attribute value prefix we are looking to replace. For example, "com.google.android.ump:user-messaging-platform"</param>
 | |
|         /// <param name="newDependency">The new dependency we want to add.</param>
 | |
|         protected static void AddOrUpdateDependency(
 | |
|             XDocument dependenciesDocument,
 | |
|             string parentTag,
 | |
|             string elementTag,
 | |
|             string matchAttribute,
 | |
|             string matchValuePrefix,
 | |
|             XElement newDependency)
 | |
|         {
 | |
|             var parentElement = dependenciesDocument.Root.Element(parentTag);
 | |
|             if (parentElement == null)
 | |
|             {
 | |
|                 parentElement = new XElement(parentTag);
 | |
|                 dependenciesDocument.Root.Add(parentElement);
 | |
|             }
 | |
| 
 | |
|             // Check if a dependency exists that matches the attributes name and value
 | |
|             var existingElement = parentElement.Elements(elementTag)
 | |
|                 .FirstOrDefault(element =>
 | |
|                 {
 | |
|                     var attr = element.Attribute(matchAttribute);
 | |
|                     return attr != null && attr.Value.StartsWith(matchValuePrefix, StringComparison.OrdinalIgnoreCase);
 | |
|                 });
 | |
| 
 | |
|             if (existingElement != null)
 | |
|             {
 | |
|                 foreach (var attr in newDependency.Attributes())
 | |
|                 {
 | |
|                     existingElement.SetAttributeValue(attr.Name, attr.Value);
 | |
|                 }
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 parentElement.Add(newDependency);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Removes a dependency from an xml file.
 | |
|         /// </summary>
 | |
|         /// <param name="doc">The xml file to remove a dependency from</param>
 | |
|         /// <param name="parentTag">The parent tag that we want to search for the dependency to remove. For example: "androidPackages"</param>
 | |
|         /// <param name="elementTag">The element we are looking to remove. For example: "androidPackage"</param>
 | |
|         /// <param name="matchAttribute">The attribute name we want to remove. For example: "spec" </param>
 | |
|         /// <param name="matchValuePrefix">The attribute value prefix we are looking to replace. For example: "com.google.android.ump:user-messaging-platform"</param>
 | |
|         /// <returns>True if the dependency was removed successfully, otherwise return false.</returns>
 | |
|         protected static bool RemoveDependency(
 | |
|             XDocument doc,
 | |
|             string parentTag,
 | |
|             string elementTag,
 | |
|             string matchAttribute,
 | |
|             string matchValuePrefix)
 | |
|         {
 | |
|             var root = doc.Root;
 | |
|             if (root == null) return false;
 | |
| 
 | |
|             var parentElement = root.Element(parentTag);
 | |
|             if (parentElement == null) return false;
 | |
| 
 | |
|             XElement toRemove = null;
 | |
|             foreach (var e in parentElement.Elements(elementTag))
 | |
|             {
 | |
|                 var attr = e.Attribute(matchAttribute);
 | |
|                 if (attr != null && attr.Value.StartsWith(matchValuePrefix))
 | |
|                 {
 | |
|                     toRemove = e;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (toRemove == null) return false;
 | |
| 
 | |
|             toRemove.Remove();
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Saves an xml file.
 | |
|         /// </summary>
 | |
|         /// <param name="doc">The document to save</param>
 | |
|         /// <param name="path">The path to the document to save</param>
 | |
|         /// <returns>Returns true if the file was saved successfully</returns>
 | |
|         protected static bool SaveDependenciesFile(XDocument doc, string path)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 // Ensure directory exists before saving the file
 | |
|                 var directory = Path.GetDirectoryName(path);
 | |
|                 if (MaxSdkUtils.IsValidString(directory))
 | |
|                 {
 | |
|                     // Does nothing if directory already exists
 | |
|                     Directory.CreateDirectory(directory);
 | |
|                 }
 | |
| 
 | |
|                 using (var xmlWriter = XmlWriter.Create(path, DependenciesFileXmlWriterSettings))
 | |
|                 {
 | |
|                     doc.Save(xmlWriter);
 | |
|                     return true;
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception exception)
 | |
|             {
 | |
|                 MaxSdkLogger.E("Unable to save Dependencies file due to exception: " + exception.Message);
 | |
|             }
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| }
 |