From 25814f7de7805e3a9a2865529506cc1ee052bd90 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Mon, 26 Jan 2026 14:32:54 +0500 Subject: [PATCH] refactor: Simplify message loading logic and remove workaround for large messages in ChatViewModel --- .../messenger/data/MessageRepository.kt | 6 ++- .../messenger/ui/chats/ChatViewModel.kt | 51 ++----------------- 2 files changed, 9 insertions(+), 48 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 9c9add4..b11e3f6 100644 --- a/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt +++ b/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt @@ -732,6 +732,9 @@ class MessageRepository private constructor(private val context: Context) { /** * Сериализация attachments в JSON + * 🔥 ВАЖНО: blob НЕ сохраняется в БД (как в desktop) + * Только метаданные: id, type, preview, width, height + * blob скачивается с CDN по id при показе */ private fun serializeAttachments(attachments: List): String { if (attachments.isEmpty()) return "[]" @@ -740,7 +743,8 @@ class MessageRepository private constructor(private val context: Context) { for (attachment in attachments) { val jsonObj = JSONObject().apply { put("id", attachment.id) - put("blob", attachment.blob) + // 🔥 blob НЕ сохраняем в БД - скачивается с CDN по id + put("blob", "") put("type", attachment.type.value) put("preview", attachment.preview) put("width", attachment.width) 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 b9a3e9a..7b86012 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 @@ -486,16 +486,10 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { // 🔥 Получаем первую страницу - используем специальный метод для saved messages Log.d(TAG, "🔍 Querying DB for messages...") - val entities = try { - if (isSavedMessages) { - messageDao.getMessagesForSavedDialog(account, limit = PAGE_SIZE, offset = 0) - } else { - messageDao.getMessages(account, dialogKey, limit = PAGE_SIZE, offset = 0) - } - } catch (e: android.database.sqlite.SQLiteBlobTooBigException) { - // 🔥 WORKAROUND: Если сообщение слишком большое - загружаем по одному - Log.w(TAG, "⚠️ SQLiteBlobTooBigException - loading messages one by one") - loadMessagesOneByOne(account, dialogKey, isSavedMessages, PAGE_SIZE) + val entities = if (isSavedMessages) { + messageDao.getMessagesForSavedDialog(account, limit = PAGE_SIZE, offset = 0) + } else { + messageDao.getMessages(account, dialogKey, limit = PAGE_SIZE, offset = 0) } Log.d(TAG, "📋 Loaded entities from DB: count=${entities.size}") @@ -569,43 +563,6 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { } } - /** - * 🔥 WORKAROUND: Загрузка сообщений по одному (для случаев когда сообщение слишком большое) - * Пропускает сообщения которые не могут быть загружены из-за размера - */ - private suspend fun loadMessagesOneByOne( - account: String, - dialogKey: String, - isSavedMessages: Boolean, - limit: Int - ): List { - val result = mutableListOf() - var offset = 0 - var loadedCount = 0 - - while (loadedCount < limit && offset < limit * 2) { // limit * 2 чтобы не зациклиться - try { - val batch = if (isSavedMessages) { - messageDao.getMessagesForSavedDialog(account, limit = 1, offset = offset) - } else { - messageDao.getMessages(account, dialogKey, limit = 1, offset = offset) - } - - if (batch.isEmpty()) break - - result.addAll(batch) - loadedCount++ - } catch (e: android.database.sqlite.SQLiteBlobTooBigException) { - Log.w(TAG, "⚠️ Skipping message at offset $offset - too big") - // Пропускаем это сообщение - } - offset++ - } - - Log.d(TAG, "📦 Loaded $loadedCount messages one by one (skipped ${offset - loadedCount})") - return result - } - /** * 🔥 Фоновое обновление сообщений из БД (проверка новых) * Вызывается когда кэш уже отображён, но нужно проверить есть ли новые сообщения