using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using System.Xml; using IronSourceJSON; using UnityEditor; using UnityEngine; using UnityEngine.Networking; public class IronSourceDependenciesManager : EditorWindow { private readonly SortedSet providersSet = new SortedSet(new ProviderInfoComparor()); private ProviderInfo ironSourceProviderInfo; private ProviderInfo unityAdsProviderInfo; private UnityWebRequest downloadWebClient; private string messageData; private IronSourceEditorCoroutines mEditorCoroutines; private static string latestUnitySDKVersion; private GUIStyle headerStyle; private GUIStyle textStyle; private GUIStyle boldTextStyle; private readonly GUILayoutOption buttonWidth = GUILayout.Width(90); public class ProviderInfo { public Status currentStatues; public string providerName; public string currentUnityVersion; public string latestUnityVersion; public string latestUnityAdsVersion; public string downloadURL; public string displayProviderName; public bool isNewProvider; public string fileName; public Dictionary sdkVersionDic; public ProviderInfo() { isNewProvider = false; fileName = string.Empty; downloadURL = string.Empty; currentUnityVersion = IronSourceDependenciesManagerConstants.NONE; sdkVersionDic = new Dictionary(); } public enum Status { INSTALLED = 1, NONE = 2, UPDATED = 3 } public bool SetProviderDataProperties(string provider, Dictionary providerData, Dictionary providerXML) { providerName = provider; object obj; if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_KEY_NAME, out obj)) { displayProviderName = obj as string; } else { displayProviderName = providerName; } if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_IS_NEW, out obj)) { isNewProvider = bool.Parse(obj as string); } if (providerXML.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_DOWNLOAD_URL, out obj)) { downloadURL = obj as string; } if (providerXML.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_FILE_NAME, out obj)) { fileName = obj as string; } if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_ANDROID_SDK_VER, out obj)) { sdkVersionDic.Add(IronSourceDependenciesManagerConstants.ANDROID, obj as string); } if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_IOS_SDK_VER, out obj)) { sdkVersionDic.Add(IronSourceDependenciesManagerConstants.IOS, obj as string); } if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_UNITY_ADAPTER_VERSION, out obj)) { if ((providerName.ToLower() != IronSourceDependenciesManagerConstants.IRONSOURCE)) { latestUnityVersion = obj as string; } else { latestUnityVersion = latestUnitySDKVersion; } downloadURL = downloadURL.Replace(IronSourceDependenciesManagerConstants.UNITY_ADAPTER_MACRO, latestUnityVersion); } if (providerData.TryGetValue(IronSourceDependenciesManagerConstants.PROVIDER_UNITY_ADAPTER_VERSION, out obj)) { if ((providerName.ToLower() == IronSourceDependenciesManagerConstants.UNITYADS)) { latestUnityAdsVersion = obj as string; } downloadURL = downloadURL.Replace(IronSourceDependenciesManagerConstants.UNITY_ADAPTER_MACRO, latestUnityVersion); } currentUnityVersion = GetVersionFromXML(fileName); if (currentUnityVersion.Equals(IronSourceDependenciesManagerConstants.NONE)) { currentStatues = Status.NONE; } else { if (isNewerVersion(currentUnityVersion, latestUnityVersion)) { currentStatues = Status.INSTALLED; } else { currentStatues = Status.UPDATED; } } return true; } } private static string GetVersionFromXML(string fileName) { XmlDocument xmlDoc = new XmlDocument(); string version = IronSourceDependenciesManagerConstants.NONE; try { xmlDoc.LoadXml(File.ReadAllText(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR + fileName)); } catch (Exception) { return version; } var unityVersion = xmlDoc.SelectSingleNode(IronSourceDependenciesManagerConstants.IRONSOURCE_XML_PATH); if (unityVersion != null) { return (unityVersion.InnerText); } File.Delete(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR + fileName); return version; } private IEnumerator SetProviderData() { UnityWebRequest unityWebRequestLinkJson = UnityWebRequest.Get(IronSourceDependenciesManagerConstants.IRONSOURCE_SDK_XML_LINKS); UnityWebRequest unityWebRequesInfoJson = UnityWebRequest.Get(IronSourceDependenciesManagerConstants.IRONSOURCE_SDK_INFO); var webRequestLinks = unityWebRequestLinkJson.SendWebRequest(); var webRequestSDKInfo = unityWebRequesInfoJson.SendWebRequest(); while (!webRequestLinks.isDone || !webRequestSDKInfo.isDone) { yield return new WaitForSeconds(0.1f); } #if UNITY_2020_1_OR_NEWER if (unityWebRequestLinkJson.result != UnityWebRequest.Result.ProtocolError && unityWebRequesInfoJson.result != UnityWebRequest.Result.ProtocolError) #else if (!unityWebRequestLinkJson.isHttpError && !unityWebRequestLinkJson.isNetworkError && !unityWebRequesInfoJson.isError && !unityWebRequesInfoJson.isHttpError) #endif { string linksJson = unityWebRequestLinkJson.downloadHandler.text; string SDKInfoJson = unityWebRequesInfoJson.downloadHandler.text; providersSet.Clear(); Dictionary linksDictionary = new Dictionary(); Dictionary SDKInfoDictionary = new Dictionary(); try { linksDictionary = Json.Deserialize(linksJson) as Dictionary; SDKInfoDictionary = Json.Deserialize(SDKInfoJson) as Dictionary; } catch (Exception e) { Debug.Log("Error getting response " + e.ToString()); } if (SDKInfoDictionary != null && SDKInfoDictionary.Count != 0 && linksDictionary != null && linksDictionary.Count != 0) { string requiredVersion; object providersJson; ironSourceProviderInfo = new ProviderInfo(); unityAdsProviderInfo = new ProviderInfo(); ironSourceProviderInfo.currentUnityVersion = GetVersionFromXML(IronSourceDependenciesManagerConstants.IRONSOURCE_XML); SDKInfoDictionary.TryGetValue(IronSourceDependenciesManagerConstants.LATEST_SDK_VERSION, out providersJson); latestUnitySDKVersion = providersJson.ToString(); ironSourceProviderInfo.latestUnityVersion = providersJson.ToString(); requiredVersion = (ironSourceProviderInfo.currentUnityVersion == IronSourceDependenciesManagerConstants.NONE) ? ironSourceProviderInfo.latestUnityVersion : ironSourceProviderInfo.currentUnityVersion; if (SDKInfoDictionary.TryGetValue(requiredVersion, out providersJson)) { if (providersJson != null) { foreach (var item in providersJson as Dictionary) { ProviderInfo info = new ProviderInfo(); object providerXML; var lowerCaseItem = item.Key.ToLower(new System.Globalization.CultureInfo("en")); linksDictionary.TryGetValue(lowerCaseItem, out providerXML); if (info.SetProviderDataProperties(item.Key, item.Value as Dictionary, providerXML as Dictionary)) { if (item.Key.ToLower().Contains(IronSourceDependenciesManagerConstants.IRONSOURCE)) { ironSourceProviderInfo.displayProviderName = info.displayProviderName; ironSourceProviderInfo.downloadURL = info.downloadURL; ironSourceProviderInfo.providerName = info.providerName; ironSourceProviderInfo.sdkVersionDic = info.sdkVersionDic; ironSourceProviderInfo.fileName = info.fileName; ironSourceProviderInfo.currentStatues = info.currentStatues; } else { if (item.Key.ToLower().Contains(IronSourceDependenciesManagerConstants.UNITYADS)) { if (item.Key.ToLower().Contains(IronSourceDependenciesManagerConstants.UNITYADS)) { if (File.Exists(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR + IronSourceDependenciesManagerConstants.UNITYADS_XML)) { unityAdsProviderInfo.currentUnityVersion = GetVersionFromXML(IronSourceDependenciesManagerConstants.UNITYADS_XML); unityAdsProviderInfo.latestUnityVersion = info.latestUnityAdsVersion; } else { unityAdsProviderInfo.currentUnityVersion = "none"; } unityAdsProviderInfo.latestUnityVersion = info.latestUnityAdsVersion; unityAdsProviderInfo.displayProviderName = info.displayProviderName; unityAdsProviderInfo.downloadURL = info.downloadURL; unityAdsProviderInfo.providerName = info.providerName; unityAdsProviderInfo.sdkVersionDic = info.sdkVersionDic; unityAdsProviderInfo.fileName = info.fileName; unityAdsProviderInfo.currentStatues = info.currentStatues; } } else { providersSet.Add(info); } } } } } } if (ironSourceProviderInfo.currentStatues == ProviderInfo.Status.INSTALLED || ironSourceProviderInfo.currentStatues == ProviderInfo.Status.NONE) { if (SDKInfoDictionary.TryGetValue(IronSourceDependenciesManagerConstants.UPDATE_MSG, out providersJson)) { messageData = providersJson.ToString(); } } else { if (SDKInfoDictionary.TryGetValue(IronSourceDependenciesManagerConstants.LATEST_MSG, out providersJson)) { messageData = providersJson.ToString(); } } } } Repaint(); } private void CancelDownload() { // if downloader object is still active if (downloadWebClient != null) { downloadWebClient.Abort(); return; } if (mEditorCoroutines != null) { mEditorCoroutines.StopEditorCoroutine(); mEditorCoroutines = null; } downloadWebClient = null; } public static void ShowISDependenciesManager() { var win = GetWindowWithRect(new Rect(0, 0, IronSourceDependenciesManagerConstants.WIDTH, IronSourceDependenciesManagerConstants.HEIGHT), true); win.titleContent = new GUIContent(IronSourceDependenciesManagerConstants.INTERGRATION_MANAGER_TITLE); win.Focus(); } void Awake() { headerStyle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold, fontSize = 14, fixedHeight = 20, stretchWidth = true, fixedWidth = IronSourceDependenciesManagerConstants.WIDTH / 4 + 5, clipping = TextClipping.Overflow, alignment = TextAnchor.MiddleLeft }; textStyle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Normal, alignment = TextAnchor.MiddleLeft }; boldTextStyle = new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold }; CancelDownload(); } private void OnEnable() { mEditorCoroutines = IronSourceEditorCoroutines.StartEditorCoroutine(SetProviderData()); } private void OnDestroy() { CancelDownload(); AssetDatabase.Refresh(); } void DrawProviderItem(ProviderInfo providerData) { if (!providerData.Equals(default(ProviderInfo))) { using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) { GUI.enabled = true; bool isNew = providerData.isNewProvider; string isNewAddition = isNew ? IronSourceDependenciesManagerConstants.NEW_NETWORK : string.Empty; string tooltipText = IronSourceDependenciesManagerConstants.TOOLTIP_LATEST_VERSION + " \n " + providerData.providerName + " " + IronSourceDependenciesManagerConstants.TOOLTIP_ADAPTER_VERSION + " " + providerData.latestUnityVersion; if (providerData.sdkVersionDic.TryGetValue(IronSourceDependenciesManagerConstants.ANDROID, out string androidVersion)) { tooltipText = tooltipText + "\n " + IronSourceDependenciesManagerConstants.TOOLTIP_ANDROID_SDK + " " + androidVersion; } if (providerData.sdkVersionDic.TryGetValue(IronSourceDependenciesManagerConstants.IOS, out string iosVersion)) { tooltipText = tooltipText + "\n " + IronSourceDependenciesManagerConstants.TOOLTIP_IOS_SDK + " " + iosVersion; } EditorGUILayout.LabelField(providerData.displayProviderName + isNewAddition, isNew ? boldTextStyle : textStyle); EditorGUILayout.LabelField(providerData.currentUnityVersion, textStyle); EditorGUILayout.LabelField(providerData.latestUnityVersion, textStyle); string downloadButtonText; switch (providerData.currentStatues) { case ProviderInfo.Status.NONE: downloadButtonText = IronSourceDependenciesManagerConstants.LABEL_INSTALL; break; case ProviderInfo.Status.INSTALLED: downloadButtonText = IronSourceDependenciesManagerConstants.LABEL_UPDATE; break; default: downloadButtonText = IronSourceDependenciesManagerConstants.LABEL_UPDATED; GUI.enabled = false; break; } GUIContent gUIContent = new GUIContent { text = downloadButtonText, tooltip = tooltipText }; bool btn = GUILayout.Button(gUIContent, buttonWidth); if (btn && downloadWebClient == null) { GUI.enabled = true; IronSourceEditorCoroutines.StartEditorCoroutine(DownloadFile(providerData.downloadURL)); } GUILayout.Space(5); GUI.enabled = true; } } } void OnGUI() { if (ironSourceProviderInfo == null) { GUILayout.Label(IronSourceDependenciesManagerConstants.ERROR_NOT_AVAILABLE); return; } GUILayout.Space(10); using (new EditorGUILayout.VerticalScope("box")) { DrawSDKHeader(); GUILayout.Space(5); GUILayout.BeginHorizontal(); DrawProviderItem(ironSourceProviderInfo); GUILayout.Space(5); GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); DrawProviderItem(unityAdsProviderInfo); GUILayout.Space(5); GUILayout.EndHorizontal(); GUILayout.Space(5); } GUILayout.Space(15); DrawAdaptersHeader(); GUILayout.Space(15); foreach (var provider in providersSet) { DrawProviderItem(provider); GUILayout.Space(2); } GUILayout.Space(30); if (!string.IsNullOrEmpty(messageData)) { using (new EditorGUILayout.VerticalScope("box", GUILayout.ExpandHeight(true))) { GUILayout.Space(5); using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) { EditorGUILayout.SelectableLabel(messageData, EditorStyles.textField, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); } GUILayout.Space(5); } using (new EditorGUILayout.VerticalScope(GUILayout.ExpandHeight(false))) { GUILayout.Space(15); } } } private void DrawSDKHeader() { using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) { EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_CURRENT_SDK, new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold, fontSize = 13, fixedHeight = 20, stretchWidth = true, fixedWidth = IronSourceDependenciesManagerConstants.WIDTH / 4, clipping = TextClipping.Overflow, padding = new RectOffset(IronSourceDependenciesManagerConstants.WIDTH / 4 + 15, 0, 0, 0) }); GUILayout.Space(85); EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_LATEST_SDK, new GUIStyle(EditorStyles.label) { fontStyle = FontStyle.Bold, fontSize = 13, fixedHeight = 20, stretchWidth = true, fixedWidth = Screen.width / 4, clipping = TextClipping.Overflow, }); } } private void DrawAdaptersHeader() { using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) { EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_NETWORK, headerStyle); EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_CURRENT_SDK, headerStyle); EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_LATEST_SDK, headerStyle); GUILayout.Space(30); EditorGUILayout.LabelField(IronSourceDependenciesManagerConstants.LABEL_Action, headerStyle); } } private IEnumerator DownloadFile(string downloadFileUrl) { int fileNameIndex = downloadFileUrl.LastIndexOf("/") + 1; string downloadFileName = downloadFileUrl.Substring(fileNameIndex); string fileDownloading = string.Format("Downloading {0}", downloadFileName); string genericFileName = Regex.Replace(downloadFileName, @"_v+(\d\.\d\.\d\.\d|\d\.\d\.\d)", ""); string path = Path.Combine(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR, genericFileName); bool isCancelled = false; downloadWebClient = new UnityWebRequest(downloadFileUrl); downloadWebClient.downloadHandler = new DownloadHandlerFile(path); downloadWebClient.SendWebRequest(); #if UNITY_2020_1_OR_NEWER if (downloadWebClient.result != UnityWebRequest.Result.ProtocolError) #else if (!downloadWebClient.isHttpError && !downloadWebClient.isNetworkError) #endif { while (!downloadWebClient.isDone) { yield return new WaitForSeconds(0.1f); if (EditorUtility.DisplayCancelableProgressBar("Download Manager", fileDownloading, downloadWebClient.downloadProgress)) { if (downloadWebClient.error != null) { Debug.LogError(downloadWebClient.error); } CancelDownload(); isCancelled = true; } } } else { Debug.LogError("Error Downloading " + genericFileName + " : " + downloadWebClient.error); } EditorUtility.ClearProgressBar(); if (genericFileName.EndsWith(".unitypackage") && !isCancelled) { AssetDatabase.ImportPackage(Path.Combine(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR, genericFileName), true); } else { // in case the download was cancelled, delete the file if (isCancelled && File.Exists(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR + genericFileName)) { File.Delete(IronSourceDependenciesManagerConstants.IRONSOURCE_DOWNLOAD_DIR + genericFileName); } IronSourceEditorCoroutines.StartEditorCoroutine(SetProviderData()); } //clean the downloadWebClient object regardless of whether the request succeeded or failed downloadWebClient.Dispose(); downloadWebClient = null; IronSourceEditorCoroutines.StartEditorCoroutine(SetProviderData()); } private static bool isNewerVersion(string current, string latest) { bool isNewer = false; try { int[] currentVersion = Array.ConvertAll(current.Split('.'), int.Parse); int[] remoteVersion = Array.ConvertAll(latest.Split('.'), int.Parse); int remoteBuild = 0; int curBuild = 0; if (currentVersion.Length > 3) { curBuild = currentVersion[3]; } if (remoteVersion.Length > 3) { remoteBuild = remoteVersion[3]; } System.Version cur = new System.Version(currentVersion[0], currentVersion[1], currentVersion[2], curBuild); System.Version remote = new System.Version(remoteVersion[0], remoteVersion[1], remoteVersion[2], remoteBuild); isNewer = cur < remote; } catch (Exception) { } return isNewer; } internal class ProviderInfoComparor : IComparer { public int Compare(ProviderInfo x, ProviderInfo y) { return x.providerName.CompareTo(y.providerName); } } }