Skip to content

Commit

Permalink
perf: Add FileOpenPicker bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
ebariche committed May 10, 2023
1 parent 131d4f8 commit 2482244
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 6 deletions.
12 changes: 11 additions & 1 deletion src/Uno.UWP/Storage/Pickers/FileOpenPicker.Interop.wasm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> PickFilesAsync(bool multiple, bool showAll, string fileTypeMap, string id, string startIn);

[JSImport($"{JsType}.uploadPickFilesAsync")]
internal static partial Task<string> UploadPickFilesAsync(bool multiple, string targetFolder, string accept);
}
}
}
#endif
#endif
28 changes: 23 additions & 5 deletions src/Uno.UWP/Storage/Pickers/FileOpenPicker.wasm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,22 @@ 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;

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;
Expand Down Expand Up @@ -69,14 +75,20 @@ private async Task<FilePickerSelectedFilesArray> PickFilesAsync(bool multiple, C

private async Task<FilePickerSelectedFilesArray> 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<NativeStorageItemInfo[]>(nativeStorageItemInfosJson);

var results = new List<StorageFile>();
Expand Down Expand Up @@ -138,17 +150,23 @@ private NativeFilePickerAcceptType BuildNativeFilePickerAcceptType(string fileTy

private async Task<FilePickerSelectedFilesArray> 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
Expand Down

0 comments on commit 2482244

Please sign in to comment.