diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 51faa1e..5358330 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -17,8 +17,8 @@ "data_successfully_imported": "Daten erfolgreich importiert", "days_ago": "vor {count} Tagen", "delete": "Löschen", - "delete_all_data": "Alle Daten löschen?", - "delete_all_data": "Diese Gruppe löschen", + "delete_all_data": "Alle Daten löschen", + "delete_group": "Diese Gruppe löschen", "edit_group": "Gruppe bearbeiten", "error_creating_group": "Fehler beim Erstellen der Gruppe, bitte erneut versuchen", "error_deleting_group": "Fehler beim Löschen der Gruppe, bitte erneut versuchen", diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index cee5ba8..29dd4b0 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -34,10 +34,10 @@ "description": "Button text to create a match" }, "@create_new_group": { - "description": "Appbar text to create a group" + "description": "Button text to create a new group" }, "@create_new_match": { - "description": "Appbar text to create a match" + "description": "Button text to create a new match" }, "@data_successfully_deleted": { "description": "Success message after deleting data" @@ -289,7 +289,7 @@ "data_successfully_imported": "Data successfully imported", "days_ago": "{count} days ago", "delete": "Delete", - "delete_all_data": "Delete all data?", + "delete_all_data": "Delete all data", "delete_group": "Delete this group", "edit_group": "Edit Group", "error_creating_group": "Error while creating group, please try again", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 5d8f454..0fd55db 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -164,13 +164,13 @@ abstract class AppLocalizations { /// **'Create match'** String get create_match; - /// Appbar text to create a group + /// Button text to create a new group /// /// In en, this message translates to: /// **'Create new group'** String get create_new_group; - /// Appbar text to create a match + /// Button text to create a new match /// /// In en, this message translates to: /// **'Create new match'** @@ -209,13 +209,13 @@ abstract class AppLocalizations { /// Confirmation dialog for deleting all data /// /// In en, this message translates to: - /// **'Delete all data?'** + /// **'Delete all data'** String get delete_all_data; /// Confirmation dialog for deleting a group /// /// In en, this message translates to: - /// **'Delete this group?'** + /// **'Delete this group'** String get delete_group; /// Button & Appbar label for editing a group diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index 22f817e..bd45aa0 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -67,10 +67,10 @@ class AppLocalizationsDe extends AppLocalizations { String get delete => 'Löschen'; @override - String get delete_all_data => 'Diese Gruppe löschen?'; + String get delete_all_data => 'Alle Daten löschen'; @override - String get delete_group => 'Delete this group?'; + String get delete_group => 'Diese Gruppe löschen'; @override String get edit_group => 'Gruppe bearbeiten'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index a28140b..21ad344 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -67,10 +67,10 @@ class AppLocalizationsEn extends AppLocalizations { String get delete => 'Delete'; @override - String get delete_all_data => 'Delete all data?'; + String get delete_all_data => 'Delete all data'; @override - String get delete_group => 'Delete this group?'; + String get delete_group => 'Delete this group'; @override String get edit_group => 'Edit Group'; diff --git a/lib/presentation/views/main_menu/settings_view.dart b/lib/presentation/views/main_menu/settings_view.dart index 897ef5f..998bb5e 100644 --- a/lib/presentation/views/main_menu/settings_view.dart +++ b/lib/presentation/views/main_menu/settings_view.dart @@ -4,6 +4,7 @@ import 'package:game_tracker/core/enums.dart'; import 'package:game_tracker/l10n/generated/app_localizations.dart'; import 'package:game_tracker/presentation/widgets/tiles/settings_list_tile.dart'; import 'package:game_tracker/services/data_transfer_service.dart'; +import 'package:package_info_plus/package_info_plus.dart'; class SettingsView extends StatefulWidget { const SettingsView({super.key}); @@ -17,9 +18,16 @@ class _SettingsViewState extends State { /// GlobalKey for ScaffoldMessenger to show snackbars final _scaffoldMessengerKey = GlobalKey(); + PackageInfo _packageInfo = PackageInfo( + appName: 'n.A.', + packageName: 'n.A.', + version: 'n.A.', + buildNumber: 'n.A.', + ); @override void initState() { super.initState(); + _initPackageInfo(); } @override @@ -30,102 +38,107 @@ class _SettingsViewState extends State { child: Scaffold( appBar: AppBar(backgroundColor: CustomTheme.backgroundColor), backgroundColor: CustomTheme.backgroundColor, - body: LayoutBuilder( - builder: (BuildContext context, BoxConstraints constraints) => - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(24, 0, 24, 10), - child: Text( - textAlign: TextAlign.start, - loc.menu, - style: const TextStyle( - fontSize: 28, - fontWeight: FontWeight.bold, - ), - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 24, - vertical: 10, - ), - child: Text( - textAlign: TextAlign.start, - loc.settings, - style: const TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - ), - ), - ), - SettingsListTile( - title: loc.export_data, - icon: Icons.upload_rounded, - suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), - onPressed: () async { - final String json = - await DataTransferService.getAppDataAsJson(context); - final result = await DataTransferService.exportData( - json, - 'game_tracker-data', - ); - if (!context.mounted) return; - showExportSnackBar(context: context, result: result); - }, - ), - SettingsListTile( - title: loc.import_data, - icon: Icons.download_rounded, - suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), - onPressed: () async { - final result = await DataTransferService.importData( - context, - ); - if (!context.mounted) return; - showImportSnackBar(context: context, result: result); - }, - ), - SettingsListTile( - title: loc.delete_all_data, - icon: Icons.delete_rounded, - suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), - onPressed: () { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(loc.delete_all_data), - content: Text(loc.this_cannot_be_undone), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text(loc.cancel), - ), - TextButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text(loc.delete), - ), - ], - ), - ).then((confirmed) { - if (confirmed == true && context.mounted) { - DataTransferService.deleteAllData(context); - showSnackbar( - context: context, - message: AppLocalizations.of( - context, - ).data_successfully_deleted, - ); - } - }); - }, - ), - ], + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(24, 0, 24, 10), + child: Text( + textAlign: TextAlign.start, + loc.menu, + style: const TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, ), ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 10), + child: Text( + textAlign: TextAlign.start, + loc.settings, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsListTile( + title: loc.export_data, + icon: Icons.upload_rounded, + suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), + onPressed: () async { + final String json = await DataTransferService.getAppDataAsJson( + context, + ); + final result = await DataTransferService.exportData( + json, + 'game_tracker-data', + ); + if (!context.mounted) return; + showExportSnackBar(context: context, result: result); + }, + ), + SettingsListTile( + title: loc.import_data, + icon: Icons.download_rounded, + suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), + onPressed: () async { + final result = await DataTransferService.importData(context); + if (!context.mounted) return; + showImportSnackBar(context: context, result: result); + }, + ), + SettingsListTile( + title: loc.delete_all_data, + icon: Icons.delete_rounded, + suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16), + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text('${loc.delete_all_data}?'), + content: Text(loc.this_cannot_be_undone), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text(loc.cancel), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: Text(loc.delete), + ), + ], + ), + ).then((confirmed) { + if (confirmed == true && context.mounted) { + DataTransferService.deleteAllData(context); + showSnackbar( + context: context, + message: AppLocalizations.of( + context, + ).data_successfully_deleted, + ); + } + }); + }, + ), + const Spacer(), + Padding( + padding: const EdgeInsets.all(20), + child: Center( + child: Text( + 'Version ${_packageInfo.version} (${_packageInfo.buildNumber})', + style: TextStyle( + color: Colors.grey.shade600, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ], ), ), ); @@ -201,4 +214,11 @@ class _SettingsViewState extends State { ), ); } + + Future _initPackageInfo() async { + final info = await PackageInfo.fromPlatform(); + setState(() { + _packageInfo = info; + }); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 7ace12f..dbb26c3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: game_tracker description: "Game Tracking App for Card Games" publish_to: 'none' -version: 0.0.3+93 +version: 0.0.4+101 environment: sdk: ^3.8.1 @@ -22,6 +22,7 @@ dependencies: intl: any flutter_localizations: sdk: flutter + package_info_plus: ^9.0.0 dev_dependencies: flutter_test: