From 58b554731d8682fb87b8c60cde36fbc8f71174f7 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 10 Mar 2026 20:55:31 +0300 Subject: [PATCH] fix(android): render gif attachments reliably after send --- android/app/build.gradle.kts | 1 + .../repository/NetworkMediaRepository.kt | 11 +++++++-- .../repository/NetworkMessageRepository.kt | 23 ++++++++++++++++++- .../domain/media/model/UploadedAttachment.kt | 8 +++++++ .../media/repository/MediaRepository.kt | 3 ++- .../usecase/UploadAndAttachMediaUseCase.kt | 3 ++- 6 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 android/app/src/main/java/ru/daemonlord/messenger/domain/media/model/UploadedAttachment.kt diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index ab6dcea..6c47e45 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -101,6 +101,7 @@ dependencies { implementation("androidx.compose.material:material-icons-extended:1.7.6") implementation("io.coil-kt:coil:2.7.0") implementation("io.coil-kt:coil-compose:2.7.0") + implementation("io.coil-kt:coil-gif:2.7.0") implementation("androidx.media3:media3-exoplayer:1.4.1") implementation("androidx.media3:media3-datasource:1.4.1") implementation("androidx.media3:media3-datasource-okhttp:1.4.1") diff --git a/android/app/src/main/java/ru/daemonlord/messenger/data/media/repository/NetworkMediaRepository.kt b/android/app/src/main/java/ru/daemonlord/messenger/data/media/repository/NetworkMediaRepository.kt index 79539fe..ced5890 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/data/media/repository/NetworkMediaRepository.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/data/media/repository/NetworkMediaRepository.kt @@ -16,6 +16,7 @@ import ru.daemonlord.messenger.di.IoDispatcher import ru.daemonlord.messenger.di.RefreshClient import ru.daemonlord.messenger.domain.common.AppError import ru.daemonlord.messenger.domain.common.AppResult +import ru.daemonlord.messenger.domain.media.model.UploadedAttachment import ru.daemonlord.messenger.domain.media.repository.MediaRepository import java.io.ByteArrayOutputStream import kotlin.math.roundToInt @@ -34,7 +35,7 @@ class NetworkMediaRepository @Inject constructor( fileName: String, mimeType: String, bytes: ByteArray, - ): AppResult = withContext(ioDispatcher) { + ): AppResult = withContext(ioDispatcher) { try { val uploadPayload = prepareUploadPayload( fileName = fileName, @@ -74,7 +75,13 @@ class NetworkMediaRepository @Inject constructor( fileSize = uploadPayload.bytes.size.toLong(), ) ) - AppResult.Success(Unit) + AppResult.Success( + UploadedAttachment( + fileUrl = uploadInfo.fileUrl, + fileType = uploadPayload.mimeType, + fileSize = uploadPayload.bytes.size.toLong(), + ) + ) } catch (error: Throwable) { AppResult.Error(error.toAppError()) } diff --git a/android/app/src/main/java/ru/daemonlord/messenger/data/message/repository/NetworkMessageRepository.kt b/android/app/src/main/java/ru/daemonlord/messenger/data/message/repository/NetworkMessageRepository.kt index ecda196..976dd1f 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/data/message/repository/NetworkMessageRepository.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/data/message/repository/NetworkMessageRepository.kt @@ -16,6 +16,7 @@ import ru.daemonlord.messenger.data.common.toAppError import ru.daemonlord.messenger.data.message.local.dao.MessageDao import ru.daemonlord.messenger.data.message.local.dao.PendingMessageActionDao import ru.daemonlord.messenger.data.message.local.entity.MessageEntity +import ru.daemonlord.messenger.data.message.local.entity.MessageAttachmentEntity import ru.daemonlord.messenger.data.message.local.entity.PendingMessageActionEntity import ru.daemonlord.messenger.data.message.mapper.toDomain import ru.daemonlord.messenger.data.message.mapper.toEntity @@ -360,7 +361,27 @@ class NetworkMessageRepository @Inject constructor( )) { is AppResult.Success -> { messageDao.deleteMessage(tempId) - syncRecentMessages(chatId = chatId) + messageDao.upsertMessages(listOf(created.toEntity())) + messageDao.upsertAttachments( + listOf( + MessageAttachmentEntity( + id = -System.currentTimeMillis(), + messageId = created.id, + fileUrl = mediaResult.data.fileUrl, + fileType = mediaResult.data.fileType, + fileSize = mediaResult.data.fileSize, + waveformPointsJson = null, + ) + ) + ) + chatDao.updateLastMessage( + chatId = chatId, + lastMessageText = created.text, + lastMessageType = created.type, + lastMessageCreatedAt = created.createdAt, + updatedSortAt = created.createdAt, + ) + AppResult.Success(Unit) } is AppResult.Error -> { diff --git a/android/app/src/main/java/ru/daemonlord/messenger/domain/media/model/UploadedAttachment.kt b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/model/UploadedAttachment.kt new file mode 100644 index 0000000..d4329d5 --- /dev/null +++ b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/model/UploadedAttachment.kt @@ -0,0 +1,8 @@ +package ru.daemonlord.messenger.domain.media.model + +data class UploadedAttachment( + val fileUrl: String, + val fileType: String, + val fileSize: Long, +) + diff --git a/android/app/src/main/java/ru/daemonlord/messenger/domain/media/repository/MediaRepository.kt b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/repository/MediaRepository.kt index 4baf76c..8689f27 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/domain/media/repository/MediaRepository.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/repository/MediaRepository.kt @@ -1,6 +1,7 @@ package ru.daemonlord.messenger.domain.media.repository import ru.daemonlord.messenger.domain.common.AppResult +import ru.daemonlord.messenger.domain.media.model.UploadedAttachment interface MediaRepository { suspend fun uploadAndAttach( @@ -8,5 +9,5 @@ interface MediaRepository { fileName: String, mimeType: String, bytes: ByteArray, - ): AppResult + ): AppResult } diff --git a/android/app/src/main/java/ru/daemonlord/messenger/domain/media/usecase/UploadAndAttachMediaUseCase.kt b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/usecase/UploadAndAttachMediaUseCase.kt index 7a84db9..af7e2ed 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/domain/media/usecase/UploadAndAttachMediaUseCase.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/domain/media/usecase/UploadAndAttachMediaUseCase.kt @@ -1,6 +1,7 @@ package ru.daemonlord.messenger.domain.media.usecase import ru.daemonlord.messenger.domain.common.AppResult +import ru.daemonlord.messenger.domain.media.model.UploadedAttachment import ru.daemonlord.messenger.domain.media.repository.MediaRepository import javax.inject.Inject @@ -12,7 +13,7 @@ class UploadAndAttachMediaUseCase @Inject constructor( fileName: String, mimeType: String, bytes: ByteArray, - ): AppResult { + ): AppResult { return mediaRepository.uploadAndAttach( messageId = messageId, fileName = fileName,