860 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			860 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | ||
| using System.Collections;
 | ||
| using System.IO;
 | ||
| using System.Linq;
 | ||
| using UnityEditor;
 | ||
| using UnityEngine;
 | ||
| using UnityEngine.UI;
 | ||
| using System.Collections.Generic;
 | ||
| using System.Text;
 | ||
| 
 | ||
| namespace AnyThink.Scripts.IntegrationManager.Editor
 | ||
| {
 | ||
|     public class ATIntegrationManagerWindow : EditorWindow
 | ||
|     {
 | ||
| 
 | ||
|         private const string windowTitle = "ThinkupTpn Integration Manager";
 | ||
|         private const string uninstallIconExportPath = "ThinkupTpnPlugin/Resources/Images/uninstall_icon.png";
 | ||
|         private const string alertIconExportPath = "ThinkupTpnPlugin/Resources/Images/alert_icon.png";
 | ||
|         private const string warningIconExportPath = "ThinkupTpnPlugin/Resources/Images/warning_icon.png";
 | ||
| 
 | ||
|         private static readonly Color darkModeTextColor = new Color(0.29f, 0.6f, 0.8f);
 | ||
|         private GUIStyle titleLabelStyle;
 | ||
|         private GUIStyle headerLabelStyle;
 | ||
|         private GUIStyle environmentValueStyle;
 | ||
|         private GUIStyle wrapTextLabelStyle;
 | ||
|         private GUIStyle linkLabelStyle;
 | ||
|         private GUIStyle iconStyle;
 | ||
|         private GUIStyle tipTextStyle;
 | ||
|         private Texture2D uninstallIcon;
 | ||
|         private Texture2D alertIcon;
 | ||
|         private Texture2D warningIcon;
 | ||
|         private Vector2 scrollPosition;
 | ||
|         private static readonly Vector2 windowMinSize = new Vector2(850, 750);
 | ||
|         private const float actionFieldWidth = 80f;
 | ||
|         private const float upgradeAllButtonWidth = 80f;
 | ||
|         private const float networkFieldMinWidth = 200f;
 | ||
|         private const float versionFieldMinWidth = 200f;
 | ||
|         private const float privacySettingLabelWidth = 200f;
 | ||
|         private const float networkFieldWidthPercentage = 0.22f;
 | ||
|         private const float versionFieldWidthPercentage = 0.36f; // There are two version fields. Each take 40% of the width, network field takes the remaining 20%.
 | ||
|         private static float previousWindowWidth = windowMinSize.x;
 | ||
|         private static GUILayoutOption networkWidthOption = GUILayout.Width(networkFieldMinWidth);
 | ||
|         private static GUILayoutOption versionWidthOption = GUILayout.Width(versionFieldMinWidth);
 | ||
| 
 | ||
|         private static GUILayoutOption sdkKeyTextFieldWidthOption = GUILayout.Width(520);
 | ||
| 
 | ||
|         private static GUILayoutOption privacySettingFieldWidthOption = GUILayout.Width(400);
 | ||
|         private static readonly GUILayoutOption fieldWidth = GUILayout.Width(actionFieldWidth);
 | ||
|         private static readonly GUILayoutOption upgradeAllButtonFieldWidth = GUILayout.Width(upgradeAllButtonWidth);
 | ||
| 
 | ||
|         private ATEditorCoroutine loadDataCoroutine;
 | ||
|         private PluginData pluginData;
 | ||
|         private bool pluginDataLoadFailed;
 | ||
|         private bool networkButtonsEnabled = true;
 | ||
|         private bool shouldShowGoogleWarning;
 | ||
|         private int curSelectCountryInt;
 | ||
|         // private int dropdownIndex = 0;
 | ||
|         private int androidVersionPopupIndex;
 | ||
|         private int iosVersionPopupIndex;
 | ||
| 
 | ||
| 
 | ||
|         public static void ShowManager()
 | ||
|         {
 | ||
|             var manager = GetWindow<ATIntegrationManagerWindow>(utility: true, title: windowTitle, focus: true);
 | ||
|             manager.minSize = windowMinSize;
 | ||
|             // manager.maxSize = windowMinSize;
 | ||
|         }
 | ||
|         //定义UI的Style
 | ||
|         private void Awake()
 | ||
|         {
 | ||
|             titleLabelStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 fontSize = 14,
 | ||
|                 fontStyle = FontStyle.Bold,
 | ||
|                 fixedHeight = 20
 | ||
|             };
 | ||
| 
 | ||
|             headerLabelStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 fontSize = 12,
 | ||
|                 fontStyle = FontStyle.Bold,
 | ||
|                 fixedHeight = 18
 | ||
|             };
 | ||
| 
 | ||
|             environmentValueStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 alignment = TextAnchor.MiddleRight
 | ||
|             };
 | ||
| 
 | ||
|             linkLabelStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 wordWrap = true,
 | ||
|                 normal = { textColor = EditorGUIUtility.isProSkin ? darkModeTextColor : Color.blue }
 | ||
|             };
 | ||
| 
 | ||
|             wrapTextLabelStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 wordWrap = true
 | ||
|             };
 | ||
| 
 | ||
|             iconStyle = new GUIStyle(EditorStyles.miniButton)
 | ||
|             {
 | ||
|                 fixedWidth = 18,
 | ||
|                 fixedHeight = 18,
 | ||
|                 padding = new RectOffset(1, 1, 1, 1)
 | ||
|             };
 | ||
| 
 | ||
|             tipTextStyle = new GUIStyle(EditorStyles.label)
 | ||
