feat: Enhance message handling and emoji picker

- Update MessageEntity to clarify encryption of plainMessage.
- Introduce ERROR status in MessageStatus for handling message send failures.
- Implement message delivery timeout logic in ChatDetailScreen.
- Add retry and delete functionality for failed messages in ChatViewModel.
- Improve message decryption process in ChatViewModel to handle various scenarios.
- Refactor emoji categories in AppleEmojiPicker to align with Unicode standards and improve sorting.
This commit is contained in:
k1ngsterr1
2026-01-13 16:05:42 +05:00
parent 764127c093
commit 42b1cdd79a
5 changed files with 551 additions and 113 deletions

View File

@@ -157,6 +157,9 @@ class MessageRepository private constructor(private val context: Context) {
// Сериализуем attachments в JSON
val attachmentsJson = serializeAttachments(attachments)
// 🔒 Шифруем plainMessage с использованием приватного ключа
val encryptedPlainMessage = CryptoManager.encryptWithPassword(text.trim(), privateKey)
// Сохраняем в БД
val entity = MessageEntity(
account = account,
@@ -169,7 +172,7 @@ class MessageRepository private constructor(private val context: Context) {
fromMe = 1,
delivered = DeliveryStatus.WAITING.value,
messageId = messageId,
plainMessage = text.trim(),
plainMessage = encryptedPlainMessage, // 🔒 Зашифрованный текст
attachments = attachmentsJson,
replyToMessageId = replyToMessageId,
dialogKey = dialogKey
@@ -230,6 +233,9 @@ class MessageRepository private constructor(private val context: Context) {
privateKey
)
// 🔒 Шифруем plainMessage с использованием приватного ключа
val encryptedPlainMessage = CryptoManager.encryptWithPassword(plainText, privateKey)
// Сохраняем в БД
val entity = MessageEntity(
account = account,
@@ -242,7 +248,7 @@ class MessageRepository private constructor(private val context: Context) {
fromMe = 0,
delivered = DeliveryStatus.DELIVERED.value,
messageId = packet.messageId,
plainMessage = plainText,
plainMessage = encryptedPlainMessage, // 🔒 Зашифрованный текст
attachments = attachmentsJson,
dialogKey = dialogKey
)
@@ -405,18 +411,33 @@ class MessageRepository private constructor(private val context: Context) {
}
// Extension functions
private fun MessageEntity.toMessage() = Message(
id = id,
messageId = messageId,
fromPublicKey = fromPublicKey,
toPublicKey = toPublicKey,
content = plainMessage,
timestamp = timestamp,
isFromMe = fromMe == 1,
isRead = read == 1,
deliveryStatus = DeliveryStatus.fromInt(delivered),
replyToMessageId = replyToMessageId
)
private fun MessageEntity.toMessage(): Message {
// 🔓 Расшифровываем plainMessage с использованием приватного ключа
val privateKey = currentPrivateKey
val decryptedText = if (privateKey != null && plainMessage.isNotEmpty()) {
try {
CryptoManager.decryptWithPassword(plainMessage, privateKey) ?: plainMessage
} catch (e: Exception) {
android.util.Log.e("MessageRepository", "Failed to decrypt plainMessage: ${e.message}")
plainMessage // Fallback на зашифрованный текст если расшифровка не удалась
}
} else {
plainMessage
}
return Message(
id = id,
messageId = messageId,
fromPublicKey = fromPublicKey,
toPublicKey = toPublicKey,
content = decryptedText, // 🔓 Расшифрованный текст
timestamp = timestamp,
isFromMe = fromMe == 1,
isRead = read == 1,
deliveryStatus = DeliveryStatus.fromInt(delivered),
replyToMessageId = replyToMessageId
)
}
private fun DialogEntity.toDialog() = Dialog(
opponentKey = opponentKey,