using Android.Content; using Android.Webkit; using Microsoft.Maui.Controls; using Microsoft.Maui.Handlers; using Microsoft.Maui.Platform; using System; using System.Threading.Tasks; using Android.Views; using Xamarin.Forms.Clinical6.UI.Controls; namespace MAUI.Clinical6.Platforms.Android.Renders { public class LocalHtmlWebViewerHandler : ViewHandler { private ExtendedWebViewClient _webDelegate; public static IPropertyMapper Mapper = new PropertyMapper(ViewHandler.ViewMapper) { [nameof(LocalHtmlWebViewer.Html)] = MapHtml }; public LocalHtmlWebViewerHandler() : base(Mapper) { } protected override global::Android.Webkit.WebView CreatePlatformView() { var webView = new global::Android.Webkit.WebView(Context); webView.Settings.JavaScriptEnabled = true; webView.LayoutParameters = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent ); return webView; } protected override void ConnectHandler(global::Android.Webkit.WebView platformView) { base.ConnectHandler(platformView); LoadHtml(); } private static void MapHtml(LocalHtmlWebViewerHandler handler, LocalHtmlWebViewer view) { handler?.LoadHtml(); } private void LoadHtml() { if (VirtualView == null || PlatformView == null) return; if (string.IsNullOrWhiteSpace(VirtualView.Html)) { VirtualView.IsVisible = false; return; } VirtualView.IsVisible = true; var htmlSource = new HtmlWebViewSource { Html = VirtualView.Html }; VirtualView.Source = htmlSource; _webDelegate = new ExtendedWebViewClient(VirtualView); PlatformView.SetWebViewClient(_webDelegate); PlatformView.LoadDataWithBaseURL(null, VirtualView.Html, "text/html", "UTF-8", null); } } internal class ExtendedWebViewClient : WebViewClient { private readonly LocalHtmlWebViewer _control; private readonly double _mainDisplayHeight; public ExtendedWebViewClient(LocalHtmlWebViewer control) { _control = control; var mainDisplayInfo = DeviceDisplay.Current.MainDisplayInfo; _mainDisplayHeight = mainDisplayInfo.Height / mainDisplayInfo.Density; } public override async void OnPageFinished(global::Android.Webkit.WebView view, string url) { if (_control != null) { int i = 10; try { while (view?.ContentHeight == 0 && i-- > 0) { await Task.Delay(100); } } catch { } try { var contentHeight = view.ContentHeight / view.Scale; if (contentHeight > (_mainDisplayHeight - (_mainDisplayHeight * 0.25))) { if (contentHeight > (_mainDisplayHeight - (_mainDisplayHeight * 0.35))) { _control.HeightRequest = _mainDisplayHeight - (_mainDisplayHeight * 0.35); } else { _control.HeightRequest = _mainDisplayHeight - (_mainDisplayHeight * 0.25); } } else { _control.HeightRequest = contentHeight; } } catch (Exception ex) { Console.WriteLine(ex); } } base.OnPageFinished(view, url); } } }