import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../model/accountModel.dart'; import '../../storage/base/settingsProvider.dart'; import '../../theming/appTheme.dart'; import '../../widget/confirmDialog.dart'; import 'debug/cacheView.dart'; import 'debug/jsonViewer.dart'; class Settings extends StatefulWidget { const Settings({Key? key}) : super(key: key); @override State createState() => _SettingsState(); } class _SettingsState extends State { @override void initState() { super.initState(); } bool developerMode = false; @override Widget build(BuildContext context) { return Consumer(builder: (context, settings, child) { return Scaffold( appBar: AppBar( title: const Text("Einstellungen"), ), body: ListView( children: [ ListTile( leading: const Icon(Icons.logout_outlined), title: const Text("Konto abmelden"), onTap: () { showDialog( context: context, builder: (context) => ConfirmDialog( title: "Abmelden?", content: "Möchtest du dich wirklich abmelden?", confirmButton: "Abmelden", onConfirm: () { SharedPreferences.getInstance().then((value) => { value.clear(), }).then((value) => { Provider.of(context, listen: false).logout(), Navigator.popUntil(context, (route) => !Navigator.canPop(context)), }); }, ), ); }, ), const Divider(), ListTile( leading: const Icon(Icons.dark_mode_outlined), title: const Text("Farbgebung"), trailing: DropdownButton( value: settings.val().appTheme, icon: const Icon(Icons.arrow_drop_down), items: ThemeMode.values.map((e) => DropdownMenuItem( value: e, enabled: e != settings.val().appTheme, child: Row( children: [ Icon(AppTheme.getDisplayOptions(e).icon), const SizedBox(width: 10), Text(AppTheme.getDisplayOptions(e).displayName), ], ), )).toList(), onChanged: (e) { setState(() { settings.val(write: true).appTheme = e!; }); }, ), ), const Divider(), ListTile( leading: const Icon(Icons.star_border), title: const Text("Favoriten im Talk nach oben sortieren"), trailing: Checkbox( value: settings.val().talkSettings.sortFavoritesToTop, onChanged: (e) { setState(() { settings.val(write: true).talkSettings.sortFavoritesToTop = e!; }); }, ), ), const Divider(), ListTile( leading: const Icon(Icons.live_help_outlined), title: const Text("Informationen und Lizenzen"), onTap: () { PackageInfo.fromPlatform().then((appInfo) { showAboutDialog( context: context, applicationIcon: const Icon(Icons.apps), applicationName: "MarianumMobile", applicationVersion: "${appInfo.appName}\n\nPackage: ${appInfo.packageName}\n\nVersion: ${appInfo.version}\nBuild: ${appInfo.buildNumber}", applicationLegalese: "Dies ist ein Inoffizieller Nextcloud & Webuntis Client und wird nicht vom Marianum selbst betrieben.\n" "Keinerlei Gewähr für Vollständigkeit, Richtigkeit und Aktualität!\n\n" "Development build\n" "Marianum Fulda 2023 Elias Müller", ); }); }, trailing: const Icon(Icons.arrow_right), ), ListTile( leading: const Icon(Icons.policy_outlined), title: const Text("Datenschutz"), onTap: () { ConfirmDialog.openBrowser(context, "https://mhsl.eu/datenschutz.html"); }, trailing: const Icon(Icons.open_in_new), ), ListTile( leading: const Icon(Icons.badge_outlined), title: const Text("Impressum"), onTap: () { ConfirmDialog.openBrowser(context, "https://mhsl.eu/id.html"); }, trailing: const Icon(Icons.open_in_new), ), const Divider(), ListTile( leading: const Icon(Icons.developer_mode_outlined), title: const Text("Entwickleransicht"), trailing: Checkbox( visualDensity: const VisualDensity(horizontal: VisualDensity.minimumDensity), value: settings.val().devToolsEnabled, onChanged: (state) { changeView() => setState(() { settings.val(write: true).devToolsEnabled = state ?? false; }); if(!state!) { changeView(); return; } ConfirmDialog( title: "Entwicklermodus", content: "" "Die Entwickleransicht bietet erweiterte Funktionen, die für den üblichen Gebrauch nicht benötigt werden.\n\nDie Verwendung der Tools kann darüber hinaus bei falscher Verwendung zu Fehlern führen.\n\n" "Aktivieren auf eigene Verantwortung.", confirmButton: "Ja, ich verstehe das Risiko", cancelButton: "Nein, zurück zur App", onConfirm: () { changeView(); }, ).asDialog(context); }, ), ), Visibility( visible: settings.val().devToolsEnabled, child: Column( children: [ ListTile( leading: const Icon(Icons.logo_dev_outlined), title: const Text("Logging verbosity"), trailing: DropdownButton( value: "1", items: ["1", "2", "3"].map((e) => DropdownMenuItem(value: e, child: Text(e))).toList(), onChanged: (e) { }, ), ), ListTile( leading: const Icon(Icons.data_object), title: FutureBuilder( future: const CacheView().totalSize(), builder: (context, snapshot) { return Text("Cache JSON dump (${snapshot.hasError ? "?" : snapshot.hasData ? "est. ${filesize(snapshot.data)}" : "Berechnen..."})"); }, ), subtitle: const Text("Tippen und halten um zu löschen"), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) { return const CacheView(); })); }, onLongPress: () { ConfirmDialog( title: "Cache löschen", content: "Alle cache Einträge werden gelöscht. Der cache wird bei benutzung der App erneut aufgebaut", confirmButton: "Unwiederruflich löschen", onConfirm: () => const CacheView().clear().then((value) => setState((){})), ).asDialog(context); }, trailing: const Icon(Icons.arrow_right), ), ListTile( leading: const Icon(Icons.broken_image), title: const Text("Cached Thumbnails löschen"), onTap: () { ConfirmDialog( title: "Thumbs cache löschen", content: "Alle zwischengespeicherten Bilder werden gelöscht.", confirmButton: "Unwiederruflich löschen", onConfirm: () => PaintingBinding.instance.imageCache.clear(), ).asDialog(context); }, ), ListTile( leading: const Icon(Icons.settings_applications_outlined), title: const Text("Storage JSON dump"), subtitle: const Text("Tippen und halten um zu löschen"), onTap: () { JsonViewer.asDialog(context, settings.val().toJson()); }, onLongPress: () { ConfirmDialog( title: "App-Speicher löschen", content: "Alle Einstellungen und gespeicherten Inhalte gehen verloren! Accountdaten sind nicht betroffen.", confirmButton: "Unwiederruflich Löschen", onConfirm: () { setState(() { Provider.of(context, listen: false).init(resetConfig: true); }); }, ).asDialog(context); }, ), ], ), ), ], ), ); }); } }