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 |