Skip to content

Commit e0e37ab

Browse files
Merge pull request #1484 from Infomaniak/move-signatures-to-MailboxInfos-realm
Move `Signature` from MailboxContent to MailboxInfo
2 parents 4db7635 + 17a0a85 commit e0e37ab

File tree

13 files changed

+95
-130
lines changed

13 files changed

+95
-130
lines changed

Diff for: app/src/main/java/com/infomaniak/mail/data/cache/RealmDatabase.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ object RealmDatabase {
6363
//region Realms' mutexes
6464
private val appSettingsMutex = Mutex()
6565
private val userInfoMutex = Mutex()
66-
private val mailboxInfoMutex = Mutex()
6766
private val mailboxContentMutex = Mutex()
6867
//endregion
6968

@@ -161,7 +160,7 @@ object RealmDatabase {
161160

162161
//region Configurations versions
163162
const val USER_INFO_SCHEMA_VERSION = 1L
164-
const val MAILBOX_INFO_SCHEMA_VERSION = 5L
163+
const val MAILBOX_INFO_SCHEMA_VERSION = 6L
165164
const val MAILBOX_CONTENT_SCHEMA_VERSION = 16L
166165
//endregion
167166

@@ -185,6 +184,7 @@ object RealmDatabase {
185184
Mailbox::class,
186185
MailboxPermissions::class,
187186
Quotas::class,
187+
Signature::class,
188188
)
189189
val mailboxContentSet = setOf(
190190
Folder::class,
@@ -200,7 +200,6 @@ object RealmDatabase {
200200
SwissTransferContainer::class,
201201
SwissTransferFile::class,
202202
Attendee::class,
203-
Signature::class,
204203
Bimi::class,
205204
)
206205
//endregion

Diff for: app/src/main/java/com/infomaniak/mail/data/cache/RealmMigrations.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ val MAILBOX_CONTENT_MIGRATION = AutomaticSchemaMigration { migrationContext ->
3636
migrationContext.deleteRealmFromFirstMigration()
3737
}
3838

39+
// Migrate to version #1
3940
private fun MigrationContext.deleteRealmFromFirstMigration() {
40-
if (oldRealm.schemaVersion() == 0L) newRealm.deleteAll()
41+
if (oldRealm.schemaVersion() < 1L) newRealm.deleteAll()
4142
}

Diff for: app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/SignatureController.kt

-85
This file was deleted.

Diff for: app/src/main/java/com/infomaniak/mail/data/cache/mailboxInfo/QuotasController.kt

+2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class QuotasController @Inject constructor(
2828
private val mailboxController: MailboxController,
2929
) {
3030

31+
//region Get data
3132
fun getQuotasAsync(mailboxObjectId: String): Flow<Quotas?> {
3233
return mailboxController.getMailboxAsync(mailboxObjectId).map { it.obj?.quotas }
3334
}
35+
//endregion
3436
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Infomaniak Mail - Android
3+
* Copyright (C) 2022-2024 Infomaniak Network SA
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.infomaniak.mail.data.cache.mailboxInfo
19+
20+
import com.infomaniak.mail.data.models.signature.Signature
21+
import io.realm.kotlin.types.RealmList
22+
import kotlinx.coroutines.flow.Flow
23+
import kotlinx.coroutines.flow.mapNotNull
24+
import javax.inject.Inject
25+
import javax.inject.Singleton
26+
27+
@Singleton
28+
class SignatureController @Inject constructor(
29+
private val mailboxController: MailboxController,
30+
) {
31+
32+
//region Get data
33+
fun getSignaturesAsync(mailboxObjectId: String): Flow<RealmList<Signature>> {
34+
return mailboxController.getMailboxAsync(mailboxObjectId).mapNotNull { it.obj?.signatures }
35+
}
36+
//endregion
37+
}

Diff for: app/src/main/java/com/infomaniak/mail/data/models/mailbox/Mailbox.kt

+12-5
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ import androidx.core.app.NotificationManagerCompat
2323
import com.infomaniak.mail.data.models.AppSettings
2424
import com.infomaniak.mail.data.models.FeatureFlag
2525
import com.infomaniak.mail.data.models.Quotas
26+
import com.infomaniak.mail.data.models.draft.Draft.DraftMode
27+
import com.infomaniak.mail.data.models.signature.Signature
2628
import com.infomaniak.mail.utils.UnreadDisplay
29+
import com.infomaniak.mail.utils.extensions.getDefault
2730
import io.realm.kotlin.ext.realmListOf
2831
import io.realm.kotlin.ext.realmSetOf
2932
import io.realm.kotlin.serializers.RealmListKSerializer
30-
import io.realm.kotlin.types.RealmList
3133
import io.realm.kotlin.types.RealmObject
32-
import io.realm.kotlin.types.RealmSet
3334
import io.realm.kotlin.types.annotations.Ignore
3435
import io.realm.kotlin.types.annotations.PrimaryKey
3536
import kotlinx.serialization.SerialName
@@ -61,7 +62,7 @@ class Mailbox : RealmObject {
6162
var isLocked: Boolean = false
6263
@SerialName("unseen_messages")
6364
var unreadCountRemote: Int = 0
64-
var aliases: RealmList<String> = realmListOf()
65+
var aliases = realmListOf<String>()
6566
//endregion
6667

6768
//region Local data (Transient)
@@ -77,11 +78,13 @@ class Mailbox : RealmObject {
7778
@Transient
7879
var permissions: MailboxPermissions? = null
7980
@Transient
80-
private var _featureFlags: RealmSet<String> = realmSetOf()
81+
var signatures = realmListOf<Signature>()
82+
@Transient
83+
private var _featureFlags = realmSetOf<String>()
8184
@Transient
8285
var externalMailFlagEnabled: Boolean = false
8386
@Transient
84-
var trustedDomains: RealmList<String> = realmListOf()
87+
var trustedDomains = realmListOf<String>()
8588
//endregion
8689

8790
//region UI data (Transient & Ignore)
@@ -113,6 +116,10 @@ class Mailbox : RealmObject {
113116
this.permissions = permissions
114117
}
115118

119+
fun getDefaultSignatureWithFallback(draftMode: DraftMode? = null): Signature {
120+
return signatures.getDefault(draftMode) ?: signatures.first()
121+
}
122+
116123
fun notificationsIsDisabled(notificationManagerCompat: NotificationManagerCompat): Boolean = with(notificationManagerCompat) {
117124
val isGroupBlocked = getNotificationChannelGroupCompat(channelGroupId)?.isBlocked == true
118125
val isChannelBlocked = getNotificationChannelCompat(channelId)?.importance == NotificationManagerCompat.IMPORTANCE_NONE

Diff for: app/src/main/java/com/infomaniak/mail/data/models/signature/Signature.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,16 @@ import android.content.Context
2121
import com.infomaniak.mail.R
2222
import com.infomaniak.mail.data.models.draft.Draft
2323
import com.infomaniak.mail.utils.AccountUtils
24-
import io.realm.kotlin.types.RealmObject
24+
import io.realm.kotlin.types.EmbeddedRealmObject
2525
import io.realm.kotlin.types.annotations.Ignore
26-
import io.realm.kotlin.types.annotations.PrimaryKey
2726
import kotlinx.serialization.SerialName
2827
import kotlinx.serialization.Serializable
2928
import kotlinx.serialization.Transient
3029

3130
@Serializable
32-
class Signature : RealmObject {
31+
class Signature : EmbeddedRealmObject {
3332

3433
//region Remote data
35-
@PrimaryKey
3634
var id: Int = 0
3735
var name: String = ""
3836
@SerialName("full_name")

Diff for: app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import com.infomaniak.mail.data.models.message.Message
4949
import com.infomaniak.mail.data.models.thread.Thread
5050
import com.infomaniak.mail.data.models.thread.Thread.ThreadFilter
5151
import com.infomaniak.mail.di.IoDispatcher
52+
import com.infomaniak.mail.di.MailboxInfoRealm
5253
import com.infomaniak.mail.ui.main.SnackbarManager
5354
import com.infomaniak.mail.ui.main.SnackbarManager.UndoData
5455
import com.infomaniak.mail.utils.AccountUtils
@@ -64,6 +65,7 @@ import com.infomaniak.mail.utils.coroutineContext
6465
import com.infomaniak.mail.utils.extensions.*
6566
import com.infomaniak.mail.views.itemViews.AvatarMergedContactData
6667
import dagger.hilt.android.lifecycle.HiltViewModel
68+
import io.realm.kotlin.Realm
6769
import io.realm.kotlin.ext.copyFromRealm
6870
import io.realm.kotlin.ext.toRealmList
6971
import io.realm.kotlin.notifications.ResultsChange
@@ -93,6 +95,7 @@ class MainViewModel @Inject constructor(
9395
private val sharedUtils: SharedUtils,
9496
private val threadController: ThreadController,
9597
private val snackbarManager: SnackbarManager,
98+
@MailboxInfoRealm private val mailboxInfoRealm: Realm,
9699
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
97100
) : AndroidViewModel(application) {
98101

@@ -350,7 +353,7 @@ class MainViewModel @Inject constructor(
350353

351354
private fun updateSignatures(mailbox: Mailbox) = viewModelScope.launch(ioCoroutineContext) {
352355
SentryLog.d(TAG, "Force refresh Signatures")
353-
updateSignatures(mailbox, mailboxContentRealm())
356+
updateSignatures(mailbox, mailboxInfoRealm)
354357
}
355358

356359
private fun updateFeatureFlag(mailbox: Mailbox) = viewModelScope.launch(ioCoroutineContext) {

Diff for: app/src/main/java/com/infomaniak/mail/ui/main/settings/mailbox/SignatureSettingViewModel.kt

+7-11
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ import androidx.lifecycle.asLiveData
2323
import androidx.lifecycle.viewModelScope
2424
import com.infomaniak.lib.core.utils.SingleLiveEvent
2525
import com.infomaniak.mail.data.api.ApiRepository
26-
import com.infomaniak.mail.data.cache.RealmDatabase
27-
import com.infomaniak.mail.data.cache.mailboxContent.SignatureController
2826
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
27+
import com.infomaniak.mail.data.cache.mailboxInfo.SignatureController
2928
import com.infomaniak.mail.data.models.signature.Signature
3029
import com.infomaniak.mail.di.IoDispatcher
31-
import com.infomaniak.mail.utils.AccountUtils
30+
import com.infomaniak.mail.di.MailboxInfoRealm
3231
import com.infomaniak.mail.utils.SharedUtils.Companion.updateSignatures
3332
import dagger.hilt.android.lifecycle.HiltViewModel
33+
import io.realm.kotlin.Realm
3434
import kotlinx.coroutines.CoroutineDispatcher
3535
import kotlinx.coroutines.launch
3636
import javax.inject.Inject
@@ -39,17 +39,18 @@ import com.infomaniak.lib.core.R as RCore
3939
@HiltViewModel
4040
class SignatureSettingViewModel @Inject constructor(
4141
mailboxController: MailboxController,
42+
signatureController: SignatureController,
4243
private val savedStateHandle: SavedStateHandle,
44+
@MailboxInfoRealm private val mailboxInfoRealm: Realm,
4345
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
4446
) : ViewModel() {
4547

4648
private val coroutineContext = viewModelScope.coroutineContext + ioDispatcher
4749

4850
private val mailboxObjectId inline get() = savedStateHandle.get<String>(SignatureSettingFragmentArgs::mailboxObjectId.name)!!
4951
val mailbox = mailboxController.getMailbox(mailboxObjectId)!!
50-
private val customRealm = RealmDatabase.newMailboxContentInstance(AccountUtils.currentUserId, mailbox.mailboxId)
5152

52-
val signaturesLive = SignatureController.getSignaturesAsync(customRealm).asLiveData(coroutineContext)
53+
val signaturesLive = signatureController.getSignaturesAsync(mailboxObjectId).asLiveData(coroutineContext)
5354
val showError = SingleLiveEvent<Int>() // StringRes
5455

5556
fun setDefaultSignature(signature: Signature?) = viewModelScope.launch(ioDispatcher) {
@@ -63,14 +64,9 @@ class SignatureSettingViewModel @Inject constructor(
6364
}
6465

6566
fun updateSignatures() = viewModelScope.launch(ioDispatcher) {
66-
updateSignatures(mailbox, customRealm)?.also { translatedError ->
67+
updateSignatures(mailbox, mailboxInfoRealm)?.also { translatedError ->
6768
val title = if (translatedError == 0) RCore.string.anErrorHasOccurred else translatedError
6869
showError.postValue(title)
6970
}
7071
}
71-
72-
override fun onCleared() {
73-
customRealm.close()
74-
super.onCleared()
75-
}
7672
}

Diff for: app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt

+6-10
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import com.infomaniak.mail.data.cache.RealmDatabase
3838
import com.infomaniak.mail.data.cache.mailboxContent.DraftController
3939
import com.infomaniak.mail.data.cache.mailboxContent.MessageController
4040
import com.infomaniak.mail.data.cache.mailboxContent.ReplyForwardFooterManager
41-
import com.infomaniak.mail.data.cache.mailboxContent.SignatureController
4241
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
4342
import com.infomaniak.mail.data.cache.userInfo.MergedContactController
4443
import com.infomaniak.mail.data.models.Attachment
@@ -63,11 +62,8 @@ import com.infomaniak.mail.utils.*
6362
import com.infomaniak.mail.utils.ContactUtils.arrangeMergedContacts
6463
import com.infomaniak.mail.utils.JsoupParserUtil.jsoupParseWithLog
6564
import com.infomaniak.mail.utils.Utils
65+
import com.infomaniak.mail.utils.extensions.*
6666
import com.infomaniak.mail.utils.extensions.AttachmentExtensions.findSpecificAttachment
67-
import com.infomaniak.mail.utils.extensions.appContext
68-
import com.infomaniak.mail.utils.extensions.htmlToText
69-
import com.infomaniak.mail.utils.extensions.isEmail
70-
import com.infomaniak.mail.utils.extensions.valueOrEmpty
7167
import dagger.hilt.android.lifecycle.HiltViewModel
7268
import io.realm.kotlin.MutableRealm
7369
import io.realm.kotlin.Realm
@@ -206,7 +202,7 @@ class NewMessageViewModel @Inject constructor(
206202

207203
runCatching {
208204

209-
signatures = SignatureController.getAllSignatures(realm)
205+
signatures = currentMailbox.signatures
210206
.also { signaturesCount = it.count() }
211207
.toMutableList()
212208
.apply { add(index = 0, element = Signature.getDummySignature(appContext, email = currentMailbox.email)) }
@@ -216,7 +212,7 @@ class NewMessageViewModel @Inject constructor(
216212
draft = if (isNewMessage) {
217213
getNewDraft(signatures, intent, realm) ?: return@runCatching
218214
} else {
219-
getExistingDraft(draftLocalUuid, realm) ?: return@runCatching
215+
getExistingDraft(draftLocalUuid) ?: return@runCatching
220216
}
221217
}.onFailure(Sentry::captureException)
222218

@@ -238,11 +234,11 @@ class NewMessageViewModel @Inject constructor(
238234
emit(draft)
239235
}
240236

241-
private fun getExistingDraft(localUuid: String?, realm: Realm): Draft? {
237+
private fun getExistingDraft(localUuid: String?): Draft? {
242238
return getLocalOrRemoteDraft(localUuid)?.also { draft ->
243239
saveNavArgsToSavedState(draft.localUuid)
244240
if (draft.identityId.isNullOrBlank()) {
245-
draft.identityId = SignatureController.getDefaultSignatureWithFallback(realm, draftMode)?.id?.toString()
241+
draft.identityId = currentMailbox.getDefaultSignatureWithFallback().id.toString()
246242
}
247243
splitSignatureAndQuoteFromBody(draft)
248244
}
@@ -274,7 +270,7 @@ class NewMessageViewModel @Inject constructor(
274270
}
275271
}
276272

277-
val defaultSignature = SignatureController.getDefaultSignature(realm, draftMode)
273+
val defaultSignature = signatures.getDefault(draftMode)
278274
val shouldPreselectSignature = draftMode == DraftMode.REPLY || draftMode == DraftMode.REPLY_ALL
279275
val signature = if (shouldPreselectSignature) {
280276
defaultSignature ?: guessMostFittingSignature(previousMessage!!, signatures)

0 commit comments

Comments
 (0)