From ebb95905b5e8e0a25067687d7391698a20f67ed7 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Sun, 22 Mar 2026 21:25:04 +0500 Subject: [PATCH] =?UTF-8?q?PacketRead=20parity:=20=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=B5=20read-=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=81=D1=8B=20=D0=B8=20update=20release=20notes=20?= =?UTF-8?q?1.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messenger/data/MessageRepository.kt | 48 +++++++++++-------- .../rosetta/messenger/data/ReleaseNotes.kt | 1 + .../messenger/database/MessageEntities.kt | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt b/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt index b524b41..cff36e0 100644 --- a/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt +++ b/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt @@ -975,20 +975,24 @@ class MessageRepository private constructor(private val context: Context) { val readCount = messageCache[dialogKey]?.value?.count { - it.isFromMe && - !it.isRead && - (it.deliveryStatus == DeliveryStatus.DELIVERED || - it.deliveryStatus == DeliveryStatus.READ) + it.isFromMe && !it.isRead } ?: 0 messageCache[dialogKey]?.let { flow -> flow.value = flow.value.map { msg -> - if (msg.isFromMe && - !msg.isRead && - (msg.deliveryStatus == DeliveryStatus.DELIVERED || - msg.deliveryStatus == DeliveryStatus.READ) - ) { - msg.copy(isRead = true, deliveryStatus = DeliveryStatus.READ) + if (msg.isFromMe && !msg.isRead) { + msg.copy( + isRead = true, + deliveryStatus = + if ( + msg.deliveryStatus == DeliveryStatus.DELIVERED || + msg.deliveryStatus == DeliveryStatus.READ + ) { + DeliveryStatus.READ + } else { + msg.deliveryStatus + } + ) } else { msg } @@ -1026,20 +1030,24 @@ class MessageRepository private constructor(private val context: Context) { val readCount = messageCache[dialogKey]?.value?.count { - it.isFromMe && - !it.isRead && - (it.deliveryStatus == DeliveryStatus.DELIVERED || - it.deliveryStatus == DeliveryStatus.READ) + it.isFromMe && !it.isRead } ?: 0 messageCache[dialogKey]?.let { flow -> flow.value = flow.value.map { msg -> - if (msg.isFromMe && - !msg.isRead && - (msg.deliveryStatus == DeliveryStatus.DELIVERED || - msg.deliveryStatus == DeliveryStatus.READ) - ) { - msg.copy(isRead = true, deliveryStatus = DeliveryStatus.READ) + if (msg.isFromMe && !msg.isRead) { + msg.copy( + isRead = true, + deliveryStatus = + if ( + msg.deliveryStatus == DeliveryStatus.DELIVERED || + msg.deliveryStatus == DeliveryStatus.READ + ) { + DeliveryStatus.READ + } else { + msg.deliveryStatus + } + ) } else { msg } diff --git a/app/src/main/java/com/rosetta/messenger/data/ReleaseNotes.kt b/app/src/main/java/com/rosetta/messenger/data/ReleaseNotes.kt index affa43b..cb55638 100644 --- a/app/src/main/java/com/rosetta/messenger/data/ReleaseNotes.kt +++ b/app/src/main/java/com/rosetta/messenger/data/ReleaseNotes.kt @@ -22,6 +22,7 @@ object ReleaseNotes { - Исправлена нормализация дубликатов своих сообщений из sync: локальные WAITING/ERROR теперь автоматически переходят в DELIVERED - Добавлен watchdog для sync-запроса: если ответ на PacketSync завис, запрос перезапускается автоматически - Повышена стабильность цикла BATCH_START/BATCH_END/NOT_NEEDED при reconnect + - Исправлена обработка PacketRead: read-статусы теперь ставятся как в desktop/wss, включая сценарии когда read приходит раньше delivery """.trimIndent() fun getNotice(version: String): String = diff --git a/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt b/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt index 75a4af3..ff229f1 100644 --- a/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt +++ b/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt @@ -403,7 +403,7 @@ interface MessageDao { WHERE account = :account AND to_public_key = :opponent AND from_me = 1 - AND delivered IN (1, 3) + AND read != 1 """ ) suspend fun markAllAsRead(account: String, opponent: String): Int