feat(settings): Cache-Status UI + Clear-Button (Phase 2)

- 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 
This commit is contained in:
Hermes (Server)
2026-08-19 19:04:47 +02:00
parent 0635c92d22
commit 2548e38af9
+37
View File
@@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import '../library/database.dart'; import '../library/database.dart';
import '../library/permissions.dart'; import '../library/permissions.dart';
import '../services/cache_manager.dart';
import '../services/navidrome_service.dart'; import '../services/navidrome_service.dart';
import '../services/offline_mode.dart'; import '../services/offline_mode.dart';
import 'library_stats.dart'; import 'library_stats.dart';
@@ -17,11 +18,19 @@ class SettingsScreen extends StatefulWidget {
class _SettingsScreenState extends State<SettingsScreen> { class _SettingsScreenState extends State<SettingsScreen> {
late final NavidromeService _navidrome = NavidromeService(); late final NavidromeService _navidrome = NavidromeService();
late final CacheManager _cache = CacheManager();
int _cacheSize = 0;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_navidrome.ladeGespeicherteZugangsdaten(); _navidrome.ladeGespeicherteZugangsdaten();
_cache.init().then((_) => _updateCacheSize());
}
Future<void> _updateCacheSize() async {
final size = await _cache.getCacheSize();
if (mounted) setState(() => _cacheSize = size);
} }
@override @override
@@ -82,6 +91,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
}, },
), ),
), ),
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 Divider(height: 1),
const _SectionLabel('Berechtigungen'), const _SectionLabel('Berechtigungen'),
ListTile( ListTile(
@@ -210,6 +231,22 @@ class _SettingsScreenState extends State<SettingsScreen> {
await _navidrome.loescheZugangsdaten(); await _navidrome.loescheZugangsdaten();
if (mounted) setState(() {}); if (mounted) setState(() {});
} }
Future<void> _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. /// Kleine graue Überschrift über einer Einstellungs-Gruppe.