Fix group collisions error.

This commit is contained in:
Alex Hart 2024-05-01 15:35:01 -03:00 committed by Greyson Parrelli
parent ab9ecff4d4
commit 03d8f72c41

View file

@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId
import java.io.IOException import java.io.IOException
import java.security.MessageDigest import java.security.MessageDigest
import java.security.NoSuchAlgorithmException import java.security.NoSuchAlgorithmException
import java.util.Optional
import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.days
/** /**
@ -166,7 +167,7 @@ class NameCollisionTables(
return emptyList() return emptyList()
} }
val collisions = readableDatabase val collisions: Set<ReviewRecipient> = readableDatabase
.select() .select()
.from(NameCollisionMembershipTable.TABLE_NAME) .from(NameCollisionMembershipTable.TABLE_NAME)
.where("${NameCollisionMembershipTable.COLLISION_ID} = ?", collisionId) .where("${NameCollisionMembershipTable.COLLISION_ID} = ?", collisionId)
@ -176,11 +177,16 @@ class NameCollisionTables(
Recipient.resolved(RecipientId.from(cursor.requireLong(NameCollisionMembershipTable.RECIPIENT_ID))), Recipient.resolved(RecipientId.from(cursor.requireLong(NameCollisionMembershipTable.RECIPIENT_ID))),
cursor.requireBlob(NameCollisionMembershipTable.PROFILE_CHANGE_DETAILS)?.let { ProfileChangeDetails.ADAPTER.decode(it) } cursor.requireBlob(NameCollisionMembershipTable.PROFILE_CHANGE_DETAILS)?.let { ProfileChangeDetails.ADAPTER.decode(it) }
) )
}.toMutableList() }.toSet()
val groups = collisions.groupBy { SqlUtil.buildCaseInsensitiveGlobPattern(it.recipient.getDisplayName(context)) } val groupMembers: Optional<List<RecipientId>> = SignalDatabase.groups.getGroup(recipientId).map { it.members }
val toDelete: List<ReviewRecipient> = groups.values.filter { it.size < 2 }.flatten() val invalidCollisions: Set<ReviewRecipient> = collisions.filter {
val toReturn: List<ReviewRecipient> = groups.values.filter { it.size >= 2 }.flatten() groupMembers.isPresent && (it.recipient.id !in groupMembers.get())
}.toSet()
val groups = (collisions - invalidCollisions).groupBy { SqlUtil.buildCaseInsensitiveGlobPattern(it.recipient.getDisplayName(context)) }
val toDelete: Set<ReviewRecipient> = invalidCollisions + groups.values.filter { it.size < 2 }.flatten().toSet()
val toReturn: Set<ReviewRecipient> = groups.values.filter { it.size >= 2 }.flatten().toSet()
if (toDelete.isNotEmpty()) { if (toDelete.isNotEmpty()) {
writableDatabase.withinTransaction { db -> writableDatabase.withinTransaction { db ->
@ -199,7 +205,7 @@ class NameCollisionTables(
} }
} }
return toReturn return toReturn.toList()
} }
/** /**