Added logic to launch Browser from Windows
This commit is contained in:
		
							parent
							
								
									de9102f38a
								
							
						
					
					
						commit
						b8e71c9c66
					
				
							
								
								
									
										267
									
								
								Ooui/Platform.cs
								
								
								
								
							
							
						
						
									
										267
									
								
								Ooui/Platform.cs
								
								
								
								
							| 
						 | 
				
			
			@ -7,147 +7,174 @@ namespace Ooui
 | 
			
		|||
{
 | 
			
		||||
    static class Platform
 | 
			
		||||
    {
 | 
			
		||||
		static readonly Assembly iosAssembly;
 | 
			
		||||
		static readonly Type iosUIViewControllerType;
 | 
			
		||||
		static readonly Type iosUIApplicationType;
 | 
			
		||||
		static readonly Type iosUIWebViewType;
 | 
			
		||||
		static readonly Type iosNSUrl;
 | 
			
		||||
		static readonly Type iosNSUrlRequest;
 | 
			
		||||
        static readonly Assembly iosAssembly;
 | 
			
		||||
        static readonly Type iosUIViewControllerType;
 | 
			
		||||
        static readonly Type iosUIApplicationType;
 | 
			
		||||
        static readonly Type iosUIWebViewType;
 | 
			
		||||
        static readonly Type iosNSUrl;
 | 
			
		||||
        static readonly Type iosNSUrlRequest;
 | 
			
		||||
 | 
			
		||||
		static readonly Assembly androidAssembly;
 | 
			
		||||
		static readonly Type androidActivityType;
 | 
			
		||||
		static readonly Type androidWebViewType;
 | 
			
		||||
        static readonly Assembly androidAssembly;
 | 
			
		||||
        static readonly Type androidActivityType;
 | 
			
		||||
        static readonly Type androidWebViewType;
 | 
			
		||||
 | 
			
		||||
		static Platform ()
 | 
			
		||||
		{
 | 
			
		||||
			var asms = AppDomain.CurrentDomain.GetAssemblies ().ToDictionary (
 | 
			
		||||
				x => x.GetName ().Name);
 | 
			
		||||
        static Platform()
 | 
			
		||||
        {
 | 
			
		||||
            var asms = AppDomain.CurrentDomain.GetAssemblies().ToDictionary(
 | 
			
		||||
                x => x.GetName().Name);
 | 
			
		||||
 | 
			
		||||
			asms.TryGetValue ("Xamarin.iOS", out iosAssembly);
 | 
			
		||||
			if (iosAssembly != null) {
 | 
			
		||||
				iosUIViewControllerType = iosAssembly.GetType ("UIKit.UIViewController");
 | 
			
		||||
				iosUIApplicationType = iosAssembly.GetType ("UIKit.UIApplication");
 | 
			
		||||
				iosUIWebViewType = iosAssembly.GetType ("UIKit.UIWebView");
 | 
			
		||||
				iosNSUrl = iosAssembly.GetType ("Foundation.NSUrl");
 | 
			
		||||
				iosNSUrlRequest = iosAssembly.GetType ("Foundation.NSUrlRequest");
 | 
			
		||||
			}
 | 
			
		||||
            asms.TryGetValue("Xamarin.iOS", out iosAssembly);
 | 
			
		||||
            if (iosAssembly != null)
 | 
			
		||||
            {
 | 
			
		||||
                iosUIViewControllerType = iosAssembly.GetType("UIKit.UIViewController");
 | 
			
		||||
                iosUIApplicationType = iosAssembly.GetType("UIKit.UIApplication");
 | 
			
		||||
                iosUIWebViewType = iosAssembly.GetType("UIKit.UIWebView");
 | 
			
		||||
                iosNSUrl = iosAssembly.GetType("Foundation.NSUrl");
 | 
			
		||||
                iosNSUrlRequest = iosAssembly.GetType("Foundation.NSUrlRequest");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			asms.TryGetValue ("Mono.Android", out androidAssembly);
 | 
			
		||||
			if (androidAssembly != null) {
 | 
			
		||||
				androidActivityType = androidAssembly.GetType ("Android.App.Activity");
 | 
			
		||||
				androidWebViewType = androidAssembly.GetType ("Android.Webkit.WebView");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
            asms.TryGetValue("Mono.Android", out androidAssembly);
 | 
			
		||||
            if (androidAssembly != null)
 | 
			
		||||
            {
 | 
			
		||||
                androidActivityType = androidAssembly.GetType("Android.App.Activity");
 | 
			
		||||
                androidWebViewType = androidAssembly.GetType("Android.Webkit.WebView");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		public static void OpenBrowser (string url, object presenter)
 | 
			
		||||
		{
 | 
			
		||||
			if (iosAssembly != null) {
 | 
			
		||||
				OpenBrowserOniOS (url, presenter);
 | 
			
		||||
			}
 | 
			
		||||
			else if (androidAssembly != null) {
 | 
			
		||||
				OpenBrowserOnAndroid (url, presenter);
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				StartBrowserProcess (url);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
        public static void OpenBrowser(string url, object presenter)
 | 
			
		||||
        {
 | 
			
		||||
            if (iosAssembly != null)
 | 
			
		||||
            {
 | 
			
		||||
                OpenBrowserOniOS(url, presenter);
 | 
			
		||||
            }
 | 
			
		||||
            else if (androidAssembly != null)
 | 
			
		||||
            {
 | 
			
		||||
                OpenBrowserOnAndroid(url, presenter);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                StartBrowserProcess(url);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		static void OpenBrowserOnAndroid (string url, object presenter)
 | 
			
		||||
		{
 | 
			
		||||
			var presenterType = GetObjectType (presenter);
 | 
			
		||||
        static void OpenBrowserOnAndroid(string url, object presenter)
 | 
			
		||||
        {
 | 
			
		||||
            var presenterType = GetObjectType(presenter);
 | 
			
		||||
 | 
			
		||||
			object presenterWebView = null;
 | 
			
		||||
			if (presenter != null && androidWebViewType.IsAssignableFrom (presenterType)) {
 | 
			
		||||
				presenterWebView = presenter;
 | 
			
		||||
			}
 | 
			
		||||
            object presenterWebView = null;
 | 
			
		||||
            if (presenter != null && androidWebViewType.IsAssignableFrom(presenterType))
 | 
			
		||||
            {
 | 
			
		||||
                presenterWebView = presenter;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			if (presenterWebView == null) {
 | 
			
		||||
				throw new ArgumentException ("Presenter must be a WebView", nameof(presenter));
 | 
			
		||||
			}
 | 
			
		||||
            if (presenterWebView == null)
 | 
			
		||||
            {
 | 
			
		||||
                throw new ArgumentException("Presenter must be a WebView", nameof(presenter));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			var m = androidWebViewType.GetMethod ("LoadUrl", BindingFlags.Public|BindingFlags.Instance, null, CallingConventions.Any, new Type[] { typeof(string) }, null);
 | 
			
		||||
			m.Invoke (presenterWebView, new object[] { url });
 | 
			
		||||
		}
 | 
			
		||||
            var m = androidWebViewType.GetMethod("LoadUrl", BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, new Type[] { typeof(string) }, null);
 | 
			
		||||
            m.Invoke(presenterWebView, new object[] { url });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		static void OpenBrowserOniOS (string url, object presenter)
 | 
			
		||||
		{
 | 
			
		||||
			var presenterType = GetObjectType (presenter);
 | 
			
		||||
        static void OpenBrowserOniOS(string url, object presenter)
 | 
			
		||||
        {
 | 
			
		||||
            var presenterType = GetObjectType(presenter);
 | 
			
		||||
 | 
			
		||||
			//
 | 
			
		||||
			// Find a presenter view controller
 | 
			
		||||
			// 1. Try the given presenter
 | 
			
		||||
			// 2. Find the key window vc
 | 
			
		||||
			// 3. Create a window?
 | 
			
		||||
			//
 | 
			
		||||
			object presenterViewController = null;
 | 
			
		||||
			if (presenter != null && iosUIViewControllerType.IsAssignableFrom (presenterType)) {
 | 
			
		||||
				presenterViewController = presenter;
 | 
			
		||||
			}
 | 
			
		||||
            //
 | 
			
		||||
            // Find a presenter view controller
 | 
			
		||||
            // 1. Try the given presenter
 | 
			
		||||
            // 2. Find the key window vc
 | 
			
		||||
            // 3. Create a window?
 | 
			
		||||
            //
 | 
			
		||||
            object presenterViewController = null;
 | 
			
		||||
            if (presenter != null && iosUIViewControllerType.IsAssignableFrom(presenterType))
 | 
			
		||||
            {
 | 
			
		||||
                presenterViewController = presenter;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			if (presenterViewController == null) {
 | 
			
		||||
				var app = iosUIApplicationType.GetProperty ("SharedApplication").GetValue (null, null);
 | 
			
		||||
				var window = iosUIApplicationType.GetProperty ("KeyWindow").GetValue (app, null);
 | 
			
		||||
				if (window != null) {
 | 
			
		||||
					var rvc = window.GetType ().GetProperty ("RootViewController").GetValue (window, null);
 | 
			
		||||
					if (rvc != null) {
 | 
			
		||||
						var pvc = rvc.GetType ().GetProperty ("PresentedViewController").GetValue (rvc, null);
 | 
			
		||||
						presenterViewController = pvc ?? rvc;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
            if (presenterViewController == null)
 | 
			
		||||
            {
 | 
			
		||||
                var app = iosUIApplicationType.GetProperty("SharedApplication").GetValue(null, null);
 | 
			
		||||
                var window = iosUIApplicationType.GetProperty("KeyWindow").GetValue(app, null);
 | 
			
		||||
                if (window != null)
 | 
			
		||||
                {
 | 
			
		||||
                    var rvc = window.GetType().GetProperty("RootViewController").GetValue(window, null);
 | 
			
		||||
                    if (rvc != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        var pvc = rvc.GetType().GetProperty("PresentedViewController").GetValue(rvc, null);
 | 
			
		||||
                        presenterViewController = pvc ?? rvc;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			if (presenterViewController == null) {
 | 
			
		||||
				throw new InvalidOperationException ("Cannot find a view controller from which to present");
 | 
			
		||||
			}
 | 
			
		||||
            if (presenterViewController == null)
 | 
			
		||||
            {
 | 
			
		||||
                throw new InvalidOperationException("Cannot find a view controller from which to present");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			//
 | 
			
		||||
			// Create the browser
 | 
			
		||||
			//
 | 
			
		||||
			var browserVC = Activator.CreateInstance (iosUIViewControllerType);
 | 
			
		||||
			var browserV = Activator.CreateInstance (iosUIWebViewType);
 | 
			
		||||
            //
 | 
			
		||||
            // Create the browser
 | 
			
		||||
            //
 | 
			
		||||
            var browserVC = Activator.CreateInstance(iosUIViewControllerType);
 | 
			
		||||
            var browserV = Activator.CreateInstance(iosUIWebViewType);
 | 
			
		||||
 | 
			
		||||
			var nsUrl = iosNSUrl.GetMethod ("FromString").Invoke (null, new object[] { url });
 | 
			
		||||
			var nsUrlRequest = iosNSUrlRequest.GetMethod ("FromUrl").Invoke (null, new object[] { nsUrl });
 | 
			
		||||
			iosUIWebViewType.GetMethod ("LoadRequest").Invoke (browserV, new object[] { nsUrlRequest });
 | 
			
		||||
			iosUIViewControllerType.GetProperty ("View").SetValue (browserVC, browserV, null);
 | 
			
		||||
            var nsUrl = iosNSUrl.GetMethod("FromString").Invoke(null, new object[] { url });
 | 
			
		||||
            var nsUrlRequest = iosNSUrlRequest.GetMethod("FromUrl").Invoke(null, new object[] { nsUrl });
 | 
			
		||||
            iosUIWebViewType.GetMethod("LoadRequest").Invoke(browserV, new object[] { nsUrlRequest });
 | 
			
		||||
            iosUIViewControllerType.GetProperty("View").SetValue(browserVC, browserV, null);
 | 
			
		||||
 | 
			
		||||
			var m = iosUIViewControllerType.GetMethod ("PresentViewController");
 | 
			
		||||
            var m = iosUIViewControllerType.GetMethod("PresentViewController");
 | 
			
		||||
 | 
			
		||||
			// Console.WriteLine (presenterViewController);
 | 
			
		||||
			// Console.WriteLine (browserVC);
 | 
			
		||||
			m.Invoke (presenterViewController, new object[] { browserVC, false, null });
 | 
			
		||||
		}
 | 
			
		||||
            // Console.WriteLine (presenterViewController);
 | 
			
		||||
            // Console.WriteLine (browserVC);
 | 
			
		||||
            m.Invoke(presenterViewController, new object[] { browserVC, false, null });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		static Type GetObjectType (object o)
 | 
			
		||||
		{
 | 
			
		||||
			var t = typeof (object);
 | 
			
		||||
			if (o is IReflectableType rt) {
 | 
			
		||||
				t = rt.GetTypeInfo ().AsType ();
 | 
			
		||||
			}
 | 
			
		||||
			else if (o != null) {
 | 
			
		||||
				t = o.GetType ();
 | 
			
		||||
			}
 | 
			
		||||
			return t;
 | 
			
		||||
		}
 | 
			
		||||
        static Type GetObjectType(object o)
 | 
			
		||||
        {
 | 
			
		||||
            var t = typeof(object);
 | 
			
		||||
            if (o is IReflectableType rt)
 | 
			
		||||
            {
 | 
			
		||||
                t = rt.GetTypeInfo().AsType();
 | 
			
		||||
            }
 | 
			
		||||
            else if (o != null)
 | 
			
		||||
            {
 | 
			
		||||
                t = o.GetType();
 | 
			
		||||
            }
 | 
			
		||||
            return t;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		static Process StartBrowserProcess (string url)
 | 
			
		||||
		{
 | 
			
		||||
			var cmd = url;
 | 
			
		||||
			var args = "";
 | 
			
		||||
        static Process StartBrowserProcess(string url)
 | 
			
		||||
        {
 | 
			
		||||
            var cmd = url;
 | 
			
		||||
            var args = string.Empty;
 | 
			
		||||
 | 
			
		||||
			var osv = Environment.OSVersion;
 | 
			
		||||
			if (osv.Platform == PlatformID.Unix) {
 | 
			
		||||
				cmd = "open";
 | 
			
		||||
				args = url;
 | 
			
		||||
			}
 | 
			
		||||
            var osv = Environment.OSVersion;
 | 
			
		||||
 | 
			
		||||
			// var vs = Environment.GetEnvironmentVariables ();
 | 
			
		||||
			// foreach (System.Collections.DictionaryEntry kv in vs) {
 | 
			
		||||
			//     System.Console.WriteLine($"K={kv.Key}, V={kv.Value}");
 | 
			
		||||
			// }
 | 
			
		||||
            if (osv.Platform == PlatformID.Unix)
 | 
			
		||||
            {
 | 
			
		||||
                cmd = "open";
 | 
			
		||||
                args = url;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
			// Console.WriteLine ($"Process.Start {cmd} {args}");
 | 
			
		||||
			return Process.Start (cmd, args);
 | 
			
		||||
		}
 | 
			
		||||
            var platform = (int)Environment.OSVersion.Platform;
 | 
			
		||||
            var isWindows = ((platform != 4) && (platform != 6) && (platform != 128));
 | 
			
		||||
 | 
			
		||||
            if (isWindows)
 | 
			
		||||
            {
 | 
			
		||||
                cmd = "explorer.exe";
 | 
			
		||||
                args = url;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // var vs = Environment.GetEnvironmentVariables ();
 | 
			
		||||
            // foreach (System.Collections.DictionaryEntry kv in vs) {
 | 
			
		||||
            //     System.Console.WriteLine($"K={kv.Key}, V={kv.Value}");
 | 
			
		||||
            // }
 | 
			
		||||
 | 
			
		||||
            // Console.WriteLine ($"Process.Start {cmd} {args}");
 | 
			
		||||
 | 
			
		||||
            return Process.Start(cmd, args);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue