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:
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user