Fuenf P0-Fehler behoben: Benachrichtigung, Offline, Cover, Warteschlange

Ergebnis einer Durchsicht der App gegen den Massstab "Apple Music".
Alle fuenf Punkte waren keine fehlenden Funktionen, sondern Versprechen,
die die Oberflaeche gab und der Code nicht hielt.

- POST_NOTIFICATIONS fehlte im Manifest. Auf Android 13+ blieb die
  Wiedergabe-Benachrichtigung dadurch unsichtbar. Das Recht wird erst
  erfragt, wenn wirklich ein Titel laeuft.
- Der Offline-Schalter wurde nirgends gelesen. Er greift jetzt an allen
  drei Wegen in die Warteschlange; uebersprungene Titel werden benannt.
- CoverImage kannte nur file://, und der Server-Browser gab die
  Cover-Adresse gar nicht erst mit. Server-Titel waren deshalb immer ein
  graues Notensymbol.
- Warteschlange entfernen/umsortieren baute die ganze Queue neu auf:
  hoerbarer Aussetzer und doppelte Wiedergabe-Zaehlung. Jetzt mutiert nur
  der betroffene Eintrag, die Buchfuehrung steht vor dem Player.
- Das Herz bei Server-Titeln legte einen Favoriten mit leerer Kennung an,
  der nie in der Liste auftauchte. Es ist jetzt ausgegraut.

Nachgebessert aus dem Code-Review: Offline-Meldung an die Stelle geholt,
wo sie greifen kann; Queue-Buchfuehrung vor den Player gezogen;
Fehlerpfad fuer die Berechtigungs-Abfrage ergaenzt.

