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'
This commit is contained in:
Dustin
2026-08-05 11:03:03 +02:00
parent 73aed70edd
commit 187b26603b
5 changed files with 58 additions and 53 deletions
+1 -1
View File
@@ -419,7 +419,7 @@ class _EntwicklerScreenState extends State<EntwicklerScreen> {
padding: const EdgeInsets.all(16),
children: [
_infoKarte([
('Version', 'v2.51'),
('Version', 'v2.52.3'),
('Session', MeloLogger().sessionId.isEmpty ? '' : MeloLogger().sessionId),
('Songs in DB', _songAnzahl < 0 ? '' : '$_songAnzahl'),
('Auth-Server', AppConfig.authUrl),
+19 -3
View File
@@ -20,6 +20,7 @@ import 'erweitert_screen.dart';
import '../services/cloud_service.dart';
import '../services/player_service.dart';
import '../services/auth_service.dart';
import '../services/sync_service.dart';
import '../config/app_config.dart';
class MeloHome extends StatefulWidget {
@@ -54,14 +55,23 @@ class _MeloHomeState extends State<MeloHome> {
});
// Cloud-Verbindung beim App-Start herstellen (feuern-und-vergessen).
_cloud.verbinde();
// Tipp auf die Sync-Abschluss-/Fehler-Notification → Cloud-Tab öffnen
SyncService.syncBenachrichtigungGetippt.addListener(_syncNotifGetippt);
}
@override
void dispose() {
SyncService.syncBenachrichtigungGetippt.removeListener(_syncNotifGetippt);
_vm.dispose();
super.dispose();
}
/// Öffnet den Cloud-Tab, wenn die Sync-Notification getippt wurde.
void _syncNotifGetippt() {
if (!mounted) return;
setState(() => _aktiverTab = 3);
}
// ─── Navigation ─────────────────────────────────────
/// Öffnet den Now-Playing-Fullscreen mit Slide-up-Animation
@@ -415,7 +425,9 @@ class _MeloHomeState extends State<MeloHome> {
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: _vm,
// _vm (Songs/Status), _cloud (Verbindung) UND SyncService.laeuftNotifier
// (☁️-Chip pulsiert bei laufendem Sync, auch im Hintergrund)
listenable: Listenable.merge([_vm, _cloud, SyncService.laeuftNotifier]),
builder: (_, _) {
if (_vm.ladt) {
return const Scaffold(
@@ -454,7 +466,11 @@ class _MeloHomeState extends State<MeloHome> {
onSearch: _zeigeSuche,
onServer: _zeigeMusikserverDetail,
serverVerbunden: _vm.navidrome.istVerbunden,
serverSyncLaeuft: _cloud.status == CloudStatus.verbinde || _vm.serverLadt,
// Chip pulsiert während des Syncs (SyncService-Läuft-Signal),
// beim Verbinden und solange der Server lädt.
serverSyncLaeuft: SyncService.laeuftNotifier.value ||
_cloud.status == CloudStatus.verbinde ||
_vm.serverLadt,
),
Expanded(
child: ListView(
@@ -1059,7 +1075,7 @@ class _MeloHomeState extends State<MeloHome> {
),
child: Column(
children: [
_infoZeile('Version', '2.51'),
_infoZeile('Version', '2.52.3'),
const Divider(color: MeloTheme.dunkel2, height: 1),
_infoZeile('Theme', 'Schwarz + Rot'),
const Divider(color: MeloTheme.dunkel2, height: 1),
+1 -1
View File
@@ -138,7 +138,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
),
child: Column(
children: [
_infoZeile('Version', '2.51'),
_infoZeile('Version', '2.52.3'),
const Divider(color: MeloTheme.dunkel2, height: 1),
_infoZeile('Theme', 'Schwarz + Rot'),
const Divider(color: MeloTheme.dunkel2, height: 1),