Client/lib/view/settings/settings.dart

290 lines
11 KiB
Dart

import 'package:filesize/filesize.dart';
import 'package:flutter/material.dart';
import 'package:marianum_mobile/widget/centeredLeading.dart';
import 'package:package_info/package_info.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../model/accountData.dart';
import '../../storage/base/settingsProvider.dart';
import '../../theming/appTheme.dart';
import '../../widget/confirmDialog.dart';
import '../../widget/debug/cacheView.dart';
import '../../widget/debug/jsonViewer.dart';
class Settings extends StatefulWidget {
const Settings({Key? key}) : super(key: key);
@override
State<Settings> createState() => _SettingsState();
}
class _SettingsState extends State<Settings> {
@override
void initState() {
super.initState();
}
bool developerMode = false;
@override
Widget build(BuildContext context) {
return Consumer<SettingsProvider>(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) {
AccountData().removeData(context);
Navigator.popUntil(context, (route) => !Navigator.canPop(context));
});
},
),
);
},
),
const Divider(),
ListTile(
leading: const Icon(Icons.dark_mode_outlined),
title: const Text("Farbgebung"),
trailing: DropdownButton<ThemeMode>(
value: settings.val().appTheme,
icon: const Icon(Icons.arrow_drop_down),
items: ThemeMode.values.map((e) => DropdownMenuItem<ThemeMode>(
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!;
});
},
),
),
ListTile(
leading: const Icon(Icons.mark_email_unread_outlined),
title: const Text("Ungelesene Chats nach oben sortieren"),
trailing: Checkbox(
value: settings.val().talkSettings.sortUnreadToTop,
onChanged: (e) {
setState(() {
settings.val(write: true).talkSettings.sortUnreadToTop = e!;
});
},
),
),
const Divider(),
ListTile(
leading: const Icon(Icons.drive_folder_upload_outlined),
title: const Text("Ordner in Dateien nach oben sortieren"),
trailing: Checkbox(
value: settings.val().fileSettings.sortFoldersToTop,
onChanged: (e) {
setState(() {
settings.val(write: true).fileSettings.sortFoldersToTop = 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(
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<String>(
value: "1",
items: ["1", "2", "3"].map((e) => DropdownMenuItem<String>(value: e, child: Text(e))).toList(),
onChanged: (e) {
},
),
),
ListTile(
leading: const CenteredLeading(Icon(Icons.image_outlined)),
title: const Text("Cached Thumbnails löschen"),
subtitle: Text("etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}"),
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);
},
trailing: const Icon(Icons.arrow_right),
),
ListTile(
leading: const CenteredLeading(Icon(Icons.settings_applications_outlined)),
title: const Text("Settings-storage JSON dump"),
subtitle: Text("etwa ${filesize(settings.val().toJson().toString().length * 8)}\nLange tippen um zu löschen"),
onTap: () {
JsonViewer.asDialog(context, settings.val().toJson());
},
onLongPress: () {
ConfirmDialog(
title: "App-Speicher löschen",
content: "Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.",
confirmButton: "Unwiederruflich Löschen",
onConfirm: () {
setState(() {
Provider.of<SettingsProvider>(context, listen: false).reset();
});
},
).asDialog(context);
},
trailing: const Icon(Icons.arrow_right),
),
ListTile(
leading: const CenteredLeading(Icon(Icons.data_object)),
title: const Text("Cache-storage JSON dump"),
subtitle: FutureBuilder(
future: const CacheView().totalSize(),
builder: (context, snapshot) {
return Text("etwa ${snapshot.hasError ? "?" : snapshot.hasData ? filesize(snapshot.data) : "..."}\nLange tippen um zu löschen");
},
),
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const CacheView();
}));
},
onLongPress: () {
ConfirmDialog(
title: "App-Cache löschen",
content: "Alle cache Einträge werden gelöscht. Der Cache wird bei Nutzung der App automatisch erneut aufgebaut",
confirmButton: "Unwiederruflich löschen",
onConfirm: () => const CacheView().clear().then((value) => setState((){})),
).asDialog(context);
},
trailing: const Icon(Icons.arrow_right),
),
],
),
),
],
),
);
});
}
}