Nachrichten: Ungelesene Anzahl als rote Badges anzeigen #110

Closed
opened 2026-05-18 14:48:59 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-18 14:48:59 +00:00 (Migrated from github.com)

Ziel

Die reine Anzahl ungelesener Nachrichten soll als rote Badge-Zahl sichtbar sein:

  • am Launcher-App-Icon (wie bei WhatsApp)
  • im App-Header auf dem Nachrichten-Icon
  • in der Chatliste je Chat oben rechts beim Usernamen

Scope

  • Launcher-Badge mit Gesamtzahl ungelesener Nachrichten
  • In-App-Badge auf dem Nachrichten-Icon (Header)
  • Pro-Chat-Badge in der Chatliste (roter Kreis mit Zahl)

Aktualisierung (wichtig)

Die Badges müssen laufend und zuverlässig aktualisiert werden bei:

  • neuen eingehenden Nachrichten
  • Lesen/Markieren als gelesen
  • App-Start und App-Resume (Foreground)
  • Login-/User-Wechsel
  • erfolgreicher Synchronisierung

UX/Visual

  • Badge immer als roter Kreis mit weißer Zahl
  • Bei großen Werten: Anzeige als 99+
  • Bei 0 ungelesenen Nachrichten: Badge ausblenden
  • Konsistente Darstellung an allen drei Stellen

Akzeptanzkriterien

  • Gesamtzahl am Launcher entspricht Summe aller ungelesenen Nachrichten
  • Header-Badge entspricht derselben Gesamtzahl in Echtzeit
  • Chat-Badges zeigen je Chat die korrekte ungelesene Anzahl
  • Badges aktualisieren ohne manuellen Refresh
  • Nach Lesen einer Nachricht sinkt die Zahl sofort
  • Nach Login-Wechsel werden Werte korrekt neu geladen

Technische Hinweise

  • Android Launcher Badge über Notification-Badge-Mechanismus; falls Herstellerabhängigkeit Probleme macht, Fallback prüfen
  • In Compose Material Badge-Komponente für Header- und Chat-Badges nutzen
  • Unread-Counts zentral im State/Repository führen (pro Chat + global aggregiert)
  • Aktualisierung über bestehende Flow/State-Updates der Nachrichtenquelle

Abgrenzung

  • Kein Redesign der gesamten Chat-UI
  • Keine neue Backend-Funktion, sofern bestehende Datenbasis unread-Status bereits liefert
  • Keine Push-Implementierung im Rahmen dieses Tickets
## Ziel Die reine Anzahl ungelesener Nachrichten soll als rote Badge-Zahl sichtbar sein: - am Launcher-App-Icon (wie bei WhatsApp) - im App-Header auf dem Nachrichten-Icon - in der Chatliste je Chat oben rechts beim Usernamen ## Scope - [ ] Launcher-Badge mit Gesamtzahl ungelesener Nachrichten - [ ] In-App-Badge auf dem Nachrichten-Icon (Header) - [ ] Pro-Chat-Badge in der Chatliste (roter Kreis mit Zahl) ## Aktualisierung (wichtig) Die Badges müssen laufend und zuverlässig aktualisiert werden bei: - neuen eingehenden Nachrichten - Lesen/Markieren als gelesen - App-Start und App-Resume (Foreground) - Login-/User-Wechsel - erfolgreicher Synchronisierung ## UX/Visual - Badge immer als roter Kreis mit weißer Zahl - Bei großen Werten: Anzeige als `99+` - Bei `0` ungelesenen Nachrichten: Badge ausblenden - Konsistente Darstellung an allen drei Stellen ## Akzeptanzkriterien - [ ] Gesamtzahl am Launcher entspricht Summe aller ungelesenen Nachrichten - [ ] Header-Badge entspricht derselben Gesamtzahl in Echtzeit - [ ] Chat-Badges zeigen je Chat die korrekte ungelesene Anzahl - [ ] Badges aktualisieren ohne manuellen Refresh - [ ] Nach Lesen einer Nachricht sinkt die Zahl sofort - [ ] Nach Login-Wechsel werden Werte korrekt neu geladen ## Technische Hinweise - Android Launcher Badge über Notification-Badge-Mechanismus; falls Herstellerabhängigkeit Probleme macht, Fallback prüfen - In Compose Material Badge-Komponente für Header- und Chat-Badges nutzen - Unread-Counts zentral im State/Repository führen (pro Chat + global aggregiert) - Aktualisierung über bestehende Flow/State-Updates der Nachrichtenquelle ## Abgrenzung - Kein Redesign der gesamten Chat-UI - Keine neue Backend-Funktion, sofern bestehende Datenbasis unread-Status bereits liefert - Keine Push-Implementierung im Rahmen dieses Tickets
jreinemann-euris commented 2026-05-18 16:29:05 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-18)

