Sperrbildschirm und ReplayGain - DB-Schema 6: lyrics + gain_db - Songtext bevorzugt lokalen Tag, Server nur als Rueckfall; Song-ID-Bug beim Lyrics-Aufruf behoben - "Als Naechstes spielen" / "Zur Warteschlange hinzufuegen" ohne Eingriff in Favoriten oder Wiedergabelisten - songToMediaItem nimmt eine Cover-Vorgabe: Sperrbildschirm zeigt das Kategorie-Cover - ReplayGain: Tags werden gelesen, laute Titel abgesenkt, abschaltbar Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
58 lines
2.2 KiB
Dart
58 lines
2.2 KiB
Dart
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';
|
|
|
|
bool _groupCoversByCategory = true;
|
|
bool _autoPlayOnHeadphones = false;
|
|
bool _normalizeVolume = true;
|
|
|
|
/// "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;
|
|
|
|
Future<void> init() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
_groupCoversByCategory = prefs.getBool(_keyGroupCovers) ?? true;
|
|
_autoPlayOnHeadphones = prefs.getBool(_keyAutoPlayHeadphones) ?? false;
|
|
_normalizeVolume = prefs.getBool(_keyNormalizeVolume) ?? true;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> setGroupCoversByCategory(bool value) async {
|
|
if (_groupCoversByCategory == value) return;
|
|
_groupCoversByCategory = value;
|
|
notifyListeners();
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setBool(_keyGroupCovers, value);
|
|
}
|
|
|
|
Future<void> setNormalizeVolume(bool value) async {
|
|
if (_normalizeVolume == value) return;
|
|
_normalizeVolume = value;
|
|
notifyListeners();
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setBool(_keyNormalizeVolume, value);
|
|
}
|
|
|
|
Future<void> setAutoPlayOnHeadphones(bool value) async {
|
|
if (_autoPlayOnHeadphones == value) return;
|
|
_autoPlayOnHeadphones = value;
|
|
notifyListeners();
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setBool(_keyAutoPlayHeadphones, value);
|
|
}
|
|
}
|