using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using CefSharp; using CefSharp.Wpf; using Tango.Core.DI; using Tango.Core.Helpers; using Tango.Logging; using Tango.PPC.Browser.BoundsObjects; using Tango.PPC.Browser.ViewContracts; using Tango.PPC.Common.Helpers; using Tango.Touch.Keyboard; namespace Tango.PPC.Browser.Views { /// /// Interaction logic for MainView.xaml /// public partial class BrowserView : UserControl, IBrowserView { public event EventHandler AddressChanged; public static BrowserView Instance { get; set; } public BrowserView() { try { var settings = new CefSettings(); settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe"; settings.UserAgent = "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"; Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null); } catch (Exception ex) { LogManager.Default.Log(ex, "Error loading cef."); } InitializeComponent(); Instance = this; TangoIOC.Default.Register(this); Helpers.BoundObjectsHelper.RegisterAllBoundObjects(Browser, Dispatcher); KeyboardView.Default.KeyboardOpened += Default_KeyboardOpened; KeyboardView.Default.KeyboardClosed += Default_KeyboardClosed; var handler = new RequestHandlers.ChromiumRequestHandler(); handler.AddressChanged += Handler_AddressChanged; Browser.RequestHandler = handler; Browser.LoadError += Browser_LoadError; Browser.LoadingStateChanged += Browser_LoadingStateChanged; } private void Browser_LoadError(object sender, LoadErrorEventArgs e) { //if (e.ErrorCode == CefErrorCode.ConnectionTimedOut || e.ErrorCode == CefErrorCode.NameNotResolved) //{ InvokeUI(() => { runError.Text = e.ErrorText; gridError.Visibility = Visibility.Visible; }); //} } private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { if (!e.IsLoading) { InvokeUI(() => { KeyboardHelper.CloseKeyboard(); }); } else { InvokeUI(() => { gridError.Visibility = Visibility.Hidden; }); } } private void Handler_AddressChanged(object sender, string address) { InvokeUI(() => { AddressChanged?.Invoke(this, address); }); } private void Default_KeyboardClosed(object sender, EventArgs e) { Browser.VerticalAlignment = VerticalAlignment.Stretch; Browser.Height = double.NaN; } private void Default_KeyboardOpened(object sender, EventArgs e) { Browser.VerticalAlignment = VerticalAlignment.Top; Browser.Height = 780; } public bool CanGoBack() { return Browser.CanGoBack; } public void NavigateTo(string address) { if (Browser.Address != address) { String uri; if (ValidHttpURL(address, out uri)) { Browser.Address = uri; } else { Browser.Address = $"google.com/search?q={address.Replace(" ", "+")}"; } } else { Browser.Reload(); } } public static bool ValidHttpURL(string s, out string result) { if (Uri.IsWellFormedUriString(s, UriKind.Absolute)) { result = s; return true; } else if (s.StartsWith("www.")) { result = "http://" + s; return true; } result = s; return false; } public void GoBack() { if (Browser.CanGoBack) { Browser.Back(); } } private async void TxtAddress_GotFocus(object sender, RoutedEventArgs e) { KeyboardHelper.OpenKeyboard(KeyboardActionKeyMode.Go); await Task.Delay(100); txtAddress.SelectAll(); } private void TxtAddress_LostFocus(object sender, RoutedEventArgs e) { KeyboardHelper.CloseKeyboard(); } private void TxtAddress_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Return) { KeyboardHelper.CloseKeyboard(); NavigateTo(txtAddress.Text); } } private void TxtAddress_MouseUp(object sender, MouseButtonEventArgs e) { KeyboardHelper.OpenKeyboard(KeyboardActionKeyMode.Go); } private async void TxtAddress_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { KeyboardHelper.OpenKeyboard(KeyboardActionKeyMode.Go); await Task.Delay(100); txtAddress.SelectAll(); } private void InvokeUI(Action action) { Dispatcher.BeginInvoke(action); } } }