diff --git a/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/CustomRefreshStrategies.kt b/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/CustomRefreshStrategies.kt index d33a0073bd..d7dec8899d 100644 --- a/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/CustomRefreshStrategies.kt +++ b/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/CustomRefreshStrategies.kt @@ -18,6 +18,7 @@ package com.infomaniak.mail.data.cache.mailboxContent import com.infomaniak.mail.data.models.message.Message +import com.infomaniak.mail.data.models.message.Message.MessageInitialState import com.infomaniak.mail.data.models.thread.Thread import io.realm.kotlin.MutableRealm import io.realm.kotlin.TypedRealm @@ -36,6 +37,12 @@ val snoozeRefreshStrategy = object : DefaultRefreshStrategy { return ThreadController.getInboxThreadsWithSnoozeFilter(withSnooze = true, realm = realm) } + /** + * In the case of the Snooze refresh strategy, the Message could already exist (because it comes from the INBOX). + * In this situation, we don't want to loose its data (for example the body). + * So we take the [remoteMessage] (because it contains the up-to-date data about the snooze state), + * we give it the localMessage local values, then we upsert it into Realm. + */ override fun handleAddedMessages( scope: CoroutineScope, remoteMessage: Message, @@ -43,13 +50,23 @@ val snoozeRefreshStrategy = object : DefaultRefreshStrategy { impactedThreadsManaged: MutableSet, realm: MutableRealm, ) { - impactedThreadsManaged += buildSet { - MessageController.updateMessage(remoteMessage.uid, realm) { localMessage -> - localMessage?.snoozeState = remoteMessage.snoozeState - localMessage?.snoozeEndDate = remoteMessage.snoozeEndDate - localMessage?.snoozeAction = remoteMessage.snoozeAction - localMessage?.threads?.let(::addAll) - } + + MessageController.getMessage(remoteMessage.uid, realm)?.let { localMessage -> + remoteMessage.initLocalValues( + messageInitialState = MessageInitialState( + date = localMessage.date, + isFullyDownloaded = localMessage.isFullyDownloaded(), + isTrashed = localMessage.isTrashed, + isFromSearch = localMessage.isFromSearch, + draftLocalUuid = localMessage.draftLocalUuid, + ), + messageIds = localMessage.messageIds, + ) + remoteMessage.keepHeavyData(localMessage) } + + val updatedMessage = MessageController.upsertMessage(remoteMessage, realm) + + impactedThreadsManaged += updatedMessage.threads } } diff --git a/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt b/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt index 8da7738ca9..a3f37c99ad 100644 --- a/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt +++ b/app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt @@ -200,9 +200,7 @@ class MessageController @Inject constructor(private val mailboxContentRealm: Rea //endregion //region Edit data - fun upsertMessage(message: Message, realm: MutableRealm) { - realm.copyToRealm(message, UpdatePolicy.ALL) - } + fun upsertMessage(message: Message, realm: MutableRealm): Message = realm.copyToRealm(message, UpdatePolicy.ALL) fun updateMessage(messageUid: String, realm: MutableRealm, onUpdate: (Message?) -> Unit) { onUpdate(getMessage(messageUid, realm)) diff --git a/app/src/main/java/com/infomaniak/mail/data/models/message/Message.kt b/app/src/main/java/com/infomaniak/mail/data/models/message/Message.kt index 1c1173b799..2a0ccbfc04 100644 --- a/app/src/main/java/com/infomaniak/mail/data/models/message/Message.kt +++ b/app/src/main/java/com/infomaniak/mail/data/models/message/Message.kt @@ -233,7 +233,7 @@ class Message : RealmObject { fun initLocalValues( messageInitialState: MessageInitialState, - latestCalendarEventResponse: CalendarEventResponse?, + latestCalendarEventResponse: CalendarEventResponse? = null, messageIds: RealmSet? = null, swissTransferFiles: RealmList = realmListOf(), ) {