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) {}