Синхронизация 1.3.0: parity с desktop/server и стабилизация sync-цикла

This commit is contained in:
2026-03-22 19:47:23 +05:00
parent 69c0c377d1
commit f915333a44
8 changed files with 219 additions and 14 deletions

View File

@@ -686,13 +686,6 @@ class MessageRepository private constructor(private val context: Context) {
return true
}
// 🔥 ВТОРОЙ УРОВЕНЬ ЗАЩИТЫ: Проверка в БД (для сообщений сохранённых в предыдущих сессиях)
val isDuplicate = messageDao.messageExists(account, messageId)
MessageLogger.logDuplicateCheck(messageId, isDuplicate)
if (isDuplicate) {
return true
}
val dialogOpponentKey =
when {
isGroupMessage -> packet.toPublicKey
@@ -701,6 +694,33 @@ class MessageRepository private constructor(private val context: Context) {
}
val dialogKey = getDialogKey(dialogOpponentKey)
// 🔥 ВТОРОЙ УРОВЕНЬ ЗАЩИТЫ: Проверка в БД (для сообщений сохранённых в предыдущих сессиях)
val isDuplicate = messageDao.messageExists(account, messageId)
MessageLogger.logDuplicateCheck(messageId, isDuplicate)
if (isDuplicate) {
// Desktop/server parity:
// own messages that arrive via sync must be treated as delivered.
// If a local optimistic row already exists (WAITING/ERROR), normalize it.
if (isOwnMessage) {
messageDao.updateDeliveryStatus(account, messageId, DeliveryStatus.DELIVERED.value)
messageCache[dialogKey]?.let { flow ->
flow.value =
flow.value.map { msg ->
if (msg.messageId == messageId) {
msg.copy(deliveryStatus = DeliveryStatus.DELIVERED)
} else {
msg
}
}
}
_deliveryStatusEvents.tryEmit(
DeliveryStatusUpdate(dialogKey, messageId, DeliveryStatus.DELIVERED)
)
dialogDao.updateDialogFromMessages(account, dialogOpponentKey)
}
return true
}
try {
val groupKey =
if (isGroupMessage) {

View File

@@ -17,10 +17,11 @@ object ReleaseNotes {
val RELEASE_NOTICE = """
Update v$VERSION_PLACEHOLDER
Полноэкранный просмотр фото
- Убраны лишние искусственные отступы в fullscreen viewer
- Фото (включая большие скриншоты) снова открываются edge-to-edge, как в Telegram
- Исправлены большие чёрные бордеры вокруг изображения при открытии
Синхронизация 1 в 1 с desktop/server
- Выровнен сетевой контракт пакетов как в desktop: добавлена поддержка 0x10 (push), 0x1A (signal), 0x1B (webrtc), 0x1C (ice)
- Исправлена нормализация дубликатов своих сообщений из sync: локальные WAITING/ERROR теперь автоматически переходят в DELIVERED
- Добавлен watchdog для sync-запроса: если ответ на PacketSync завис, запрос перезапускается автоматически
- Повышена стабильность цикла BATCH_START/BATCH_END/NOT_NEEDED при reconnect
""".trimIndent()
fun getNotice(version: String): String =