Add PNP change number insert events and tests.

This commit is contained in:
Greyson Parrelli
2022-11-07 19:11:54 -05:00
committed by Cody Henthorne
parent 433b5ebc13
commit 739a8e9451
6 changed files with 77 additions and 28 deletions

View File

@@ -178,7 +178,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns,
public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, int defaultReceiptStatus, @Nullable SmsDatabase.InsertListener insertListener) throws MmsException;
public abstract void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName);
public abstract void insertGroupV1MigrationEvents(@NonNull RecipientId recipientId, long threadId, @NonNull GroupMigrationMembershipChange membershipChange);
public abstract void insertNumberChangeMessages(@NonNull Recipient recipient);
public abstract void insertNumberChangeMessages(@NonNull RecipientId recipientId);
public abstract void insertBoostRequestMessage(@NonNull RecipientId recipientId, long threadId);
public abstract void insertThreadMergeEvent(@NonNull RecipientId recipientId, long threadId, @NonNull ThreadMergeEvent event);
public abstract void insertSmsExportMessage(@NonNull RecipientId recipientId, long threadId);

View File

@@ -572,7 +572,7 @@ public class MmsDatabase extends MessageDatabase {
}
@Override
public void insertNumberChangeMessages(@NonNull Recipient recipient) {
public void insertNumberChangeMessages(@NonNull RecipientId recipientId) {
throw new UnsupportedOperationException();
}

View File

@@ -2445,8 +2445,11 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
Log.w(TAG, "Session switchover events aren't implemented yet!")
}
is PnpOperation.ChangeNumberInsert -> {
// TODO [pnp]
Log.w(TAG, "Change number inserts aren't implemented yet!")
if (changeSet.id is PnpIdResolver.PnpNoopId) {
SignalDatabase.sms.insertNumberChangeMessages(changeSet.id.recipientId)
} else {
throw IllegalStateException("There's a change number event on a newly-inserted recipient?")
}
}
}
}
@@ -2649,7 +2652,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
)
}
if (record.e164 != null && updatedNumber) {
if (record.e164 != null && updatedNumber && notSelf(e164, pni, aci) && !record.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = commonId,
oldE164 = record.e164,
@@ -2762,7 +2765,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
secondaryId = data.byPniSid
)
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164) {
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164 && notSelf(e164, pni, aci) && !data.aciSidRecord.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = data.byAciSid,
oldE164 = data.aciSidRecord.e164,
@@ -2788,7 +2791,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
e164 = e164
)
if (data.aciSidRecord.e164 != null) {
if (data.aciSidRecord.e164 != null && notSelf(e164, pni, aci) && !data.aciSidRecord.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = data.byAciSid,
oldE164 = data.aciSidRecord.e164,
@@ -2829,7 +2832,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
secondaryId = data.byE164
)
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164) {
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164 && notSelf(e164, pni, aci) && !data.aciSidRecord.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = data.byAciSid,
oldE164 = data.aciSidRecord.e164,
@@ -2854,7 +2857,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
secondaryId = data.byE164
)
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164) {
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164 && notSelf(e164, pni, aci) && !data.aciSidRecord.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = data.byAciSid,
oldE164 = data.aciSidRecord.e164,
@@ -2872,7 +2875,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
e164 = e164
)
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164) {
if (data.aciSidRecord.e164 != null && data.aciSidRecord.e164 != e164 && notSelf(e164, pni, aci) && !data.aciSidRecord.isBlocked) {
operations += PnpOperation.ChangeNumberInsert(
recipientId = data.byAciSid,
oldE164 = data.aciSidRecord.e164,

View File

@@ -88,6 +88,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import static org.thoughtcrime.securesms.database.MmsSmsColumns.Types.CHANGE_NUMBER_TYPE;
import static org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS;
/**
@@ -1070,16 +1071,16 @@ public class SmsDatabase extends MessageDatabase {
}
@Override
public void insertNumberChangeMessages(@NonNull Recipient recipient) {
public void insertNumberChangeMessages(@NonNull RecipientId recipientId) {
ThreadDatabase threadDatabase = SignalDatabase.threads();
List<GroupDatabase.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipient.getId(), false);
List<GroupDatabase.GroupRecord> groupRecords = SignalDatabase.groups().getGroupsContainingMember(recipientId, false);
List<Long> threadIdsToUpdate = new LinkedList<>();
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.beginTransaction();
try {
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(recipient.getId()));
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(recipientId));
for (GroupDatabase.GroupRecord groupRecord : groupRecords) {
if (groupRecord.isActive()) {
threadIdsToUpdate.add(threadDatabase.getThreadIdFor(groupRecord.getRecipientId()));
@@ -1090,7 +1091,7 @@ public class SmsDatabase extends MessageDatabase {
.filter(Objects::nonNull)
.forEach(threadId -> {
ContentValues values = new ContentValues();
values.put(RECIPIENT_ID, recipient.getId().serialize());
values.put(RECIPIENT_ID, recipientId.serialize());
values.put(ADDRESS_DEVICE_ID, 1);
values.put(DATE_RECEIVED, System.currentTimeMillis());
values.put(DATE_SENT, System.currentTimeMillis());
@@ -2018,6 +2019,26 @@ public class SmsDatabase extends MessageDatabase {
}
}
/**
* The number of change number messages in the thread.
* Currently only used for tests.
*/
@VisibleForTesting
int getChangeNumberMessageCount(@NonNull RecipientId recipientId) {
try (Cursor cursor = SQLiteDatabaseExtensionsKt
.select(getReadableDatabase(), "COUNT(*)")
.from(TABLE_NAME)
.where(RECIPIENT_ID + " = ? AND " + TYPE + " = ?", recipientId, CHANGE_NUMBER_TYPE)
.run())
{
if (cursor.moveToFirst()) {
return cursor.getInt(0);
} else {
return 0;
}
}
}
@VisibleForTesting
Optional<InsertResult> collapseJoinRequestEventsIfPossible(long threadId, IncomingGroupUpdateMessage message) {
InsertResult result = null;

View File

@@ -32,7 +32,7 @@ class RecipientChangedNumberJob(parameters: Parameters, private val recipientId:
if (!recipient.isBlocked && !recipient.isGroup && !recipient.isSelf) {
Log.i(TAG, "Writing a number change event.")
SignalDatabase.sms.insertNumberChangeMessages(recipient)
SignalDatabase.sms.insertNumberChangeMessages(recipient.id)
} else {
Log.i(TAG, "Number changed but not relevant. blocked: ${recipient.isBlocked} isGroup: ${recipient.isGroup} isSelf: ${recipient.isSelf}")
}