From 46cdcececd2edfb0cbb89875fc241a35c42d641a Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 10 Sep 2026 00:05:34 +0200 Subject: [PATCH] feat: Update-Hinweis beim App-Start MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ruft /static/downloads/version.txt vom konfigurierten Server ab und vergleicht gegen kAppVersion. Bei Abweichung Hinweis-Banner auf HomeScreen ("Neue Version X verfügbar, installiert: Y"). Rein informativ, kein Auto-Update (APK-Sideloading, kein Play-Store-Mechanismus verfügbar). Fehler beim Check (offline, Server down) werden stillschweigend ignoriert. v0.1.5+6. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1 --- lib/app_version.dart | 2 +- lib/screens/home_screen.dart | 25 ++++++++++++++++++++++ lib/services/update_check_service.dart | 29 ++++++++++++++++++++++++++ pubspec.yaml | 2 +- 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 lib/services/update_check_service.dart diff --git a/lib/app_version.dart b/lib/app_version.dart index 2b876a4..24f3adf 100644 --- a/lib/app_version.dart +++ b/lib/app_version.dart @@ -1,4 +1,4 @@ /// Manuell mit `pubspec.yaml` synchron halten (kein package_info_plus, um /// keine zusätzliche Native-Plugin-Fläche in dieser Debugging-Phase /// einzuführen). Bei jedem Release beide Stellen bumpen. -const String kAppVersion = '0.1.4+5'; +const String kAppVersion = '0.1.5+6'; diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 11f7953..00fc7c2 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -6,6 +6,7 @@ import '../app_version.dart'; import '../models/time_entry.dart'; import '../services/auth_service.dart'; import '../services/time_service.dart'; +import '../services/update_check_service.dart'; import 'login_screen.dart'; class HomeScreen extends StatefulWidget { @@ -24,6 +25,7 @@ class _HomeScreenState extends State { TimeEntry? _openEntry; String? _error; Timer? _ticker; + String? _newerVersion; @override void initState() { @@ -32,6 +34,9 @@ class _HomeScreenState extends State { _ticker = Timer.periodic(const Duration(seconds: 1), (_) { if (_openEntry != null) setState(() {}); }); + UpdateCheckService().checkForNewerVersion().then((v) { + if (mounted && v != null) setState(() => _newerVersion = v); + }); } @override @@ -161,6 +166,26 @@ class _HomeScreenState extends State { : ListView( padding: const EdgeInsets.all(24), children: [ + if (_newerVersion != null) + Card( + color: Colors.blue[50], + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + const Icon(Icons.system_update, color: Colors.blue), + const SizedBox(width: 12), + Expanded( + child: Text( + 'Neue Version $_newerVersion verfügbar (installiert: $kAppVersion). ' + 'Im Portal unter Profil herunterladen.', + style: const TextStyle(color: Colors.blue), + ), + ), + ], + ), + ), + ), if (_error != null) Card( color: Colors.red[50], diff --git a/lib/services/update_check_service.dart b/lib/services/update_check_service.dart new file mode 100644 index 0000000..77f869c --- /dev/null +++ b/lib/services/update_check_service.dart @@ -0,0 +1,29 @@ +import 'package:dio/dio.dart'; +import '../app_version.dart'; +import 'api_client.dart'; + +/// Prüft `/static/downloads/version.txt` auf dem konfigurierten Server gegen +/// die eigene kAppVersion. Rein informativ – kein Erzwingen, kein Auto-Update +/// (APK-Sideloading, kein Play Store). Fehler beim Check sind egal (offline, +/// Server down) – dann einfach kein Hinweis. +class UpdateCheckService { + Future checkForNewerVersion() async { + try { + final apiBase = ApiClient.instance.baseUrl; // endet auf .../api/v1 + final origin = apiBase.replaceFirst(RegExp(r'/api/v1/?$'), ''); + final response = await Dio(BaseOptions( + baseUrl: origin, + connectTimeout: const Duration(seconds: 5), + receiveTimeout: const Duration(seconds: 5), + )).get('/static/downloads/version.txt'); + + final remote = (response.data ?? '').trim(); + if (remote.isEmpty || remote == kAppVersion) return null; + return remote; + } on DioException { + return null; + } catch (_) { + return null; + } + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 32f0524..ecd3e5c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: timemaster_mobile description: TimeMaster Zeiterfassung – Employee App publish_to: 'none' -version: 0.1.4+5 +version: 0.1.5+6 environment: sdk: '>=3.3.0 <4.0.0'