android: fix unread ack to use latest visible message
Some checks failed
Android CI / android (push) Has started running
Android Release / release (push) Has been cancelled
CI / test (push) Has been cancelled

This commit is contained in:
Codex
2026-03-09 23:25:20 +03:00
parent 28b549e53e
commit d54eb400c7
2 changed files with 14 additions and 10 deletions

View File

@@ -700,3 +700,9 @@
- unregister token on logout,
- handle foreground push payload via existing notification service worker.
- Added required env keys to `web/.env.example` and backend Firebase env keys to root `.env.example`.
### Step 106 - Unread counter stabilization in Chat screen
- Fixed read acknowledgement strategy in `ChatViewModel`:
- read status is now acknowledged by the latest visible message id in chat (not only latest incoming),
- delivery status still uses latest incoming message.
- This removes cases where unread badge reappears after chat list refresh because the previous read ack used an outdated incoming id.

View File

@@ -571,7 +571,7 @@ class ChatViewModel @Inject constructor(
highlightedMessageId = highlighted,
)
}
acknowledgeLatestIncoming(messages)
acknowledgeLatestMessages(messages)
}
}
}
@@ -644,22 +644,20 @@ class ChatViewModel @Inject constructor(
}
}
private fun acknowledgeLatestIncoming(messages: List<MessageItem>) {
val latestIncoming = messages
.asReversed()
.firstOrNull { !it.isOutgoing }
?: return
private fun acknowledgeLatestMessages(messages: List<MessageItem>) {
val latestVisible = messages.maxByOrNull { it.id } ?: return
val latestIncoming = messages.asReversed().firstOrNull { !it.isOutgoing }
if (lastDeliveredMessageId != latestIncoming.id) {
if (latestIncoming != null && lastDeliveredMessageId != latestIncoming.id) {
lastDeliveredMessageId = latestIncoming.id
viewModelScope.launch {
markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id)
}
}
if (lastReadMessageId != latestIncoming.id) {
lastReadMessageId = latestIncoming.id
if (lastReadMessageId != latestVisible.id) {
lastReadMessageId = latestVisible.id
viewModelScope.launch {
markMessageReadUseCase(chatId = chatId, messageId = latestIncoming.id)
markMessageReadUseCase(chatId = chatId, messageId = latestVisible.id)
}
}
}