diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt index 8c43d0bfc..bb5ddd511 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt @@ -5,6 +5,7 @@ import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.mms.IncomingMediaMessage import org.thoughtcrime.securesms.mms.OutgoingMediaMessage +import org.thoughtcrime.securesms.mms.OutgoingSecureMediaMessage import org.thoughtcrime.securesms.recipients.Recipient import java.util.Optional @@ -25,7 +26,8 @@ object MmsHelper { storyType: StoryType = StoryType.NONE, parentStoryId: ParentStoryId? = null, isStoryReaction: Boolean = false, - giftBadge: GiftBadge? = null + giftBadge: GiftBadge? = null, + secure: Boolean = true ): Long { val message = OutgoingMediaMessage( recipient, @@ -46,7 +48,9 @@ object MmsHelper { emptySet(), emptySet(), giftBadge - ) + ).let { + if (secure) OutgoingSecureMediaMessage(it) else it + } return insert( message = message, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientDatabaseTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientDatabaseTest.kt new file mode 100644 index 000000000..4c721a738 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientDatabaseTest.kt @@ -0,0 +1,91 @@ +package org.thoughtcrime.securesms.database + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.signal.core.util.CursorUtil +import org.thoughtcrime.securesms.profiles.ProfileName +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.testing.SignalActivityRule + +@RunWith(AndroidJUnit4::class) +class RecipientDatabaseTest { + + @get:Rule + val harness = SignalActivityRule() + + @Test + fun givenABlockedRecipient_whenIQueryAllContacts_thenIDoNotExpectBlockedToBeReturned() { + val blockedRecipient = harness.others[0] + SignalDatabase.recipients.setProfileName(blockedRecipient, ProfileName.fromParts("Blocked", "Person")) + SignalDatabase.recipients.setBlocked(blockedRecipient, true) + + val results = SignalDatabase.recipients.queryAllContacts("Blocked")!! + + assertEquals(0, results.count) + } + + @Test + fun givenABlockedRecipient_whenIGetSignalContacts_thenIDoNotExpectBlockedToBeReturned() { + val blockedRecipient = harness.others[0] + SignalDatabase.recipients.setProfileName(blockedRecipient, ProfileName.fromParts("Blocked", "Person")) + SignalDatabase.recipients.setBlocked(blockedRecipient, true) + + val results: MutableList = SignalDatabase.recipients.getSignalContacts(false)?.use { + val ids = mutableListOf() + while (it.moveToNext()) { + ids.add(RecipientId.from(CursorUtil.requireLong(it, RecipientDatabase.ID))) + } + + ids + }!! + + assertNotEquals(0, results.size) + assertFalse(blockedRecipient in results) + } + + @Test + fun givenABlockedRecipient_whenIQuerySignalContacts_thenIDoNotExpectBlockedToBeReturned() { + val blockedRecipient = harness.others[0] + SignalDatabase.recipients.setProfileName(blockedRecipient, ProfileName.fromParts("Blocked", "Person")) + SignalDatabase.recipients.setBlocked(blockedRecipient, true) + + val results = SignalDatabase.recipients.querySignalContacts("Blocked", false)!! + + assertEquals(0, results.count) + } + + @Test + fun givenABlockedRecipient_whenIQueryNonGroupContacts_thenIDoNotExpectBlockedToBeReturned() { + val blockedRecipient = harness.others[0] + SignalDatabase.recipients.setProfileName(blockedRecipient, ProfileName.fromParts("Blocked", "Person")) + SignalDatabase.recipients.setBlocked(blockedRecipient, true) + + val results = SignalDatabase.recipients.queryNonGroupContacts("Blocked", false)!! + + assertEquals(0, results.count) + } + + @Test + fun givenABlockedRecipient_whenIGetNonGroupContacts_thenIDoNotExpectBlockedToBeReturned() { + val blockedRecipient = harness.others[0] + SignalDatabase.recipients.setProfileName(blockedRecipient, ProfileName.fromParts("Blocked", "Person")) + SignalDatabase.recipients.setBlocked(blockedRecipient, true) + + val results: MutableList = SignalDatabase.recipients.getNonGroupContacts(false)?.use { + val ids = mutableListOf() + while (it.moveToNext()) { + ids.add(RecipientId.from(CursorUtil.requireLong(it, RecipientDatabase.ID))) + } + + ids + }!! + + assertNotEquals(0, results.size) + assertFalse(blockedRecipient in results) + } +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_recents.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_recents.kt new file mode 100644 index 000000000..744451749 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_recents.kt @@ -0,0 +1,52 @@ +package org.thoughtcrime.securesms.database + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert.assertFalse +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.signal.core.util.CursorUtil +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.testing.SignalDatabaseRule +import org.whispersystems.signalservice.api.push.ServiceId +import java.util.UUID + +@Suppress("ClassName") +@RunWith(AndroidJUnit4::class) +class ThreadDatabaseTest_recents { + + @Rule + @JvmField + val databaseRule = SignalDatabaseRule() + + private lateinit var recipient: Recipient + + @Before + fun setUp() { + recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ServiceId.from(UUID.randomUUID()))) + } + + @Test + fun givenARecentRecipient_whenIBlockAndGetRecents_thenIDoNotExpectToSeeThatRecipient() { + // GIVEN + 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, ThreadDatabase.RECIPIENT_ID))) + } + + ids + } + + // THEN + assertFalse(recipient.id in results) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt index 05b7dbad1..6513a3a6d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -133,7 +133,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : const val GROUP_ID = "group_id" const val DISTRIBUTION_LIST_ID = "distribution_list_id" const val GROUP_TYPE = "group_type" - private const val BLOCKED = "blocked" + const val BLOCKED = "blocked" private const val MESSAGE_RINGTONE = "message_ringtone" private const val MESSAGE_VIBRATE = "message_vibrate" private const val CALL_RINGTONE = "call_ringtone" diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index b40f7a52c..f371397e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -625,6 +625,7 @@ public class ThreadDatabase extends Database { } query += " AND " + ARCHIVED + " = 0"; + query += " AND " + RecipientDatabase.TABLE_NAME + "." + RecipientDatabase.BLOCKED + " = 0"; if (SignalStore.releaseChannelValues().getReleaseChannelRecipientId() != null) { query += " AND " + RECIPIENT_ID + " != " + SignalStore.releaseChannelValues().getReleaseChannelRecipientId().toLong();