refactor: Simplify message loading logic and remove workaround for large messages in ChatViewModel
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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<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
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔥 Фоновое обновление сообщений из БД (проверка новых)
|
||||
* Вызывается когда кэш уже отображён, но нужно проверить есть ли новые сообщения
|
||||
|
||||
Reference in New Issue
Block a user