Sync-Statusanzeige: Live-Verbindungsstatus, Aktivitaets-Feed & Robustheit #94

Closed
opened 2026-05-17 13:43:54 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-17 13:43:54 +00:00 (Migrated from github.com)

Kontext

Die Sync-Kommunikation (WebSocket, Pull/Push) läuft im Hintergrund, aber der User sieht nicht, was passiert. Unter „Server-Synchronisierung" in den Einstellungen soll eine Live-Statusanzeige stehen, die den aktuellen Zustand der Verbindung und alle Sync-Aktivitäten transparent macht.

Akzeptanzkriterien

1. Verbindungsstatus-Anzeige

  • Verbunden: Grüner Punkt + „Verbunden" wenn WebSocket-Verbindung steht und idle
  • Verbinde…: Gelber Punkt + „Verbinde…" während des initialen Verbindungsaufbaus
  • Keine Verbindung: Roter Punkt + „Keine Verbindung – nächster Versuch in X Sek." wenn Server nicht erreichbar, aber Credentials vorhanden
    • Countdown-Timer zeigt die verbleibende Zeit bis zum nächsten Reconnect-Versuch
    • Timer aktualisiert sich jede Sekunde
  • Nicht konfiguriert: Grauer Punkt + „Nicht angemeldet" wenn keine Credentials vorhanden

2. Aktivitäts-Feed (Sync-Aktivitäten)

  • Sync-Aktivitäten werden als kurze Status-Texte unter dem Verbindungsstatus angezeigt
  • Typische Meldungen:
    • „Empfange Inventar-Update…" (während Pull/WebSocket-Event)
    • „Sende Änderung…" (während PATCH/DELETE an Server)
    • „Inventar synchronisiert" (nach erfolgreichem Pull)
    • „Änderung gesendet" (nach erfolgreichem Push eines Items)
    • „X Änderungen in Warteschlange" (wenn Offline-Queue nicht leer ist)
    • „Fehler: [Fehlermeldung]" (bei Sync-Fehlern, rot)
  • Meldungen bleiben 3 Sekunden nach Ende des Vorgangs sichtbar
  • Timer-Reset: Kommt während der 3-Sekunden-Wartezeit eine neue Aktivität, wird der Timer zurückgesetzt und die neue Meldung angezeigt
  • Nach Ablauf des Timers: Zurück zu „Verbunden" (oder jeweiliger Verbindungsstatus)

3. Robustheit der Sync-Prozesse

  • Alle Sync-Operationen (pullSync, pushSync, patchItem, deleteItem) in try/catch mit UI-Feedback
  • Netzwerk-Timeouts: Klare Fehlermeldung statt stilles Scheitern
  • WebSocket-Reconnect: Backoff-Timer im UI sichtbar machen (aktuelle Implementierung hat Backoff, aber der User sieht es nicht)
  • Offline-Queue: Anzahl wartender Operationen im Status anzeigen
  • Kein Deadlock/Endlosloop bei wiederholten Fehlern – nach max. Retries klare Meldung

4. UI-Design

  • Kompakte Darstellung: Farbiger Punkt (●) + Statustext in einer Zeile
  • Aktivitäts-Text darunter in bodySmall, dezent animiert (Fade-in/out)
  • Letzte Synchronisierung-Timestamp bleibt erhalten (wie bisher)
  • „Jetzt synchronisieren"-Fallback-Button bleibt erhalten

Technische Hinweise

  • SyncStatus sealed class erweitern oder durch detaillierteres Modell ersetzen (z.B. ConnectionState + SyncActivity)
  • WebSocket-Reconnect-Timer ist in WebSocketClientImpl bereits implementiert (exponential backoff 2s→60s) – muss als Flow/State nach außen exponiert werden
  • PendingSyncOpDao.getCount() für Queue-Größe nutzen
  • Für den 3-Sekunden-Timer: delay(3000) + Job-Tracking im ViewModel
  • Compose-Animation: AnimatedVisibility oder animateContentSize für Statuswechsel
