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

@ -24,7 +24,8 @@ namespace Ooui
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"); iosUIViewControllerType = iosAssembly.GetType("UIKit.UIViewController");
iosUIApplicationType = iosAssembly.GetType("UIKit.UIApplication"); iosUIApplicationType = iosAssembly.GetType("UIKit.UIApplication");
iosUIWebViewType = iosAssembly.GetType("UIKit.UIWebView"); iosUIWebViewType = iosAssembly.GetType("UIKit.UIWebView");
@ -33,7 +34,8 @@ namespace Ooui
} }
asms.TryGetValue("Mono.Android", out androidAssembly); asms.TryGetValue("Mono.Android", out androidAssembly);
if (androidAssembly != null) { if (androidAssembly != null)
{
androidActivityType = androidAssembly.GetType("Android.App.Activity"); androidActivityType = androidAssembly.GetType("Android.App.Activity");
androidWebViewType = androidAssembly.GetType("Android.Webkit.WebView"); androidWebViewType = androidAssembly.GetType("Android.Webkit.WebView");
} }
@ -41,13 +43,16 @@ namespace Ooui
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) { else if (androidAssembly != null)
{
OpenBrowserOnAndroid(url, presenter); OpenBrowserOnAndroid(url, presenter);
} }
else { else
{
StartBrowserProcess(url); StartBrowserProcess(url);
} }
} }
@ -57,11 +62,13 @@ namespace Ooui
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));
} }
@ -80,23 +87,28 @@ namespace Ooui
// 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 app = iosUIApplicationType.GetProperty("SharedApplication").GetValue(null, null);
var window = iosUIApplicationType.GetProperty("KeyWindow").GetValue(app, null); var window = iosUIApplicationType.GetProperty("KeyWindow").GetValue(app, null);
if (window != null) { if (window != null)
{
var rvc = window.GetType().GetProperty("RootViewController").GetValue(window, null); var rvc = window.GetType().GetProperty("RootViewController").GetValue(window, null);
if (rvc != null) { if (rvc != null)
{
var pvc = rvc.GetType().GetProperty("PresentedViewController").GetValue(rvc, null); var pvc = rvc.GetType().GetProperty("PresentedViewController").GetValue(rvc, null);
presenterViewController = pvc ?? rvc; 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");
} }
@ -121,10 +133,12 @@ namespace Ooui
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) { else if (o != null)
{
t = o.GetType(); t = o.GetType();
} }
return t; return t;
@ -133,21 +147,34 @@ namespace Ooui
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) {
if (osv.Platform == PlatformID.Unix)
{
cmd = "open"; cmd = "open";
args = url; args = url;
} }
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 (); // var vs = Environment.GetEnvironmentVariables ();
// foreach (System.Collections.DictionaryEntry kv in vs) { // foreach (System.Collections.DictionaryEntry kv in vs) {
// System.Console.WriteLine($"K={kv.Key}, V={kv.Value}"); // System.Console.WriteLine($"K={kv.Key}, V={kv.Value}");
// } // }
// Console.WriteLine ($"Process.Start {cmd} {args}"); // Console.WriteLine ($"Process.Start {cmd} {args}");
return Process.Start(cmd, args); return Process.Start(cmd, args);
} }
} }
} }