diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java index d7935915d6..dd985fff39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java @@ -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() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index 8065f81147..e1b032905a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -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 threadIds); abstract void deleteAllThreads(); abstract void deleteAbandonedMessages(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 8a379ac2d5..0e8ac32ae8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index c7806df89f..9d9ab9b492 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -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() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 123d45910a..9fc728bd7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 32a2cf6157..86163eb787 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -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); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderModel.java b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderModel.java index 4e59b51dee..4a276e16ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderModel.java @@ -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 getReminder() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java index d9293dc40b..fdaa15435d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index 1b0a42d666..bbe26b343d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -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();