Fix crash when sending media message as first message in conversation.

This commit is contained in:
Cody Henthorne
2021-08-13 12:50:45 -04:00
parent 7448183ff4
commit 0838c0be27
9 changed files with 57 additions and 40 deletions

View File

@@ -468,7 +468,10 @@ public class AttachmentDatabase extends Database {
String selectAllMmsIds = "SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME;
String where = MMS_ID + " != " + PREUPLOAD_MESSAGE_ID + " AND " + MMS_ID + " NOT IN (" + selectAllMmsIds + ")";
db.delete(TABLE_NAME, where, null);
int deletes = db.delete(TABLE_NAME, where, null);
if (deletes > 0) {
Log.i(TAG, "Trimmed " + deletes + " abandoned attachments.");
}
}
public int deleteAbandonedAttachmentFiles() {

View File

@@ -172,7 +172,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract boolean deleteMessage(long messageId);
abstract void deleteThread(long threadId);
abstract boolean deleteMessagesInThreadBeforeDate(long threadId, long date);
abstract int deleteMessagesInThreadBeforeDate(long threadId, long date);
abstract void deleteThreads(@NonNull Set<Long> threadIds);
abstract void deleteAllThreads();
abstract void deleteAbandonedMessages();

View File

@@ -1451,7 +1451,7 @@ public class MmsDatabase extends MessageDatabase {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
}
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
@Override
@@ -1797,11 +1797,11 @@ public class MmsDatabase extends MessageDatabase {
}
@Override
boolean deleteMessagesInThreadBeforeDate(long threadId, long date) {
int deleteMessagesInThreadBeforeDate(long threadId, long date) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date;
return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)) > 0;
return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId));
}
@Override
@@ -1809,7 +1809,10 @@ public class MmsDatabase extends MessageDatabase {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")";
db.delete(TABLE_NAME, where, null);
int deletes = db.delete(TABLE_NAME, where, null);
if (deletes > 0) {
Log.i(TAG, "Deleted " + deletes + " abandoned messages");
}
}
@Override

View File

@@ -589,11 +589,11 @@ public class MmsSmsDatabase extends Database {
DatabaseFactory.getMmsDatabase(context).setNotifiedTimestamp(timestamp, mmsIds);
}
public boolean deleteMessagesInThreadBeforeDate(long threadId, long trimBeforeDate) {
public int deleteMessagesInThreadBeforeDate(long threadId, long trimBeforeDate) {
Log.d(TAG, "deleteMessagesInThreadBeforeData(" + threadId + ", " + trimBeforeDate + ")");
boolean deletedSms = DatabaseFactory.getSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
boolean deletedMms = DatabaseFactory.getMmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
return deletedSms || deletedMms;
int deletes = DatabaseFactory.getSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
deletes += DatabaseFactory.getMmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
return deletes;
}
public void deleteAbandonedMessages() {

View File

@@ -749,7 +749,7 @@ public class SmsDatabase extends MessageDatabase {
}
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
@Override
@@ -826,7 +826,7 @@ public class SmsDatabase extends MessageDatabase {
}
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
@Override
@@ -892,7 +892,7 @@ public class SmsDatabase extends MessageDatabase {
}
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
return new Pair<>(messageId, threadId);
}
@@ -979,7 +979,7 @@ public class SmsDatabase extends MessageDatabase {
Stream.of(threadIdsToUpdate)
.withoutNulls()
.forEach(threadId -> ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId)));
.forEach(TrimThreadJob::enqueueAsync);
}
@Override
@@ -994,7 +994,7 @@ public class SmsDatabase extends MessageDatabase {
}
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
private void insertGroupV1MigrationNotification(@NonNull RecipientId recipientId, long threadId) {
@@ -1119,7 +1119,7 @@ public class SmsDatabase extends MessageDatabase {
notifyConversationListeners(threadId);
if (!silent) {
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
return Optional.of(new InsertResult(messageId, threadId));
@@ -1156,7 +1156,7 @@ public class SmsDatabase extends MessageDatabase {
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
return new InsertResult(messageId, threadId);
}
@@ -1180,7 +1180,7 @@ public class SmsDatabase extends MessageDatabase {
notifyConversationListeners(threadId);
ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId));
TrimThreadJob.enqueueAsync(threadId);
}
@Override
@@ -1335,11 +1335,11 @@ public class SmsDatabase extends MessageDatabase {
}
@Override
boolean deleteMessagesInThreadBeforeDate(long threadId, long date) {
int deleteMessagesInThreadBeforeDate(long threadId, long date) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " < " + date;
return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId)) > 0;
return db.delete(TABLE_NAME, where, SqlUtil.buildArgs(threadId));
}
@Override
@@ -1347,7 +1347,10 @@ public class SmsDatabase extends MessageDatabase {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String where = THREAD_ID + " NOT IN (SELECT _id FROM " + ThreadDatabase.TABLE_NAME + ")";
db.delete(TABLE_NAME, where, null);
int deletes = db.delete(TABLE_NAME, where, null);
if (deletes > 0) {
Log.i(TAG, "Deleted " + deletes + " abandoned messages");
}
}
@Override

View File

@@ -340,12 +340,15 @@ public class ThreadDatabase extends Database {
if (trimBeforeDate != NO_TRIM_BEFORE_DATE_SET) {
Log.i(TAG, "Trimming thread: " + threadId + " before: " + trimBeforeDate);
boolean deletedMessages = DatabaseFactory.getMmsSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
int deletes = DatabaseFactory.getMmsSmsDatabase(context).deleteMessagesInThreadBeforeDate(threadId, trimBeforeDate);
if (deletedMessages) {
if (deletes > 0) {
Log.i(TAG, "Trimming deleted " + deletes + " messages thread: " + threadId);
setLastScrolled(threadId, 0);
update(threadId, false);
notifyConversationListeners(threadId);
} else {
Log.i(TAG, "Trimming deleted no messages thread: " + threadId);
}
}
}

View File

@@ -50,18 +50,18 @@ public final class InviteReminderModel {
}
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
long threadId = threadDatabase.getOrCreateThreadIdFor(recipient);
Long threadId = threadDatabase.getThreadIdFor(recipient.getId());
MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context);
int conversationCount = mmsSmsDatabase.getInsecureSentCount(threadId);
if (threadId != null) {
int conversationCount = DatabaseFactory.getMmsSmsDatabase(context).getInsecureSentCount(threadId);
if (conversationCount >= SECOND_INVITE_REMINDER_MESSAGE_THRESHOLD && !resolved.hasSeenSecondInviteReminder()) {
return new SecondInviteReminderInfo(context, resolved, repository, repository.getPercentOfInsecureMessages(conversationCount));
} else if (conversationCount >= FIRST_INVITE_REMINDER_MESSAGE_THRESHOLD && !resolved.hasSeenFirstInviteReminder()) {
return new FirstInviteReminderInfo(context, resolved, repository, repository.getPercentOfInsecureMessages(conversationCount));
} else {
return new NoReminderInfo();
if (conversationCount >= SECOND_INVITE_REMINDER_MESSAGE_THRESHOLD && !resolved.hasSeenSecondInviteReminder()) {
return new SecondInviteReminderInfo(context, resolved, repository, repository.getPercentOfInsecureMessages(conversationCount));
} else if (conversationCount >= FIRST_INVITE_REMINDER_MESSAGE_THRESHOLD && !resolved.hasSeenFirstInviteReminder()) {
return new FirstInviteReminderInfo(context, resolved, repository, repository.getPercentOfInsecureMessages(conversationCount));
}
}
return new NoReminderInfo();
}
public @NonNull Optional<Reminder> getReminder() {

View File

@@ -1,4 +1,4 @@
/**
/*
* Copyright (C) 2014 Open Whisper Systems
*
* This program is free software: you can redistribute it and/or modify
@@ -32,18 +32,23 @@ public class TrimThreadJob extends BaseJob {
public static final String KEY = "TrimThreadJob";
private static final String TAG = Log.tag(TrimThreadJob.class);
private static final String TAG = Log.tag(TrimThreadJob.class);
private static final String QUEUE_PREFIX = "TrimThreadJob_";
private static final String KEY_THREAD_ID = "thread_id";
private long threadId;
private final long threadId;
public static void enqueueAsync(long threadId) {
SignalExecutors.BOUNDED.execute(() -> ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId)));
if (SignalStore.settings().getKeepMessagesDuration() != KeepMessagesDuration.FOREVER || SignalStore.settings().isTrimByLengthEnabled()) {
SignalExecutors.BOUNDED.execute(() -> ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId)));
}
}
public TrimThreadJob(long threadId) {
this(new Job.Parameters.Builder().setQueue("TrimThreadJob").build(), threadId);
private TrimThreadJob(long threadId) {
this(new Job.Parameters.Builder().setQueue(QUEUE_PREFIX + threadId)
.setMaxInstancesForQueue(2)
.build(),
threadId);
}
private TrimThreadJob(@NonNull Job.Parameters parameters, long threadId) {

View File

@@ -1298,7 +1298,7 @@ public final class MessageContentProcessor {
}
ApplicationDependencies.getMessageNotifier().updateNotification(context, insertResult.get().getThreadId());
ApplicationDependencies.getJobManager().add(new TrimThreadJob(insertResult.get().getThreadId()));
TrimThreadJob.enqueueAsync(insertResult.get().getThreadId());
if (message.isViewOnce()) {
ApplicationDependencies.getViewOnceMessageManager().scheduleIfNecessary();