Merge branch 'feature/maui-migration' into feature/maui-migration-passkeys

This commit is contained in:
Federico Maccaroni
2024-02-08 12:33:16 -03:00
14 changed files with 59 additions and 35 deletions

View File

@@ -1,25 +0,0 @@
#if IOS || MACCATALYST
using PlatformView = WebKit.WKWebView;
#elif ANDROID
using PlatformView = Android.Webkit.WebView;
#elif (NETSTANDARD || !PLATFORM) || (NET6_0_OR_GREATER && !IOS && !ANDROID)
using PlatformView = System.Object;
#endif
using Bit.App.Controls;
using Microsoft.Maui.Handlers;
namespace Bit.App.Handlers
{
public partial class HybridWebViewHandler
{
public static PropertyMapper<HybridWebView, HybridWebViewHandler> PropertyMapper = new PropertyMapper<HybridWebView, HybridWebViewHandler>(ViewHandler.ViewMapper)
{
[nameof(HybridWebView.Uri)] = MapUri
};
public HybridWebViewHandler() : base(PropertyMapper)
{
}
}
}

View File

@@ -13,7 +13,6 @@
},
handlers =>
{
handlers.AddHandler(typeof(Bit.App.Controls.HybridWebView), typeof(Bit.App.Handlers.HybridWebViewHandler));
#if ANDROID
Bit.App.Handlers.EntryHandlerMappings.Setup();
Bit.App.Handlers.EditorHandlerMappings.Setup();
@@ -28,6 +27,7 @@
Bit.App.Handlers.ButtonHandlerMappings.Setup();
Bit.App.Handlers.ToolbarHandlerMappings.Setup();
handlers.AddHandler(typeof(Bit.App.Controls.HybridWebView), typeof(Bit.App.Handlers.HybridWebViewHandler));
handlers.AddHandler(typeof(Bit.App.Pages.TabsPage), typeof(Bit.App.Handlers.CustomTabbedPageHandler));
handlers.AddHandler(typeof(Bit.App.Controls.ExtendedDatePicker), typeof(Bit.App.Handlers.ExtendedDatePickerHandler));
#else

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.2.0" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.2.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />

View File

@@ -6,10 +6,19 @@ using AWebkit = Android.Webkit;
namespace Bit.App.Handlers
{
public partial class HybridWebViewHandler : ViewHandler<HybridWebView, AWebkit.WebView>
public class HybridWebViewHandler : ViewHandler<HybridWebView, AWebkit.WebView>
{
private const string JSFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}";
public static PropertyMapper<HybridWebView, HybridWebViewHandler> PropertyMapper = new PropertyMapper<HybridWebView, HybridWebViewHandler>(ViewHandler.ViewMapper)
{
[nameof(HybridWebView.Uri)] = MapUri
};
public HybridWebViewHandler() : base(PropertyMapper)
{
}
public HybridWebViewHandler([NotNull] IPropertyMapper mapper, CommandMapper commandMapper = null) : base(mapper, commandMapper)
{
}

View File

@@ -1,84 +0,0 @@
using System.Diagnostics.CodeAnalysis;
using Bit.App.Controls;
using CoreGraphics;
using Foundation;
using Microsoft.Maui.Handlers;
using WebKit;
namespace Bit.App.Handlers
{
public partial class HybridWebViewHandler : ViewHandler<HybridWebView, WebKit.WKWebView>
{
private const string JSFunction =
"function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
private WKUserContentController _userController;
public HybridWebViewHandler([NotNull] IPropertyMapper mapper, CommandMapper commandMapper = null) : base(mapper, commandMapper)
{
}
protected override WKWebView CreatePlatformView()
{
_userController = new WKUserContentController();
var script = new WKUserScript(new NSString(JSFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
_userController.AddUserScript(script);
_userController.AddScriptMessageHandler(new WebViewScriptMessageHandler(InvokeAction), "invokeAction");
var config = new WKWebViewConfiguration { UserContentController = _userController };
var webView = new WKWebView(CGRect.Empty, config);
return webView;
}
public static void MapUri(HybridWebViewHandler handler, HybridWebView view)
{
if (handler != null && view?.Uri != null)
{
handler?.PlatformView?.LoadRequest(new NSUrlRequest(new NSUrl(view.Uri)));
}
}
protected override void ConnectHandler(WKWebView platformView)
{
if (VirtualView?.Uri != null)
{
platformView?.LoadRequest(new NSUrlRequest(new NSUrl(VirtualView?.Uri)));
}
base.ConnectHandler(platformView);
}
protected override void DisconnectHandler(WKWebView platformView)
{
_userController.RemoveAllUserScripts();
_userController.RemoveScriptMessageHandler("invokeAction");
platformView?.Dispose();
VirtualView?.Cleanup();
_userController = null;
base.DisconnectHandler(platformView);
}
private void InvokeAction(WKScriptMessage message)
{
if(message?.Body != null)
{
VirtualView?.InvokeAction(message.Body.ToString());
}
}
}
public class WebViewScriptMessageHandler : NSObject, IWKScriptMessageHandler
{
private Action<WKScriptMessage> _messageReceivedAction;
public WebViewScriptMessageHandler(Action<WKScriptMessage> messageReceivedAction)
{
_messageReceivedAction = messageReceivedAction ?? throw new ArgumentNullException(nameof(messageReceivedAction));
}
public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
{
_messageReceivedAction(message);
}
}
}

View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key>
<string>com.8bit.bitwarden</string>
<key>CFBundleShortVersionString</key>
<string>2024.2.0</string>
<string>2024.2.1</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleIconName</key>