From 2482244f4e55ba8aa0db3eca9842044364616a92 Mon Sep 17 00:00:00 2001 From: Elie Bariche <33458222+ebariche@users.noreply.github.com> Date: Tue, 9 May 2023 15:56:30 -0400 Subject: [PATCH] perf: Add FileOpenPicker bindings --- .../Pickers/FileOpenPicker.Interop.wasm.cs | 12 +++++++- .../Storage/Pickers/FileOpenPicker.wasm.cs | 28 +++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/Uno.UWP/Storage/Pickers/FileOpenPicker.Interop.wasm.cs b/src/Uno.UWP/Storage/Pickers/FileOpenPicker.Interop.wasm.cs index f8e1378c11e1..d9a1d431512b 100644 --- a/src/Uno.UWP/Storage/Pickers/FileOpenPicker.Interop.wasm.cs +++ b/src/Uno.UWP/Storage/Pickers/FileOpenPicker.Interop.wasm.cs @@ -8,7 +8,17 @@ internal partial class FileOpenPicker { internal static partial class NativeMethods { + private const string JsType = "globalThis.Windows.Storage.Pickers.FileOpenPicker"; + + [JSImport($"{JsType}.isNativeSupported")] + internal static partial bool IsNativeSupported(); + + [JSImport($"{JsType}.nativePickFilesAsync")] + internal static partial Task PickFilesAsync(bool multiple, bool showAll, string fileTypeMap, string id, string startIn); + + [JSImport($"{JsType}.uploadPickFilesAsync")] + internal static partial Task UploadPickFilesAsync(bool multiple, string targetFolder, string accept); } } } -#endif \ No newline at end of file +#endif diff --git a/src/Uno.UWP/Storage/Pickers/FileOpenPicker.wasm.cs b/src/Uno.UWP/Storage/Pickers/FileOpenPicker.wasm.cs index effb6d7bc0fe..c82ee574040a 100644 --- a/src/Uno.UWP/Storage/Pickers/FileOpenPicker.wasm.cs +++ b/src/Uno.UWP/Storage/Pickers/FileOpenPicker.wasm.cs @@ -21,7 +21,9 @@ namespace Windows.Storage.Pickers { public partial class FileOpenPicker { +#if !NET7_0_OR_GREATER private const string JsType = "Windows.Storage.Pickers.FileOpenPicker"; +#endif private static bool? _fileSystemAccessApiSupported; @@ -29,8 +31,12 @@ internal static bool IsNativePickerSupported() { if (_fileSystemAccessApiSupported is null) { +#if NET7_0_OR_GREATER + _fileSystemAccessApiSupported = NativeMethods.IsNativeSupported(); +#else var isSupportedString = WebAssemblyRuntime.InvokeJS($"{JsType}.isNativeSupported()"); _fileSystemAccessApiSupported = bool.TryParse(isSupportedString, out var isSupported) && isSupported; +#endif } return _fileSystemAccessApiSupported.Value; @@ -69,14 +75,20 @@ private async Task PickFilesAsync(bool multiple, C private async Task NativePickerPickFilesAsync(bool multiple, CancellationToken token) { - var showAllEntryParameter = FileTypeFilter.Contains("*") ? "true" : "false"; - var multipleParameter = multiple ? "true" : "false"; var fileTypeAcceptTypes = BuildFileTypesMap(); var fileTypeAcceptTypesJson = JsonHelper.Serialize(fileTypeAcceptTypes); + var startIn = SuggestedStartLocation.ToStartInDirectory(); + +#if NET7_0_OR_GREATER + var nativeStorageItemInfosJson = await NativeMethods.PickFilesAsync(multiple, FileTypeFilter.Contains("*"), fileTypeAcceptTypesJson, SettingsIdentifier, startIn); +#else + var multipleParameter = multiple ? "true" : "false"; + var showAllEntryParameter = FileTypeFilter.Contains("*") ? "true" : "false"; var fileTypeMapParameter = WebAssemblyRuntime.EscapeJs(fileTypeAcceptTypesJson); var id = WebAssemblyRuntime.EscapeJs(SettingsIdentifier); - var startIn = SuggestedStartLocation.ToStartInDirectory(); var nativeStorageItemInfosJson = await WebAssemblyRuntime.InvokeAsync($"{JsType}.nativePickFilesAsync({multipleParameter},{showAllEntryParameter},'{fileTypeMapParameter}','{id}','{startIn}')"); +#endif + var infos = JsonHelper.Deserialize(nativeStorageItemInfosJson); var results = new List(); @@ -138,17 +150,23 @@ private NativeFilePickerAcceptType BuildNativeFilePickerAcceptType(string fileTy private async Task UploadPickerPickFilesAsync(bool multiple, CancellationToken token) { - var multipleParameter = multiple ? "true" : "false"; - var acceptParameter = WebAssemblyRuntime.EscapeJs(BuildAcceptString()); var temporaryFolder = ApplicationData.Current.LocalCacheFolder; if (!Directory.Exists(temporaryFolder.Path)) { temporaryFolder.MakePersistent(); } var targetFolder = Directory.CreateDirectory(Path.Combine(temporaryFolder.Path, Guid.NewGuid().ToString())); + +#if NET7_0_OR_GREATER + var fileCountString = await NativeMethods.UploadPickFilesAsync(multiple, targetFolder.FullName, BuildAcceptString()); +#else + var multipleParameter = multiple ? "true" : "false"; var targetFolderParameter = WebAssemblyRuntime.EscapeJs(targetFolder.FullName); + var acceptParameter = WebAssemblyRuntime.EscapeJs(BuildAcceptString()); var jsUploadQuery = $"{JsType}.uploadPickFilesAsync({multipleParameter},'{targetFolderParameter}','{acceptParameter}')"; var fileCountString = await WebAssemblyRuntime.InvokeAsync(jsUploadQuery); +#endif + if (int.TryParse(fileCountString, out var fileCount)) { var files = targetFolder