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