230 lines
9.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
namespace AppCenterEditor
{
public abstract class AppCenterSDKPackage
{
private static int angle = 0;
public static IEnumerable<AppCenterSDKPackage> SupportedPackages = new AppCenterSDKPackage[]
{
AppCenterAnalyticsPackage.Instance,
AppCenterCrashesPackage.Instance,
AppCenterDistributePackage.Instance,
};
public string InstalledVersion { get; private set; }
public bool IsInstalled { get; set; }
public bool IsPackageInstalling { get; set; }
public bool IsObjectFieldActive { get; set; }
protected abstract bool IsSupportedForWSA { get; }
public abstract string Name { get; }
public abstract string DownloadLatestUrl { get; }
public abstract string DownloadUrlFormat { get; }
public abstract string TypeName { get; }
public abstract string VersionFieldName { get; }
protected abstract bool IsSdkPackageSupported();
public static IEnumerable<AppCenterSDKPackage> GetInstalledPackages()
{
var installedPackages = new List<AppCenterSDKPackage>();
foreach (var package in SupportedPackages)
{
if (package.IsInstalled)
{
installedPackages.Add(package);
}
}
return installedPackages;
}
private void RemovePackage(bool prompt = true)
{
if (prompt && !EditorUtility.DisplayDialog("Confirm SDK Removal", string.Format("This action will remove the current {0} SDK.", Name), "Confirm", "Cancel"))
{
return;
}
EdExLogger.LoggerInstance.LogWithTimeStamp(string.Format("Removing {0} package...", Name));
var toDelete = new List<string>();
string pluginsPath = Path.Combine(AppCenterEditorPrefsSO.Instance.SdkPath, "Plugins");
string androidPath = Path.Combine(pluginsPath, "Android");
string sdkPath = Path.Combine(pluginsPath, "AppCenterSDK");
string iosPath = Path.Combine(pluginsPath, "iOS");
string wsaPath = Path.Combine(pluginsPath, "WSA");
toDelete.Add(Path.Combine(androidPath, string.Format("appcenter-{0}-release.aar", Name.ToLower())));
toDelete.AddRange(Directory.GetFiles(Path.Combine(sdkPath, Name)));
toDelete.AddRange(Directory.GetDirectories(Path.Combine(sdkPath, Name)));
toDelete.Add(Path.Combine(sdkPath, Name));
toDelete.AddRange(Directory.GetFiles(Path.Combine(iosPath, Name)));
toDelete.AddRange(Directory.GetDirectories(Path.Combine(iosPath, Name)));
toDelete.Add(Path.Combine(iosPath, Name));
if (IsSupportedForWSA)
{
toDelete.AddRange(Directory.GetFiles(Path.Combine(wsaPath, Name)));
toDelete.AddRange(Directory.GetDirectories(Path.Combine(wsaPath, Name)));
toDelete.Add(Path.Combine(wsaPath, Name));
}
bool deleted = true;
foreach (var path in toDelete)
{
if (!FileUtil.DeleteFileOrDirectory(path))
{
if (!path.EndsWith("meta"))
{
deleted = false;
}
}
FileUtil.DeleteFileOrDirectory(path + ".meta");
}
// Remove Core if no packages left.
List<AppCenterSDKPackage> installedPackages = new List<AppCenterSDKPackage>();
installedPackages.AddRange(GetInstalledPackages());
if (installedPackages.Count <= 1)
{
AppCenterEditorSDKTools.RemoveSdk(false);
}
if (deleted)
{
EdExLogger.LoggerInstance.LogWithTimeStamp(string.Format("{0} package removed.", Name));
AppCenterEditor.RaiseStateUpdate(AppCenterEditor.EdExStates.OnSuccess, string.Format("App Center {0} SDK removed.", Name));
// HACK for 5.4, AssetDatabase.Refresh(); seems to cause the install to fail.
if (prompt)
{
AssetDatabase.Refresh();
}
}
else
{
AppCenterEditor.RaiseStateUpdate(AppCenterEditor.EdExStates.OnError, string.Format("An unknown error occured and the {0} SDK could not be removed.", Name));
}
}
public void ShowPackageInstalledMenu()
{
var isPackageSupported = IsSdkPackageSupported();
using (new AppCenterGuiFieldHelper.UnityVertical(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
var sdkPackageVersion = InstalledVersion;
using (new AppCenterGuiFieldHelper.UnityHorizontal(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
GUILayout.FlexibleSpace();
var labelStyle = new GUIStyle(AppCenterEditorHelper.uiStyle.GetStyle("versionText"));
EditorGUILayout.LabelField(string.Format("{0} SDK {1} is installed", Name, sdkPackageVersion), labelStyle);
GUILayout.FlexibleSpace();
}
bool packageVersionIsValid = sdkPackageVersion != null && sdkPackageVersion != Constants.UnknownVersion;
if (packageVersionIsValid && sdkPackageVersion.CompareTo(AppCenterEditorSDKTools.InstalledSdkVersion) != 0)
{
using (new AppCenterGuiFieldHelper.UnityHorizontal(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
GUILayout.FlexibleSpace();
EditorGUILayout.LabelField("Warning! Package version is not equal to the AppCenter Core SDK version. ", AppCenterEditorHelper.uiStyle.GetStyle("orTxt"));
GUILayout.FlexibleSpace();
}
}
if (isPackageSupported && AppCenterEditorSDKTools.SdkFolder != null)
{
using (new AppCenterGuiFieldHelper.UnityHorizontal(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Remove SDK", AppCenterEditorHelper.uiStyle.GetStyle("textButton")))
{
RemovePackage();
}
GUILayout.FlexibleSpace();
}
}
}
}
public void ShowPackageNotInstalledMenu()
{
using (new AppCenterGuiFieldHelper.UnityVertical(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
using (new AppCenterGuiFieldHelper.UnityHorizontal(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
GUILayout.FlexibleSpace();
var labelStyle = new GUIStyle(AppCenterEditorHelper.uiStyle.GetStyle("versionText"));
EditorGUILayout.LabelField(string.Format("{0} SDK is not installed.", Name), labelStyle);
GUILayout.FlexibleSpace();
}
using (new AppCenterGuiFieldHelper.UnityHorizontal(AppCenterEditorHelper.uiStyle.GetStyle("gpStyleEmpty")))
{
GUILayout.FlexibleSpace();
if (IsPackageInstalling)
{
var image = DrawUtils.RotateImage(AssetDatabase.LoadAssetAtPath("Assets/AppCenterEditorExtensions/Editor/UI/Images/wheel.png", typeof(Texture2D)) as Texture2D, angle++);
GUILayout.Button(new GUIContent(string.Format(" {0} SDK is installing", Name), image), AppCenterEditorHelper.uiStyle.GetStyle("customButton"), GUILayout.MaxWidth(200), GUILayout.MinHeight(32));
}
else
{
if (GUILayout.Button("Install SDK", AppCenterEditorHelper.uiStyle.GetStyle("textButton")))
{
AppCenterEditorSDKTools.IsInstalling = IsPackageInstalling = true;
ImportLatestPackageSDK();
}
}
GUILayout.FlexibleSpace();
}
}
}
public string GetDownloadUrl(string version)
{
if (string.IsNullOrEmpty(version) || version == Constants.UnknownVersion)
{
return DownloadLatestUrl;
}
else
{
return string.Format(DownloadUrlFormat, version);
}
}
public void GetInstalledVersion(Type type, string coreVersion)
{
foreach (var field in type.GetFields())
{
if (field.Name == VersionFieldName)
{
InstalledVersion = field.GetValue(field).ToString();
break;
}
}
if (string.IsNullOrEmpty(InstalledVersion))
{
InstalledVersion = Constants.UnknownVersion;
}
}
private void ImportLatestPackageSDK()
{
try
{
PackagesInstaller.ImportLatestSDK(new[] { this }, AppCenterEditorSDKTools.LatestSdkVersion);
}
catch (Exception exception)
{
EdExLogger.LoggerInstance.LogError("Failed to import package: " + exception);
AppCenterEditorSDKTools.IsInstalling = IsPackageInstalling = false;
}
}
}
}