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); }); }
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"); } }); }
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); }); }
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"); }; }
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", "")); }
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 }); }
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); } }); }
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(); * } * });*/ }); }
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}); }
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; }
// 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); }); }); }); }
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; } }
/// <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)); }); }
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); }