Clean up bookkeeping around threads.

This commit is contained in:
Greyson Parrelli
2021-07-27 13:52:49 -04:00
committed by GitHub
parent 0478757af4
commit 7d8f780d60
23 changed files with 81 additions and 70 deletions

View File

@@ -697,10 +697,10 @@ public class MmsDatabase extends MessageDatabase {
if (retrieved.getGroupId() != null) {
RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromPossiblyMigratedGroupId(retrieved.getGroupId());
Recipient groupRecipients = Recipient.resolved(groupRecipientId);
return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipients);
return DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(groupRecipients);
} else {
Recipient sender = Recipient.resolved(retrieved.getFrom());
return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(sender);
return DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(sender);
}
}
@@ -709,7 +709,7 @@ public class MmsDatabase extends MessageDatabase {
? Util.toIsoString(notification.getFrom().getTextString())
: "";
Recipient recipient = Recipient.external(context, fromString);
return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
return DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient);
}
private Cursor rawQuery(@NonNull String where, @Nullable String[] arguments) {

View File

@@ -741,7 +741,7 @@ public class SmsDatabase extends MessageDatabase {
{
SQLiteDatabase db = databaseHelper.getWritableDatabase();
Recipient recipient = Recipient.resolved(groupRecipientId);
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient);
boolean peerEraIdSameAsPrevious = updatePreviousGroupCall(threadId, peekGroupCallEraId, peekJoinedUuids, isCallFull);
try {
@@ -803,7 +803,7 @@ public class SmsDatabase extends MessageDatabase {
Recipient recipient = Recipient.resolved(groupRecipientId);
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient);
String where = TYPE + " = ? AND " + THREAD_ID + " = ?";
String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId);
@@ -908,7 +908,7 @@ public class SmsDatabase extends MessageDatabase {
private @NonNull Pair<Long, Long> insertCallLog(@NonNull RecipientId recipientId, long type, boolean unread, long timestamp) {
Recipient recipient = Recipient.resolved(recipientId);
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient);
ContentValues values = new ContentValues(6);
values.put(RECIPIENT_ID, recipientId.serialize());
@@ -1108,8 +1108,8 @@ public class SmsDatabase extends MessageDatabase {
long threadId;
if (groupRecipient == null) threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient);
else threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient);
if (groupRecipient == null) threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient);
else threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(groupRecipient);
ContentValues values = new ContentValues();
values.put(RECIPIENT_ID, message.getSender().serialize());
@@ -1170,7 +1170,7 @@ public class SmsDatabase extends MessageDatabase {
@Override
public @NonNull InsertResult insertChatSessionRefreshedMessage(@NonNull RecipientId recipientId, long senderDeviceId, long sentTimestamp) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(Recipient.resolved(recipientId));
long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(Recipient.resolved(recipientId));
long type = Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT;
type = type & (Types.TOTAL_MASK - Types.ENCRYPTION_MASK) | Types.ENCRYPTION_REMOTE_FAILED_BIT;

View File

@@ -225,7 +225,7 @@ public class SmsMigrator {
if (ourRecipients != null) {
if (ourRecipients.size() == 1) {
long ourThreadId = threadDatabase.getThreadIdFor(ourRecipients.iterator().next());
long ourThreadId = threadDatabase.getOrCreateThreadIdFor(ourRecipients.iterator().next());
migrateConversation(context, listener, progress, theirThreadId, ourThreadId);
} else if (ourRecipients.size() > 1) {
ourRecipients.add(Recipient.self());
@@ -235,7 +235,7 @@ public class SmsMigrator {
GroupId.Mms ourGroupId = DatabaseFactory.getGroupDatabase(context).getOrCreateMmsGroupForMembers(recipientIds);
RecipientId ourGroupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(ourGroupId);
Recipient ourGroupRecipient = Recipient.resolved(ourGroupRecipientId);
long ourThreadId = threadDatabase.getThreadIdFor(ourGroupRecipient, ThreadDatabase.DistributionTypes.CONVERSATION);
long ourThreadId = threadDatabase.getOrCreateThreadIdFor(ourGroupRecipient, ThreadDatabase.DistributionTypes.CONVERSATION);
migrateConversation(context, listener, progress, theirThreadId, ourThreadId);
}

View File

@@ -371,7 +371,7 @@ public class ThreadDatabase extends Database {
}
public boolean hasCalledSince(@NonNull Recipient recipient, long timestamp) {
return hasReceivedAnyCallsSince(getThreadIdFor(recipient), timestamp);
return hasReceivedAnyCallsSince(getOrCreateThreadIdFor(recipient), timestamp);
}
public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) {
@@ -1035,15 +1035,15 @@ public class ThreadDatabase extends Database {
return candidateId;
}
} else {
return getThreadIdFor(recipient, distributionType);
return getOrCreateThreadIdFor(recipient, distributionType);
}
}
public long getThreadIdFor(@NonNull Recipient recipient) {
return getThreadIdFor(recipient, DistributionTypes.DEFAULT);
public long getOrCreateThreadIdFor(@NonNull Recipient recipient) {
return getOrCreateThreadIdFor(recipient, DistributionTypes.DEFAULT);
}
public long getThreadIdFor(@NonNull Recipient recipient, int distributionType) {
public long getOrCreateThreadIdFor(@NonNull Recipient recipient, int distributionType) {
Long threadId = getThreadIdFor(recipient.getId());
if (threadId != null) {
return threadId;
@@ -1260,7 +1260,7 @@ public class ThreadDatabase extends Database {
}
public @NonNull ThreadRecord getThreadRecordFor(@NonNull Recipient recipient) {
return Objects.requireNonNull(getThreadRecord(getThreadIdFor(recipient)));
return Objects.requireNonNull(getThreadRecord(getOrCreateThreadIdFor(recipient)));
}
public @NonNull Set<RecipientId> getAllThreadRecipients() {

View File

@@ -209,8 +209,9 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab
private static final int MMS_AUTOINCREMENT = 109;
private static final int ABANDONED_ATTACHMENT_CLEANUP = 110;
private static final int AVATAR_PICKER = 111;
private static final int THREAD_CLEANUP = 112;
private static final int DATABASE_VERSION = 111;
private static final int DATABASE_VERSION = 112;
private static final String DATABASE_NAME = "signal.db";
private final Context context;
@@ -1955,6 +1956,11 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab
}
}
if (oldVersion < THREAD_CLEANUP) {
db.delete("mms", "thread_id NOT IN (SELECT _id FROM thread)", null);
db.delete("part", "mid != -8675309 AND mid NOT IN (SELECT _id FROM mms)", null);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();

View File

@@ -36,7 +36,7 @@ public final class RecipientMediaLoader extends MediaLoader {
if (recipientId == null || recipientId.isUnknown()) return null;
long threadId = DatabaseFactory.getThreadDatabase(getContext())
.getThreadIdFor(Recipient.resolved(recipientId));
.getOrCreateThreadIdFor(Recipient.resolved(recipientId));
return ThreadMediaLoader.createThreadMediaCursor(context, threadId, mediaType, sorting);
}