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, - unregister token on logout,
- handle foreground push payload via existing notification service worker. - 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`. - 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, highlightedMessageId = highlighted,
) )
} }
acknowledgeLatestIncoming(messages) acknowledgeLatestMessages(messages)
} }
} }
} }
@@ -644,22 +644,20 @@ class ChatViewModel @Inject constructor(
} }
} }
private fun acknowledgeLatestIncoming(messages: List<MessageItem>) { private fun acknowledgeLatestMessages(messages: List<MessageItem>) {
val latestIncoming = messages val latestVisible = messages.maxByOrNull { it.id } ?: return
.asReversed() val latestIncoming = messages.asReversed().firstOrNull { !it.isOutgoing }
.firstOrNull { !it.isOutgoing }
?: return
if (lastDeliveredMessageId != latestIncoming.id) { if (latestIncoming != null && lastDeliveredMessageId != latestIncoming.id) {
lastDeliveredMessageId = latestIncoming.id lastDeliveredMessageId = latestIncoming.id
viewModelScope.launch { viewModelScope.launch {
markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id) markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id)
} }
} }
if (lastReadMessageId != latestIncoming.id) { if (lastReadMessageId != latestVisible.id) {
lastReadMessageId = latestIncoming.id lastReadMessageId = latestVisible.id
viewModelScope.launch { viewModelScope.launch {
markMessageReadUseCase(chatId = chatId, messageId = latestIncoming.id) markMessageReadUseCase(chatId = chatId, messageId = latestVisible.id)
} }
} }
} }