360 Tests gruen (vorher 328), flutter analyze ohne Befund, Release-APK
gebaut und POST_NOTIFICATIONS darin nachgeprueft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xAHJTJM6UUqmjUgk1PUEd
This commit is contained in:
Hermes (Server)
2026-08-23 18:34:26 +02:00
co-authored by Claude Opus 5
parent 34d6d8e52a
commit e6d5f1c9ee
21 changed files with 1222 additions and 232 deletions
+87
View File
@@ -5,6 +5,93 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
## [Unreleased]
### 🚑 Fünf P0-Fehler behoben: Benachrichtigung, Offline, Cover, Warteschlange (2026-08-23)
Ergebnis einer vollständigen Durchsicht der App gegen den Maßstab „Apple
Music". Fünf Punkte waren keine fehlenden Funktionen, sondern **Versprechen,
die die App gab und der Code nicht hielt**.
- 🔔 **Die Wiedergabe-Benachrichtigung erschien auf Android 13+ gar nicht.**
Dafür braucht das System die Berechtigung `POST_NOTIFICATIONS` — sie fehlte
im Manifest, auch im fertig gebauten APK. Die Musik lief, aber Notification
und die Bedienknöpfe darin blieben unsichtbar; steuern ließ sich nur in der
geöffneten App. Die Berechtigung ist jetzt drin und wird **erst dann**
erfragt, wenn wirklich ein Titel läuft — beim kalten Start käme die Frage
ohne Zusammenhang, und zweimal weggetippt sperrt Android sie dauerhaft.
- 📴 **Der Offline-Schalter tat nichts.** Er speicherte brav ein Ja/Nein, aber
**niemand las es**: die App streamte weiter und verbrauchte Mobilfunkdaten,
obwohl „Offline-Modus" anstand. Jetzt greift er an allen drei Wegen in die
Warteschlange — Abspielen, „Als Nächstes", „Zur Warteschlange". Titel vom
Gerät laufen immer, Titel vom Server nur, wenn sie schon hier liegen. Was
übersprungen wird, sagt die App: *„Offline-Modus: 3 Titel übersprungen —
nicht heruntergeladen"*, statt still eine kürzere Liste zu spielen.
- 🖼️ **Titel vom Server hatten nie ein Coverbild.** Die App konnte Cover nur
aus Dateien laden; das Bild vom Navidrome-Server liegt aber hinter einer
Web-Adresse. Jeder Server-Titel war deshalb ein graues Notensymbol — in der
Liste, im Player, auf dem Sperrbildschirm. Jetzt lädt die App auch
Web-Cover, und der Server-Browser gibt die Adresse überhaupt erst mit
(vorher wurde sie an beiden Stellen schlicht vergessen).
- ⏭️ **Warteschlange umsortieren riss die Wiedergabe auf.** Jedes Entfernen
und jedes Verschieben baute die *ganze* Warteschlange neu auf: hörbarer
Aussetzer, Sprung an den Titelanfang — und der laufende Titel wurde dabei
**jedes Mal erneut als Wiedergabe gezählt**. Die Sortierung „Wie oft
abgespielt" zählte damit Queue-Bedienung statt Hören. Jetzt wird nur der
eine betroffene Eintrag bewegt; die Wiedergabe merkt davon nichts.
- 🤍 **Das Herz bei Server-Titeln log.** Ein Titel, der nur am Server liegt,
hat keinen Eintrag in der Bibliothek — das Herz bekam deshalb eine leere
Kennung, füllte sich beim Antippen und legte einen Favoriten an, der in der
Favoritenliste nie auftauchte. Es ist jetzt sichtbar ausgegraut, mit dem
Hinweis „Nur für Titel in deiner Bibliothek".
-**Nebenwirkung der Offline-Umstellung, aber eine gute:** „Als Nächstes"
und „Zur Warteschlange" sahen bisher gar nicht im Zwischenspeicher nach und
streamten einen Server-Titel auch dann, wenn er längst auf dem Gerät lag.
Alle drei Wege in die Warteschlange bauen die Abspielquelle jetzt an
derselben Stelle — ein bereits geladener Titel läuft immer von der Platte.
- 🧹 **Nebenbei:** „📴 Offline-Modus" heißt jetzt ohne Emoji „Offline-Modus"
(Emoji sehen auf jedem Hersteller-Handy anders aus und lassen sich nicht
einfärben), und der Untertitel sagt, was der Schalter wirklich tut.
- 🔍 **Aus dem Code-Review nachgebessert (drei Punkte):**
**(1)** Die Offline-Meldung hing an der falschen Stelle. Sie stand in der
Bibliotheksliste — die zeigt aber nur Titel vom Gerät, dort wird nie etwas
übersprungen. Beim Server-Album, wo es wirklich passiert, wurde sie
verworfen. Jetzt sitzt sie dort, wo sie greifen kann; und „nichts davon ist
heruntergeladen" erscheint nicht mehr als *„Fehler: …"* — das ist kein
Fehler, sondern die eingestellte Wahl.
**(2)** Beim Umsortieren wurde die Warteschlange erst *nach* dem Player
nachgeführt. In der Lücke dazwischen konnte der Player schon einen neuen
Titelindex melden, während die App noch die alte Liste kannte — falscher
Titel im Player, Wiedergabe für das falsche Lied gezählt. Buchführung steht
jetzt vor dem Player, genau wie beim normalen Abspielen.
**(3)** Die Abfrage der Benachrichtigungs-Berechtigung hatte keinen
Fehlerpfad. Läuft beim Start noch die Abfrage der Musik-Berechtigung, wirft
Android — das wäre als unbehandelter Fehler durchgeschlagen. Jetzt wird es
nur protokolliert; die Wiedergabe läuft weiter, nur eben ohne
Benachrichtigung.
-**Getestet:** 360 Tests grün (vorher 328), `flutter analyze` ohne Befund,
Release-APK gebaut. Im fertigen APK ist `POST_NOTIFICATIONS` nachgeprüft
enthalten. Neu: 39 Tests für Offline-Filter, Warteschlangen-Mutation,
Zähler-Nachführung, Server-Cover und das ausgegraute Herz. Entfallen: 9
Tests für `newPlayingIndex` — die Funktion gab es nur, um nach dem
Neuaufbau der Warteschlange den laufenden Titel wiederzufinden, und den
Neuaufbau gibt es nicht mehr.
- 📋 **Nicht in dieser Runde:** Alben-Ansicht, Suche über den Server,
gezieltes Herunterladen und die Cache-Obergrenze. Die stehen als P1 im
Review-Bericht unter `.ui-design/reviews/melo_vollwertigkeit_20260823.md`.
Dazu zwei Punkte, die erst bei dieser Arbeit auffielen und dort als **G9**
und **G10** stehen: `stop()` bricht den Positions-Timer dauerhaft ab (nach
dem Wegwischen der Benachrichtigung merkt sich die App keine Hörposition
mehr — vorbestehend), und die Server-Cover haben nur einen Zwischenspeicher
im Arbeitsspeicher, keinen auf der Platte.
### 🏷️ Der zweite Tab heißt wieder „Download" (2026-08-21)
- 📥 **Aus „Online" wird „Download".** Der Bereich behält seinen Inhalt