Added logic to launch Browser from Windows

This commit is contained in:
Javier Suárez Ruiz 2017-11-16 08:43:01 +01:00
parent de9102f38a
commit b8e71c9c66
1 changed files with 147 additions and 120 deletions

View File

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