diff --git a/lib/utils/FileSaver.dart b/lib/utils/FileSaver.dart new file mode 100644 index 0000000..1a1a88c --- /dev/null +++ b/lib/utils/FileSaver.dart @@ -0,0 +1,23 @@ +import 'dart:io'; + +import 'package:permission_handler/permission_handler.dart'; + +// only tested on android! +class FileSaver { + static Future getExternalDocumentPath() async { + var permission = await Permission.storage.status; + if(!permission.isGranted) { + await Permission.storage.request(); + } + var directory = Directory('/storage/emulated/0/Download'); + final externalPath = directory.path; + await Directory(externalPath).create(recursive: true); + return externalPath; + } + + static Future writeBytes(List bytes, String name) async { + final path = await getExternalDocumentPath(); + var file = File('$path/$name'); + return file.writeAsBytes(bytes); + } +} diff --git a/lib/widget/fileViewer.dart b/lib/widget/fileViewer.dart index 085caf4..e6c7de5 100644 --- a/lib/widget/fileViewer.dart +++ b/lib/widget/fileViewer.dart @@ -9,6 +9,8 @@ import 'package:share_plus/share_plus.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; import '../storage/base/settingsProvider.dart'; +import '../utils/FileSaver.dart'; +import 'infoDialog.dart'; import 'placeholderView.dart'; import 'sharePositionOrigin.dart'; @@ -53,6 +55,17 @@ class _FileViewerState extends State { }, icon: const Icon(Icons.share_outlined), ), + Visibility( + visible: Platform.isAndroid, + child: IconButton( + onPressed: () async { + await FileSaver.writeBytes(await File(widget.path).readAsBytes(), widget.path.split('/').last); + if(!context.mounted) return; + InfoDialog.show(context, 'Die Datei wurde im Downloads Ordner gespeichert.'); + }, + icon: const Icon(Icons.save_alt_outlined) + ) + ), ...actions ], ); diff --git a/pubspec.yaml b/pubspec.yaml index 63931ca..d2917f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,6 +102,7 @@ dependencies: uuid: ^4.5.1 open_filex: ^4.7.0 collection: ^1.19.0 + permission_handler: ^12.0.1 dev_dependencies: flutter_test: