mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-24 03:35:58 +00:00
Fix crash when sending media message as first message in conversation.
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user