feat: Implement special handling for Saved Messages, including dedicated methods for retrieval, display, and dialog updates

This commit is contained in:
k1ngsterr1
2026-01-18 12:28:28 +05:00
parent 52523d91fb
commit 5833237c3a
7 changed files with 363 additions and 60 deletions

View File

@@ -158,7 +158,11 @@ class MessageRepository private constructor(private val context: Context) {
val timestamp = System.currentTimeMillis()
val dialogKey = getDialogKey(toPublicKey)
// 📁 Проверяем является ли это Saved Messages
val isSavedMessages = (account == toPublicKey)
// 1. Создаем оптимистичное сообщение
// 📁 Для saved messages - сразу DELIVERED и прочитано
val optimisticMessage = Message(
messageId = messageId,
fromPublicKey = account,
@@ -166,8 +170,8 @@ class MessageRepository private constructor(private val context: Context) {
content = text.trim(),
timestamp = timestamp,
isFromMe = true,
isRead = account == toPublicKey, // Если сам себе - сразу прочитано
deliveryStatus = DeliveryStatus.WAITING,
isRead = isSavedMessages, // 📁 Если сам себе - сразу прочитано
deliveryStatus = if (isSavedMessages) DeliveryStatus.DELIVERED else DeliveryStatus.WAITING, // 📁 Для saved messages - сразу доставлено
attachments = attachments,
replyToMessageId = replyToMessageId
)
@@ -194,6 +198,7 @@ class MessageRepository private constructor(private val context: Context) {
val exists = messageDao.messageExists(account, messageId)
if (!exists) {
// Сохраняем в БД только если сообщения нет
// 📁 Для saved messages - сразу read=1 и delivered=DELIVERED
val entity = MessageEntity(
account = account,
fromPublicKey = account,
@@ -201,9 +206,9 @@ class MessageRepository private constructor(private val context: Context) {
content = encryptedContent,
timestamp = timestamp,
chachaKey = encryptedKey,
read = if (account == toPublicKey) 1 else 0,
read = if (isSavedMessages) 1 else 0,
fromMe = 1,
delivered = DeliveryStatus.WAITING.value,
delivered = if (isSavedMessages) DeliveryStatus.DELIVERED.value else DeliveryStatus.WAITING.value,
messageId = messageId,
plainMessage = encryptedPlainMessage, // 🔒 Зашифрованный текст
attachments = attachmentsJson,
@@ -219,7 +224,13 @@ class MessageRepository private constructor(private val context: Context) {
// 🔥 Отмечаем что я отправлял сообщения в этот диалог (перемещает из requests в chats)
val updatedRows = dialogDao.markIHaveSent(account, toPublicKey)
// Отправляем пакет
// 📁 НЕ отправляем пакет на сервер для saved messages!
// Как в Архиве: if(publicKey == opponentPublicKey) return;
if (isSavedMessages) {
return@launch // Для saved messages - только локальное сохранение, без отправки на сервер
}
// Отправляем пакет (только для обычных диалогов)
val packet = PacketMessage().apply {
this.fromPublicKey = account
this.toPublicKey = toPublicKey
@@ -375,6 +386,7 @@ class MessageRepository private constructor(private val context: Context) {
/**
* Отметить диалог как прочитанный
* 🔥 После обновления messages обновляем диалог через updateDialogFromMessages
* 📁 SAVED MESSAGES: Использует специальный метод для saved messages
*/
suspend fun markDialogAsRead(opponentKey: String) {
val account = currentAccount ?: return
@@ -385,17 +397,28 @@ class MessageRepository private constructor(private val context: Context) {
// 🔥 КРИТИЧНО: Пересчитываем счетчики из таблицы messages
// чтобы unread_count обновился моментально
dialogDao.updateDialogFromMessages(account, opponentKey)
// 📁 Используем специальный метод для saved messages
if (opponentKey == account) {
dialogDao.updateSavedMessagesDialogFromMessages(account)
} else {
dialogDao.updateDialogFromMessages(account, opponentKey)
}
}
/**
* Отправить уведомление "печатает"
* 📁 Для Saved Messages - не отправляем
*/
fun sendTyping(toPublicKey: String) {
val account = currentAccount ?: return
val privateKey = currentPrivateKey ?: return
// 📁 Для Saved Messages - не отправляем typing
if (account == toPublicKey) {
return
}
scope.launch {
val packet = PacketTyping().apply {
this.fromPublicKey = account
@@ -435,8 +458,17 @@ class MessageRepository private constructor(private val context: Context) {
// Private helpers
// ===============================
/**
* Получить ключ диалога для группировки сообщений
* 📁 SAVED MESSAGES: Для saved messages (account == opponentKey) возвращает просто account
*/
private fun getDialogKey(opponentKey: String): String {
val account = currentAccount ?: return opponentKey
// Для saved messages dialog_key = просто publicKey
if (account == opponentKey) {
return account
}
// Для обычных диалогов - сортируем ключи
return if (account < opponentKey) "$account:$opponentKey"
else "$opponentKey:$account"
}