diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/MessageExt.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/MessageExt.kt index 524350809c..03d428a9c8 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/MessageExt.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/MessageExt.kt @@ -11,6 +11,7 @@ import com.flowcrypt.email.api.email.gmail.GmailApiHelper import com.flowcrypt.email.extensions.kotlin.asContentTypeOrNull import com.flowcrypt.email.extensions.kotlin.asInternetAddresses import com.google.api.services.gmail.model.Message +import com.google.api.services.gmail.model.MessagePartHeader import jakarta.mail.internet.InternetAddress /** @@ -76,4 +77,8 @@ fun Message.isDraft(): Boolean { fun Message.hasAttachments(): Boolean { return payload?.hasAttachments() ?: false +} + +fun Message.filterHeadersWithName(name: String): List { + return payload?.headers?.filter { header -> header.name == name } ?: emptyList() } \ No newline at end of file diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/ThreadExt.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/ThreadExt.kt index a10ef7d29a..a6e8f6f964 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/ThreadExt.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/extensions/com/google/api/services/gmail/model/ThreadExt.kt @@ -20,23 +20,36 @@ import jakarta.mail.internet.InternetAddress */ fun Thread.getUniqueRecipients(account: String): List { return mutableListOf().apply { - val filteredHeaders = messages?.flatMap { message -> - if (message?.payload?.headers?.any { - it.name in listOf( - "From", - "To", - "Cc", - "Delivered-To" - ) && it.value.contains(account, true) - } == true) { - message.payload?.headers?.filter { header -> - header.name == "From" - } ?: emptyList() - } else emptyList() + if (messages == null || messages.isEmpty()) { + return@apply + } + val fromHeaderName = "From" + + val filteredHeaders = if (messages.size > 1) { + //if we have more than one message in a conversation, + //firstly we will try to filter only active recipients + messages.flatMap { message -> + val listOfAcceptedHeaders = listOf( + fromHeaderName, + "To", + "Cc", + "Delivered-To" + ) + if (message.payload?.headers?.any { + it.name in listOfAcceptedHeaders && it.value.contains(account, true) + } == true) { + message.filterHeadersWithName(fromHeaderName) + } else emptyList() + }.ifEmpty { + //otherwise we will use all recipients + messages.flatMap { message -> message.filterHeadersWithName(fromHeaderName) } + } + } else { + messages.first().filterHeadersWithName(fromHeaderName) } val mapOfUniqueRecipients = mutableMapOf() - filteredHeaders?.forEach { header -> + filteredHeaders.forEach { header -> header.value.asInternetAddresses().forEach { internetAddress -> val address = internetAddress.address.lowercase()