14 Commits
Author SHA1 Message Date
Dustin 8f9ed1ff53 v2.56.2 — Versions-String aktualisiert + sichtbare Version in Einstellungen 2026-08-06 20:08:55 +02:00
Dustin 489cb129b1 v2.56.1 — Code-Review-Fix: Settings verbindungsStatus korrigiert (CloudService()-Instanz hatte keinen echten Status → zeigt '–') 2026-08-06 20:01:19 +02:00
Dustin 79b15a3cb8 v2.56 — UI/Design-Rework: Melo Dark Fusion (neue Startseite, 2-stufige Einstellungen, Design-System)
- Design-System: MeloDesignTokens ThemeExtension, Outfit-Font, Farben #0B0B10/#14141C/#1C1C26
- Akzentfarbe-User-Einstellung behalten (MeloTheme.akzentNotifier), Gradient aus Akzent
- Startseite: Hero-Weiterhören-Karte mit Cover, Titel, Glow-Play-Button
- 2-stufige Einstellungen: Standard + Expertenmodus (SharedPreferences Key 'experten_modus')
- Komponenten: Pill-Buttons (radius 999), Card-Radius 20, Glow-Shadow, PressScale-Widget
- Login: Gradient-Button mit Akzent-Glow
- 199 Tests grün (194 bestehend + 5 neu): ThemeExtension, Expertenmodus, Akzent, PressScale, Hero
- flutter analyze lib/ + test/ = 0 Issues
- KEIN APK
2026-08-06 19:56:02 +02:00
Dustin b4d63509d1 v2.55.1 — Code-Review-Fixes: Singleton, Race-Conditions, Fallback-Timer, Log-Security
CRITICAL (C1): RealtimeSyncService jetzt Singleton (Factory-Pattern)
  - Verhindert doppelte SSE-Verbindungen durch home_screen + settings
  - UI-Notifier (istVerbundenNotifier) app-weit konsistent

HIGH (H1): _reconnecteOderFallback + starteWennAktiviert setzen
  cloud_interval vor starteAutoSyncTimer() — sonst bleibt Timer
  bei Fallback auf 0 (kein Sync)

HIGH (H2): Race-Condition in _verbinde() nach await request.close()
  — _pausiert-Flag re-check; bei true → clean exit mit _laeuft=false

HIGH (H3): fortsetzen() re-checkt _pausiert nach starteWennAktiviert()
  — verhindert Leak bei schnellem App-Umschalten

MEDIUM (M1): _syncModusSetzen stoppt SSE bei Wechsel auf manual/interval
  (vorher lief die Verbindung weiter)

MEDIUM (M2): Event-Logging loggt nur noch Event-Typ, nicht rohe Daten
  (Privacy: Song-IDs/Titel/Künstler nicht im Log)

LOW (L1): _verbinde() setzt _laeuft=false bei Token-Fehler (kein Deadlock)
2026-08-06 18:04:52 +02:00
Dustin 3f169fa1d9 v2.55 — Echtzeit-Cloud-Sync (SSE) mit 3 Modi: Echtzeit/Manuell/Zeit 2026-08-06 18:01:02 +02:00
Dustin 22ce611537 v2.53 — Sprint E: Recap-Zeiträume (Woche/Monat/Jahr)
## Recap-Zeiträume
- recap_service.dart: RecapZeitraum-Enum (woche/monat/jahr), berechne(zeitraum:, jetzt:) mit injizierbarem Historie-Loader (Tests ohne DB), Fallback-Kette Woche → Monat → Jahr → Gesamt-Historie, Zeitraum-Getter (kopfzeile, introTitel, introUntertitel, zeitraumLabel, shareTitel, Monatsname)
- recap_screen.dart: Zeitraum-Umschalter (7 Tage / Monat / Jahr) oben im Recap, dynamische Texte („Deine Woche in Musik“, „Abspielungen in dieser Woche“, „Melo Wochen-Recap“), Seiten-Reset bei Wechsel
- home_screen.dart: Recap-Karte „Recap 2026“ + „Woche · Monat · Jahr“-Untertitel
- settings_screen.dart: Kachel „Recap (Woche/Monat/Jahr)“
- test/recap_service_test.dart: 12 neue Tests (Filter, Fallback-Kette, Aggregation, Label-Getter)
- flutter analyze 0 Issues, Tests 123/123
2026-08-05 11:10:49 +02:00
Dustin bc3357bf72 v2.52.4 — Einstellungen (F4): Auto-Sync-Intervall, Sleep-Timer-Default, Wiedergabegeschwindigkeit, Akzentfarbe, Storage-Info 2026-08-05 11:05:55 +02:00
Dustin 187b26603b v2.52.3 — F3-Rest: ☁️-Chip-Puls + Auto-Sync-Timer app-weit
## Chip-Puls (home_screen)
- ListenableBuilder hört auf Listenable.merge([_vm, _cloud, SyncService.laeuftNotifier]) — der ☁️-Musikserver-Chip pulsiert jetzt bei laufendem Sync (auch im Hintergrund/Auto-Sync), nicht nur beim Verbinden/Laden
- serverSyncLaeuft = SyncService.laeuftNotifier.value || CloudStatus.verbinde || serverLadt

