refactor: Better download UX with file picker for android and iOS

This commit is contained in:
krille-chan 2024-02-22 18:36:29 +01:00
parent 1776a65884
commit 826cce6573
No known key found for this signature in database
3 changed files with 36 additions and 28 deletions

View file

@ -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<String> 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<Directory> 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(

View file

@ -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:

View file

@ -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