diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart index 183fb753f..97978ce02 100644 --- a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -3,10 +3,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter_file_dialog/flutter_file_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:universal_html/html.dart' as html; @@ -15,8 +15,8 @@ import 'package:fluffychat/utils/size_string.dart'; extension MatrixFileExtension on MatrixFile { void save(BuildContext context) async { - if (PlatformInfos.isIOS) { - return share(context); + if (PlatformInfos.isIOS || PlatformInfos.isAndroid) { + _mobileDownload(context); } if (PlatformInfos.isWeb) { @@ -24,13 +24,11 @@ extension MatrixFileExtension on MatrixFile { return; } - final downloadPath = PlatformInfos.isAndroid - ? await getDownloadPathAndroid() - : await FilePicker.platform.saveFile( - dialogTitle: L10n.of(context)!.saveFile, - fileName: name, - type: filePickerFileType, - ); + final downloadPath = await FilePicker.platform.saveFile( + dialogTitle: L10n.of(context)!.saveFile, + fileName: name, + type: filePickerFileType, + ); if (downloadPath == null) return; final result = await showFutureLoadingDialog( @@ -48,24 +46,6 @@ extension MatrixFileExtension on MatrixFile { ); } - Future getDownloadPathAndroid() async { - final directory = await getDownloadDirectoryAndroid(); - var counter = 1; - var path = '${directory.path}/$name'; - while (await File(path).exists()) { - path = '${directory.path}/(${counter++})$name'; - } - return path; - } - - Future getDownloadDirectoryAndroid() async { - final defaultDownloadDirectory = Directory('/storage/emulated/0/Download'); - if (await defaultDownloadDirectory.exists()) { - return defaultDownloadDirectory; - } - return await getApplicationDocumentsDirectory(); - } - FileType get filePickerFileType { if (this is MatrixImageFile) return FileType.image; if (this is MatrixAudioFile) return FileType.audio; @@ -73,6 +53,25 @@ extension MatrixFileExtension on MatrixFile { return FileType.any; } + void _mobileDownload(BuildContext context) async { + final downloadPath = await FlutterFileDialog.saveFile( + params: SaveFileDialogParams( + fileName: name, + data: bytes, + ), + ); + if (downloadPath != null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + L10n.of(context)!.fileHasBeenSavedAt(downloadPath), + ), + ), + ); + } + return; + } + void _webDownload() { html.AnchorElement( href: html.Url.createObjectUrlFromBlob( diff --git a/pubspec.lock b/pubspec.lock index 055187044..29dc21ffe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -427,6 +427,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_file_dialog: + dependency: "direct main" + description: + name: flutter_file_dialog + sha256: "9344b8f07be6a1b6f9854b723fb0cf84a8094ba94761af1d213589d3cb087488" + url: "https://pub.dev" + source: hosted + version: "3.0.2" flutter_foreground_task: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5a446bf1b..f85518e97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: flutter_app_badger: ^1.5.0 flutter_blurhash: ^0.8.2 flutter_cache_manager: ^3.3.0 + flutter_file_dialog: ^3.0.2 flutter_foreground_task: ^6.0.0+1 flutter_highlighter: ^0.1.1 flutter_html: ^3.0.0-beta.2