## Kontext Die Sync-Kommunikation (WebSocket, Pull/Push) läuft im Hintergrund, aber der User sieht nicht, was passiert. Unter „Server-Synchronisierung" in den Einstellungen soll eine **Live-Statusanzeige** stehen, die den aktuellen Zustand der Verbindung und alle Sync-Aktivitäten transparent macht. ## Akzeptanzkriterien ### 1. Verbindungsstatus-Anzeige - [ ] **Verbunden**: Grüner Punkt + „Verbunden" wenn WebSocket-Verbindung steht und idle - [ ] **Verbinde…**: Gelber Punkt + „Verbinde…" während des initialen Verbindungsaufbaus - [ ] **Keine Verbindung**: Roter Punkt + „Keine Verbindung – nächster Versuch in X Sek." wenn Server nicht erreichbar, aber Credentials vorhanden - Countdown-Timer zeigt die verbleibende Zeit bis zum nächsten Reconnect-Versuch - Timer aktualisiert sich jede Sekunde - [ ] **Nicht konfiguriert**: Grauer Punkt + „Nicht angemeldet" wenn keine Credentials vorhanden ### 2. Aktivitäts-Feed (Sync-Aktivitäten) - [ ] Sync-Aktivitäten werden als kurze Status-Texte unter dem Verbindungsstatus angezeigt - [ ] Typische Meldungen: - „Empfange Inventar-Update…" (während Pull/WebSocket-Event) - „Sende Änderung…" (während PATCH/DELETE an Server) - „Inventar synchronisiert" (nach erfolgreichem Pull) - „Änderung gesendet" (nach erfolgreichem Push eines Items) - „X Änderungen in Warteschlange" (wenn Offline-Queue nicht leer ist) - „Fehler: [Fehlermeldung]" (bei Sync-Fehlern, rot) - [ ] Meldungen bleiben **3 Sekunden nach Ende des Vorgangs** sichtbar - [ ] Timer-Reset: Kommt während der 3-Sekunden-Wartezeit eine neue Aktivität, wird der Timer zurückgesetzt und die neue Meldung angezeigt - [ ] Nach Ablauf des Timers: Zurück zu „Verbunden" (oder jeweiliger Verbindungsstatus) ### 3. Robustheit der Sync-Prozesse - [ ] Alle Sync-Operationen (pullSync, pushSync, patchItem, deleteItem) in try/catch mit UI-Feedback - [ ] Netzwerk-Timeouts: Klare Fehlermeldung statt stilles Scheitern - [ ] WebSocket-Reconnect: Backoff-Timer im UI sichtbar machen (aktuelle Implementierung hat Backoff, aber der User sieht es nicht) - [ ] Offline-Queue: Anzahl wartender Operationen im Status anzeigen - [ ] Kein Deadlock/Endlosloop bei wiederholten Fehlern – nach max. Retries klare Meldung ### 4. UI-Design - [ ] Kompakte Darstellung: Farbiger Punkt (●) + Statustext in einer Zeile - [ ] Aktivitäts-Text darunter in `bodySmall`, dezent animiert (Fade-in/out) - [ ] Letzte Synchronisierung-Timestamp bleibt erhalten (wie bisher) - [ ] „Jetzt synchronisieren"-Fallback-Button bleibt erhalten ## Technische Hinweise - `SyncStatus` sealed class erweitern oder durch detaillierteres Modell ersetzen (z.B. `ConnectionState` + `SyncActivity`) - WebSocket-Reconnect-Timer ist in `WebSocketClientImpl` bereits implementiert (exponential backoff 2s→60s) – muss als Flow/State nach außen exponiert werden - `PendingSyncOpDao.getCount()` für Queue-Größe nutzen - Für den 3-Sekunden-Timer: `delay(3000)` + `Job`-Tracking im ViewModel - Compose-Animation: `AnimatedVisibility` oder `animateContentSize` für Statuswechsel
jreinemann-euris commented 2026-05-17 14:03:12 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-17)

Zyklen: 1
Tests: 306 Tests, 0 Fehler

Implementierte Artefakte

  • ConnectionState: Sealed interface (Connected/Connecting/Disconnected mit Countdown/NotConfigured)
  • WebSocketClientImpl: connectionState StateFlow mit sekündlichem Reconnect-Countdown
  • SyncActivityMessage: Aktivitäts-Feed-Modell (ReceivingUpdate/SendingChange/InventorySynced/ChangeSent/QueuePending/Error)
  • PendingSyncOpDao.getCount(): Reaktive Queue-Größe als Flow
  • SettingsViewModel: Connection-State-Beobachtung, Activity-Feed mit 3-Sek-Auto-Dismiss (Job-Reset)
  • SettingsScreen: Farbiger Punkt (●) + Statustext, AnimatedVisibility für Feed, Countdown-Anzeige

Abweichungen

keine

## Abgeschlossen (2026-05-17) **Zyklen:** 1 **Tests:** ✅ 306 Tests, 0 Fehler ### Implementierte Artefakte - ✅ ConnectionState: Sealed interface (Connected/Connecting/Disconnected mit Countdown/NotConfigured) - ✅ WebSocketClientImpl: connectionState StateFlow mit sekündlichem Reconnect-Countdown - ✅ SyncActivityMessage: Aktivitäts-Feed-Modell (ReceivingUpdate/SendingChange/InventorySynced/ChangeSent/QueuePending/Error) - ✅ PendingSyncOpDao.getCount(): Reaktive Queue-Größe als Flow - ✅ SettingsViewModel: Connection-State-Beobachtung, Activity-Feed mit 3-Sek-Auto-Dismiss (Job-Reset) - ✅ SettingsScreen: Farbiger Punkt (●) + Statustext, AnimatedVisibility für Feed, Countdown-Anzeige ### Abweichungen keine
Sign in to join this conversation.
No description provided.