using UnityEngine; using UnityEditor; using System.Collections.Generic; using System; using System.IO; public class UniWebViewEditorSettings: ScriptableObject { private const string AssetPath = "Assets/Editor/UniWebView/settings.asset"; [SerializeField] internal bool usesCleartextTraffic = false; [SerializeField] internal bool writeExternalStorage = false; [SerializeField] internal bool accessFineLocation = false; [SerializeField] internal bool addsKotlin = true; [SerializeField] internal string kotlinVersion = null; [SerializeField] internal bool addsAndroidBrowser = true; [SerializeField] internal string androidBrowserVersion = null; [SerializeField] internal bool addsAndroidXCore = false; [SerializeField] internal string androidXCoreVersion = null; [SerializeField] internal bool enableJetifier = true; [SerializeField] internal string[] authCallbackUrls = { }; [SerializeField] internal bool supportLINELogin = false; internal static string defaultKotlinVersion = "1.6.21"; internal static string defaultAndroidBrowserVersion = "1.2.0"; internal static string defaultAndroidXCoreVersion = "1.5.0"; internal static UniWebViewEditorSettings GetOrCreateSettings() { var settings = AssetDatabase.LoadAssetAtPath(AssetPath); if (settings == null) { settings = ScriptableObject.CreateInstance(); Directory.CreateDirectory("Assets/Editor/UniWebView/"); AssetDatabase.CreateAsset(settings, AssetPath); AssetDatabase.SaveAssets(); } return settings; } internal static SerializedObject GetSerializedSettings() { return new SerializedObject(GetOrCreateSettings()); } } // UniWebViewEditorSettings is not working well with AndroidProjectFilesModifier. // (reading it requires main thread, but the OnModifyAndroidProjectFiles is not in main thread) [Serializable] public class UniWebViewEditorSettingsReading { public bool usesCleartextTraffic = false; public bool writeExternalStorage = false; public bool accessFineLocation = false; public bool addsKotlin = true; public string kotlinVersion = null; public bool addsAndroidBrowser = true; public string androidBrowserVersion = null; public bool addsAndroidXCore = false; public string androidXCoreVersion = null; public bool enableJetifier = true; public string[] authCallbackUrls = { }; public bool supportLINELogin = false; } static class UniWebViewSettingsProvider { static SerializedObject settings; #if UNITY_2018_3_OR_NEWER private class Provider : SettingsProvider { public Provider(string path, SettingsScope scope = SettingsScope.User): base(path, scope) {} public override void OnGUI(string searchContext) { DrawPref(); } } [SettingsProvider] static SettingsProvider UniWebViewPref() { return new Provider("Preferences/UniWebView"); } #else [PreferenceItem("UniWebView")] #endif static void DrawPref() { EditorGUIUtility.labelWidth = 320; EditorGUIUtility.fieldWidth = 20; if (settings == null) { settings = UniWebViewEditorSettings.GetSerializedSettings(); } settings.Update(); EditorGUI.BeginChangeCheck(); // Manifest EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Android Manifest", EditorStyles.boldLabel); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("usesCleartextTraffic")); DrawDetailLabel("If you need to load plain HTTP content."); EditorGUILayout.PropertyField(settings.FindProperty("writeExternalStorage")); DrawDetailLabel("If you need to download an image from web page."); EditorGUILayout.PropertyField(settings.FindProperty("accessFineLocation")); DrawDetailLabel("If you need to enable location support in web view."); EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); // Gradle EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Gradle Build", EditorStyles.boldLabel); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("addsKotlin")); DrawDetailLabel("Turn off this if another library is already adding Kotlin runtime."); var addingKotlin = settings.FindProperty("addsKotlin").boolValue; if (addingKotlin) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("kotlinVersion"), GUILayout.Width(400)); DrawDetailLabel("If not specified, use the default version: " + UniWebViewEditorSettings.defaultKotlinVersion); EditorGUI.indentLevel--; } EditorGUILayout.PropertyField(settings.FindProperty("addsAndroidBrowser")); DrawDetailLabel("Turn off this if another library is already adding 'androidx.browser:browser'."); var addingBrowser = settings.FindProperty("addsAndroidBrowser").boolValue; if (addingBrowser) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("androidBrowserVersion"), GUILayout.Width(400)); DrawDetailLabel("If not specified, use the default version: " + UniWebViewEditorSettings.defaultAndroidBrowserVersion); EditorGUI.indentLevel--; } if (!addingBrowser) { EditorGUILayout.BeginVertical("box"); EditorGUILayout.HelpBox("UniWebView at least requires `androidx.core` to run. Without it, your game will crash when launching.\nIf you do not have another `androidx.core` package in the project, enable the option below.", MessageType.Warning); EditorGUILayout.PropertyField(settings.FindProperty("addsAndroidXCore")); DrawDetailLabel("Turn on this if you disabled `Adds Android Browser` and there is no other library adding 'androidx.core:core'."); var addingCore = settings.FindProperty("addsAndroidXCore").boolValue; if (addingCore) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("androidXCoreVersion"), GUILayout.Width(400)); DrawDetailLabel("If not specified, use the default version: " + UniWebViewEditorSettings.defaultAndroidXCoreVersion); EditorGUI.indentLevel--; } EditorGUILayout.EndVertical(); } EditorGUILayout.PropertyField(settings.FindProperty("enableJetifier")); DrawDetailLabel("Turn off this if you do not need Jetifier (for converting other legacy support dependencies to Android X)."); EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); // Auth callbacks EditorGUILayout.Space(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Auth Callbacks", EditorStyles.boldLabel); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(settings.FindProperty("authCallbackUrls"), true); DrawDetailLabel("Adds all available auth callback URLs here to use UniWebView's auth support."); EditorGUILayout.Space(); EditorGUILayout.PropertyField(settings.FindProperty("supportLINELogin")); DrawDetailLabel("LINE Login is using a custom fixed scheme. If you want to support LINE Login, turn on this."); EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); EditorGUI.indentLevel++; EditorGUILayout.HelpBox("Read the help page to know more about all UniWebView preferences detail.", MessageType.Info); var style = new GUIStyle(GUI.skin.label); style.normal.textColor = Color.blue; if (GUILayout.Button("Help Page", style)) { Application.OpenURL("https://docs.uniwebview.com/guide/installation.html#optional-steps"); } EditorGUILayout.Space(); EditorGUI.indentLevel--; EditorGUILayout.EndHorizontal(); if (EditorGUI.EndChangeCheck()) { settings.ApplyModifiedProperties(); AssetDatabase.SaveAssets(); } EditorGUIUtility.labelWidth = 0; } static void DrawDetailLabel(string text) { EditorGUI.indentLevel++; EditorGUILayout.LabelField(text, EditorStyles.miniLabel); EditorGUI.indentLevel--; } }