From 7ed2b1f8773f2c451161157678721d0405752ea2 Mon Sep 17 00:00:00 2001 From: denbond7 Date: Wed, 19 Feb 2025 15:41:59 +0200 Subject: [PATCH 1/3] Fixed empty recipients issue.| #2955 --- .../api/services/gmail/model/ThreadExt.kt | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) 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..d43f893829 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,19 +20,25 @@ 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() + val filteredHeaders = if ((messages?.size ?: 0) > 1) { + 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() + } + } else { + messages.firstOrNull()?.payload?.headers?.filter { header -> + header.name == "From" + } } val mapOfUniqueRecipients = mutableMapOf() From 3a4c7c0c64080280d14110f07190ff7663602653 Mon Sep 17 00:00:00 2001 From: denbond7 Date: Wed, 19 Feb 2025 16:00:01 +0200 Subject: [PATCH 2/3] Refactored code --- .../api/services/gmail/model/ThreadExt.kt | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) 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 d43f893829..227506df6b 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,9 +20,15 @@ import jakarta.mail.internet.InternetAddress */ fun Thread.getUniqueRecipients(account: String): List { return mutableListOf().apply { - val filteredHeaders = if ((messages?.size ?: 0) > 1) { - messages?.flatMap { message -> - if (message?.payload?.headers?.any { + if (messages == null || messages.isEmpty()) { + return@apply + } + + 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 -> + if (message.payload?.headers?.any { it.name in listOf( "From", "To", @@ -34,15 +40,22 @@ fun Thread.getUniqueRecipients(account: String): List { header.name == "From" } ?: emptyList() } else emptyList() + }.ifEmpty { + //otherwise we will use all recipients + messages.flatMap { message -> + message.payload?.headers?.filter { header -> + header.name == "From" + } ?: emptyList() + } } } else { - messages.firstOrNull()?.payload?.headers?.filter { header -> + messages.first().payload?.headers?.filter { header -> header.name == "From" - } + } ?: emptyList() } val mapOfUniqueRecipients = mutableMapOf() - filteredHeaders?.forEach { header -> + filteredHeaders.forEach { header -> header.value.asInternetAddresses().forEach { internetAddress -> val address = internetAddress.address.lowercase() From 0e8be18cfbc3b50d8982b5c599870325af6e47dc Mon Sep 17 00:00:00 2001 From: denbond7 Date: Wed, 19 Feb 2025 16:09:21 +0200 Subject: [PATCH 3/3] Refactored code --- .../api/services/gmail/model/MessageExt.kt | 5 ++++ .../api/services/gmail/model/ThreadExt.kt | 28 ++++++++----------- 2 files changed, 16 insertions(+), 17 deletions(-) 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 227506df6b..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 @@ -23,35 +23,29 @@ fun Thread.getUniqueRecipients(account: String): List { 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 listOf( - "From", - "To", - "Cc", - "Delivered-To" - ) && it.value.contains(account, true) + it.name in listOfAcceptedHeaders && it.value.contains(account, true) } == true) { - message.payload?.headers?.filter { header -> - header.name == "From" - } ?: emptyList() + message.filterHeadersWithName(fromHeaderName) } else emptyList() }.ifEmpty { //otherwise we will use all recipients - messages.flatMap { message -> - message.payload?.headers?.filter { header -> - header.name == "From" - } ?: emptyList() - } + messages.flatMap { message -> message.filterHeadersWithName(fromHeaderName) } } } else { - messages.first().payload?.headers?.filter { header -> - header.name == "From" - } ?: emptyList() + messages.first().filterHeadersWithName(fromHeaderName) } val mapOfUniqueRecipients = mutableMapOf()