From 5eaf1000c8770cb1b29a3c18a93db8352a770772 Mon Sep 17 00:00:00 2001 From: jeffrey-signal Date: Fri, 27 Mar 2026 15:31:32 -0400 Subject: [PATCH] Prevent hidden recipients from appearing in recent conversations. --- .../database/ThreadTableTest_recents.kt | 43 +++++++++++++------ .../securesms/database/ThreadTable.kt | 1 + 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_recents.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_recents.kt index e892121423..c3276512f9 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_recents.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadTableTest_recents.kt @@ -29,24 +29,39 @@ class ThreadTableTest_recents { } @Test - fun givenARecentRecipient_whenIBlockAndGetRecents_thenIDoNotExpectToSeeThatRecipient() { - // GIVEN + fun getRecentConversationList_excludes_blocked_recipients() { + createActiveThreadFor(recipient) + + SignalDatabase.recipients.setBlocked(recipient.id, true) + + assertFalse(recipient.id in getRecentConversationRecipients(limit = 10)) + } + + @Test + fun getRecentConversationList_excludes_hidden_recipients() { + createActiveThreadFor(recipient) + + SignalDatabase.recipients.markHidden(recipient.id) + + assertFalse(recipient.id in getRecentConversationRecipients(limit = 10)) + } + + private fun createActiveThreadFor(recipient: Recipient) { val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) MmsHelper.insert(recipient = recipient, threadId = threadId) SignalDatabase.threads.update(threadId, true) + } - // WHEN - SignalDatabase.recipients.setBlocked(recipient.id, true) - val results: MutableList = SignalDatabase.threads.getRecentConversationList(10, false, false, false, false, false, false).use { cursor -> - val ids = mutableListOf() - while (cursor.moveToNext()) { - ids.add(RecipientId.from(CursorUtil.requireLong(cursor, ThreadTable.RECIPIENT_ID))) + @Suppress("SameParameterValue") + private fun getRecentConversationRecipients(limit: Int = 10): Set { + return SignalDatabase.threads + .getRecentConversationList(limit = limit, includeInactiveGroups = false, individualsOnly = false, groupsOnly = false, hideV1Groups = false, hideSms = false, hideSelf = false) + .use { cursor -> + buildSet { + while (cursor.moveToNext()) { + add(RecipientId.from(CursorUtil.requireLong(cursor, ThreadTable.RECIPIENT_ID))) + } + } } - - ids - } - - // THEN - assertFalse(recipient.id in results) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 44192b5b63..8dbcb3208f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -910,6 +910,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa where += " AND $ARCHIVED = 0" where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.BLOCKED} = 0" + where += " AND ${RecipientTable.TABLE_NAME}.${RecipientTable.HIDDEN} = 0" if (SignalStore.releaseChannel.releaseChannelRecipientId != null) { where += " AND $TABLE_NAME.$RECIPIENT_ID != ${SignalStore.releaseChannel.releaseChannelRecipientId!!.toLong()}"