コード例 #1
0
        public WebHybridSamplePage()
        {
            this.BackgroundColor = Color.White;
            var stack = new StackLayout {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };

            hwv = new HybridWebView {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };

            stack.Children.Add(hwv);
            this.Content = stack;

            hwv.RegisterCallback("dataCallback", t =>
                                 Device.BeginInvokeOnMainThread(() =>
            {
                this.DisplayAlert("Data callback", t, "OK");
            })
                                 );

            //hwv.RegisterNativeFunction("funcCallback", s => new object[] {"Func return data for " + s});

            hwv.RegisterCallback("sendObject", s =>
            {
                var serializer = Resolver.Resolve <IJsonSerializer>();

                var o = serializer.Deserialize <SendObject>(s);

                System.Diagnostics.Debug.WriteLine(o.X);
                System.Diagnostics.Debug.WriteLine(o.Y);
            });
        }
コード例 #2
0
        private void RegisterCallBacks()
        {
            hybrid.RegisterCallback("callNative",
                                    args =>
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    hybrid.CallJsFunction($"loadHtml", _html);
                    DisplayAlert("Alert", "Native", "cancel");
                });
            });

            hybrid.RegisterNativeFunction("callNativeFunc", args =>
            {
                Device.BeginInvokeOnMainThread(() => { DisplayAlert("Alert", "NativeFunc", "cancel"); });
                return(new object[] { args });
            });

            hybrid.RegisterCallback("invokeCSharpAction", s =>
            {
                var serializer = Resolver.Resolve <IJsonSerializer>();

                var o = serializer.Deserialize <List <SendObject> >(s);

                foreach (var context in o)
                {
                    DisplayAlert("Object", $"JavaScript sent x: {context.name}, y: {context.value}",
                                 "OK");
                }
            });
        }
コード例 #3
0
        public WebHybridSamplePage()
        {
            this.BackgroundColor = Color.White;
            var stack = new StackLayout { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand };
            hwv = new HybridWebView { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand };

            stack.Children.Add(hwv);
            this.Content = stack;

            hwv.RegisterCallback("dataCallback", t =>
                Device.BeginInvokeOnMainThread(() =>
                {
                    this.DisplayAlert("Data callback", t, "OK");
                })
            );

            //hwv.RegisterNativeFunction("funcCallback", s => new object[] {"Func return data for " + s});

            hwv.RegisterCallback("sendObject", s =>
            {
                var serializer = Resolver.Resolve<IJsonSerializer>();

                var o = serializer.Deserialize<SendObject>(s);

                System.Diagnostics.Debug.WriteLine(o.X);
                System.Diagnostics.Debug.WriteLine(o.Y);
            });
        }
コード例 #4
0
        public WebHybridTestPage()
        {
            var stack = new StackLayout {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };
            var hwv = new HybridWebView {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };

            stack.Children.Add(hwv);
            this.Content = stack;

            hwv.Uri = new Uri("http://test.padrose.co.uk/hvw/test1.html");

            hwv.RegisterCallback("dataCallback", t =>
                                 Device.BeginInvokeOnMainThread(() =>
            {
                /**********************************/
                //THIS WILL WORK FOR PAGE 1 ONLY
                /*********************************/
                System.Diagnostics.Debug.WriteLine("!!!!!!!!!!!!!!!!! dataCallback: " + t);
            })
                                 );

            hwv.LoadFinished += (s, e) =>
            {
                /***********************************/
                //THIS WILL WORK FOR PAGE 1 ONLY
                //WEAK REFERENCE LOST???
                /***********************************/
                System.Diagnostics.Debug.WriteLine("(!!!!!!!!!!!!!!!!!!!! LoadFinished");
            };
        }
コード例 #5
0
        void PageDataLoaded()
        {
            if (_hybridWebView == null)
            {
                _hybridWebView = new HybridWebView(new JsonNetJsonSerializer());
                _hybridWebView.HorizontalOptions = LayoutOptions.FillAndExpand;
                _hybridWebView.VerticalOptions   = LayoutOptions.FillAndExpand;
                _hybridWebView.RegisterCallback("EditVisible", (data) => {
                    PageModel.EditVisible.Execute(data);
                });
                _hybridWebView.RegisterNativeFunction("GetGraphData", (input) => {
                    return(PageModel.GetGraphData(input));
                });

                _hybridWebView.LoadFinished += (s, e) => {
                    string data = JsonConvert.SerializeObject(PageModel.GraphData).Replace("\r\n", "");
                    _hybridWebView.InjectJavaScript("JellyBeanTrackerApp.buildChartStr('" + data + "');");
                };
                Content = _hybridWebView;
            }

            var profitReportRazorView = new JellyBeanGraph(); // { Model = PageModel.GraphData };
            var html = profitReportRazorView.GenerateString();

            _hybridWebView.LoadContent(html.Replace("\r\n", ""));
        }
