refactor: Simplify message loading logic and remove workaround for large messages in ChatViewModel

This commit is contained in:
k1ngsterr1
2026-01-26 14:32:54 +05:00
parent 3c08adb516
commit 25814f7de7
2 changed files with 9 additions and 48 deletions

View File

@@ -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<MessageAttachment>): 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)

View File

@@ -486,17 +486,11 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
// 🔥 Получаем первую страницу - используем специальный метод для saved messages
Log.d(TAG, "🔍 Querying DB for messages...")
val entities = try {
if (isSavedMessages) {
val entities = 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)
}
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<MessageEntity> {
val result = mutableListOf<MessageEntity>()
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
}
/**
* 🔥 Фоновое обновление сообщений из БД (проверка новых)
* Вызывается когда кэш уже отображён, но нужно проверить есть ли новые сообщения