Skip to content

Commit 139a988

Browse files
feat: Handle signatures containing +xxx in the answering email (#2212)
2 parents 189c4de + 9b8458a commit 139a988

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/MessageController.kt

+10-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.infomaniak.mail.data.models.thread.Thread
2727
import com.infomaniak.mail.data.models.thread.Thread.ThreadFilter
2828
import com.infomaniak.mail.utils.AccountUtils
2929
import com.infomaniak.mail.utils.LocalStorageUtils.deleteDraftUploadDir
30+
import com.infomaniak.mail.utils.extensions.getStartAndEndOfPlusEmail
3031
import io.realm.kotlin.MutableRealm
3132
import io.realm.kotlin.Realm
3233
import io.realm.kotlin.TypedRealm
@@ -59,10 +60,17 @@ class MessageController @Inject constructor(private val mailboxContentRealm: Rea
5960
fun getLastMessageToExecuteAction(thread: Thread): Message = with(thread) {
6061

6162
val isNotScheduledDraft = "${Message::isScheduledDraft.name} == false"
62-
val isNotFromMe = "SUBQUERY(${Message::from.name}, \$recipient, " +
63+
64+
val isNotFromRealMe = "SUBQUERY(${Message::from.name}, \$recipient, " +
6365
"\$recipient.${Recipient::email.name} != '${AccountUtils.currentMailboxEmail}').@count > 0"
6466

65-
return messages.query("$isNotDraft AND $isNotScheduledDraft AND $isNotFromMe").find().lastOrNull()
67+
val (start, end) = AccountUtils.currentMailboxEmail.getStartAndEndOfPlusEmail()
68+
val isNotFromPlusMe = "SUBQUERY(${Message::from.name}, \$recipient," +
69+
" \$recipient.${Recipient::email.name} BEGINSWITH '${start}'" +
70+
" AND \$recipient.${Recipient::email.name} ENDSWITH '${end}'" +
71+
").@count < 1"
72+
73+
return messages.query("$isNotDraft AND $isNotScheduledDraft AND $isNotFromRealMe AND $isNotFromPlusMe").find().lastOrNull()
6674
?: messages.query("$isNotDraft AND $isNotScheduledDraft").find().lastOrNull()
6775
?: messages.query(isNotScheduledDraft).find().lastOrNull()
6876
?: messages.last()

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.os.Parcelable
2222
import com.infomaniak.lib.core.utils.firstOrEmpty
2323
import com.infomaniak.mail.R
2424
import com.infomaniak.mail.utils.AccountUtils
25+
import com.infomaniak.mail.utils.extensions.getStartAndEndOfPlusEmail
2526
import io.sentry.Sentry
2627

2728
interface Correspondent : Parcelable {
@@ -30,7 +31,17 @@ interface Correspondent : Parcelable {
3031

3132
val initials: String
3233

33-
fun isMe(): Boolean = AccountUtils.currentMailboxEmail?.lowercase() == email.lowercase()
34+
fun isMe(): Boolean {
35+
val userEmail = AccountUtils.currentMailboxEmail?.lowercase()
36+
val correspondentEmail = email.lowercase()
37+
38+
val isRealMe = userEmail == correspondentEmail
39+
40+
val (start, end) = userEmail.getStartAndEndOfPlusEmail()
41+
val isPlusMe = correspondentEmail.startsWith(start) && correspondentEmail.endsWith(end)
42+
43+
return isRealMe || isPlusMe
44+
}
3445

3546
fun shouldDisplayUserAvatar(): Boolean = isMe() && email.lowercase() == AccountUtils.currentUser?.email?.lowercase()
3647

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1150,7 +1150,7 @@ class MainViewModel @Inject constructor(
11501150
message != null -> {
11511151
message.folder.role
11521152
}
1153-
threads?.firstOrNull()?.folder?.id == FolderController.SEARCH_FOLDER_ID -> {
1153+
threads?.firstOrNull()?.folderId == FolderController.SEARCH_FOLDER_ID -> {
11541154
folderController.getFolder(threads.first().folderId)?.role
11551155
}
11561156
else -> {

app/src/main/java/com/infomaniak/mail/utils/extensions/Extensions.kt

+7
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,13 @@ fun String.removeLineBreaksFromHtml(): Document = jsoupParseWithLog(replace("\r"
143143

144144
fun String.htmlToText(): String = removeLineBreaksFromHtml().wholeText()
145145

146+
fun String?.getStartAndEndOfPlusEmail(): Pair<String, String> {
147+
val splittedEmail = this?.split("@")
148+
val fromStartToPlus = splittedEmail?.first() + "+"
149+
val fromArobaseToEnd = "@" + splittedEmail?.last()
150+
return fromStartToPlus to fromArobaseToEnd
151+
}
152+
146153
//region Date
147154
fun RealmInstant.toDate(): Date = Date(epochSeconds * 1_000L + nanosecondsOfSecond / 1_000L)
148155

0 commit comments

Comments
 (0)