Skip to content

Commit c2dda4f

Browse files
Move emailDictionary, aliases & trustedDomains parameters into an ExternalData data class
1 parent b8dcc0a commit c2dda4f

File tree

5 files changed

+38
-59
lines changed

5 files changed

+38
-59
lines changed

app/src/main/java/com/infomaniak/mail/data/models/correspondent/Recipient.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
package com.infomaniak.mail.data.models.correspondent
1919

2020
import android.os.Parcel
21-
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
21+
import com.infomaniak.mail.utils.ExternalUtils.ExternalData
2222
import com.infomaniak.mail.utils.extensions.isEmail
2323
import io.realm.kotlin.types.EmbeddedRealmObject
2424
import io.realm.kotlin.types.annotations.Ignore
@@ -64,13 +64,13 @@ open class Recipient : EmbeddedRealmObject, Correspondent {
6464

6565
// Computes if the Recipient is external, according to the required conditions.
6666
// Does not tell anything about how to display the Recipient chip when composing a new Message.
67-
fun isExternal(emailDictionary: MergedContactDictionary, aliases: List<String>, trustedDomains: List<String>): Boolean {
67+
fun isExternal(externalData: ExternalData): Boolean = with(externalData) {
6868
val isUnknownContact = email !in emailDictionary
69-
val isMailerDaemon = """mailer-daemon@(?:.+\.)?infomaniak\.ch""".toRegex(RegexOption.IGNORE_CASE).matches(email)
70-
val isUntrustedDomain = email.isEmail() && trustedDomains.none { email.endsWith(it) }
7169
val isAlias = email in aliases
70+
val isUntrustedDomain = email.isEmail() && trustedDomains.none { email.endsWith(it) }
71+
val isMailerDaemon = """mailer-daemon@(?:.+\.)?infomaniak\.ch""".toRegex(RegexOption.IGNORE_CASE).matches(email)
7272

73-
return isUnknownContact && !isMailerDaemon && isUntrustedDomain && !isAlias
73+
return@with isUnknownContact && !isAlias && isUntrustedDomain && !isMailerDaemon
7474
}
7575

7676
fun quotedDisplayName(): String = "${("$name ").ifBlank { "" }}<$email>"

app/src/main/java/com/infomaniak/mail/ui/main/thread/SubjectFormatter.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.core.content.res.ResourcesCompat
2727
import com.infomaniak.mail.MatomoMail.trackExternalEvent
2828
import com.infomaniak.mail.R
2929
import com.infomaniak.mail.data.models.thread.Thread
30+
import com.infomaniak.mail.utils.ExternalUtils.ExternalData
3031
import com.infomaniak.mail.utils.ExternalUtils.findExternalRecipients
3132
import com.infomaniak.mail.utils.Utils
3233
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
@@ -57,7 +58,7 @@ class SubjectFormatter @Inject constructor(private val appContext: Context) {
5758
if (!externalMailFlagEnabled) return previousContent
5859

5960
val (externalRecipientEmail, externalRecipientQuantity) = thread.findExternalRecipients(
60-
emailDictionary, aliases, trustedDomains,
61+
externalData = ExternalData(emailDictionary, aliases, trustedDomains),
6162
)
6263
if (externalRecipientQuantity == 0) return previousContent
6364

app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageExternalsManager.kt

+16-27
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import com.infomaniak.mail.MatomoMail.trackExternalEvent
2222
import com.infomaniak.mail.R
2323
import com.infomaniak.mail.databinding.FragmentNewMessageBinding
2424
import com.infomaniak.mail.ui.alertDialogs.InformationAlertDialog
25+
import com.infomaniak.mail.utils.ExternalUtils.ExternalData
2526
import com.infomaniak.mail.utils.ExternalUtils.findExternalRecipientForNewMessage
2627
import com.infomaniak.mail.utils.Utils
27-
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
2828
import dagger.hilt.android.scopes.FragmentScoped
2929
import javax.inject.Inject
3030

@@ -49,41 +49,30 @@ class NewMessageExternalsManager @Inject constructor() : NewMessageManager() {
4949

5050
fun observeExternals(arrivedFromExistingDraft: Boolean) = with(newMessageViewModel) {
5151
Utils.waitInitMediator(initResult, mergedContacts).observe(viewLifecycleOwner) { (_, mergedContacts) ->
52-
val externalMailFlagEnabled = currentMailbox.externalMailFlagEnabled
53-
val trustedDomains = currentMailbox.trustedDomains
54-
val shouldWarnForExternal = externalMailFlagEnabled && !arrivedFromExistingDraft
55-
val emailDictionary = mergedContacts.second
56-
val aliases = currentMailbox.aliases
57-
58-
updateFields(shouldWarnForExternal, emailDictionary, aliases, trustedDomains)
59-
updateBanner(shouldWarnForExternal, emailDictionary, aliases, trustedDomains)
52+
val shouldWarnForExternal = currentMailbox.externalMailFlagEnabled && !arrivedFromExistingDraft
53+
val externalData = ExternalData(
54+
emailDictionary = mergedContacts.second,
55+
aliases = currentMailbox.aliases,
56+
trustedDomains = currentMailbox.trustedDomains,
57+
)
58+
59+
updateFields(shouldWarnForExternal, externalData)
60+
updateBanner(shouldWarnForExternal, externalData)
6061
}
6162
}
6263

63-
private fun updateFields(
64-
shouldWarnForExternal: Boolean,
65-
emailDictionary: MergedContactDictionary,
66-
aliases: List<String>,
67-
trustedDomains: List<String>,
68-
) {
64+
private fun updateFields(shouldWarnForExternal: Boolean, externalData: ExternalData) {
6965
with(binding) {
70-
toField.updateExternals(shouldWarnForExternal, emailDictionary, aliases, trustedDomains)
71-
ccField.updateExternals(shouldWarnForExternal, emailDictionary, aliases, trustedDomains)
72-
bccField.updateExternals(shouldWarnForExternal, emailDictionary, aliases, trustedDomains)
66+
toField.updateExternals(shouldWarnForExternal, externalData)
67+
ccField.updateExternals(shouldWarnForExternal, externalData)
68+
bccField.updateExternals(shouldWarnForExternal, externalData)
7369
}
7470
}
7571

76-
private fun updateBanner(
77-
shouldWarnForExternal: Boolean,
78-
emailDictionary: MergedContactDictionary,
79-
aliases: List<String>,
80-
trustedDomains: List<String>,
81-
) {
72+
private fun updateBanner(shouldWarnForExternal: Boolean, externalData: ExternalData) {
8273
with(newMessageViewModel) {
8374
if (shouldWarnForExternal && !isExternalBannerManuallyClosed) {
84-
val (externalEmail, externalQuantity) = draft.findExternalRecipientForNewMessage(
85-
aliases, emailDictionary, trustedDomains,
86-
)
75+
val (externalEmail, externalQuantity) = draft.findExternalRecipientForNewMessage(externalData)
8776
externalRecipientCount.value = externalEmail to externalQuantity
8877
}
8978
}

app/src/main/java/com/infomaniak/mail/ui/newMessage/RecipientFieldView.kt

+3-8
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ import com.infomaniak.mail.data.models.correspondent.Recipient
4343
import com.infomaniak.mail.databinding.ViewContactChipContextMenuBinding
4444
import com.infomaniak.mail.databinding.ViewRecipientFieldBinding
4545
import com.infomaniak.mail.ui.main.SnackbarManager
46+
import com.infomaniak.mail.utils.ExternalUtils.ExternalData
4647
import com.infomaniak.mail.utils.UiUtils
47-
import com.infomaniak.mail.utils.extensions.MergedContactDictionary
4848
import com.infomaniak.mail.utils.extensions.isEmail
4949
import com.infomaniak.mail.utils.extensions.toggleChevron
5050
import dagger.hilt.android.AndroidEntryPoint
@@ -417,16 +417,11 @@ class RecipientFieldView @JvmOverloads constructor(
417417
return (if (recipientCount == 1) recipients.single().email else null) to recipientCount
418418
}
419419

420-
fun updateExternals(
421-
shouldWarnForExternal: Boolean,
422-
emailDictionary: MergedContactDictionary,
423-
aliases: List<String>,
424-
trustedDomains: List<String>,
425-
) {
420+
fun updateExternals(shouldWarnForExternal: Boolean, externalData: ExternalData) {
426421
for (recipient in contactChipAdapter.getRecipients()) {
427422
if (recipient.isManuallyEntered) continue
428423

429-
val shouldDisplayAsExternal = shouldWarnForExternal && recipient.isExternal(emailDictionary, aliases, trustedDomains)
424+
val shouldDisplayAsExternal = shouldWarnForExternal && recipient.isExternal(externalData)
430425
recipient.initDisplayAsExternal(shouldDisplayAsExternal)
431426

432427
updateCollapsedChipValues(isSelfCollapsed)

app/src/main/java/com/infomaniak/mail/utils/ExternalUtils.kt

+12-18
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,12 @@ object ExternalUtils {
2727
/**
2828
* Only returns a quantity of at most 2, used to differentiate between the singular or plural form of the dialog messages
2929
*/
30-
fun Thread.findExternalRecipients(
31-
emailDictionary: MergedContactDictionary,
32-
aliases: List<String>,
33-
trustedDomains: List<String>,
34-
): Pair<String?, Int> {
30+
fun Thread.findExternalRecipients(externalData: ExternalData): Pair<String?, Int> {
3531
var externalRecipientEmail: String? = null
3632
var externalRecipientQuantity = 0
3733

3834
messages.forEach { message ->
39-
val (singleEmail, quantityForThisMessage) = findExternalRecipientInIterables(
40-
emailDictionary, aliases, trustedDomains, message.from,
41-
)
35+
val (singleEmail, quantityForThisMessage) = findExternalRecipientInIterables(externalData, message.from)
4236

4337
externalRecipientQuantity += quantityForThisMessage
4438
if (externalRecipientQuantity > 1) return null to 2
@@ -49,15 +43,11 @@ object ExternalUtils {
4943
return externalRecipientEmail to externalRecipientQuantity
5044
}
5145

52-
fun Draft.findExternalRecipientForNewMessage(
53-
aliases: List<String>,
54-
emailDictionary: MergedContactDictionary,
55-
trustedDomains: List<String>,
56-
): Pair<String?, Int> {
46+
fun Draft.findExternalRecipientForNewMessage(externalData: ExternalData): Pair<String?, Int> {
5747
val to = to.onlyAutomaticallyAddedOnes()
5848
val cc = cc.onlyAutomaticallyAddedOnes()
5949
val bcc = bcc.onlyAutomaticallyAddedOnes()
60-
return findExternalRecipientInIterables(emailDictionary, aliases, trustedDomains, to, cc, bcc)
50+
return findExternalRecipientInIterables(externalData, to, cc, bcc)
6151
}
6252

6353
private fun List<Recipient>.onlyAutomaticallyAddedOnes(): List<Recipient> = filter { !it.isManuallyEntered }
@@ -66,17 +56,15 @@ object ExternalUtils {
6656
* Only returns a quantity of at most 2, used to differentiate between the singular or plural form of the dialog messages
6757
*/
6858
private fun findExternalRecipientInIterables(
69-
emailDictionary: MergedContactDictionary,
70-
aliases: List<String>,
71-
trustedDomains: List<String>,
59+
externalData: ExternalData,
7260
vararg recipientLists: Iterable<Recipient>,
7361
): Pair<String?, Int> {
7462
var externalRecipientEmail: String? = null
7563
var externalRecipientQuantity = 0
7664

7765
recipientLists.forEach { recipientList ->
7866
recipientList.forEach { recipient ->
79-
if (recipient.isExternal(emailDictionary, aliases, trustedDomains)) {
67+
if (recipient.isExternal(externalData)) {
8068
if (externalRecipientQuantity++ == 0) {
8169
externalRecipientEmail = recipient.email
8270
} else {
@@ -88,4 +76,10 @@ object ExternalUtils {
8876

8977
return externalRecipientEmail to externalRecipientQuantity
9078
}
79+
80+
data class ExternalData(
81+
val emailDictionary: MergedContactDictionary,
82+
val aliases: List<String>,
83+
val trustedDomains: List<String>,
84+
)
9185
}

0 commit comments

Comments
 (0)