コード例 #6
0
        public WebHybridSamplePage()
        {
            this.BackgroundColor = Color.White;
            var stack = new StackLayout {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };

            hwv = new HybridWebView {
                VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand
            };

            stack.Children.Add(hwv);
            this.Content = stack;

            hwv.Uri = new Uri("http://test.padrose.co.uk/hvw/test1.html");

            hwv.RegisterCallback("dataCallback", t =>
                                 Device.BeginInvokeOnMainThread(() =>
            {
                this.DisplayAlert("Data callback", t, "OK");
            })
                                 );

            hwv.RegisterNativeFunction("funcCallback", s => new object[] { "Func return data for " + s });
        }
コード例 #7
0
        private void RegisterCallback <T> (string jsCallbackName) where T : class
        {
            //create object to control lock and keep the reference to the user callback function
            AddFuncCallingControl <T> ();

            //register a c# callback (lambda above) to bring to us the javascript result
            _hybridWebView.RegisterCallback(jsCallbackName, json =>
            {
                T result = null;
                try {
                    result = _serializer.Deserialize <T>(json);
                }
                catch (Exception e) {
                    Monitor.Exit(GetFuncCallingControl <T>()._lock);
                    throw new Exception(string.Format("EtherifyServiceProviderJsImpl raised an error when deserializing the result from javascript {0} function.", jsCallbackName), e);
                }

                if (result == null)
                {
                    throw new Exception(string.Format("EtherifyServiceProviderJsImpl: javascript function {0} returned null value.", jsCallbackName));
                }

                if (GetFuncCallingControl <T>()._callback != null)
                {
                    GetFuncCallingControl <T>()._callback(result);
                }
            });
        }
コード例 #8
0
        private void RegisterCallBacks()
        {
            /*_hybrid.RegisterCallback("loginApp",
             *  args =>
             *  {
             *      Device.BeginInvokeOnMainThread(async () =>
             *      {
             *          var data = args;
             *          var login = JsonConvert.DeserializeObject<LoginVM>(data);
             *          if (login.UserName == "test" && login.Password == "test")
             *          {
             *              Navigation.PushAsync(new Page1());
             *          }
             *      });
             *      //var dataUnits = data.Split('&');
             *      //var context = new Dictionary<string, string>();
             *      //foreach (var dUnit in dataUnits)
             *      //    context.Add(dUnit.Split('=')[0], dUnit.Split('=')[1]);
             *      //var uiDoc = new UIDoc();
             *      //var html = uiDoc.Render(context);
             *
             *      //Device.BeginInvokeOnMainThread(() => { _hybrid.CallJsFunction("invokeFromCS", html); });
             *      // Device.BeginInvokeOnMainThread(() => { DisplayAlert("Alert", "Native", "cancel"); }); });
             *  });*/


            _hybrid.RegisterCallback("loginApp",
                                     args =>
            {
                var data  = args;
                var login = JsonConvert.DeserializeObject <LoginVM>(data);

                if (login.UserName == "test" && login.Password == "test")
                {
                    //await Navigation.PushAsync(new Page1());
                    Navigation.PushAsync(new Page1());
                }

                /*Device.BeginInvokeOnMainThread(async () =>
                 * {
                 *  var data = args;
                 *  var login = JsonConvert.DeserializeObject<LoginVM>(data);
                 *
                 *  if (login.UserName == "test" && login.Password == "test")
                 *  {
                 *      await Navigate();
                 *  }
                 * });*/
            });
        }
コード例 #9
0
        public WebHybridSamplePage()
        {
            this.BackgroundColor = Color.White;
            var stack = new StackLayout { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand };
            hwv = new HybridWebView { VerticalOptions = LayoutOptions.FillAndExpand, HorizontalOptions = LayoutOptions.FillAndExpand };

            stack.Children.Add(hwv);
            this.Content = stack;

            hwv.Uri = new Uri("http://test.padrose.co.uk/hvw/test1.html");

            hwv.RegisterCallback("dataCallback", t =>
                Device.BeginInvokeOnMainThread(() =>
                {
                    this.DisplayAlert("Data callback", t, "OK");
                })
            );

            hwv.RegisterNativeFunction("funcCallback", s => new object[] {"Func return data for " + s});
        }
コード例 #10
0
        public XamarinFormsWebViewSamplePage()
        {
            InitializeComponent();

            var serializer = new JsonSerializer();
            var webView    = new HybridWebView(serializer)
            {
                VerticalOptions = LayoutOptions.FillAndExpand,
                Margin          = new Thickness(20, 30),
                Uri             = new Uri(WebViewUrl)
            };

            webView.RegisterCallback(LoginCallback, (arg) =>
            {
                var loginForm = serializer.Deserialize <LoginFormDto>(arg);
                var result    = loginForm.Username == Username;
                webView.CallJsFunction(DisplayLoginAlertFunctioName, new[] { result.ToString() });
            });

            Content = webView;
        }
