From f29f25822b70ac721c061d4b30d4638be6b75ac6 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 24 Aug 2020 16:40:47 -0400 Subject: [PATCH] Have DatabaseFactory.getMmsDatabase() return MessageDatabase. --- .../conversation/ConversationFragment.java | 4 +- .../conversation/MessageCountsViewModel.java | 9 +- .../securesms/database/DatabaseFactory.java | 2 +- .../securesms/database/MessageDatabase.java | 71 ++++++++- .../securesms/database/MmsDatabase.java | 138 ++++++------------ .../securesms/database/MmsSmsDatabase.java | 8 +- .../securesms/database/SmsDatabase.java | 114 ++++++++++++++- .../groups/GroupV1MessageProcessor.java | 2 +- .../v2/processing/GroupsV2StateProcessor.java | 8 +- .../securesms/jobs/MmsDownloadJob.java | 9 +- .../securesms/jobs/MmsReceiveJob.java | 3 +- .../securesms/jobs/MmsSendJob.java | 5 +- .../securesms/jobs/PushGroupSendJob.java | 5 +- .../securesms/jobs/PushMediaSendJob.java | 5 +- .../securesms/jobs/PushProcessMessageJob.java | 12 +- .../securesms/jobs/WakeGroupV2Job.java | 3 +- .../migrations/LegacyMigrationJob.java | 3 +- .../revealable/ViewOnceMessageManager.java | 3 +- .../revealable/ViewOnceMessageRepository.java | 3 +- .../securesms/search/SearchRepository.java | 7 +- .../securesms/sms/MessageSender.java | 10 +- 21 files changed, 278 insertions(+), 146 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 2b062eb45..1b6f3f269 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -905,7 +905,7 @@ public class ConversationFragment extends LoggingFragment { } public long stageOutgoingMessage(OutgoingMediaMessage message) { - MessageRecord messageRecord = DatabaseFactory.getMmsDatabase(getContext()).readerFor(message, threadId).getCurrent(); + MessageRecord messageRecord = MmsDatabase.readerFor(message, threadId).getCurrent(); if (getListAdapter() != null) { clearHeaderIfNotTyping(getListAdapter()); @@ -1081,7 +1081,7 @@ public class ConversationFragment extends LoggingFragment { private void scrollToNextMention() { SimpleTask.run(getViewLifecycleOwner().getLifecycle(), () -> { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(ApplicationDependencies.getApplication()); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(ApplicationDependencies.getApplication()); return mmsDatabase.getOldestUnreadMentionDetails(threadId); }, (pair) -> { if (pair != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/MessageCountsViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/MessageCountsViewModel.java index 0ac5daabe..659abd70b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/MessageCountsViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/MessageCountsViewModel.java @@ -13,6 +13,7 @@ import androidx.lifecycle.ViewModelProvider; import org.thoughtcrime.securesms.database.DatabaseContentProviders; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -78,10 +79,10 @@ public class MessageCountsViewModel extends ViewModel { } private Pair getCounts(@NonNull Context context, long threadId) { - MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); - int unreadCount = mmsSmsDatabase.getUnreadCount(threadId); - int unreadMentionCount = mmsDatabase.getUnreadMentionCount(threadId); + MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + int unreadCount = mmsSmsDatabase.getUnreadCount(threadId); + int unreadMentionCount = mmsDatabase.getUnreadMentionCount(threadId); return new Pair<>(unreadCount, unreadMentionCount); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java index a81e8b4d2..94ec86bda 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -86,7 +86,7 @@ public class DatabaseFactory { return getInstance(context).sms; } - public static MmsDatabase getMmsDatabase(Context context) { + public static MessageDatabase getMmsDatabase(Context context) { return getInstance(context).mms; } 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 f1a3ae0f9..d6674d7c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.annimon.stream.Stream; +import com.google.android.mms.pdu_alt.NotificationInd; import com.google.protobuf.InvalidProtocolBufferException; import net.sqlcipher.database.SQLiteDatabase; @@ -17,6 +18,7 @@ import net.sqlcipher.database.SQLiteStatement; import org.thoughtcrime.securesms.database.documents.Document; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList; +import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.SmsMessageRecord; @@ -24,8 +26,12 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ReactionList; import org.thoughtcrime.securesms.database.model.ReactionRecord; import org.thoughtcrime.securesms.insights.InsightsConstants; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.mms.IncomingMediaMessage; +import org.thoughtcrime.securesms.mms.MmsException; +import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo; import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.util.JsonUtils; @@ -33,6 +39,7 @@ import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; +import java.io.Closeable; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -56,17 +63,26 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns protected abstract String getDateReceivedColumnName(); public abstract @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived); + public abstract long getLatestGroupQuitTimestamp(long threadId, long quitTimeBarrier); + public abstract boolean isGroupQuitMessage(long messageId); + public abstract @Nullable Pair getOldestUnreadMentionDetails(long threadId); + public abstract int getUnreadMentionCount(long threadId); public abstract long getThreadIdForMessage(long id); public abstract int getMessageCountForThread(long threadId); public abstract int getMessageCountForThread(long threadId, long beforeTime); abstract int getMessageCountForThreadSummary(long threadId); + public abstract Optional getNotification(long messageId); public abstract Cursor getExpirationStartedMessages(); public abstract SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException; + public abstract Reader getMessages(Collection messageIds); public abstract Cursor getMessageCursor(long messageId); + public abstract OutgoingMediaMessage getOutgoingMessage(long messageId) throws MmsException, NoSuchMessageException; public abstract MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException; public abstract Cursor getVerboseMessageCursor(long messageId); public abstract boolean hasReceivedAnyCallsSince(long threadId, long timestamp); + public abstract @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage(); + public abstract boolean isSent(long messageId); public abstract void markExpireStarted(long messageId); public abstract void markExpireStarted(long messageId, long startTime); @@ -95,14 +111,18 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns public abstract void markAsMissedCall(long id); public abstract void markAsNotified(long id); public abstract void markSmsStatus(long id, int status); + public abstract void markDownloadState(long messageId, long state); + public abstract void markIncomingNotificationReceived(long threadId); - public abstract boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt); + public abstract boolean incrementReceiptCount(SyncMessageId messageId, long timestamp, boolean deliveryReceipt); public abstract List> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted); public abstract List setEntireThreadRead(long threadId); public abstract List setMessagesReadSince(long threadId, long timestamp); public abstract List setAllMessagesRead(); public abstract Pair updateBundleMessageBody(long messageId, String body); + public abstract void addFailures(long messageId, List failure); + public abstract void removeFailure(long messageId, NetworkFailure failure); public abstract @NonNull Pair insertReceivedCall(@NonNull RecipientId address); public abstract @NonNull Pair insertOutgoingCall(@NonNull RecipientId address); @@ -110,7 +130,12 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns public abstract Optional insertMessageInbox(IncomingTextMessage message, long type); public abstract Optional insertMessageInbox(IncomingTextMessage message); + public abstract Optional insertMessageInbox(IncomingMediaMessage retrieved, String contentLocation, long threadId) throws MmsException; + public abstract Pair insertMessageInbox(@NonNull NotificationInd notification, int subscriptionId); + public abstract Optional insertSecureDecryptedMessageInbox(IncomingMediaMessage retrieved, long threadId) throws MmsException; public abstract long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener); + public abstract long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, @Nullable SmsDatabase.InsertListener insertListener) throws MmsException; + 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 boolean deleteMessage(long messageId); @@ -119,9 +144,11 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns abstract void deleteThreads(@NonNull Set threadIds); abstract void deleteAllThreads(); - abstract SQLiteDatabase beginTransaction(); - abstract void endTransaction(SQLiteDatabase database); - abstract SQLiteStatement createInsertStatement(SQLiteDatabase database); + public abstract SQLiteDatabase beginTransaction(); + public abstract void endTransaction(SQLiteDatabase database); + public abstract void setTransactionSuccessful(); + public abstract void endTransaction(); + public abstract SQLiteStatement createInsertStatement(SQLiteDatabase database); public abstract void ensureMigration(); @@ -594,7 +621,43 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns } } + public static class MmsNotificationInfo { + private final RecipientId from; + private final String contentLocation; + private final String transactionId; + private final int subscriptionId; + + MmsNotificationInfo(@NonNull RecipientId from, String contentLocation, String transactionId, int subscriptionId) { + this.from = from; + this.contentLocation = contentLocation; + this.transactionId = transactionId; + this.subscriptionId = subscriptionId; + } + + public String getContentLocation() { + return contentLocation; + } + + public String getTransactionId() { + return transactionId; + } + + public int getSubscriptionId() { + return subscriptionId; + } + + public @NonNull RecipientId getFrom() { + return from; + } + } + public interface InsertListener { void onComplete(); } + + public interface Reader extends Closeable { + MessageRecord getNext(); + MessageRecord getCurrent(); + void close(); + } } 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 0af33bb3c..9d47687f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -377,11 +377,6 @@ public class MmsDatabase extends MessageDatabase { throw new UnsupportedOperationException(); } - @Override - public boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) { - throw new UnsupportedOperationException(); - } - @Override public Pair updateBundleMessageBody(long messageId, String body) { throw new UnsupportedOperationException(); @@ -423,12 +418,12 @@ public class MmsDatabase extends MessageDatabase { } @Override - void endTransaction(SQLiteDatabase database) { - + public void endTransaction(SQLiteDatabase database) { + database.endTransaction(); } @Override - SQLiteStatement createInsertStatement(SQLiteDatabase database) { + public SQLiteStatement createInsertStatement(SQLiteDatabase database) { throw new UnsupportedOperationException(); } @@ -437,6 +432,7 @@ public class MmsDatabase extends MessageDatabase { databaseHelper.getWritableDatabase(); } + @Override public boolean isGroupQuitMessage(long messageId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -454,6 +450,7 @@ public class MmsDatabase extends MessageDatabase { return false; } + @Override public long getLatestGroupQuitTimestamp(long threadId, long quitTimeBarrier) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -473,6 +470,7 @@ public class MmsDatabase extends MessageDatabase { return -1; } + @Override public int getMessageCountForThread(long threadId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -489,6 +487,7 @@ public class MmsDatabase extends MessageDatabase { return 0; } + @Override public int getMessageCountForThread(long threadId, long beforeTime) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -505,6 +504,7 @@ public class MmsDatabase extends MessageDatabase { return 0; } + @Override public void addFailures(long messageId, List failure) { try { addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class); @@ -513,6 +513,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public void removeFailure(long messageId, NetworkFailure failure) { try { removeFromDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class); @@ -521,6 +522,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public boolean incrementReceiptCount(SyncMessageId messageId, long timestamp, boolean deliveryReceipt) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); boolean found = false; @@ -567,6 +569,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public long getThreadIdForMessage(long id) { String sql = "SELECT " + THREAD_ID + " FROM " + TABLE_NAME + " WHERE " + ID + " = ?"; String[] sqlArgs = new String[] {id+""}; @@ -630,6 +633,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public Reader getMessages(Collection messageIds) { String ids = TextUtils.join(",", messageIds); return readerFor(rawQuery(MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " IN (" + ids + ")", null)); @@ -646,17 +650,20 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public void markAsOutbox(long messageId) { long threadId = getThreadIdForMessage(messageId); updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_OUTBOX_TYPE, Optional.of(threadId)); } + @Override public void markAsForcedSms(long messageId) { long threadId = getThreadIdForMessage(messageId); updateMailboxBitmask(messageId, Types.PUSH_MESSAGE_BIT, Types.MESSAGE_FORCE_SMS_BIT, Optional.of(threadId)); notifyConversationListeners(threadId); } + @Override public void markAsPendingInsecureSmsFallback(long messageId) { long threadId = getThreadIdForMessage(messageId); updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_PENDING_INSECURE_SMS_FALLBACK, Optional.of(threadId)); @@ -670,6 +677,7 @@ public class MmsDatabase extends MessageDatabase { notifyConversationListeners(threadId); } + @Override public void markAsSentFailed(long messageId) { long threadId = getThreadIdForMessage(messageId); updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE, Optional.of(threadId)); @@ -706,6 +714,7 @@ public class MmsDatabase extends MessageDatabase { notifyConversationListeners(threadId); } + @Override public void markDownloadState(long messageId, long state) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -715,24 +724,11 @@ public class MmsDatabase extends MessageDatabase { notifyConversationListeners(getThreadIdForMessage(messageId)); } - public void markAsNoSession(long messageId, long threadId) { - updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT, Optional.of(threadId)); - notifyConversationListeners(threadId); - } - -// public void markAsSecure(long messageId) { -// updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT, Optional.absent()); -// } - @Override public void markAsInsecure(long messageId) { updateMailboxBitmask(messageId, Types.SECURE_MESSAGE_BIT, 0, Optional.absent()); } -// public void markAsPush(long messageId) { -// updateMailboxBitmask(messageId, 0, Types.PUSH_MESSAGE_BIT, Optional.absent()); -// } - @Override public void markUnidentified(long messageId, boolean unidentified) { ContentValues contentValues = new ContentValues(); @@ -781,6 +777,7 @@ public class MmsDatabase extends MessageDatabase { notifyConversationListeners(threadId); } + @Override public void markAsNotified(long id) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -799,10 +796,12 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public List setEntireThreadRead(long threadId) { return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)}); } + @Override public List setAllMessagesRead() { return setMessagesRead(READ + " = 0", null); } @@ -845,6 +844,7 @@ public class MmsDatabase extends MessageDatabase { return result; } + @Override public List> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); List> expiring = new LinkedList<>(); @@ -888,6 +888,7 @@ public class MmsDatabase extends MessageDatabase { return expiring; } + @Override public @Nullable Pair getOldestUnreadMentionDetails(long threadId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); String[] projection = new String[]{RECIPIENT_ID,DATE_RECEIVED}; @@ -903,6 +904,7 @@ public class MmsDatabase extends MessageDatabase { return null; } + @Override public int getUnreadMentionCount(long threadId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); String[] projection = new String[]{"COUNT(*)"}; @@ -918,12 +920,6 @@ public class MmsDatabase extends MessageDatabase { return 0; } - public void updateMessageBody(long messageId, String body) { - long type = 0; - - updateMessageBodyAndType(messageId, body, Types.ENCRYPTION_MASK, type); - } - /** * Trims data related to expired messages. Only intended to be run after a backup restore. */ @@ -949,22 +945,7 @@ public class MmsDatabase extends MessageDatabase { } } - private Pair updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { - SQLiteDatabase db = databaseHelper.getWritableDatabase(); - db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " + - MESSAGE_BOX + " = (" + MESSAGE_BOX + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + ") " + - "WHERE " + ID + " = ?", - new String[] {body, messageId + ""}); - - long threadId = getThreadIdForMessage(messageId); - - DatabaseFactory.getThreadDatabase(context).update(threadId, true); - notifyConversationListeners(threadId); - notifyConversationListListeners(); - - return new Pair<>(messageId, threadId); - } - + @Override public Optional getNotification(long messageId) { Cursor cursor = null; @@ -985,6 +966,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public OutgoingMediaMessage getOutgoingMessage(long messageId) throws MmsException, NoSuchMessageException { @@ -1217,6 +1199,7 @@ public class MmsDatabase extends MessageDatabase { return Optional.of(new InsertResult(messageId, threadId)); } + @Override public Optional insertMessageInbox(IncomingMediaMessage retrieved, String contentLocation, long threadId) throws MmsException @@ -1234,6 +1217,7 @@ public class MmsDatabase extends MessageDatabase { return insertMessageInbox(retrieved, contentLocation, threadId, type); } + @Override public Optional insertSecureDecryptedMessageInbox(IncomingMediaMessage retrieved, long threadId) throws MmsException { @@ -1287,6 +1271,7 @@ public class MmsDatabase extends MessageDatabase { return new Pair<>(messageId, threadId); } + @Override public void markIncomingNotificationReceived(long threadId) { notifyConversationListeners(threadId); DatabaseFactory.getThreadDatabase(context).update(threadId, true); @@ -1298,14 +1283,17 @@ public class MmsDatabase extends MessageDatabase { ApplicationDependencies.getJobManager().add(new TrimThreadJob(threadId)); } + @Override public long insertMessageOutbox(@NonNull OutgoingMediaMessage message, - long threadId, boolean forceSms, + long threadId, + boolean forceSms, @Nullable SmsDatabase.InsertListener insertListener) throws MmsException { return insertMessageOutbox(message, threadId, forceSms, GroupReceiptDatabase.STATUS_UNDELIVERED, insertListener); } + @Override public long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, int defaultReceiptStatus, @Nullable SmsDatabase.InsertListener insertListener) @@ -1492,6 +1480,7 @@ public class MmsDatabase extends MessageDatabase { return threadDeleted; } + @Override public void deleteThread(long threadId) { Set singleThreadSet = new HashSet<>(); singleThreadSet.add(threadId); @@ -1559,6 +1548,7 @@ public class MmsDatabase extends MessageDatabase { } } + @Override public boolean isSent(long messageId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); try (Cursor cursor = database.query(TABLE_NAME, new String[] { MESSAGE_BOX }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) { @@ -1571,7 +1561,7 @@ public class MmsDatabase extends MessageDatabase { } @Override - void deleteThreads(Set threadIds) { + void deleteThreads(@NonNull Set threadIds) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); String where = ""; Cursor cursor = null; @@ -1631,6 +1621,7 @@ public class MmsDatabase extends MessageDatabase { database.delete(TABLE_NAME, null, null); } + @Override public @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() { SQLiteDatabase db = databaseHelper.getReadableDatabase(); ViewOnceExpirationInfo info = null; @@ -1663,21 +1654,6 @@ public class MmsDatabase extends MessageDatabase { return info; } - public Cursor getCarrierMmsInformation(String apn) { - Uri uri = Uri.withAppendedPath(Uri.parse("content://telephony/carriers"), "current"); - String selection = TextUtils.isEmpty(apn) ? null : "apn = ?"; - String[] selectionArgs = TextUtils.isEmpty(apn) ? null : new String[] {apn.trim()}; - - try { - return context.getContentResolver().query(uri, null, selection, selectionArgs, null); - } catch (NullPointerException npe) { - // NOTE - This is dumb, but on some devices there's an NPE in the Android framework - // for the provider of this call, which gets rethrown back to here through a binder - // call. - throw new IllegalArgumentException(npe); - } - } - private static @NonNull List parseQuoteMentions(@NonNull Context context, Cursor cursor) { byte[] raw = cursor.getBlob(cursor.getColumnIndexOrThrow(QUOTE_MENTIONS)); @@ -1690,10 +1666,12 @@ public class MmsDatabase extends MessageDatabase { return databaseHelper.getWritableDatabase(); } + @Override public void setTransactionSuccessful() { databaseHelper.getWritableDatabase().setTransactionSuccessful(); } + @Override public void endTransaction() { databaseHelper.getWritableDatabase().endTransaction(); } @@ -1702,7 +1680,7 @@ public class MmsDatabase extends MessageDatabase { return new Reader(cursor); } - public OutgoingMessageReader readerFor(OutgoingMediaMessage message, long threadId) { + public static OutgoingMessageReader readerFor(OutgoingMediaMessage message, long threadId) { return new OutgoingMessageReader(message, threadId); } @@ -1715,43 +1693,15 @@ public class MmsDatabase extends MessageDatabase { public static final int DOWNLOAD_APN_UNAVAILABLE = 6; } - public static class MmsNotificationInfo { - private final RecipientId from; - private final String contentLocation; - private final String transactionId; - private final int subscriptionId; - - MmsNotificationInfo(@NonNull RecipientId from, String contentLocation, String transactionId, int subscriptionId) { - this.from = from; - this.contentLocation = contentLocation; - this.transactionId = transactionId; - this.subscriptionId = subscriptionId; - } - - public String getContentLocation() { - return contentLocation; - } - - public String getTransactionId() { - return transactionId; - } - - public int getSubscriptionId() { - return subscriptionId; - } - - public @NonNull RecipientId getFrom() { - return from; - } - } - - public class OutgoingMessageReader { + public static class OutgoingMessageReader { + private final Context context; private final OutgoingMediaMessage message; private final long id; private final long threadId; public OutgoingMessageReader(OutgoingMediaMessage message, long threadId) { + this.context = ApplicationDependencies.getApplication(); this.message = message; this.id = new SecureRandom().nextLong(); this.threadId = threadId; @@ -1806,7 +1756,7 @@ public class MmsDatabase extends MessageDatabase { } } - public static class Reader implements Closeable { + public static class Reader implements MessageDatabase.Reader { private final Cursor cursor; private final Context context; @@ -1816,6 +1766,7 @@ public class MmsDatabase extends MessageDatabase { this.context = ApplicationDependencies.getApplication(); } + @Override public MessageRecord getNext() { if (cursor == null || !cursor.moveToNext()) return null; @@ -1823,6 +1774,7 @@ public class MmsDatabase extends MessageDatabase { return getCurrent(); } + @Override public MessageRecord getCurrent() { long mmsType = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_TYPE)); 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 fd90f2cd5..573336a22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -118,7 +118,7 @@ public class MmsSmsDatabase extends Database { } private @NonNull Pair getGroupAddedBy(long threadId, long lastQuitChecked) { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked); RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit); @@ -287,14 +287,14 @@ public class MmsSmsDatabase extends Database { } public void incrementDeliveryReceiptCount(SyncMessageId syncMessageId, long timestamp) { - DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, true); + DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, true); DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, true); } public boolean incrementReadReceiptCount(SyncMessageId syncMessageId, long timestamp) { boolean handled = false; - handled |= DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, false); + handled |= DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, false); handled |= DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, false); return handled; @@ -581,7 +581,7 @@ public class MmsSmsDatabase extends Database { private MmsDatabase.Reader getMmsReader() { if (mmsReader == null) { - mmsReader = DatabaseFactory.getMmsDatabase(context).readerFor(cursor); + mmsReader = MmsDatabase.readerFor(cursor); } return mmsReader; 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 cbf7d5f45..07c82ff5e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -26,12 +26,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.annimon.stream.Stream; +import com.google.android.mms.pdu_alt.NotificationInd; import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteStatement; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList; +import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; @@ -40,8 +42,12 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDet import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.TrimThreadJob; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.mms.IncomingMediaMessage; +import org.thoughtcrime.securesms.mms.MmsException; +import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo; import org.thoughtcrime.securesms.sms.IncomingGroupUpdateMessage; import org.thoughtcrime.securesms.sms.IncomingTextMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; @@ -453,7 +459,7 @@ public class SmsDatabase extends MessageDatabase { } @Override - public boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) { + public boolean incrementReceiptCount(SyncMessageId messageId, long timestamp, boolean deliveryReceipt) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); boolean foundMessage = false; @@ -995,20 +1001,30 @@ public class SmsDatabase extends MessageDatabase { } @Override - SQLiteDatabase beginTransaction() { + public SQLiteDatabase beginTransaction() { SQLiteDatabase database = databaseHelper.getWritableDatabase(); database.beginTransaction(); return database; } @Override - void endTransaction(SQLiteDatabase database) { + public void setTransactionSuccessful() { + databaseHelper.getWritableDatabase().setTransactionSuccessful(); + } + + @Override + public void endTransaction(SQLiteDatabase database) { database.setTransactionSuccessful(); database.endTransaction(); } @Override - SQLiteStatement createInsertStatement(SQLiteDatabase database) { + public void endTransaction() { + databaseHelper.getWritableDatabase().endTransaction(); + } + + @Override + public SQLiteStatement createInsertStatement(SQLiteDatabase database) { return database.compileStatement("INSERT INTO " + TABLE_NAME + " (" + RECIPIENT_ID + ", " + PERSON + ", " + DATE_SENT + ", " + @@ -1025,6 +1041,96 @@ public class SmsDatabase extends MessageDatabase { " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); } + @Override + public @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isSent(long messageId) { + throw new UnsupportedOperationException(); + } + + @Override + public long getLatestGroupQuitTimestamp(long threadId, long quitTimeBarrier) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isGroupQuitMessage(long messageId) { + throw new UnsupportedOperationException(); + } + + @Override + public @Nullable Pair getOldestUnreadMentionDetails(long threadId) { + throw new UnsupportedOperationException(); + } + + @Override + public int getUnreadMentionCount(long threadId) { + throw new UnsupportedOperationException(); + } + + @Override + public void addFailures(long messageId, List failure) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeFailure(long messageId, NetworkFailure failure) { + throw new UnsupportedOperationException(); + } + + @Override + public void markDownloadState(long messageId, long state) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional getNotification(long messageId) { + throw new UnsupportedOperationException(); + } + + @Override + public OutgoingMediaMessage getOutgoingMessage(long messageId) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional insertMessageInbox(IncomingMediaMessage retrieved, String contentLocation, long threadId) throws MmsException { + throw new UnsupportedOperationException(); + } + + @Override + public Pair insertMessageInbox(@NonNull NotificationInd notification, int subscriptionId) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional insertSecureDecryptedMessageInbox(IncomingMediaMessage retrieved, long threadId) throws MmsException { + throw new UnsupportedOperationException(); + } + + @Override + public long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, @Nullable InsertListener insertListener) throws MmsException { + throw new UnsupportedOperationException(); + } + + @Override + public long insertMessageOutbox(@NonNull OutgoingMediaMessage message, long threadId, boolean forceSms, int defaultReceiptStatus, @Nullable InsertListener insertListener) throws MmsException { + throw new UnsupportedOperationException(); + } + + @Override + public void markIncomingNotificationReceived(long threadId) { + throw new UnsupportedOperationException(); + } + + @Override + public MessageDatabase.Reader getMessages(Collection messageIds) { + throw new UnsupportedOperationException(); + } + public static class Status { public static final int STATUS_NONE = -1; public static final int STATUS_COMPLETE = 0; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java index 39357ada3..c31fd940d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java @@ -239,7 +239,7 @@ public final class GroupV1MessageProcessor { try { if (outgoing) { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); RecipientId recipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(GroupId.v1orThrow(group.getGroupId())); Recipient recipient = Recipient.resolved(recipientId); OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(recipient, storage, null, content.getTimestamp(), 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index ca485e855..93be06664 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -237,9 +237,9 @@ public final class GroupsV2StateProcessor { Collections.emptyList()); try { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); - long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient); - long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient); + long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null); mmsDatabase.markAsSent(id, true); } catch (MmsException e) { Log.w(TAG, "Failed to insert leave message.", e); @@ -396,7 +396,7 @@ public final class GroupsV2StateProcessor { if (outgoing) { try { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); RecipientId recipientId = recipientDatabase.getOrInsertFromGroupId(groupId); Recipient recipient = Recipient.resolved(recipientId); OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(recipient, decryptedGroupV2Context, null, timestamp, 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java index a4b12d0d4..8941ac790 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.UriAttachment; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -104,7 +105,7 @@ public class MmsDownloadJob extends BaseJob { throw new NotReadyException(); } - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); Optional notification = database.getNotification(messageId); if (!notification.isPresent()) { @@ -164,7 +165,7 @@ public class MmsDownloadJob extends BaseJob { @Override public void onFailure() { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); database.markDownloadState(messageId, MmsDatabase.Status.DOWNLOAD_SOFT_FAILURE); if (automatic) { @@ -183,7 +184,7 @@ public class MmsDownloadJob extends BaseJob { int subscriptionId, @Nullable RecipientId notificationFrom) throws MmsException { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); Optional group = Optional.absent(); Set members = new HashSet<>(); String body = null; @@ -250,7 +251,7 @@ public class MmsDownloadJob extends BaseJob { private void handleDownloadError(long messageId, long threadId, int downloadStatus, boolean automatic) { - MmsDatabase db = DatabaseFactory.getMmsDatabase(context); + MessageDatabase db = DatabaseFactory.getMmsDatabase(context); db.markDownloadState(messageId, downloadStatus); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java index 5ac0cd6c3..a2adc4721 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.jobs; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -73,7 +74,7 @@ public class MmsReceiveJob extends BaseJob { } if (isNotification(pdu) && !isBlocked(pdu)) { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); Pair messageAndThreadId = database.insertMessageInbox((NotificationInd)pdu, subscriptionId); Log.i(TAG, "Inserted received MMS notification..."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java index f225462c0..a4eb99fb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.ThreadDatabase; @@ -78,7 +79,7 @@ public final class MmsSendJob extends SendJob { /** Enqueues compression jobs for attachments and finally the MMS send job. */ @WorkerThread public static void enqueue(@NonNull Context context, @NonNull JobManager jobManager, long messageId) { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message; try { @@ -120,7 +121,7 @@ public final class MmsSendJob extends SendJob { @Override public void onSend() throws MmsException, NoSuchMessageException, IOException { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); if (database.isSent(messageId)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index e412d5269..8279d28a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.GroupReceiptDatabase.GroupReceiptInfo; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; @@ -108,7 +109,7 @@ public final class PushGroupSendJob extends PushSendJob { throw new AssertionError("Not a group!"); } - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); Set attachmentUploadIds = enqueueCompressingAndUploadAttachmentsChains(jobManager, message); @@ -150,7 +151,7 @@ public final class PushGroupSendJob extends PushSendJob { public void onPushSend() throws IOException, MmsException, NoSuchMessageException, RetryLaterException { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); List existingNetworkFailures = message.getNetworkFailures(); List existingIdentityMismatches = message.getIdentityKeyMismatches(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java index ac6f395f2..10c372af0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java @@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; @@ -74,7 +75,7 @@ public class PushMediaSendJob extends PushSendJob { throw new AssertionError(); } - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); Set attachmentUploadIds = enqueueCompressingAndUploadAttachmentsChains(jobManager, message); @@ -108,7 +109,7 @@ public class PushMediaSendJob extends PushSendJob { UndeliverableMessageException { ExpiringMessageManager expirationManager = ApplicationContext.getInstance(context).getExpiringMessageManager(); - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); if (database.isSent(messageId)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java index 4cd2e930d..b0ae64729 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -716,14 +716,14 @@ public final class PushProcessMessageJob extends BaseJob { } try { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); Recipient sender = Recipient.externalHighTrustPush(context, content.getSender()); IncomingMediaMessage mediaMessage = new IncomingMediaMessage(sender.getId(), content.getTimestamp(), content.getServerReceivedTimestamp(), -1, expiresInSeconds * 1000L, - true, + true, false, content.isNeedsReceipt(), Optional.absent(), @@ -1026,7 +1026,7 @@ public final class PushProcessMessageJob extends BaseJob { Optional insertResult; - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); database.beginTransaction(); try { @@ -1089,8 +1089,8 @@ public final class PushProcessMessageJob extends BaseJob { private long handleSynchronizeSentExpirationUpdate(@NonNull SentTranscriptMessage message) throws MmsException, BadGroupIdException { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); - Recipient recipient = getSyncMessageDestination(message); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); + Recipient recipient = getSyncMessageDestination(message); OutgoingExpirationUpdateMessage expirationUpdateMessage = new OutgoingExpirationUpdateMessage(recipient, message.getTimestamp(), @@ -1109,7 +1109,7 @@ public final class PushProcessMessageJob extends BaseJob { private long handleSynchronizeSentMediaMessage(@NonNull SentTranscriptMessage message) throws MmsException, BadGroupIdException { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); Recipient recipients = getSyncMessageDestination(message); Optional quote = getValidatedQuote(message.getMessage().getQuote()); Optional sticker = getStickerAttachment(message.getMessage().getSticker()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java index 2fc61fcd6..0400d235f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/WakeGroupV2Job.java @@ -6,6 +6,7 @@ import org.signal.zkgroup.InvalidInputException; import org.signal.zkgroup.groups.GroupMasterKey; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context; import org.thoughtcrime.securesms.groups.GroupChangeBusyException; @@ -97,7 +98,7 @@ public final class WakeGroupV2Job extends BaseJob { long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient); GroupDatabase.V2GroupProperties v2GroupProperties = group.get().requireV2GroupProperties(); DecryptedGroupV2Context decryptedGroupV2Context = GroupProtoUtil.createDecryptedGroupV2Context(v2GroupProperties.getGroupMasterKey(), v2GroupProperties.getDecryptedGroup(), null, null); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(groupRecipient, decryptedGroupV2Context, null, System.currentTimeMillis(), 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); long messageId = mmsDatabase.insertMessageOutbox(outgoingMessage, threadId, false, null); diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java index fe07b9e2d..6e81127ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java @@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsDatabase.Reader; import org.thoughtcrime.securesms.database.PushDatabase; @@ -267,7 +268,7 @@ public class LegacyMigrationJob extends MigrationJob { private void schedulePendingIncomingParts(Context context) { final AttachmentDatabase attachmentDb = DatabaseFactory.getAttachmentDatabase(context); - final MmsDatabase mmsDb = DatabaseFactory.getMmsDatabase(context); + final MessageDatabase mmsDb = DatabaseFactory.getMmsDatabase(context); final List pendingAttachments = DatabaseFactory.getAttachmentDatabase(context).getPendingAttachments(); Log.i(TAG, pendingAttachments.size() + " pending parts."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java index e5df5f57a..0876af9d3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java @@ -13,6 +13,7 @@ import androidx.annotation.WorkerThread; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.service.TimedEventManager; @@ -24,7 +25,7 @@ public class ViewOnceMessageManager extends TimedEventManager results = new ArrayList<>(); - try (MmsDatabase.Reader reader = mmsDatabase.getMessages(mentionQueryResults.keySet())) { + try (MessageDatabase.Reader reader = mmsDatabase.getMessages(mentionQueryResults.keySet())) { MessageRecord record; while ((record = reader.getNext()) != null) { List mentions = mentionQueryResults.get(record.getId()); @@ -296,7 +297,7 @@ public class SearchRepository { List results = new ArrayList<>(); - try (MmsDatabase.Reader reader = mmsDatabase.getMessages(mentionQueryResults.keySet())) { + try (MessageDatabase.Reader reader = mmsDatabase.getMessages(mentionQueryResults.keySet())) { MessageRecord record; while ((record = reader.getNext()) != null) { //noinspection ConstantConditions diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java index 394d6ffce..799dc6fc6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -122,8 +122,8 @@ public class MessageSender { final SmsDatabase.InsertListener insertListener) { try { - ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); + MessageDatabase database = DatabaseFactory.getMmsDatabase(context); long allocatedThreadId = threadDatabase.getOrCreateValidThreadId(message.getRecipient(), threadId, message.getDistributionType()); Recipient recipient = message.getRecipient(); @@ -150,7 +150,7 @@ public class MessageSender { try { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); long allocatedThreadId; @@ -185,7 +185,7 @@ public class MessageSender { JobManager jobManager = ApplicationDependencies.getJobManager(); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); List preUploadAttachmentIds = Stream.of(preUploadResults).map(PreUploadResult::getAttachmentId).toList(); List preUploadJobIds = Stream.of(preUploadResults).map(PreUploadResult::getJobIds).flatMap(Stream::of).toList(); @@ -470,7 +470,7 @@ public class MessageSender { private static void sendLocalMediaSelf(Context context, long messageId) { try { ExpiringMessageManager expirationManager = ApplicationContext.getInstance(context).getExpiringMessageManager(); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); OutgoingMediaMessage message = mmsDatabase.getOutgoingMessage(messageId); SyncMessageId syncId = new SyncMessageId(Recipient.self().getId(), message.getSentTimeMillis());