From d6ebc43e5cfb61df8c3573af6a059fc5e962badd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 11 Aug 2023 21:25:04 +0200 Subject: [PATCH] Added option to open FileViewer always with system dialog, enabled by default on iOS --- .../listFiles/listFilesResponse.g.dart | 19 --------- lib/storage/base/settings.dart | 3 ++ lib/storage/base/settings.g.dart | 3 ++ lib/storage/base/settingsProvider.dart | 5 +++ lib/storage/fileView/fileViewSettings.dart | 13 ++++++ lib/storage/fileView/fileViewSettings.g.dart | 17 ++++++++ lib/view/settings/settings.dart | 13 ++++++ lib/widget/fileViewer.dart | 42 +++++++++++++------ 8 files changed, 83 insertions(+), 32 deletions(-) delete mode 100644 lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart create mode 100644 lib/storage/fileView/fileViewSettings.dart create mode 100644 lib/storage/fileView/fileViewSettings.g.dart diff --git a/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart b/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart deleted file mode 100644 index f6281c4..0000000 --- a/lib/api/marianumcloud/webdav/queries/listFiles/listFilesResponse.g.dart +++ /dev/null @@ -1,19 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'listFilesResponse.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -ListFilesResponse _$ListFilesResponseFromJson(Map json) => - ListFilesResponse( - (json['files'] as List) - .map((e) => CacheableFile.fromJson(e as Map)) - .toSet(), - ); - -Map _$ListFilesResponseToJson(ListFilesResponse instance) => - { - 'files': instance.files.map((e) => e.toJson()).toList(), - }; diff --git a/lib/storage/base/settings.dart b/lib/storage/base/settings.dart index 45886eb..59aca1c 100644 --- a/lib/storage/base/settings.dart +++ b/lib/storage/base/settings.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import '../file/fileSettings.dart'; +import '../fileView/fileViewSettings.dart'; import '../gradeAverages/gradeAveragesSettings.dart'; import '../holidays/holidaysSettings.dart'; import '../talk/talkSettings.dart'; @@ -23,6 +24,7 @@ class Settings { TalkSettings talkSettings; FileSettings fileSettings; HolidaysSettings holidaysSettings; + FileViewSettings fileViewSettings; Settings({ required this.appTheme, @@ -32,6 +34,7 @@ class Settings { required this.talkSettings, required this.fileSettings, required this.holidaysSettings, + required this.fileViewSettings, }); static String _themeToJson(ThemeMode m) => m.name; diff --git a/lib/storage/base/settings.g.dart b/lib/storage/base/settings.g.dart index 1325069..5d04e65 100644 --- a/lib/storage/base/settings.g.dart +++ b/lib/storage/base/settings.g.dart @@ -19,6 +19,8 @@ Settings _$SettingsFromJson(Map json) => Settings( FileSettings.fromJson(json['fileSettings'] as Map), holidaysSettings: HolidaysSettings.fromJson( json['holidaysSettings'] as Map), + fileViewSettings: FileViewSettings.fromJson( + json['fileViewSettings'] as Map), ); Map _$SettingsToJson(Settings instance) => { @@ -29,4 +31,5 @@ Map _$SettingsToJson(Settings instance) => { 'talkSettings': instance.talkSettings.toJson(), 'fileSettings': instance.fileSettings.toJson(), 'holidaysSettings': instance.holidaysSettings.toJson(), + 'fileViewSettings': instance.fileViewSettings.toJson(), }; diff --git a/lib/storage/base/settingsProvider.dart b/lib/storage/base/settingsProvider.dart index 0793e25..fd4324c 100644 --- a/lib/storage/base/settingsProvider.dart +++ b/lib/storage/base/settingsProvider.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'dart:developer'; +import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:marianum_mobile/storage/fileView/fileViewSettings.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../view/pages/files/files.dart'; @@ -100,6 +102,9 @@ class SettingsProvider extends ChangeNotifier { dismissedDisclaimer: false, showPastEvents: false, ), + fileViewSettings: FileViewSettings( + alwaysOpenExternally: Platform.isIOS, + ), ); } } \ No newline at end of file diff --git a/lib/storage/fileView/fileViewSettings.dart b/lib/storage/fileView/fileViewSettings.dart new file mode 100644 index 0000000..5ebc15d --- /dev/null +++ b/lib/storage/fileView/fileViewSettings.dart @@ -0,0 +1,13 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'fileViewSettings.g.dart'; + +@JsonSerializable() +class FileViewSettings { + bool alwaysOpenExternally; + + FileViewSettings({required this.alwaysOpenExternally}); + + factory FileViewSettings.fromJson(Map json) => _$FileViewSettingsFromJson(json); + Map toJson() => _$FileViewSettingsToJson(this); +} \ No newline at end of file diff --git a/lib/storage/fileView/fileViewSettings.g.dart b/lib/storage/fileView/fileViewSettings.g.dart new file mode 100644 index 0000000..ea16ee8 --- /dev/null +++ b/lib/storage/fileView/fileViewSettings.g.dart @@ -0,0 +1,17 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'fileViewSettings.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +FileViewSettings _$FileViewSettingsFromJson(Map json) => + FileViewSettings( + alwaysOpenExternally: json['alwaysOpenExternally'] as bool, + ); + +Map _$FileViewSettingsToJson(FileViewSettings instance) => + { + 'alwaysOpenExternally': instance.alwaysOpenExternally, + }; diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index f280173..6c221ae 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -139,6 +139,19 @@ class _SettingsState extends State { const Divider(), + ListTile( + leading: const Icon(Icons.open_in_new_outlined), + title: const Text("Dateien immer mit Systemdialog öffnen"), + trailing: Checkbox( + value: settings.val().fileViewSettings.alwaysOpenExternally, + onChanged: (e) { + settings.val(write: true).fileViewSettings.alwaysOpenExternally = e!; + }, + ), + ), + + const Divider(), + ListTile( leading: const Icon(Icons.live_help_outlined), title: const Text("Informationen und Lizenzen"), diff --git a/lib/widget/fileViewer.dart b/lib/widget/fileViewer.dart index 07986e1..2cb45a2 100644 --- a/lib/widget/fileViewer.dart +++ b/lib/widget/fileViewer.dart @@ -3,17 +3,17 @@ import 'dart:math'; import 'package:better_open_file/better_open_file.dart'; import 'package:flutter/material.dart'; +import 'package:marianum_mobile/storage/base/settingsProvider.dart'; import 'package:photo_view/photo_view.dart'; +import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; -import 'confirmDialog.dart'; import 'placeholderView.dart'; class FileViewer extends StatefulWidget { final String path; final bool openExternal; - final bool allowExternal; - const FileViewer({super.key, required this.path, this.openExternal = false, this.allowExternal = true}); + const FileViewer({super.key, required this.path, this.openExternal = false}); @override State createState() => _FileViewerState(); @@ -22,30 +22,38 @@ class FileViewer extends StatefulWidget { class _FileViewerState extends State { PhotoViewController photoViewController = PhotoViewController(); + late SettingsProvider settings = Provider.of(context, listen: false); + late bool openExternal; + + @override + void initState() { + openExternal = settings.val().fileViewSettings.alwaysOpenExternally || widget.openExternal; + super.initState(); + } + @override Widget build(BuildContext context) { AppBar appbar({List actions = const []}) { return AppBar( title: Text(widget.path.split("/").last), actions: [ - Visibility( - visible: widget.allowExternal, - child: IconButton(onPressed: () => ConfirmDialog( - title: "Extern öffnen", - content: "Möchtest du die Datei mit dem Systemdialog öffnen?", - onConfirm: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => FileViewer(path: widget.path, openExternal: true))), - confirmButton: "Öffnen", - ).asDialog(context), icon: const Icon(Icons.open_in_new)), + IconButton( + onPressed: () => Navigator.of(context).push( + MaterialPageRoute(builder: (context) => FileViewer(path: widget.path, openExternal: true)) + ), + icon: const Icon(Icons.open_in_new) ), ...actions ], ); } - switch(widget.openExternal ? "" : widget.path.split(".").last) { + switch(openExternal ? "" : widget.path.split(".").last.toLowerCase()) { case "png": case "jpg": case "jpeg": + case "webp": + case "gif": return Scaffold( appBar: appbar( actions: [ @@ -84,7 +92,15 @@ class _FileViewerState extends State { }); } }); - return const PlaceholderView(text: "Datei wird extern geöffnet...", icon: Icons.open_in_new); + + return PlaceholderView( + text: "Datei extern geöffnet", + icon: Icons.open_in_new, + button: TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Zurück"), + ), + ); } } }