|             {
 | ||
|                 normal = { textColor = Color.yellow }
 | ||
|             };
 | ||
| 
 | ||
|             // Load uninstall icon texture.
 | ||
|             var uninstallIconData = File.ReadAllBytes(ATSdkUtil.GetAssetPathForExportPath(uninstallIconExportPath));
 | ||
|             uninstallIcon = new Texture2D(100, 100, TextureFormat.RGBA32, false); // 1. Initial size doesn't matter here, will be automatically resized once the image asset is loaded. 2. Set mipChain to false, else the texture has a weird blurry effect.
 | ||
|             uninstallIcon.LoadImage(uninstallIconData);
 | ||
| 
 | ||
|             // Load alert icon texture.
 | ||
|             var alertIconData = File.ReadAllBytes(ATSdkUtil.GetAssetPathForExportPath(alertIconExportPath));
 | ||
|             alertIcon = new Texture2D(100, 100, TextureFormat.RGBA32, false);
 | ||
|             alertIcon.LoadImage(alertIconData);
 | ||
| 
 | ||
|             // Load warning icon texture.
 | ||
|             var warningIconData = File.ReadAllBytes(ATSdkUtil.GetAssetPathForExportPath(warningIconExportPath));
 | ||
|             warningIcon = new Texture2D(100, 100, TextureFormat.RGBA32, false);
 | ||
|             warningIcon.LoadImage(warningIconData);
 | ||
| 
 | ||
|             loadPluginData();
 | ||
|             //热更新
 | ||
|             ATIntegrationHotFix.Instance.loadHotFixData();
 | ||
|         }
 | ||
| 
 | ||
|         //这个方法在插件启动时会调用,然后脚本重新加载时也会重新调用,所以加载数据放在Awake中
 | ||
|         private void OnEnable()
 | ||