Zyklen: 1 Implementierungszyklus + Code-Review-Korrekturen
Tests: 328 Tests, 0 Fehler

Implementierte Artefakte

  • DB-Migration 7→8: \is_read-Spalte in \messages-Tabelle (AutoMigration; bestehende Rows: \is_read = 1)
  • MessageDao: 3 neue Queries (\getUnreadCountsBySender, \getTotalUnreadCount, \markConversationAsRead)
  • MessageRepository/Impl: \ otalUnreadCount: Flow\ + \getUnreadCountsBySender()\ + \markConversationAsRead(); reaktiv über \observeString(AuthUserId).flatMapLatest\
  • ChatViewModel: \markConversationAsRead\ beim Öffnen des Chats und bei jeder neuen Nachricht
  • UserListViewModel: \unreadCounts: StateFlow<Map<String, Int>>\
  • UserListScreen: Roter Badge pro Chat in der Chatliste (Material3 \BadgedBox; 99+ für große Werte)
  • MainViewModel: \ otalUnreadCount: StateFlow\
  • MainScreen: \BadgedBox\ am Nachrichten-Icon in der Bottom Navigation Bar
  • NotificationHelper: \updateBadgeCount(count)\ für Launcher-Badge (setzt \setNumber()\ auf Summary-Notification; cancelbar bei count=0)
  • Tests: neue Assertions für \isRead = false\ bei eingehenden Nachrichten + \markConversationAsRead-Test

Abweichungen

  • System-Nachrichten (⚙️ System) werden als \isRead = true\ gespeichert – sie lösen keinen Badge-Zähler aus
## Abgeschlossen (2026-05-18) **Zyklen:** 1 Implementierungszyklus + Code-Review-Korrekturen **Tests:** ✅ 328 Tests, 0 Fehler ### Implementierte Artefakte - ✅ **DB-Migration 7→8**: \is_read\-Spalte in \messages\-Tabelle (AutoMigration; bestehende Rows: \is_read = 1\) - ✅ **MessageDao**: 3 neue Queries (\getUnreadCountsBySender\, \getTotalUnreadCount\, \markConversationAsRead\) - ✅ **MessageRepository/Impl**: \ otalUnreadCount: Flow<Int>\ + \getUnreadCountsBySender()\ + \markConversationAsRead()\; reaktiv über \observeString(AuthUserId).flatMapLatest\ - ✅ **ChatViewModel**: \markConversationAsRead\ beim Öffnen des Chats und bei jeder neuen Nachricht - ✅ **UserListViewModel**: \unreadCounts: StateFlow<Map<String, Int>>\ - ✅ **UserListScreen**: Roter Badge pro Chat in der Chatliste (Material3 \BadgedBox\; 99+ für große Werte) - ✅ **MainViewModel**: \ otalUnreadCount: StateFlow<Int>\ - ✅ **MainScreen**: \BadgedBox\ am Nachrichten-Icon in der Bottom Navigation Bar - ✅ **NotificationHelper**: \updateBadgeCount(count)\ für Launcher-Badge (setzt \setNumber()\ auf Summary-Notification; cancelbar bei count=0) - ✅ **Tests**: neue Assertions für \isRead = false\ bei eingehenden Nachrichten + \markConversationAsRead\-Test ### Abweichungen - System-Nachrichten (⚙️ System) werden als \isRead = true\ gespeichert – sie lösen keinen Badge-Zähler aus
Sign in to join this conversation.
No description provided.