import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; /// Nutzer-Einstellungen, die die ganze App betreffen. Werden beim Start /// einmal geladen und bei jeder Änderung sofort gespeichert. class AppSettings extends ChangeNotifier { static const _keyGroupCovers = 'gleiche_kategorie_gleiches_cover'; static const _keyAutoPlayHeadphones = 'autoplay_kopfhoerer'; static const _keyNormalizeVolume = 'gleiche_lautstaerke'; static const _keyCacheGrenze = 'cache_grenze_mb'; /// Voreinstellung für den Zwischenspeicher: 2 GB. Groß genug für einige /// hundert Titel, klein genug, um ein Telefon nicht zuzumüllen. static const cacheGrenzeStandardMb = 2048; /// Zur Auswahl stehende Grenzen in MB. 0 heißt: gar nicht zwischenspeichern. static const cacheGrenzenMb = [0, 512, 1024, 2048, 4096, 8192]; bool _groupCoversByCategory = true; bool _autoPlayOnHeadphones = false; bool _normalizeVolume = true; int _cacheGrenzeMb = cacheGrenzeStandardMb; /// "Gleiche Kategorie = gleiches Coverbild" — an: das Cover kommt von der /// ersten Kategorie des Songs, aus: jeder Song zeigt sein eigenes Bild. bool get groupCoversByCategory => _groupCoversByCategory; /// Wiedergabe automatisch starten, sobald Kopfhörer verbunden werden. bool get autoPlayOnHeadphones => _autoPlayOnHeadphones; /// "Gleiche Lautstärke": laute Titel werden anhand ihres ReplayGain-Tags /// auf das Niveau der leiseren abgesenkt. bool get normalizeVolume => _normalizeVolume; /// Obergrenze des Zwischenspeichers in MB. Gilt nur für das, was beim /// Abspielen nebenbei anfällt — bewusst heruntergeladene Titel liegen in /// einem eigenen Ordner und werden nie verdrängt. int get cacheGrenzeMb => _cacheGrenzeMb; int get cacheGrenzeBytes => _cacheGrenzeMb * 1024 * 1024; Future init() async { final prefs = await SharedPreferences.getInstance(); _groupCoversByCategory = prefs.getBool(_keyGroupCovers) ?? true; _autoPlayOnHeadphones = prefs.getBool(_keyAutoPlayHeadphones) ?? false; _normalizeVolume = prefs.getBool(_keyNormalizeVolume) ?? true; _cacheGrenzeMb = prefs.getInt(_keyCacheGrenze) ?? cacheGrenzeStandardMb; notifyListeners(); } Future setCacheGrenzeMb(int mb) async { if (_cacheGrenzeMb == mb) return; _cacheGrenzeMb = mb; notifyListeners(); final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_keyCacheGrenze, mb); } Future setGroupCoversByCategory(bool value) async { if (_groupCoversByCategory == value) return; _groupCoversByCategory = value; notifyListeners(); final prefs = await SharedPreferences.getInstance(); await prefs.setBool(_keyGroupCovers, value); } Future setNormalizeVolume(bool value) async { if (_normalizeVolume == value) return; _normalizeVolume = value; notifyListeners(); final prefs = await SharedPreferences.getInstance(); await prefs.setBool(_keyNormalizeVolume, value); } Future setAutoPlayOnHeadphones(bool value) async { if (_autoPlayOnHeadphones == value) return; _autoPlayOnHeadphones = value; notifyListeners(); final prefs = await SharedPreferences.getInstance(); await prefs.setBool(_keyAutoPlayHeadphones, value); } }