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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user