From 2e8bfff4b6383202fb8478c435e742ed60ccfc1e Mon Sep 17 00:00:00 2001 From: Enguerrand_ARMINJON_MAC_2 Date: Tue, 14 Jan 2025 14:03:08 +0100 Subject: [PATCH] feat-add-mime-type --- .../plugin/filepicker/FilePickerDelegate.java | 6 ++++-- .../plugin/filepicker/FilePickerPlugin.java | 3 ++- lib/src/file_picker.dart | 4 ++++ lib/src/file_picker_io.dart | 20 +++++++++++-------- lib/src/file_picker_macos.dart | 1 + lib/src/linux/file_picker_linux.dart | 1 + lib/src/windows/file_picker_windows.dart | 1 + 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerDelegate.java b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerDelegate.java index f98a5549..f405cb6f 100644 --- a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerDelegate.java +++ b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerDelegate.java @@ -290,7 +290,7 @@ public void startFileExplorer(final String type, final boolean isMultipleSelecti } @RequiresApi(api = Build.VERSION_CODES.KITKAT) - public void saveFile(String fileName, String type, String initialDirectory, String[] allowedExtensions, byte[] bytes, MethodChannel.Result result) { + public void saveFile(String fileName, String type, String mimeType, String initialDirectory, String[] allowedExtensions, byte[] bytes, MethodChannel.Result result) { if (!this.setPendingMethodCallAndResult(result)) { finishWithAlreadyActiveError(result); return; @@ -301,7 +301,9 @@ public void saveFile(String fileName, String type, String initialDirectory, Stri intent.putExtra(Intent.EXTRA_TITLE, fileName); } this.bytes = bytes; - if (type != null && !"dir".equals(type) && type.split(",").length == 1) { + if (mimeType != null) { + intent.setType(mimeType); + } else if (type != null && !"dir".equals(type) && type.split(",").length == 1) { intent.setType(type); } else { intent.setType("*/*"); diff --git a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java index 8444b841..5e33c5c3 100644 --- a/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java +++ b/android/src/main/java/com/mr/flutter/plugin/filepicker/FilePickerPlugin.java @@ -135,10 +135,11 @@ public void onMethodCall(final MethodCall call, final MethodChannel.Result rawRe if (call.method != null && call.method.equals("save")) { String fileName = (String) arguments.get("fileName"); String type = resolveType((String) arguments.get("fileType")); + String mimeType = (String) arguments.get("mimeType"); String initialDirectory = (String) arguments.get("initialDirectory"); String[] allowedExtensions = FileUtils.getMimeTypes((ArrayList) arguments.get("allowedExtensions")); byte[] bytes = (byte[]) arguments.get("bytes"); - this.delegate.saveFile(fileName, type, initialDirectory, allowedExtensions, bytes,result); + this.delegate.saveFile(fileName, type, mimeType, initialDirectory, allowedExtensions, bytes,result); return; } diff --git a/lib/src/file_picker.dart b/lib/src/file_picker.dart index dc03e7ab..7bc5077a 100644 --- a/lib/src/file_picker.dart +++ b/lib/src/file_picker.dart @@ -162,6 +162,9 @@ abstract class FilePicker extends PlatformInterface { /// stay in front of the Flutter window until it is closed (like a modal /// window). This parameter works only on Windows desktop. /// + /// [mimeType] can be optionally set to provide a mime type for the file. + /// It only work for iOS and Android. + /// /// Returns `null` if aborted. Returns a [Future] which resolves to /// the absolute path of the selected file, if the user selected a file. Future saveFile({ @@ -172,6 +175,7 @@ abstract class FilePicker extends PlatformInterface { List? allowedExtensions, Uint8List? bytes, bool lockParentWindow = false, + String? mimeType, }) async => throw UnimplementedError('saveFile() has not been implemented.'); } diff --git a/lib/src/file_picker_io.dart b/lib/src/file_picker_io.dart index 30b51909..c39287ea 100644 --- a/lib/src/file_picker_io.dart +++ b/lib/src/file_picker_io.dart @@ -137,17 +137,20 @@ class FilePickerIO extends FilePicker { } @override - Future saveFile( - {String? dialogTitle, - String? fileName, - String? initialDirectory, - FileType type = FileType.any, - List? allowedExtensions, - Uint8List? bytes, - bool lockParentWindow = false}) { + Future saveFile({ + String? dialogTitle, + String? fileName, + String? initialDirectory, + FileType type = FileType.any, + List? allowedExtensions, + Uint8List? bytes, + bool lockParentWindow = false, + String? mimeType, + }) { if (Platform.isIOS || Platform.isAndroid) { return _channel.invokeMethod("save", { "fileName": fileName, + "mimeType": mimeType, "fileType": type.name, "initialDirectory": initialDirectory, "allowedExtensions": allowedExtensions, @@ -162,6 +165,7 @@ class FilePickerIO extends FilePicker { allowedExtensions: allowedExtensions, bytes: bytes, lockParentWindow: lockParentWindow, + mimeType: mimeType, ); } } diff --git a/lib/src/file_picker_macos.dart b/lib/src/file_picker_macos.dart index 97da8827..94242ba0 100644 --- a/lib/src/file_picker_macos.dart +++ b/lib/src/file_picker_macos.dart @@ -89,6 +89,7 @@ class FilePickerMacOS extends FilePicker { List? allowedExtensions, Uint8List? bytes, bool lockParentWindow = false, + String? mimeType, }) async { final String executable = await isExecutableOnPath('osascript'); final String fileFilter = fileTypeToFileFilter( diff --git a/lib/src/linux/file_picker_linux.dart b/lib/src/linux/file_picker_linux.dart index 0efe4b23..0076ea19 100644 --- a/lib/src/linux/file_picker_linux.dart +++ b/lib/src/linux/file_picker_linux.dart @@ -87,6 +87,7 @@ class FilePickerLinux extends FilePicker { List? allowedExtensions, Uint8List? bytes, bool lockParentWindow = false, + String? mimeType, }) async { final executable = await _getPathToExecutable(); final dialogHandler = DialogHandler(executable); diff --git a/lib/src/windows/file_picker_windows.dart b/lib/src/windows/file_picker_windows.dart index 2d19c916..6d7b7e02 100644 --- a/lib/src/windows/file_picker_windows.dart +++ b/lib/src/windows/file_picker_windows.dart @@ -172,6 +172,7 @@ class FilePickerWindows extends FilePicker { List? allowedExtensions, Uint8List? bytes, bool lockParentWindow = false, + String? mimeType, }) async { final port = ReceivePort(); await Isolate.spawn(