Релиз 1.2.6: sync-статусы, emoji-подсказки и UI-фиксы
Some checks failed
Android Kernel Build / build (push) Failing after 27m7s

This commit is contained in:
2026-03-20 21:56:52 +05:00
parent b2558653b7
commit c929685e04
8 changed files with 356 additions and 27 deletions

View File

@@ -806,14 +806,10 @@ class MessageRepository private constructor(private val context: Context) {
packet.chachaKey
}
val isSelfDialog = packet.toPublicKey.trim() == account
// Для исходящих сообщений статус доставки меняется ТОЛЬКО по PacketDelivery.
val initialDeliveredStatus =
if (isOwnMessage && !isSelfDialog) {
DeliveryStatus.WAITING.value
} else {
DeliveryStatus.DELIVERED.value
}
// Desktop parity (useSynchronize.ts):
// own messages received via PacketMessage sync are inserted as DELIVERED immediately.
// WAITING is used only for messages created locally on this device before PacketDelivery.
val initialDeliveredStatus = DeliveryStatus.DELIVERED.value
// Создаем entity для кэша и возможной вставки
val entity =
@@ -1131,6 +1127,23 @@ class MessageRepository private constructor(private val context: Context) {
val privateKey = currentPrivateKey ?: return
val now = System.currentTimeMillis()
// Desktop parity recovery:
// historically, own synced direct messages ("sync:*" chacha_key) could be saved as WAITING/ERROR
// on Android and then incorrectly shown with failed status.
// Desktop stores them as DELIVERED from the beginning.
val syncedOpponentsWithWrongStatus =
messageDao.getSyncedOwnMessageOpponentsWithNonDeliveredStatus(account)
val normalizedSyncedCount = messageDao.markSyncedOwnMessagesAsDelivered(account)
if (normalizedSyncedCount > 0) {
syncedOpponentsWithWrongStatus.forEach { opponentKey ->
runCatching { dialogDao.updateDialogFromMessages(account, opponentKey) }
}
android.util.Log.i(
"MessageRepository",
"✅ Normalized $normalizedSyncedCount synced own messages to DELIVERED"
)
}
// Mark expired messages as ERROR (older than 80 seconds)
val expiredCount = messageDao.markExpiredWaitingAsError(account, now - MESSAGE_MAX_TIME_TO_DELIVERED_MS)
if (expiredCount > 0) {

View File

@@ -17,17 +17,18 @@ object ReleaseNotes {
val RELEASE_NOTICE = """
Update v$VERSION_PLACEHOLDER
Что обновлено после версии 1.2.4
Синхронизация статусов (desktop parity)
- Исправлено ложное «ошибка отправки» для сообщений, пришедших в sync с других устройств
- Синхронизированные исходящие теперь сразу помечаются как доставленные, как в desktop
- Добавлена авто-нормализация старых sync-сообщений со статусами WAITING/ERROR в DELIVERED
Статусы отправки и прочтения
- Исправлены ложные двойные галочки у фото и медиа-сообщений до фактической доставки
- Исходящие сообщения теперь остаются в ожидании до реального PacketDelivery с сервера
- PacketRead больше не переводит недоставленные сообщения в «прочитано»
- Синхронизация статусов между БД, кэшем и UI стала стабильнее в личных чатах и группах
Emoji-подсказки в поле ввода
- Переработан UI подсказок: отдельный плавающий пузырёк над инпутом без изменения его высоты
- Исправлен клиппинг/обрезание пузырька внизу экрана
- Рендер эмодзи в подсказках приведён к Apple-like отображению
Надёжность отображения
- Убраны ложные переходы статусов при быстрых событиях синхронизации
- Логика read receipts приведена к более корректному серверному подтверждению
Полировка интерфейса
- В списке чатов выровнен текст после «Draft:» по одной line-height линии
""".trimIndent()
fun getNotice(version: String): String =