From 7aa41abe61629a2864a33e35b5c83fa53e96b2b0 Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sat, 10 Jan 2026 16:20:21 +0100 Subject: [PATCH 1/3] Implemented version number --- .../views/main_menu/settings_view.dart | 210 ++++++++++-------- pubspec.yaml | 3 +- 2 files changed, 118 insertions(+), 95 deletions(-) diff --git a/lib/presentation/views/main_menu/settings_view.dart b/lib/presentation/views/main_menu/settings_view.dart index c5fcfa2..9c61d8d 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}); @@ -13,9 +14,18 @@ class SettingsView extends StatefulWidget { } class _SettingsViewState extends State { + PackageInfo _packageInfo = PackageInfo( + appName: 'Unknown', + packageName: 'Unknown', + version: 'Unknown', + buildNumber: 'Unknown', + buildSignature: 'Unknown', + installerStore: 'Unknown', + ); @override void initState() { super.initState(); + _initPackageInfo(); } @override @@ -25,102 +35,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, + ), + ), + ), + ), + ], ), ), ); @@ -196,4 +211,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..67fd5c5 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+97 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: -- 2.49.1 From 2a72332bcd9e5e0f5ac4de997657fbd2edcd4d60 Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sat, 10 Jan 2026 21:23:28 +0100 Subject: [PATCH 2/3] Updated error string --- lib/presentation/views/main_menu/settings_view.dart | 10 ++++------ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/presentation/views/main_menu/settings_view.dart b/lib/presentation/views/main_menu/settings_view.dart index 9c61d8d..2019891 100644 --- a/lib/presentation/views/main_menu/settings_view.dart +++ b/lib/presentation/views/main_menu/settings_view.dart @@ -15,12 +15,10 @@ class SettingsView extends StatefulWidget { class _SettingsViewState extends State { PackageInfo _packageInfo = PackageInfo( - appName: 'Unknown', - packageName: 'Unknown', - version: 'Unknown', - buildNumber: 'Unknown', - buildSignature: 'Unknown', - installerStore: 'Unknown', + appName: 'n.A.', + packageName: 'n.A.', + version: 'n.A.', + buildNumber: 'n.A.', ); @override void initState() { diff --git a/pubspec.yaml b/pubspec.yaml index 67fd5c5..970eff4 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.4+97 +version: 0.0.4+99 environment: sdk: ^3.8.1 -- 2.49.1 From 497f30421d8b358dfc6511cb2f7d2b7270e730d4 Mon Sep 17 00:00:00 2001 From: Felix Kirchner Date: Sat, 10 Jan 2026 21:29:45 +0100 Subject: [PATCH 3/3] Updated string --- lib/l10n/arb/app_de.arb | 2 +- lib/l10n/arb/app_en.arb | 2 +- lib/l10n/generated/app_localizations.dart | 2 +- lib/l10n/generated/app_localizations_de.dart | 2 +- lib/l10n/generated/app_localizations_en.dart | 2 +- lib/presentation/views/main_menu/settings_view.dart | 2 +- pubspec.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 4d86460..947c31c 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -17,7 +17,7 @@ "data_successfully_imported": "Daten erfolgreich importiert", "days_ago": "vor {count} Tagen", "delete": "Löschen", - "delete_all_data": "Alle Daten löschen?", + "delete_all_data": "Alle Daten löschen", "error_creating_group": "Fehler beim Erstellen der Gruppe, bitte erneut versuchen", "error_reading_file": "Fehler beim Lesen der Datei", "export_canceled": "Export abgebrochen", diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 17c3b06..7bae9db 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -277,7 +277,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", "error_creating_group": "Error while creating group, please try again", "error_reading_file": "Error reading file", "export_canceled": "Export canceled", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 5080ff3..1da83f8 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -209,7 +209,7 @@ 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; /// Error message when group creation fails diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index c720941..75a1325 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -67,7 +67,7 @@ class AppLocalizationsDe extends AppLocalizations { String get delete => 'Löschen'; @override - String get delete_all_data => 'Alle Daten löschen?'; + String get delete_all_data => 'Alle Daten löschen'; @override String get error_creating_group => diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index cd71035..00b933b 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -67,7 +67,7 @@ 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 error_creating_group => diff --git a/lib/presentation/views/main_menu/settings_view.dart b/lib/presentation/views/main_menu/settings_view.dart index 2019891..0fa7085 100644 --- a/lib/presentation/views/main_menu/settings_view.dart +++ b/lib/presentation/views/main_menu/settings_view.dart @@ -93,7 +93,7 @@ class _SettingsViewState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: Text(loc.delete_all_data), + title: Text('${loc.delete_all_data}?'), content: Text(loc.this_cannot_be_undone), actions: [ TextButton( diff --git a/pubspec.yaml b/pubspec.yaml index 970eff4..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.4+99 +version: 0.0.4+101 environment: sdk: ^3.8.1 -- 2.49.1