コード例 #11
0
        // I'm so insanely mad that I need to even do this…. The problem is that the Android
        // renderer for the HybridWebView does not marshal back to the UI thread when the
        // native function is complete at that causes Android to fail on Lollipop+. Since building
        // my own version of HybridWebView is insanely hard and subclassing the existing one is
        // impossible, we have our *2 version of this method which works the same way but puts
        // the callback onto the right flippin thread!
        public static void RegisterNativeFunction_Custom(this HybridWebView hybridWebView, string name, Func <string, object[]> func)
        {
            hybridWebView.RegisterCallback(name, (s) =>
            {
                // Get the appended callback ID
                var index      = s.LastIndexOf('!');
                var callbackId = s.Substring(index + 1);
                s = s.Substring(0, index);

                Task.Run(() =>
                {
                    // Run the native function
                    var args = func(s);

                    // The magic that was missing from the original...
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        hybridWebView.CallJsFunction("nativeFuncs2[" + callbackId + "]", args);
                    });
                });
            });
        }
コード例 #12
0
        public HybridWebPageView(HybridWebViewModel viewModel, object razorPageInstanceOrUrl)
        {
            if (razorPageInstanceOrUrl == null)
            {
                throw new ArgumentNullException("razorPageInstance", "An instance of a Razor Page is needed");
            }

            var appSettings        = Resolver.Resolve <IAppSettings> ();
            var content            = string.Empty;
            var isWebPortalRequest = false;
            var loader             = Resolver.Resolve <IProgressDialog> ();

            loader.Title = "Loading Page...";
            loader.Show();
            try
            {
                var pageType = razorPageInstanceOrUrl.GetType();
                if (pageType != typeof(System.String))
                {
                    pageType.GetRuntimeProperty("Model").SetValue(razorPageInstanceOrUrl, viewModel);
                    MethodInfo info = pageType.GetRuntimeMethod("GenerateString", new Type[] { });
                    content = (string)info.Invoke(razorPageInstanceOrUrl, null);
                }
                else
                {
                    content            = razorPageInstanceOrUrl.ToString();
                    isWebPortalRequest = true;
                }
            } catch
            {
                ViewHasErrors = true;
                loader.Hide();
                return;
            }
            var stack = new StackLayout {
                VerticalOptions   = LayoutOptions.FillAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            var hwv = new HybridWebView {
                VerticalOptions   = LayoutOptions.FillAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            hwv.LoadFinished += (object sender, EventArgs e) =>
            {
                loader.Hide();
            };

            if (viewModel.NativeCallbacks.Count > 0)
            {
                foreach (KeyValuePair <string, Action <string> > pair in viewModel.NativeCallbacks)
                {
                    hwv.RegisterCallback(pair.Key, t => Device.BeginInvokeOnMainThread(() =>
                    {
                        pair.Value(t);
                    }));
                }
            }

            if (viewModel.ShowHeader)
            {
                var header = new FormHeaderBar();
                header.Text                = viewModel.Title;
                header.HasCloseButton      = true;
                header.CloseButtonClicked += async(object sender, EventArgs e) =>
                {
                    await Navigation.PopModalAsync();
                };
                stack.Children.Add(header);
            }
            stack.Children.Add(hwv);
            this.Content = stack;


            if (!isWebPortalRequest)
            {
                hwv.Source = new HtmlWebViewSource()
                {
                    Html = content
                };
            }
            else
            {
                var uri    = new Uri(string.Format("{0}{1}", appSettings.WebPortalHost, content));
                var qsColl = HttpUtility.ParseQueryString(uri.Query);
                qsColl.Add("mobilerequest_auth_token", App.MobileSession.AuthToken);
                var qs      = HttpUtility.GenerateQueryString(qsColl);
                var request = new UriBuilder(uri.Scheme, uri.Host, uri.Port, uri.AbsolutePath, qs).Uri;

                                #if DEBUG
                Debug.WriteLine("Hybrid Request Uri:" + request.ToString());
                                #endif
                hwv.Uri = request;
            }
        }
コード例 #13
0
        /// <summary>
        /// Register all callbacks from web page javascript
        /// </summary>
        private void RegisterCallbacks()
        {
            // Callback for injecting base script
            _webview.RegisterCallback("injectScriptCallback", (userGuid) => {
                Device.BeginInvokeOnMainThread(() => {
                    _webview.InjectJavaScript(ScriptHelper.Scripts);
                });
            });

            // Callback for registration to Azure Notification Hub
            _webview.RegisterCallback("registerForNotificationsCallback", (userGuid) => {
                var guid           = CrossSettings.Current.Get <string>("userguid");
                var shouldRegister = CrossSettings.Current.Get <bool>("shouldRegisterToNotificationHub");

                if (guid != userGuid || shouldRegister)
                {
                    //Register with Azure notification hub
                    CrossSettings.Current.Set <string>("userguid", userGuid);
                    CrossSettings.Current.Set <bool>("shouldRegisterToNotificationHub", false);

                    Task.Run(() => {
                        DependencyService.Get <INotificationService>().Register(userGuid);
                    });
                }
            });

            //Callback from sign out script
            _webview.RegisterCallback("signOutCallback", (args) => {
                //Sign out
                CrossSettings.Current.Remove("userguid");
                CrossSettings.Current.Remove("theme");
            });

            //Callback from change site script
            _webview.RegisterCallback("changeSiteCallback", (args) => {
                CrossSettings.Current.Remove("userguid");
                CrossSettings.Current.Remove("url");
                CrossSettings.Current.Remove("theme");

                SelectSite();
            });

            //Callback for badge change
            _webview.RegisterCallback("badgeCallback", (args) => {
                //Set badge
                var badge = int.Parse(args);

                Task.Run(() => {
                    DependencyService.Get <IApplicationBadge>().SetBadge(badge);
                });
            });

            // callback for theming
            _webview.RegisterCallback("themeCallback", (color) => {
                var themeColor = CrossSettings.Current.Get <string>("themecolor");

                // update theme color if different
                if (color != themeColor)
                {
                    SetThemeColor(color);
                }
            });

            //Callback from external links script
            _webview.RegisterCallback("handleLinksCallback", (args) => {
                Device.OpenUri(new Uri(args));
            });
        }
コード例 #14
0
        public void AttachViewer()
        {
            gridContainer.Children.Clear();
            var loggedUser  = App.Database.GetLoggedUser().Result;
            var lastHistory = App.Database.GetLastHistory().Result;

            if (lastHistory != null)
            {
                WebViewUrl = lastHistory.url;
            }
            webView = new HybridWebView(serializer)
            {
                VerticalOptions   = LayoutOptions.FillAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand,
                Margin            = new Thickness(0, 0),
                Uri = new Uri(WebViewUrl)
            };

            webView.LoadFinished += LoadFinished;


            webView.RegisterCallback(LoginCallback, (arg) =>
            {
                //var loginForm = serializer.Deserialize<LoginFormDto>(arg);
                //var result = loginForm.Username == Username;
                //try
                //{
                //    // await Task.Run(() => Device.BeginInvokeOnMainThread(() => Play_Animation()));
                //    Device.BeginInvokeOnMainThread(()=> webView.CallJsFunction(DisplayLoginAlertFunctioName, new[] { result.ToString() }));
                //  //  webView.CallJsFunction(DisplayLoginAlertFunctioName, new[] { result.ToString() });
                //}
                //catch(Exception ex)
                //{

                //}

                var str = arg; //serializer.Deserialize<string>(arg);
            });

            //webView.RegisterCallback(LoginCallback, (arg) =>
            //{
            //    //var loginForm = serializer.Deserialize<LoginFormDto>(arg);
            //    //var result = loginForm.Username == Username;
            //    //try
            //    //{
            //    //    // await Task.Run(() => Device.BeginInvokeOnMainThread(() => Play_Animation()));
            //    //    Device.BeginInvokeOnMainThread(()=> webView.CallJsFunction(DisplayLoginAlertFunctioName, new[] { result.ToString() }));
            //    //  //  webView.CallJsFunction(DisplayLoginAlertFunctioName, new[] { result.ToString() });
            //    //}
            //    //catch(Exception ex)
            //    //{

            //    //}

            //    var str = arg; //serializer.Deserialize<string>(arg);


            //});

            webView.RegisterCallback("exportLoginData", async(arg) =>
            {
                var data = serializer.Deserialize <MobilePocketCore.Model.LoggedUser>(arg);

                var id = await App.Database.SaveLoggedUserAsync(data);
            });
            webView.RegisterCallback("exportLogoutData", async(arg) =>
            {
                var data = arg;
                var id   = await App.Database.DeleteLoggedUserAsync();
            });
            webView.RegisterCallback("exportCurrentUrl", async(arg) =>
            {
                var data = arg;
                await App.Database.SaveHistoryAsync(new MobilePocketCore.Model.UrlHistory()
                {
                    date = DateTime.Now,
                    url  = arg,
                });
            });
            //Content = webView;
            gridContainer.Children.Add(webView);
        }