Tab-Reihenfolge, konfigurierbare Meine-Musik-Sektionen, Berechtigungen beim Start, schärferes Sperrbildschirm-Cover

- Tabs: Meine Musik, Suchen, Download, Favoriten (vorher Download vor Suchen)
- "Meine Musik": Schnellzugriffe (Favoriten/Wiedergabelisten/Zuletzt) einzeln
  über die Einstellungen abschaltbar
- Audio- und Benachrichtigungs-Berechtigung werden jetzt beim ersten Start
  gemeinsam angefragt statt erst bei Bedarf; Hinweisbanner + Einstellungen-
  Button bei dauerhafter Verweigerung (auch für Benachrichtigungen neu)
- Cover-Extraktion beim Android-Scan von 512px auf 1024px erhöht, für ein
  schärferes Cover im Sperrbildschirm
- Fix: notifyListeners() in LibraryService nur noch bei echter Wertänderung
  (verhinderte einen Test-Hang durch den neuen Start-Berechtigungs-Aufruf)

557 Tests grün, flutter analyze ohne Befund.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VM2JK5mV7AL1g2Rt6H6h9w
This commit is contained in:
Hermes (Server)
2026-08-25 14:17:13 +02:00
co-authored by Claude Sonnet 5
parent 54cb523cf4
commit da012a3dca
12 changed files with 364 additions and 73 deletions
+20 -2
View File
@@ -25,8 +25,23 @@ class LibraryService extends ChangeNotifier {
int scanDone = 0;
int scanTotal = 0;
bool permissionDenied = false;
bool notificationPermissionDenied = false;
String? scanError;
/// Fragt beim ersten Start alle für den Betrieb nötigen Berechtigungen an
/// (Musik-Zugriff + Wiedergabe-Benachrichtigung), statt sie erst bei Bedarf
/// einzeln einzufordern.
///
/// Nacheinander, nicht gleichzeitig: `permission_handler` wirft, wenn eine
/// zweite Abfrage startet, während die erste noch offen ist.
Future<void> ensureStartupPermissions() async {
await _ensurePermission();
final denied = !await ensureNotificationPermission();
if (denied == notificationPermissionDenied) return;
notificationPermissionDenied = denied;
notifyListeners();
}
/// Auf Android: automatischer Geräte-Scan. Auf Desktop: Ordner wählen + scannen.
Future<void> pickFolderAndScan() async {
if (!await _ensurePermission()) return;
@@ -52,8 +67,11 @@ class LibraryService extends ChangeNotifier {
Future<bool> _ensurePermission() async {
final granted = await ensureAudioPermission();
permissionDenied = !granted;
notifyListeners();
final denied = !granted;
if (denied != permissionDenied) {
permissionDenied = denied;
notifyListeners();
}
return granted;
}