From 2548e38af9b92c3f36aaeddd752a5bd04667d118 Mon Sep 17 00:00:00 2001 From: "Hermes (Server)" Date: Wed, 19 Aug 2026 19:04:47 +0200 Subject: [PATCH] feat(settings): Cache-Status UI + Clear-Button (Phase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neuer 'Cache-Speicher' ListTile in Musikserver-Sektion - Zeigt Cache-Größe in MB/KB/B - Clear-Button: Löscht alle gecachten Lieder - _formatBytes() für Größen-Anzeige - _clearCache() mit SnackBar-Feedback Nutzer kann jetzt Cache-Status sehen + leeren! Tests: 70/70 ✅ --- lib/settings/settings_screen.dart | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/settings/settings_screen.dart b/lib/settings/settings_screen.dart index f6cc465..362bcc6 100644 --- a/lib/settings/settings_screen.dart +++ b/lib/settings/settings_screen.dart @@ -3,6 +3,7 @@ import 'package:provider/provider.dart'; import '../library/database.dart'; import '../library/permissions.dart'; +import '../services/cache_manager.dart'; import '../services/navidrome_service.dart'; import '../services/offline_mode.dart'; import 'library_stats.dart'; @@ -17,11 +18,19 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { late final NavidromeService _navidrome = NavidromeService(); + late final CacheManager _cache = CacheManager(); + int _cacheSize = 0; @override void initState() { super.initState(); _navidrome.ladeGespeicherteZugangsdaten(); + _cache.init().then((_) => _updateCacheSize()); + } + + Future _updateCacheSize() async { + final size = await _cache.getCacheSize(); + if (mounted) setState(() => _cacheSize = size); } @override @@ -82,6 +91,18 @@ class _SettingsScreenState extends State { }, ), ), + ListTile( + leading: const Icon(Icons.storage), + title: const Text('🗄️ Cache-Speicher'), + subtitle: Text(_formatBytes(_cacheSize)), + trailing: _cacheSize > 0 + ? IconButton( + tooltip: 'Cache löschen', + icon: const Icon(Icons.delete), + onPressed: () => _clearCache(), + ) + : null, + ), const Divider(height: 1), const _SectionLabel('Berechtigungen'), ListTile( @@ -210,6 +231,22 @@ class _SettingsScreenState extends State { await _navidrome.loescheZugangsdaten(); if (mounted) setState(() {}); } + + Future _clearCache() async { + await _cache.clearCache(); + if (mounted) { + setState(() => _cacheSize = 0); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Cache gelöscht')), + ); + } + } + + String _formatBytes(int bytes) { + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; + return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB'; + } } /// Kleine graue Überschrift über einer Einstellungs-Gruppe.