From e2c3db3eda58aea10be545cd04c4254b67057c4c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 15 Feb 2023 14:11:24 -0400 Subject: [PATCH] Fix miscalculation of groups in common. --- .../securesms/database/GroupTableTest.kt | 18 +++ .../messages/MessageContentProcessorTest.kt | 2 +- .../manage/UsernameEditFragmentTest.kt | 2 +- .../contacts/paged/GroupsInCommon.kt | 9 ++ .../securesms/database/GroupTable.kt | 2 +- .../securesms/database/MessageTable.java | 3 +- gradle/verification-metadata.xml | 114 +++++++++++++++++- 7 files changed, 141 insertions(+), 9 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt index f791e6f64c..5c6d45c44f 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt @@ -224,6 +224,24 @@ class GroupTableTest { assertEquals(g2, gr2.get().id) } + @Test + fun givenASharedActiveGroupWithoutAThread_whenISearchForRecipientsWithGroupsInCommon_thenIExpectThatGroup() { + val groupInCommon = insertPushGroup() + val expected = Recipient.resolved(harness.others[0]) + + SignalDatabase.recipients.setProfileSharing(expected.id, false) + + SignalDatabase.recipients.queryGroupMemberContacts("Buddy")!!.use { + assertTrue(it.moveToFirst()) + assertEquals(1, it.count) + assertEquals(expected.id.toLong(), it.requireLong(RecipientTable.ID)) + } + + val groups = groupTable.getPushGroupsContainingMember(expected.id) + assertEquals(1, groups.size) + assertEquals(groups[0].id, groupInCommon) + } + private fun insertThread(groupId: GroupId): Long { val groupRecipient = SignalDatabase.recipients.getByGroupId(groupId).get() return SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(groupRecipient)) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTest.kt index 800c0bec5e..2e65da6bca 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTest.kt @@ -30,7 +30,7 @@ abstract class MessageContentProcessorTest { protected fun createNormalContentTestSubject(): MessageContentProcessor { val context = ApplicationProvider.getApplicationContext() - return MessageContentProcessor.forNormalContent(context) + return MessageContentProcessor.create(context) } /** diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt index 1804db2bbe..47de2aa06c 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt @@ -100,7 +100,7 @@ class UsernameEditFragmentTest { InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Put("/v1/accounts/username/reserved") { - MockResponse().success(ReserveUsernameResponse(username, "reservationToken")) + MockResponse().success(ReserveUsernameResponse(username)) }, Put("/v1/accounts/username/confirm") { MockResponse().success() diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/GroupsInCommon.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/GroupsInCommon.kt index 4a9cba9d76..b8641bb5bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/GroupsInCommon.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/GroupsInCommon.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.contacts.paged import android.content.Context +import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R /** @@ -12,6 +13,10 @@ data class GroupsInCommon( ) { fun toDisplayText(context: Context): String { return when (total) { + 0 -> { + Log.w(TAG, "Member with no groups in common!") + return "" + } 1 -> context.getString(R.string.MessageRequestProfileView_member_of_one_group, names[0]) 2 -> context.getString(R.string.MessageRequestProfileView_member_of_two_groups, names[0], names[1]) else -> context.getString( @@ -22,4 +27,8 @@ data class GroupsInCommon( ) } } + + companion object { + private val TAG = Log.tag(GroupsInCommon::class.java) + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt index d4138feb55..592ac6f6c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt @@ -565,7 +565,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT ) as $MEMBER_GROUP_CONCAT FROM ${MembershipTable.TABLE_NAME} INNER JOIN $TABLE_NAME ON ${MembershipTable.TABLE_NAME}.${MembershipTable.GROUP_ID} = $TABLE_NAME.$GROUP_ID - INNER JOIN ${ThreadTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} + LEFT JOIN ${ThreadTable.TABLE_NAME} ON $TABLE_NAME.$RECIPIENT_ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} """.toSingleLine() var query = "${MembershipTable.TABLE_NAME}.${MembershipTable.RECIPIENT_ID} = ?" diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java index 4eb7f8dd1b..29d97c95d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java @@ -1533,7 +1533,8 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie return releaseChannelThreadId; } - private void deleteGroupStoryReplies(long parentStoryId) { + @VisibleForTesting + public void deleteGroupStoryReplies(long parentStoryId) { SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String[] args = SqlUtil.buildArgs(parentStoryId); diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 7ff23ad21f..122d8732cd 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -1889,6 +1889,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -2017,6 +2022,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2043,6 +2056,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2061,12 +2082,12 @@ https://docs.gradle.org/current/userguide/dependency_verification.html - - - + + + - - + + @@ -2095,6 +2116,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2121,6 +2150,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2129,6 +2166,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -2137,6 +2179,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2145,6 +2195,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2171,6 +2229,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -2903,21 +2969,41 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + + + + + + + + + + @@ -2933,6 +3019,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -5368,6 +5459,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -5408,6 +5504,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + +