169 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.Linq;
 | |
| using UnityEditor;
 | |
| using UnityEngine;
 | |
| 
 | |
| #if UNITY_2019_2_OR_NEWER
 | |
| namespace AppLovinMax.Scripts.IntegrationManager.Editor
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Moves our SDK Unity Plugin from under the Assets folder to the Unity Package Manager.
 | |
|     /// </summary>
 | |
|     public static class AppLovinPluginMigrationHelper
 | |
|     {
 | |
|         private const string ApplovinRegistryName = "AppLovin MAX Unity";
 | |
|         private const string ApplovinRegistryUrl = "https://unity.packages.applovin.com/";
 | |
|         private static readonly List<string> AppLovinRegistryScopes = new List<string>() {"com.applovin.mediation.ads", "com.applovin.mediation.adapters", "com.applovin.mediation.dsp"};
 | |
| 
 | |
|         private const string OpenUpmRegistryName = "package.openupm.com";
 | |
|         private const string OpenUpmRegistryUrl = "https://package.openupm.com";
 | |
|         private static readonly List<string> OpenUpmRegistryScopes = new List<string>() {"com.google.external-dependency-manager"};
 | |
| 
 | |
|         private static List<string> betaNetworkPluginFilePaths = new List<string>();
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Attempts to move the Unity plugin to UPM by adding the AppLovin scoped registry and dependencies to the manifest.
 | |
|         /// </summary>
 | |
|         /// <param name="pluginData">The Unity Plugin data for our sdk and mediation adapters.</param>
 | |
|         /// <param name="deleteExternalDependencyManager">Whether to delete the EDM folder under "Assets"</param>
 | |
|         internal static void MigrateToUnityPackageManager(PluginData pluginData, bool deleteExternalDependencyManager)
 | |
|         {
 | |
|             MaxSdkLogger.UserDebug("Moving AppLovin Unity Plugin to package manager");
 | |
| 
 | |
|             if (deleteExternalDependencyManager)
 | |
|             {
 | |
|                 DeleteExternalDependencyManager();
 | |
|             }
 | |
| 
 | |
|             var appLovinManifest = AppLovinUpmManifest.Load();
 | |
| 
 | |
|             MigrateAdapters(pluginData, appLovinManifest);
 | |
|             MigratePlugin(pluginData, appLovinManifest);
 | |
| 
 | |
|             appLovinManifest.Save();
 | |
|             AppLovinUpmPackageManager.ResolvePackageManager();
 | |
|             DeletePluginFiles();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Add all currently installed networks to the manifest.
 | |
|         /// </summary>
 | |
|         internal static void MigrateAdapters(PluginData pluginData, AppLovinUpmManifest appLovinManifest)
 | |
|         {
 | |
|             var allNetworks = pluginData.MediatedNetworks.Concat(pluginData.PartnerMicroSdks).ToArray();
 | |
|             betaNetworkPluginFilePaths.Clear();
 | |
| 
 | |
|             // Add every currently installed network and separate it by android and iOS.
 | |
|             foreach (var network in allNetworks)
 | |
|             {
 | |
|                 var currentVersion = network.CurrentVersions != null ? network.CurrentVersions.Unity : "";
 | |
|                 if (string.IsNullOrEmpty(currentVersion)) continue;
 | |
| 
 | |
|                 if (currentVersion.Contains("beta"))
 | |
|                 {
 | |
|                     betaNetworkPluginFilePaths.AddRange(network.PluginFilePaths);
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 AppLovinUpmPackageManager.AddPackages(network, appLovinManifest);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Add the AppLovin scoped registry to the manifest if it doesn't exist. Otherwise update it.
 | |
|         /// </summary>
 | |
|         private static void MigratePlugin(PluginData pluginData, AppLovinUpmManifest appLovinManifest)
 | |
|         {
 | |
|             appLovinManifest.AddOrUpdateRegistry(ApplovinRegistryName, ApplovinRegistryUrl, AppLovinRegistryScopes);
 | |
|             appLovinManifest.AddOrUpdateRegistry(OpenUpmRegistryName, OpenUpmRegistryUrl, OpenUpmRegistryScopes);
 | |
| 
 | |
|             var appLovinVersion = pluginData.AppLovinMax.LatestVersions.Unity;
 | |
|             appLovinManifest.AddPackageDependency(AppLovinUpmPackageManager.PackageNamePrefixAppLovin, appLovinVersion);
 | |
|         }
 | |
| 
 | |
|         #region Utility
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Delete the external dependency manager folder from the project.
 | |
|         /// </summary>
 | |
|         private static void DeleteExternalDependencyManager()
 | |
|         {
 | |
|             var externalDependencyManagerPath = Path.Combine(Application.dataPath, "ExternalDependencyManager");
 | |
|             FileUtil.DeleteFileOrDirectory(externalDependencyManagerPath);
 | |
|             FileUtil.DeleteFileOrDirectory(externalDependencyManagerPath + ".meta");
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Deletes all the files in the plugin directory except the AppLovinSettings.asset file.
 | |
|         /// </summary>
 | |
|         private static void DeletePluginFiles()
 | |
|         {
 | |
|             if (AppLovinIntegrationManager.IsPluginInPackageManager) return;
 | |
| 
 | |
|             var pluginPath = Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, "MaxSdk");
 | |
|             var appLovinSettingsPath = Path.Combine(pluginPath, "Resources/AppLovinSettings.asset");
 | |
| 
 | |
|             var appLovinResourcesDirectory = Path.Combine(pluginPath, "Resources");
 | |
|             var appLovinSettingsTempPath = Path.Combine(Path.GetTempPath(), "AppLovinSettings.asset");
 | |
|             var appLovinMediationTempPath = Path.Combine(Path.GetTempPath(), "Mediation");
 | |
| 
 | |
|             // Ensure there aren't any errors when moving the files due to the directories/files already existing.
 | |
|             FileUtil.DeleteFileOrDirectory(appLovinSettingsTempPath);
 | |
|             FileUtil.DeleteFileOrDirectory(appLovinMediationTempPath);
 | |
| 
 | |
|             var mediationAssetsDir = Path.Combine(AppLovinIntegrationManager.PluginParentDirectory, "MaxSdk/Mediation");
 | |
| 
 | |
|             // Move the AppLovinSettings.asset file and any beta adapters to a temporary directory.
 | |
|             File.Move(appLovinSettingsPath, appLovinSettingsTempPath);
 | |
|             var adapterSaved = MoveBetaAdaptersIfNeeded(mediationAssetsDir, appLovinMediationTempPath);
 | |
| 
 | |
|             // Move the meta file if the adapter was saved to save the asset labels
 | |
|             if (adapterSaved)
 | |
|             {
 | |
|                 File.Move(mediationAssetsDir, appLovinMediationTempPath + ".meta");
 | |
|             }
 | |
| 
 | |
|             // Delete the plugin directory and then move the AppLovinSettings.asset and beta adapters back.
 | |
|             FileUtil.DeleteFileOrDirectory(pluginPath);
 | |
|             Directory.CreateDirectory(appLovinResourcesDirectory);
 | |
|             File.Move(appLovinSettingsTempPath, appLovinSettingsPath);
 | |
|             MoveBetaAdaptersIfNeeded(appLovinMediationTempPath, mediationAssetsDir);
 | |
|             if (adapterSaved)
 | |
|             {
 | |
|                 File.Move(appLovinMediationTempPath + ".meta", mediationAssetsDir);
 | |
|             }
 | |
| 
 | |
|             FileUtil.DeleteFileOrDirectory(appLovinMediationTempPath);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Moves the beta adapters from a source mediation directory to a destination mediation directory.
 | |
|         /// </summary>
 | |
|         /// <param name="sourceMediationDirectory">The directory containing the beta adapters to be moved.</param>
 | |
|         /// <param name="destinationMediationDirectory">The target directory where the beta adapters should be moved.</param>
 | |
|         private static bool MoveBetaAdaptersIfNeeded(string sourceMediationDirectory, string destinationMediationDirectory)
 | |
|         {
 | |
|             if (betaNetworkPluginFilePaths.Count == 0 || !Directory.Exists(sourceMediationDirectory)) return false;
 | |
| 
 | |
|             var movedAdapter = false;
 | |
|             Directory.CreateDirectory(destinationMediationDirectory);
 | |
|             foreach (var pluginFilePath in betaNetworkPluginFilePaths)
 | |
|             {
 | |
|                 var sourceDirectory = Path.Combine(sourceMediationDirectory, Path.GetFileName(pluginFilePath));
 | |
|                 var destinationDirectory = Path.Combine(destinationMediationDirectory, Path.GetFileName(pluginFilePath));
 | |
|                 if (Directory.Exists(sourceDirectory))
 | |
|                 {
 | |
|                     Directory.Move(sourceDirectory, destinationDirectory);
 | |
|                     movedAdapter = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return movedAdapter;
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 | |
| #endif
 |