From d94b3ec37a16e7020adf4b5431fbd10dd03dd136 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Thu, 9 Apr 2026 00:54:06 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81:=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=81=20=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=84=D0=BE=D1=82=D0=BE=20=D0=B2=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D0=B0=D1=85=20=E2=80=94=20=D0=91=D0=94=20=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20DELIVERED=20?= =?UTF-8?q?=D0=BD=D0=B0=20WAITING?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updateMessageStatusInDb и updateMessageStatusAndAttachmentsInDb теперь проверяют текущий delivered в БД и никогда не понижают (DELIVERED→WAITING race condition). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../com/rosetta/messenger/database/MessageEntities.kt | 4 ++++ .../java/com/rosetta/messenger/ui/chats/ChatViewModel.kt | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) 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 c1a6ae9..a67c762 100644 --- a/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt +++ b/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt @@ -440,6 +440,10 @@ interface MessageDao { ) suspend fun messageExists(account: String, messageId: String): Boolean + /** Найти сообщение по ID */ + @Query("SELECT * FROM messages WHERE account = :account AND message_id = :messageId LIMIT 1") + suspend fun findMessageById(account: String, messageId: String): MessageEntity? + /** * Отметить все исходящие сообщения к собеседнику как прочитанные Используется когда приходит * PacketRead от собеседника. diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt index 82b2d68..6a227eb 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt @@ -724,6 +724,9 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { private suspend fun updateMessageStatusInDb(messageId: String, delivered: Int) { val account = myPublicKey ?: return try { + // Never downgrade delivery status + val existing = messageDao.findMessageById(account, messageId) + if (existing != null && existing.delivered > delivered) return messageDao.updateDeliveryStatus(account, messageId, delivered) } catch (e: Exception) {} } @@ -736,10 +739,13 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { ) { val account = myPublicKey ?: return try { + // Never downgrade delivery status (e.g. DELIVERED→WAITING race) + val existing = messageDao.findMessageById(account, messageId) + val safeDelivered = if (existing != null && existing.delivered > delivered) existing.delivered else delivered messageDao.updateDeliveryStatusAndAttachments( account, messageId, - delivered, + safeDelivered, attachmentsJson ) } catch (e: Exception) {}