mirror of
https://github.com/krille-chan/fluffychat
synced 2024-10-05 15:12:44 +00:00
refactor: Better download UX with file picker for android and iOS
This commit is contained in:
parent
1776a65884
commit
826cce6573
3 changed files with 36 additions and 28 deletions
|
@ -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,9 +24,7 @@ extension MatrixFileExtension on MatrixFile {
|
|||
return;
|
||||
}
|
||||
|
||||
final downloadPath = PlatformInfos.isAndroid
|
||||
? await getDownloadPathAndroid()
|
||||
: await FilePicker.platform.saveFile(
|
||||
final downloadPath = await FilePicker.platform.saveFile(
|
||||
dialogTitle: L10n.of(context)!.saveFile,
|
||||
fileName: name,
|
||||
type: filePickerFileType,
|
||||
|
@ -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(
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue