diff --git a/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt b/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt index c085b76..be22180 100644 --- a/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt +++ b/app/src/main/java/com/rosetta/messenger/data/MessageRepository.kt @@ -764,10 +764,13 @@ class MessageRepository private constructor(private val context: Context) { groupKey ) - // 📸 Обрабатываем AVATAR attachments - сохраняем аватар отправителя + // 📸 Обрабатываем AVATAR attachments: + // в личке — сохраняем аватар отправителя, в группе — аватар группы (desktop parity) + val avatarOwnerKey = + if (isGroupMessage) packet.toPublicKey else packet.fromPublicKey processAvatarAttachments( packet.attachments, - packet.fromPublicKey, + avatarOwnerKey, packet.chachaKey, privateKey, plainKeyAndNonce, @@ -1510,7 +1513,7 @@ class MessageRepository private constructor(private val context: Context) { */ private suspend fun processAvatarAttachments( attachments: List, - fromPublicKey: String, + avatarOwnerKey: String, encryptedKey: String, privateKey: String, plainKeyAndNonce: ByteArray? = null, @@ -1540,18 +1543,18 @@ class MessageRepository private constructor(private val context: Context) { if (decryptedBlob != null) { // 2. Сохраняем аватар в кэш val filePath = - AvatarFileManager.saveAvatar(context, decryptedBlob, fromPublicKey) + AvatarFileManager.saveAvatar(context, decryptedBlob, avatarOwnerKey) val entity = AvatarCacheEntity( - publicKey = fromPublicKey, + publicKey = avatarOwnerKey, avatar = filePath, timestamp = System.currentTimeMillis() ) avatarDao.insertAvatar(entity) // 3. Очищаем старые аватары (оставляем последние 5) - avatarDao.deleteOldAvatars(fromPublicKey, 5) + avatarDao.deleteOldAvatars(avatarOwnerKey, 5) } else {} } catch (e: Exception) {} } diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt index b2cbfc4..71dad8b 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt @@ -2170,6 +2170,8 @@ fun ChatDetailScreen( message.senderName, isGroupChat = isGroupChat, + dialogPublicKey = + user.publicKey, showGroupSenderLabel = isGroupChat && !message.isOutgoing, diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt index 5cb7337..b860866 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/AttachmentComponents.kt @@ -332,6 +332,8 @@ fun MessageAttachments( isOutgoing: Boolean, isDarkTheme: Boolean, senderPublicKey: String, + dialogPublicKey: String = "", + isGroupChat: Boolean = false, timestamp: java.util.Date, messageStatus: MessageStatus = MessageStatus.READ, avatarRepository: AvatarRepository? = null, @@ -392,6 +394,8 @@ fun MessageAttachments( chachaKey = chachaKey, privateKey = privateKey, senderPublicKey = senderPublicKey, + dialogPublicKey = dialogPublicKey, + isGroupChat = isGroupChat, avatarRepository = avatarRepository, currentUserPublicKey = currentUserPublicKey, isOutgoing = isOutgoing, @@ -1775,6 +1779,8 @@ fun AvatarAttachment( chachaKey: String, privateKey: String, senderPublicKey: String, + dialogPublicKey: String = "", + isGroupChat: Boolean = false, avatarRepository: AvatarRepository?, currentUserPublicKey: String = "", isOutgoing: Boolean, @@ -1924,11 +1930,15 @@ fun AvatarAttachment( // Сохраняем аватар в репозиторий (для UI обновления) // Если это исходящее сообщение с аватаром, сохраняем для текущего // пользователя + val normalizedDialogKey = dialogPublicKey.trim() + val isGroupAvatarAttachment = isGroupChat || isGroupStoredKey(chachaKey) val targetPublicKey = - if (isOutgoing && currentUserPublicKey.isNotEmpty()) { - currentUserPublicKey - } else { - senderPublicKey + when { + isGroupAvatarAttachment && normalizedDialogKey.isNotEmpty() -> + normalizedDialogKey + isOutgoing && currentUserPublicKey.isNotEmpty() -> + currentUserPublicKey + else -> senderPublicKey } // ВАЖНО: ждем завершения сохранения в репозиторий diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt index 7dca103..e68ca0c 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt @@ -297,6 +297,7 @@ fun MessageBubble( senderPublicKey: String = "", senderName: String = "", isGroupChat: Boolean = false, + dialogPublicKey: String = "", showGroupSenderLabel: Boolean = false, isGroupSenderAdmin: Boolean = false, currentUserPublicKey: String = "", @@ -846,6 +847,8 @@ fun MessageBubble( isOutgoing = message.isOutgoing, isDarkTheme = isDarkTheme, senderPublicKey = senderPublicKey, + dialogPublicKey = dialogPublicKey, + isGroupChat = isGroupChat, timestamp = message.timestamp, messageStatus = attachmentDisplayStatus, avatarRepository = avatarRepository,