Merge branch 'main' into development

This commit is contained in:
2026-01-27 14:29:01 +01:00
6 changed files with 221 additions and 35 deletions

View File

@@ -2,10 +2,12 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import '../l10n/app_localizations.dart';
import '../service/notifying.dart';
import '../service/permission_service.dart';
import '../service/settings_provider.dart';
import '../service/storage.dart';
class SettingsPage extends StatefulWidget {
@@ -29,10 +31,16 @@ class _SettingsPageState extends State<SettingsPage> {
super.initState();
}
// TODO: Localize
@override
Widget build(BuildContext context) {
final titlePadding = Theme.of(context).listTileTheme.contentPadding!;
checkStoragePermission();
final alwaysExportEnabled = context
.watch<SettingsProvider>()
.settings
.alwaysExportEnabled;
return Scaffold(
appBar: AppBar(title: Text(AppLocalizations.of(context)!.settings)),
body: Center(
@@ -51,9 +59,11 @@ class _SettingsPageState extends State<SettingsPage> {
SizedBox(height: tileSpacing),
ListTile(
title: Text('Grant storage permisson'),
subtitle: Text(
'For app-data settings to work, you need to grant the app permissions to manage internal storage.',
),
subtitle: storagePermissionIsGranted
? Text('Storage permission granted')
: Text(
'For app-data settings to work, you need to grant the app permissions to manage internal storage.',
),
onTap: () => PermissionService.requestStoragePermission
.whenComplete(() => checkStoragePermission()),
trailing: Icon(Icons.arrow_forward_ios_rounded),
@@ -63,7 +73,7 @@ class _SettingsPageState extends State<SettingsPage> {
ListTile(
title: Text(AppLocalizations.of(context)!.import),
subtitle: Text('Import app-data from a json file.'),
onTap: () => onActivateJsonImportPressed(),
onTap: () => onJsonImportPressed(),
trailing: Icon(Icons.arrow_forward_ios_rounded),
enabled: storagePermissionIsGranted,
),
@@ -73,10 +83,39 @@ class _SettingsPageState extends State<SettingsPage> {
subtitle: Text(
'Export app-data to a json file in the selected directory.',
),
onTap: () => onActivateJsonExportPressed(),
onTap: () => onJsonExportPressed(),
trailing: Icon(Icons.arrow_forward_ios_rounded),
enabled: storagePermissionIsGranted,
),
SizedBox(height: tileSpacing),
ListTile(
title: Text('Always save to file'),
subtitle: Text(
'Export app data to a directory, every time you make a change',
),
onTap: () => onAlwaysSaveToJsonPressed(),
trailing: Checkbox(
value: alwaysExportEnabled,
onChanged: (value) {
onAlwaysSaveToJsonPressed();
},
),
enabled: storagePermissionIsGranted,
),
if (alwaysExportEnabled) SizedBox(height: tileSpacing),
if (alwaysExportEnabled)
ListTile(
title: Text('Change export directory'),
subtitle: Text(
context
.watch<SettingsProvider>()
.settings
.exportDirectoryPath,
),
onTap: () => onChangeExportDirectoryPressed(),
trailing: Icon(Icons.arrow_forward_ios_rounded),
enabled: storagePermissionIsGranted,
),
],
),
),
@@ -84,23 +123,54 @@ class _SettingsPageState extends State<SettingsPage> {
);
}
void onActivateJsonExportPressed() async {
if (!await PermissionService.storagePermissionStatus.isGranted) return;
void onJsonExportPressed() async {
if (!await checkStoragePermission()) return;
Storage.exportToJsonFile().then(showExportInfo);
}
void onActivateJsonImportPressed() async {
if (!await PermissionService.storagePermissionStatus.isGranted) return;
void onJsonImportPressed() async {
if (!await checkStoragePermission()) return;
Storage.importFromJsonFile().then(showImportInfo);
}
Future<void> checkStoragePermission() async {
void onAlwaysSaveToJsonPressed() async {
if (context.read<SettingsProvider>().settings.alwaysExportEnabled) {
context.read<SettingsProvider>().setExportDirectoryPath('', silent: true);
context.read<SettingsProvider>().setAlwaysExportEnabled(false);
return;
}
if (!await PermissionService.storagePermissionStatus.isGranted) return;
final dir = await Storage.selectDirectoryPath();
if (dir.isEmpty || !context.mounted) return;
// ignore: use_build_context_synchronously
context.read<SettingsProvider>().setExportDirectoryPath(dir, silent: true);
// ignore: use_build_context_synchronously
Storage.saveDataToFile().whenComplete(
// ignore: use_build_context_synchronously
() => context.read<SettingsProvider>().setAlwaysExportEnabled(true),
);
}
void onChangeExportDirectoryPressed() async {
if (!await PermissionService.storagePermissionStatus.isGranted) return;
final dir = await Storage.selectDirectoryPath();
if (dir.isEmpty || !context.mounted) return;
// ignore: use_build_context_synchronously
context.read<SettingsProvider>().setExportDirectoryPath(dir);
}
Future<bool> checkStoragePermission() async {
PermissionService.storagePermissionStatus.then((value) {
storagePermissionIsGranted = value.isGranted;
if (context.mounted && value.isGranted != storagePermissionIsGranted) {
storagePermissionIsGranted = value.isGranted;
setState(() {});
}
});
return storagePermissionIsGranted;
}
void showExportInfo(bool success) => Notifying.showSnackbar(