## Auto-Sync-Timer app-weit (main.dart)
- _starteAutoSyncFallsNoetig() entfernt (F3a: kein Sync beim App-Start); stattdessen SyncService.starteAutoSyncTimer() — Timer tickt erst nach dem Intervall, Fälligkeit via istSyncFaellig
- shared_preferences-Import aus main.dart entfernt (Intervall-Logik lebt in SyncService/CloudScreen)

## Sync-Notification
- Sync-Kanal de.baka.melo.sync wird in main() angelegt (Android 8+: Channel nötig, sonst erscheint die Notification nicht)
- onDidReceiveNotificationResponse: Tipp auf 'sync_fertig'/'sync_fehler' → SyncService.syncBenachrichtigungGetippt++ → MeloHome öffnet den Cloud-Tab

## Version
- Versionsanzeige 2.51 → 2.52.3 (settings/home/erweitert), MeloLogger.init('2.35') → '2.52.3'
2026-08-05 11:03:03 +02:00
Dustin 148ff4f21b v2.51.4 — Review-Fix MED-1: „Musik scannen“ aus Einstellungen startet Scanner
## MED-1 (settings_screen.dart)
- Erweitert-Push wird awaited; Ergebnis 'scanner' wird an MeloHome weitergereicht
- onScan-Closure poppt nur noch den Erweitert-Screen, SettingsScreen propagiert
  das Ergebnis per eigenem Navigator.pop (mit State-Context + mounted-Guard)
2026-08-05 08:09:43 +02:00
Dustin f886b0a42e v2.51.1 — Technik ausgelagert: Erweitert-Sektion (Logs, Diagnose, Entwickler, Scanner)
## Erweitert
- Neuer ErweitertScreen (lib/screens/erweitert_screen.dart): Logs, Diagnosedaten-Toggle, Entwickler, Musik scannen
- Neuer LogViewerScreen: In-Memory-Logbuch mit Kategorie-Filter (MeloLogger bekommt Anzeige-Puffer, der beim Senden nicht geleert wird)
- Neuer EntwicklerScreen: Version, Session-ID, DB-Songzahl, Server-URLs, Test-Log senden
- Einstellungen-Screen: 'Erweitert'-Sektion eingebaut, Diagnose-Toggle dorthin verschoben, Version auf 2.51

## Einstellungen
- 'Server verbinden' → 'Musikserver' umbenannt
- Abmelden/Info/Cloud Sync unverändert
2026-08-05 07:54:22 +02:00
Dustin 20ef788178 v2.46 — Jahres-Recap (Spotify-Wrapped-Stil) mit Hörstatistiken
## Neuer Recap-Screen
- lib/screens/recap_screen.dart: Full-Screen mit 7 animierten Seiten (Intro, Top 5 Songs, Top 3 Künstler, Hörzeit, häufigster Tag, Nachtaktive %, Gesamtzahl + Teilen)
- Wrapped-Stil: Verlaufs-Gradienten, große Zahlen mit Count-up-Animation, Fade+Scale-Seitenwechsel, Fortschritts-Punkte, Weiter-Button
- Teilen-Button kopiert Recap-Text in die Zwischenablage (kein neues Package)

## Datenbasis
- lib/services/recap_service.dart: aggregiert lokale Abspiel-Historie zu Top-5-Songs, Top-3-Künstler, Hörzeit, Wochentag, Nacht-%, Gesamtzahl
- Fallback auf Gesamt-Historie wenn im Zieljahr keine Daten; freundlicher Leer-Zustand ohne History

## DB + Tracking
- db_helper.dart: Migration v6→v7 mit neuer Tabelle abspiel_historie (song_id, played_at) + Backfill aus wiedergabe_verlauf
- player_service.dart: registriert jeden Abspielvorgang in der Historie

## Einstieg
- Home-Screen: Karte 'Jahres-Recap 2026' unter der Statistik-Card
- Einstellungen: Kachel 'Jahres-Recap' in Sektion Daten & Privatsphäre

flutter analyze: 0 Issues, Tests 4/4
2026-08-03 02:54:11 +02:00
Dustin 4a05c76199 fix: code-review findings — error handling, null safety, persist settings, auth header 2026-08-01 15:09:48 +02:00
Dustin 669a02304e fix: code-review warnings — deprecated APIs, debugPrint→Logger, unused import 2026-08-01 15:08:05 +02:00
Dustin 36c744d6e3 v2.31 — Login, Einstellungen & Cloud Sync Redesign
- Login-Screen im Melo-Design (Schwarz+Rot) mit Baka-Auth JWT
- AuthService fuer Token-Management ueber baka-net.de/auth
- Registrierungs-Modus + 'Ohne Login fortfahren'
- Navidrome-Credentials optional im Login aufklappbar

- SettingsScreen ersetzt AlertDialog
- BottomNav navigiert statt Dialog zu triggern
- Cloud Sync, Server verbinden, Diagnosedaten, App-Info, Abmelden

- CloudEinstellungen-Dialog entfernt, alles in CloudScreen konsolidiert
- Hardcode login('Baka','') entfernt → AuthService.benutzer
- Gradient-Statuskarte, animierte Segment-Intervall-Auswahl
- JWT Authorization statt Klartext-Passwort

- AppConfig: API-Key defaultValue entfernt (kein Fallback-Leak)
- Build crasht ohne --dart-define MELO_API_KEY

Build: split APK (arm64 19.6M, armeabi 17.1M, x86_64 21.1M)
2026-08-01 15:03:22 +02:00