|         {
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|         private void OnDisable()
 | ||
|         {
 | ||
|             if (loadDataCoroutine != null)
 | ||
|             {
 | ||
|                 loadDataCoroutine.Stop();
 | ||
|                 loadDataCoroutine = null;
 | ||
|             }
 | ||
| 
 | ||
|             ATIntegrationManager.Instance.CancelDownload();
 | ||
|             EditorUtility.ClearProgressBar();
 | ||
| 
 | ||
|             // Saves the AppLovinSettings object if it has been changed.
 | ||
|             AssetDatabase.SaveAssets();
 | ||
|         }
 | ||
| 
 | ||
|         private void OnDestroy() {
 | ||
|             ATLog.log("OnDestroy() >>> called");
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         private void OnGUI()
 | ||
|         {
 | ||
|             // OnGUI is called on each frame draw, so we don't want to do any unnecessary calculation if we can avoid it. So only calculate it when the width actually changed.
 | ||
|             if (Math.Abs(previousWindowWidth - position.width) > 1)
 | ||
|             {
 | ||
|                 previousWindowWidth = position.width;
 | ||
|                 CalculateFieldWidth();
 | ||
|             }
 | ||
|             using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPosition, false, false))
 | ||
|             {
 | ||
|                 scrollPosition = scrollView.scrollPosition;
 | ||
|                 GUILayout.Space(5);
 | ||
|                 // EditorGUILayout.LabelField("Region (Only for Android, iOS is not affected by region)", titleLabelStyle);
 | ||
|                 EditorGUILayout.LabelField("Region", titleLabelStyle);
 | ||
|                 DrawCountryUI();
 | ||
|                 DrawCountrySwitchTip();
 | ||
|                 DrawAndroidXUI();
 | ||
|                 DrawAdombAppId();
 | ||
|                 EditorGUILayout.LabelField("ThinkupTpn Plugin Details", titleLabelStyle);
 | ||
|                 //显示插件版本号
 | ||
|                 DrawPluginDetails();
 | ||
|                 //绘制SDK版本下架提示
 | ||
|                 DrawSdkVersionOffTip();
 | ||
|                 //绘制Networks
 | ||
|                 DrawMediatedNetworks();
 | ||
|             }
 | ||
|             if (GUI.changed)
 | ||
|             {
 | ||
|                 AssetDatabase.SaveAssets();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// Callback method that will be called with progress updates when the plugin is being downloaded.
 | ||
|         /// </summary>
 | ||
|         public static void OnDownloadPluginProgress(string pluginName, float progress, bool done)
 | ||
|         {
 | ||
|             ATLog.logFormat("OnDownloadPluginProgress() >>> pluginName: {0}, progress: {1}, done: {2}", new object[] { pluginName, progress, done });
 | ||
|             // Download is complete. Clear progress bar.
 | ||
|             if (done || progress == 1)
 | ||
|             {
 | ||
|                 EditorUtility.ClearProgressBar();
 | ||
|                 AssetDatabase.Refresh();
 | ||
|             }
 | ||
|             // Download is in progress, update progress bar.
 | ||
|             else
 | ||
|             {
 | ||
|                 if (EditorUtility.DisplayCancelableProgressBar(windowTitle, string.Format("Downloading {0} plugin...", pluginName), progress))
 | ||
|                 {
 | ||
|                     ATLog.log("OnDownloadPluginProgress() >>> click cancel download");
 | ||
|                     ATIntegrationManager.Instance.CancelDownload();
 | ||
|                     EditorUtility.ClearProgressBar();
 | ||
|                     AssetDatabase.Refresh();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         public void DeleteSdkVersion(PluginData pluginData, int index, int os) {
 | ||
|             var sdkVersion = pluginData.androidVersions[index];
 | ||
|             if (os == ATConfig.OS_IOS) {
 | ||
|                 sdkVersion = pluginData.iosVersions[index];
 | ||
|             }
 | ||
|             ATIntegrationManager.Instance.deleteSdk(pluginData, sdkVersion, os);
 | ||
|         }
 | ||
| 
 | ||
|         public void ExChangeSDKVersion(PluginData pluginData, int index, int os) {
 | ||
|             NetworkRequestParams requestParams = pluginData.requestParams;
 | ||
|             if (requestParams == null) {
 | ||
|                 requestParams = new NetworkRequestParams();
 | ||
|             }
 | ||
|             requestParams.os = os;
 | ||
|             if (os == ATConfig.OS_ANDROID) {  //Android 
 | ||
|                 requestParams.androidVersion = pluginData.androidVersions[index];
 | ||
|             } else {
 | ||
|                 requestParams.iosVersion = pluginData.iosVersions[index];
 | ||
|             }
 | ||
|             pluginData.requestParams = requestParams;
 | ||
|             // ATLog.log("ExChangeSDKVersion() >>> versions.Android: " + versions.Android + " versions.Ios: " + versions.Ios);
 | ||
|             loadNetworksData(pluginData);
 | ||
|         }
 | ||
| 
 | ||
|         //获取插件和SDK的版本数据
 | ||
|         private void loadPluginData()
 | ||
|         {
 | ||
|             if (loadDataCoroutine != null)
 | ||
|             {
 | ||
|                 loadDataCoroutine.Stop();
 | ||
|             }
 | ||
|             loadDataCoroutine = ATEditorCoroutine.startCoroutine(ATIntegrationManager.Instance.loadPluginData(data =>
 | ||
|             {
 | ||
|                 if (data == null)
 | ||
|                 {
 | ||
|                     pluginDataLoadFailed = true;
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     ATLog.log("loadNetworksData() >>> pluginData: " + data);
 | ||
|                     pluginData = data;
 | ||
|                     pluginDataLoadFailed = false;
 | ||
| 
 | ||
|                     var versions = pluginData.anyThink.CurrentVersions;
 | ||
|                     if (versions != null) {
 | ||
|                         var requestParams = new NetworkRequestParams();
 | ||
|                         requestParams.androidVersion = versions.Android;
 | ||
|                         requestParams.iosVersion = versions.Ios;
 | ||
|                         pluginData.requestParams = requestParams;
 | ||
|                     }
 | ||
|                     loadNetworksData(pluginData);
 | ||
|                 }
 | ||
| 
 | ||
|                 CalculateFieldWidth();
 | ||
|                 Repaint();
 | ||
|             }));
 | ||
|         }
 | ||
|         //获取networks
 | ||
|         private void loadNetworksData(PluginData pluginData)
 | ||
|         {
 | ||
|             ATEditorCoroutine.startCoroutine(ATIntegrationManager.Instance.loadNetworksData(pluginData, data =>
 | ||
|             {
 | ||
|                 pluginData = data;
 | ||
|                 Network network = pluginData.anyThink;
 | ||
|                 if (!string.IsNullOrEmpty(network.AndroidDownloadUrl) || !string.IsNullOrEmpty(network.iOSDownloadloadUrl)) {
 | ||
|                     ATIntegrationManager.Instance.downloadCorePlugin(data);
 | ||
|                 }
 | ||
|                 Repaint();
 | ||
|             }));
 | ||
|         }
 | ||
|         //切换国家,重新加载数据
 | ||
|         private void switchCountry(int country)
 | ||
|         {
 | ||
|             ATIntegrationManager.Instance.switchCountry(pluginData, country);
 | ||
|             //重新开始走network
 | ||
|             loadPluginData();
 | ||
|         }
 | ||
| 
 | ||
|         private void CalculateFieldWidth()
 | ||
|         {
 | ||
|             var currentWidth = position.width;
 | ||
|             var availableWidth = currentWidth - actionFieldWidth - 80; // NOTE: Magic number alert. This is the sum of all the spacing the fields and other UI elements.
 | ||
|             var networkLabelWidth = Math.Max(networkFieldMinWidth, availableWidth * networkFieldWidthPercentage);
 | ||
|             networkWidthOption = GUILayout.Width(networkLabelWidth);
 | ||
| 
 | ||
|             var versionLabelWidth = Math.Max(versionFieldMinWidth, availableWidth * versionFieldWidthPercentage);
 | ||
|             versionWidthOption = GUILayout.Width(versionLabelWidth);
 | ||
| 
 | ||
|             const int textFieldOtherUiElementsWidth = 45; // NOTE: Magic number alert. This is the sum of all the spacing the fields and other UI elements.
 | ||
|             var availableTextFieldWidth = currentWidth - networkLabelWidth - textFieldOtherUiElementsWidth;
 | ||
|             sdkKeyTextFieldWidthOption = GUILayout.Width(availableTextFieldWidth);
 | ||
| 
 | ||
|             var availableUserDescriptionTextFieldWidth = currentWidth - privacySettingLabelWidth - textFieldOtherUiElementsWidth;
 | ||
|             privacySettingFieldWidthOption = GUILayout.Width(availableUserDescriptionTextFieldWidth);
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawCountryUI()
 | ||
|         {
 | ||
|             // GUILayout.BeginHorizontal();
 | ||
|             GUILayout.Space(4);
 | ||
|             using (new EditorGUILayout.HorizontalScope("box"))
 | ||
|             {
 | ||
|                 GUILayout.Space(5);
 | ||
| 
 | ||
|                 int countryInt = ATConfig.getDefCountry(); //默认是中国
 | ||
|                 if (pluginData != null)
 | ||
|                 {
 | ||
|                     countryInt = pluginData.country;
 | ||
|                 }
 | ||
| 
 | ||
|                 string[] options = ATConfig.getCountryArray();
 | ||
|                 // 创建Dropdown组件
 | ||
|                 int curDropdownIndex = ATDataUtil.isChina(countryInt) ? 0 : 1;
 | ||
|                 if (options.Length == 1) {
 | ||
|                     curDropdownIndex = 0;
 | ||
|                 }
 | ||
|                 int dropdownIndex = EditorGUILayout.Popup("Select Region:", curDropdownIndex, options);
 | ||
| 
 | ||
|                 if (options.Length > 1) {
 | ||
|                     curSelectCountryInt = dropdownIndex == 0 ? ATConfig.CHINA_COUNTRY : ATConfig.NONCHINA_COUNTRY;
 | ||
|                     //变化才设置
 | ||
|                     if (pluginData != null && curSelectCountryInt != countryInt)
 | ||
|                     {
 | ||
|                         ATLog.log("DrawCountryUI() >>> curSelectCountryInt: " + curSelectCountryInt + " countryInt: " + countryInt);
 | ||
|                         //Unity需要更换Network
 | ||
|                         switchCountry(curSelectCountryInt);
 | ||
|                     }
 | ||
|                 }
 | ||
|                 GUILayout.Space(5);
 | ||
|             }
 | ||
|             GUILayout.Space(4);
 | ||
|             // GUILayout.EndHorizontal();
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawCountrySwitchTip()
 | ||
|         {
 | ||
|             var integratedTip = ATConfig.getRegionIntegrateTip();
 | ||
|             if (string.IsNullOrEmpty(integratedTip)) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             GUILayout.Space(4);
 | ||
|             // textStyle.fontStyle = FontStyle.Bold;
 | ||
|             EditorGUILayout.LabelField(integratedTip, tipTextStyle);
 | ||
|             GUILayout.Space(4);
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawAndroidXUI()
 | ||
|         {   
 | ||
|             bool isChina = ATConfig.isSelectedChina();
 | ||
|             // if (!ATConfig.isSelectedChina()) {
 | ||
|             //     return;
 | ||
|             // }
 | ||
|             EditorGUILayout.LabelField("AndroidX (Only for Android)", titleLabelStyle);
 | ||
|             GUILayout.Space(4);
 | ||
|             using (new EditorGUILayout.HorizontalScope("box"))
 | ||
|             {
 | ||
|                 GUILayout.Space(5);
 | ||
| 
 | ||
|                 int androidXSetting = ATIntegrationManager.Instance.getAndroidXSetting(pluginData);
 | ||
|                 string[] options = new string[] { "Default", "Enable", "Disable" };
 | ||
|                 if (!isChina) {
 | ||
|                     options = new string[] { "Default", "Enable" };
 | ||
|                 }
 | ||
|                 // 创建Dropdown组件
 | ||
|                 int lastDropdownIndex = androidXSetting;
 | ||
|                 int curDropdownIndex = EditorGUILayout.Popup("Enable AndroidX:", lastDropdownIndex, options);
 | ||
| 
 | ||
|                 //变化才设置
 | ||
|                 if (curDropdownIndex != lastDropdownIndex)
 | ||
|                 {
 | ||
|                     ATLog.log("DrawAndroidXUI() >>> curDropdownIndex: " + curDropdownIndex + " lastDropdownIndex: " + lastDropdownIndex);
 | ||
|                     ATIntegrationManager.Instance.saveAndroidXSetting(pluginData, curDropdownIndex);
 | ||
|                 }
 | ||
|                 GUILayout.Space(5);
 | ||
|             }
 | ||
|             GUILayout.Space(4);
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawPluginDetails()
 | ||
|         {
 | ||
|             // GUILayout.BeginHorizontal();
 | ||
|             GUILayout.Space(10);
 | ||
|             using (new EditorGUILayout.VerticalScope("box"))
 | ||
|             {
 | ||
|                 // Draw plugin version details
 | ||
|                 DrawHeaders("Platform", true);
 | ||
|                 DrawPluginDetailRow("Unity Plugin", ATConfig.PLUGIN_VERSION, "", "");
 | ||
|                 if (pluginData == null)
 | ||
|                 {
 | ||
|                     DrawEmptyPluginData("loading sdk data ...");
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 var thinkup = pluginData.anyThink;
 | ||
|                 var android_version = "";
 | ||
|                 var ios_version = "";
 | ||
|                 if (thinkup != null) {
 | ||
|                     android_version = thinkup.CurrentVersions.Android;
 | ||
|                     ios_version = thinkup.CurrentVersions.Ios;
 | ||
|                 }
 | ||
|                 //绘制Android
 | ||
|                 using (new EditorGUILayout.HorizontalScope())
 | ||
|                 {
 | ||
|                     GUILayout.Space(5);
 | ||
|                     EditorGUILayout.LabelField(new GUIContent("Android"), networkWidthOption);
 | ||
|                     EditorGUILayout.LabelField(new GUIContent(android_version), versionWidthOption);
 | ||
|                     GUILayout.Space(3);
 | ||
| 
 | ||
|                     string[] androidVersions = pluginData.androidVersions;
 | ||
|                     if (androidVersions != null && androidVersions.Length > 0) {
 | ||
|                         List<int> androidVersionsInt = new List<int>();
 | ||
|                         int androidLength = androidVersions.Length;
 | ||
|                         for (int i = 0; i < androidLength; i = i + 1)
 | ||
|                         {
 | ||
|                             androidVersionsInt.Add(i);
 | ||
|                         }
 | ||
| 
 | ||
|                         // 创建Dropdown组件
 | ||
|                         androidVersionPopupIndex = EditorGUILayout.IntPopup(androidVersionPopupIndex, androidVersions, androidVersionsInt.ToArray(), versionWidthOption);
 | ||
|                         GUILayout.FlexibleSpace();
 | ||
|                         string selectedAndroidVersion = androidVersions[androidVersionPopupIndex];
 | ||
|                         string action = "Exchange";
 | ||
|                         if (!string.IsNullOrEmpty(android_version) && Equals(android_version, selectedAndroidVersion)) {
 | ||
|                             action = "Delete";
 | ||
|                         }
 | ||
|                         GUI.enabled = (!Equals(android_version, selectedAndroidVersion)) || action == "Delete";
 | ||
|                         if (GUILayout.Button(new GUIContent(action), fieldWidth))
 | ||
|                         {
 | ||
|                             //切换AndroidSDK版本
 | ||
|                             if (action == "Delete") {
 | ||
|                                 DeleteSdkVersion(pluginData, androidVersionPopupIndex, ATConfig.OS_ANDROID);
 | ||
|                             } else {
 | ||
|                                 ExChangeSDKVersion(pluginData, androidVersionPopupIndex, ATConfig.OS_ANDROID);
 | ||
|                             }
 | ||
|                         }
 | ||
|                         GUI.enabled = true;
 | ||
|                         GUILayout.Space(5);    
 | ||
|                     } else {
 | ||
|                         EditorGUILayout.LabelField(new GUIContent("loading..."), versionWidthOption);
 | ||
|                     }
 | ||
|                 
 | ||
|                     GUILayout.Space(3);
 | ||
|                 }
 | ||
|                 //绘制iOS
 | ||
|                 using (new EditorGUILayout.HorizontalScope())
 | ||
|                 {
 | ||
|                     GUILayout.Space(5);
 | ||
|                     EditorGUILayout.LabelField(new GUIContent("iOS"), networkWidthOption);
 | ||
|                     EditorGUILayout.LabelField(new GUIContent(ios_version), versionWidthOption);
 | ||
|                     GUILayout.Space(3);
 | ||
| 
 | ||
|                     string[] iosVersions = pluginData.iosVersions;
 | ||
|                     if (iosVersions != null && iosVersions.Length > 0) {
 | ||
|                         List<int> iosVersionsInt = new List<int>();
 | ||
|                         int androidLength = iosVersions.Length;
 | ||
|                         for (int i = 0; i < androidLength; i = i + 1)
 | ||
|                         {
 | ||
|                             iosVersionsInt.Add(i);
 | ||
|                         }
 | ||
| 
 | ||
|                         // 创建Dropdown组件
 | ||
|                         iosVersionPopupIndex = EditorGUILayout.IntPopup(iosVersionPopupIndex, iosVersions, iosVersionsInt.ToArray(), versionWidthOption);
 | ||
|                         GUILayout.FlexibleSpace();
 | ||
|                         string selectedIosVersion = iosVersions[iosVersionPopupIndex];
 | ||
| 
 | ||
|                         string action = "Exchange";
 | ||
|                         if (!string.IsNullOrEmpty(ios_version) && Equals(ios_version, selectedIosVersion)) {
 | ||
|                             action = "Delete";
 | ||
|                         }
 | ||
|                         GUI.enabled = !Equals(ios_version, selectedIosVersion) || action == "Delete";
 | ||
|                         if (GUILayout.Button(new GUIContent(action), fieldWidth))
 | ||
|                         {
 | ||
|                             if (action == "Delete") {
 | ||
|                                 DeleteSdkVersion(pluginData, iosVersionPopupIndex, ATConfig.OS_IOS);
 | ||
|                             } else {
 | ||
|                                 ExChangeSDKVersion(pluginData, iosVersionPopupIndex, ATConfig.OS_IOS);
 | ||
|                             }
 | ||
|                         }
 | ||
|                         GUI.enabled = true;
 | ||
|                         GUILayout.Space(5);    
 | ||
|                     } else {
 | ||
|                         EditorGUILayout.LabelField(new GUIContent("loading..."), versionWidthOption);
 | ||
|                     }
 | ||
|                 
 | ||
|                     GUILayout.Space(3);
 | ||
|                 }
 | ||
| 
 | ||
|                 GUILayout.Space(4);
 | ||
| 
 | ||
| #if !UNITY_2018_2_OR_NEWER
 | ||
|                 EditorGUILayout.HelpBox("AnyThink Unity plugin will soon require Unity 2018.2 or newer to function. Please upgrade to a newer Unity version.", MessageType.Warning);
 | ||
| #endif
 | ||
|             }
 | ||
| 
 | ||
|             GUILayout.Space(5);
 | ||
|             // GUILayout.EndHorizontal();
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawSdkVersionOffTip()
 | ||
|         {
 | ||
|             if (pluginData == null) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             var thinkup = pluginData.anyThink;
 | ||
|             if (thinkup == null) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             var android_version = "";
 | ||
|             var ios_version = "";
 | ||
|             if (thinkup != null) {
 | ||
|                 android_version = thinkup.CurrentVersions.Android;
 | ||
|                 ios_version = thinkup.CurrentVersions.Ios;
 | ||
|                 //判断android版本是否版本列表中
 | ||
|                 string[] androidVersions = pluginData.androidVersions;
 | ||
|                 string[] iosVersions = pluginData.iosVersions;
 | ||
| 
 | ||
|                 //The currently installed Android version and io version have been offline
 | ||
|                 StringBuilder sb = new StringBuilder();
 | ||
|                 sb.Append("Tips: The currently installed ");
 | ||
|                
 | ||
|                 var android_version_off = false;
 | ||
|                 if (!string.IsNullOrEmpty(android_version) && androidVersions != null && androidVersions.Length > 0) {
 | ||
|                     if (!IsCharInStringArray(android_version, androidVersions)) {
 | ||
|                         sb.Append("Android version(");
 | ||
|                         sb.Append(android_version);
 | ||
|                         sb.Append(") ");
 | ||
|                         android_version_off = true;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 var ios_version_off = false;
 | ||
|                 if (!string.IsNullOrEmpty(ios_version) && iosVersions != null && iosVersions.Length > 0) {
 | ||
|                     if (!IsCharInStringArray(ios_version, iosVersions)) {
 | ||
|                         if (android_version_off) {
 | ||
|                             sb.Append("and ");
 | ||
|                         }
 | ||
|                         sb.Append("iOS version(");
 | ||
|                         sb.Append(ios_version);
 | ||
|                         sb.Append(") ");
 | ||
|                         ios_version_off = true;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 if (android_version_off || ios_version_off) {
 | ||
|                     sb.Append("have been offline, please install the latest version.");
 | ||
|                     GUILayout.Space(4);
 | ||
|                     EditorGUILayout.LabelField(sb.ToString(), tipTextStyle);
 | ||
|                     GUILayout.Space(4);
 | ||
|                 } else {
 | ||
|                     sb.Clear();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private bool IsCharInStringArray(string character, string[] array)
 | ||
|         {
 | ||
|             // 遍历数组中的每个字符串
 | ||
|             foreach (string str in array)
 | ||
|             {
 | ||
|                 // 如果当前字符串包含指定的字符,则返回true
 | ||
|                 if (str == character)
 | ||
|                 {
 | ||
|                     return true;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // 如果没有找到字符,则返回false
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         private void DrawHeaders(string firstColumnTitle, bool drawAction)
 | ||
|         {
 | ||
|             using (new EditorGUILayout.HorizontalScope())
 | ||
|             {
 | ||
|                 GUILayout.Space(5);
 | ||
|                 EditorGUILayout.LabelField(firstColumnTitle, headerLabelStyle, networkWidthOption);
 | ||
|                 EditorGUILayout.LabelField("Current Version", headerLabelStyle, versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 EditorGUILayout.LabelField("SDK Versions", headerLabelStyle, versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 if (drawAction)
 | ||
|                 {
 | ||
|                     GUILayout.FlexibleSpace();
 | ||
|                     GUILayout.Button("Actions", headerLabelStyle, fieldWidth);
 | ||
|                     GUILayout.Space(5);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             GUILayout.Space(4);
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawPluginDetailRow(string platform, string currentVersion, string sdkversions, string actions)
 | ||
|         {
 | ||
|             using (new EditorGUILayout.HorizontalScope())
 | ||
|             {
 | ||
|                 GUILayout.Space(5);
 | ||
|                 EditorGUILayout.LabelField(new GUIContent(platform), networkWidthOption);
 | ||
|                 EditorGUILayout.LabelField(new GUIContent(currentVersion), versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 EditorGUILayout.LabelField(new GUIContent(sdkversions), versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 // EditorGUILayout.LabelField(new GUIContent(actions), versionWidthOption);
 | ||
|                 // GUILayout.Space(3);
 | ||
|             }
 | ||
| 
 | ||
|             GUILayout.Space(4);
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawEmptyPluginData(string tip)
 | ||
|         {
 | ||
|             GUILayout.Space(5);
 | ||
| 
 | ||
|             // Plugin data failed to load. Show error and retry button.
 | ||
|             if (pluginDataLoadFailed)
 | ||
|             {
 | ||
|                 GUILayout.Space(10);
 | ||
|                 GUILayout.BeginHorizontal();
 | ||
|                 GUILayout.Space(5);
 | ||
|                 EditorGUILayout.LabelField("Failed to load plugin data. Please click retry or restart the integration manager.", titleLabelStyle);
 | ||
|                 if (GUILayout.Button("Retry", fieldWidth))
 | ||
|                 {
 | ||
|                     pluginDataLoadFailed = false;
 | ||
|                     loadPluginData();
 | ||
|                 }
 | ||
| 
 | ||
|                 GUILayout.Space(5);
 | ||
|                 GUILayout.EndHorizontal();
 | ||
|                 GUILayout.Space(10);
 | ||
|             }
 | ||
|             // Still loading, show loading label.
 | ||
|             else
 | ||
|             {
 | ||
|                 GUILayout.Space(10);
 | ||
|                 GUILayout.BeginHorizontal();
 | ||
|                 // GUILayout.FlexibleSpace();
 | ||
|                 EditorGUILayout.LabelField(tip, titleLabelStyle);
 | ||
|                 // GUILayout.FlexibleSpace();
 | ||
|                 GUILayout.EndHorizontal();
 | ||
|                 GUILayout.Space(10);
 | ||
|             }
 | ||
| 
 | ||
|             GUILayout.Space(5);
 | ||
|         }
 | ||
|         //绘制Admob Id
 | ||
|         private void DrawAdombAppId() {
 | ||
|             var integrationManager = ATIntegrationManager.Instance;
 | ||
|             bool isAdmobInstalledForAndroid = integrationManager.isAdmobInstalled(ATConfig.OS_ANDROID);
 | ||
|             bool isAdmobInstalledForIos = integrationManager.isAdmobInstalled(ATConfig.OS_IOS);
 | ||
| 
 | ||
|             if (isAdmobInstalledForAndroid || isAdmobInstalledForIos) {
 | ||
|                 EditorGUILayout.LabelField("Admob AppId", titleLabelStyle);
 | ||
|                 GUILayout.Space(5);
 | ||
|                 using (new EditorGUILayout.VerticalScope("box"))
 | ||
|                 {
 | ||
|                     GUILayout.Space(10);
 | ||
|                     if (isAdmobInstalledForAndroid) {
 | ||
|                         var androidAdmobAppId = DrawTextField("App ID (Android)", integrationManager.getAdmobAppIdByOs(pluginData, ATConfig.OS_ANDROID), networkWidthOption);
 | ||
|                         integrationManager.setAdmobAppidByOs(pluginData, ATConfig.OS_ANDROID, androidAdmobAppId);
 | ||
|                     }
 | ||
|                     if (isAdmobInstalledForIos) {
 | ||
|                         if (isAdmobInstalledForAndroid) {
 | ||
|                             GUILayout.Space(10);
 | ||
|                         }
 | ||
|                         var iosAdmobAppId = DrawTextField("App ID (iOS)", integrationManager.getAdmobAppIdByOs(pluginData, ATConfig.OS_IOS), networkWidthOption);
 | ||
|                         integrationManager.setAdmobAppidByOs(pluginData, ATConfig.OS_IOS, iosAdmobAppId);
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private string DrawTextField(string fieldTitle, string text, GUILayoutOption labelWidth,    GUILayoutOption textFieldWidthOption = null)
 | ||
|         {
 | ||
|             GUILayout.BeginHorizontal();
 | ||
|             GUILayout.Space(4);
 | ||
|             EditorGUILayout.LabelField(new GUIContent(fieldTitle), labelWidth);
 | ||
|             GUILayout.Space(4);
 | ||
|             text = (textFieldWidthOption == null) ? GUILayout.TextField(text) : GUILayout.TextField(text, textFieldWidthOption);
 | ||
|             GUILayout.Space(4);
 | ||
|             GUILayout.EndHorizontal();
 | ||
|             GUILayout.Space(4);
 | ||
| 
 | ||
|             return text;
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         private void DrawMediatedNetworks()
 | ||
|         {
 | ||
|             GUILayout.Space(5);
 | ||
|             EditorGUILayout.LabelField("Ad Networks", titleLabelStyle);
 | ||
|             GUILayout.Space(5);
 | ||
|             GUILayout.BeginHorizontal();
 | ||
|             using (new EditorGUILayout.VerticalScope("box"))
 | ||
|             {
 | ||
|                 DrawHeaders("Network", true);
 | ||
|                 string clickTip = "You need to select an sdk version and click the Exchange button.";
 | ||
|                 // Immediately after downloading and importing a plugin the entire IDE reloads and current versions can be null in that case. Will just show loading text in that case.
 | ||
|                 if (pluginData == null)
 | ||
|                 {
 | ||
|                     ATLog.log("DrawMediatedNetworks failed.");
 | ||
|                     DrawEmptyPluginData("loading sdk data ...");
 | ||
|                 } else if(pluginData.mediatedNetworks == null) {
 | ||
|                     DrawEmptyPluginData(clickTip);
 | ||
|                 } else {
 | ||
|                     var networks = pluginData.mediatedNetworks;
 | ||
|                     var length = networks.Length;
 | ||
|                     ATLog.log("DrawMediatedNetworks() >>> networks length: " + length);
 | ||
|                     if (length == 0) {
 | ||
|                         DrawEmptyPluginData(clickTip);
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     int versionEmptyLength = 0;
 | ||
|                     foreach (var network in networks)
 | ||
|                     {
 | ||
|                         if (network.isVersionEmpty()) {
 | ||
|                             // ATLog.log("DrawMediatedNetworks() >>> isVersionEmpty name: " + network.Name);
 | ||
|                             versionEmptyLength = versionEmptyLength + 1;
 | ||
|                         } else {
 | ||
|                             DrawNetworkDetailRow2(network);
 | ||
|                         }
 | ||
|                     }
 | ||
|                     ATLog.log("DrawMediatedNetworks() >>> versionEmptyLength: " + versionEmptyLength);
 | ||
|                     if (versionEmptyLength == length) {
 | ||
|                         DrawEmptyPluginData(clickTip);
 | ||
|                     }
 | ||
| 
 | ||
|                     GUILayout.Space(10);
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             GUILayout.Space(5);
 | ||
|             GUILayout.EndHorizontal();
 | ||
|         }
 | ||
|         //绘制network的每一行
 | ||
|         private void DrawNetworkDetailRow2(Network network) {
 | ||
|             using (new EditorGUILayout.VerticalScope("box"))
 | ||
|             {
 | ||
|                 GUILayout.Space(4);
 | ||
|                 string a_action = "";    
 | ||
|                 string i_action = "";
 | ||
|                 string cur_a_version = "";
 | ||
|                 string cur_i_version = "";
 | ||
|                 string last_a_version = "";
 | ||
|                 string last_i_version = "";
 | ||
|                 if (network.CurrentVersions != null)
 | ||
|                 {
 | ||
|                     cur_a_version = network.CurrentVersions.Android;
 | ||
|                     cur_i_version = network.CurrentVersions.Ios;
 | ||
|                 }
 | ||
|                 if (network.LatestVersions != null) 
 | ||
|                 {
 | ||
|                     last_a_version = network.LatestVersions.Android;
 | ||
|                     last_i_version = network.LatestVersions.Ios;
 | ||
|                 }
 | ||
|                 //Android Action按钮状态
 | ||
|                 ATLog.log("DrawNetworkDetailRow2() >>> cur_a_version: " + cur_a_version + " last_i_version: " + last_i_version + 
 | ||
|                 " name: " + network.DisplayName + " last_a_version: " + last_a_version);
 | ||
|                 if (string.IsNullOrEmpty(cur_a_version)) {
 | ||
|                     a_action = "Install";
 | ||
|                 } else if (ATDataUtil.CompareVersions(cur_a_version, last_a_version) == VersionComparisonResult.Lesser) {
 | ||
|                     a_action = "Upgrade";
 | ||
|                 } else if(ATDataUtil.CompareVersions(cur_a_version, last_a_version) == VersionComparisonResult.Equal) {
 | ||
|                     a_action = "Installed";
 | ||
|                 } 
 | ||
|                 bool hasAndroid = false;
 | ||
|                 if (!string.IsNullOrEmpty(last_a_version)) {
 | ||
|                     hasAndroid = true;
 | ||
|                     DrawRowNetwork(network, ATConfig.OS_ANDROID, cur_a_version, last_a_version, a_action, true);
 | ||
|                 }
 | ||
|                 //iOS Action按钮状态
 | ||
|                 // var i_compare_result = ATDataUtil.CompareVersions(cur_i_version, last_i_version);
 | ||
|                 if (string.IsNullOrEmpty(cur_i_version)) {
 | ||
|                     i_action = "Install";
 | ||
|                 } else if (ATDataUtil.CompareVersions(cur_i_version, last_i_version) == VersionComparisonResult.Lesser) {
 | ||
|                     i_action = "Upgrade";
 | ||
|                 } else if(ATDataUtil.CompareVersions(cur_i_version, last_i_version) == VersionComparisonResult.Equal) {
 | ||
|                     i_action = "Installed";
 | ||
|                 } 
 | ||
|                 if (!string.IsNullOrEmpty(last_i_version)) {
 | ||
|                     DrawRowNetwork(network, ATConfig.OS_IOS, cur_i_version, last_i_version, i_action, !hasAndroid);
 | ||
|                 }
 | ||
|                 GUILayout.Space(4);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void DrawRowNetwork(Network network, int os, string curVersion, string lastVersion, string action, bool isShowNetworkName)
 | ||
|         {
 | ||
|              GUILayout.Space(5);
 | ||
|             if (os == ATConfig.OS_ANDROID) {
 | ||
|                 if (!string.IsNullOrEmpty(curVersion)) {
 | ||
|                     curVersion = "Android-" + curVersion;
 | ||
|                 } else {
 | ||
|                     curVersion = "Not Installed";
 | ||
|                 }
 | ||
|                 lastVersion = "Android-" + lastVersion;
 | ||
|             } else {
 | ||
|                 if (!string.IsNullOrEmpty(curVersion)) {
 | ||
|                     curVersion = "iOS-" + curVersion;
 | ||
|                 } else {
 | ||
|                     curVersion = "Not Installed";
 | ||
|                 }
 | ||
|                 lastVersion = "iOS-" + lastVersion;
 | ||
|             }
 | ||
|             using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandHeight(false)))
 | ||
|             {
 | ||
|                 GUILayout.Space(5);
 | ||
|                 if (isShowNetworkName) {
 | ||
|                     EditorGUILayout.LabelField(new GUIContent(network.DisplayName), networkWidthOption);
 | ||
|                 } else {
 | ||
|                     EditorGUILayout.LabelField(new GUIContent(""), networkWidthOption);
 | ||
|                 }
 | ||
|                
 | ||
|                 EditorGUILayout.LabelField(new GUIContent(curVersion), versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 EditorGUILayout.LabelField(new GUIContent(lastVersion), versionWidthOption);
 | ||
|                 GUILayout.Space(3);
 | ||
|                 GUILayout.FlexibleSpace();
 | ||
| 
 | ||
|                 if (network.isReqiureUpdate())
 | ||
|                 {
 | ||
|                     GUILayout.Label(new GUIContent { image = alertIcon, tooltip = "Adapter not compatible, please update to the latest version." }, iconStyle);
 | ||
|                 }
 | ||
| 
 | ||
|                 GUI.enabled = action != "Installed";
 | ||
|                 if (GUILayout.Button(new GUIContent(action), fieldWidth))
 | ||
|                 {   
 | ||
|                     ATIntegrationManager.Instance.networkInstallOrUpdate(pluginData, network, os);
 | ||
|                 }
 | ||
|                 GUI.enabled = true;
 | ||
|                 GUILayout.Space(2);
 | ||
| 
 | ||
|                 GUI.enabled = action == "Installed";
 | ||
|                 if (GUILayout.Button(new GUIContent { image = uninstallIcon, tooltip = "Uninstall" }, iconStyle))
 | ||
|                 {
 | ||
|                     EditorUtility.DisplayProgressBar("Integration Manager", "Deleting " + network.Name + "...", 0.5f);
 | ||
|                     ATIntegrationManager.Instance.uninstallNetwork(network, os);
 | ||
|                     //Refresh UI
 | ||
|                     AssetDatabase.Refresh();
 | ||
|                     EditorUtility.ClearProgressBar();
 | ||
|                 }
 | ||
| 
 | ||
|                 GUI.enabled = true;
 | ||
|                 GUILayout.Space(5);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| } |