diff --git a/app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java b/app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java index e3d9cc0998..c25d1e9947 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java @@ -13,6 +13,7 @@ import androidx.appcompat.app.AlertDialog; import org.thoughtcrime.securesms.crypto.storage.TextSecureIdentityKeyStore; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.PushDatabase; import org.thoughtcrime.securesms.database.SmsDatabase; @@ -113,8 +114,8 @@ public class ConfirmIdentityDialog extends AlertDialog { } private void processOutgoingMessageRecord(MessageRecord messageRecord) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(getContext()); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(getContext()); if (messageRecord.isMms()) { mmsDatabase.removeMismatchedIdentity(messageRecord.getId(), @@ -137,8 +138,8 @@ public class ConfirmIdentityDialog extends AlertDialog { private void processIncomingMessageRecord(MessageRecord messageRecord) { try { - PushDatabase pushDatabase = DatabaseFactory.getPushDatabase(getContext()); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); + PushDatabase pushDatabase = DatabaseFactory.getPushDatabase(getContext()); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(getContext()); smsDatabase.removeMismatchedIdentity(messageRecord.getId(), mismatch.getRecipientId(getContext()), diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/TurnOffContactJoinedNotificationsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/TurnOffContactJoinedNotificationsActivity.java index 9cff16e6fa..21650ca38f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/TurnOffContactJoinedNotificationsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/TurnOffContactJoinedNotificationsActivity.java @@ -10,7 +10,7 @@ import androidx.appcompat.app.AppCompatActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.notifications.MarkReadReceiver; @@ -54,7 +54,7 @@ public class TurnOffContactJoinedNotificationsActivity extends AppCompatActivity SimpleTask.run(getLifecycle(), () -> { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(this); - List marked = threadDatabase.setRead(getIntent().getLongExtra(EXTRA_THREAD_ID, -1), false); + List marked = threadDatabase.setRead(getIntent().getLongExtra(EXTRA_THREAD_ID, -1), false); MarkReadReceiver.process(this, marked); TextSecurePreferences.setNewContactsNotificationEnabled(this, false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java index 910a36d304..b9b1c855ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java @@ -25,7 +25,8 @@ import org.thoughtcrime.securesms.contacts.ContactAccessor; import org.thoughtcrime.securesms.contacts.ContactsDatabase; import org.thoughtcrime.securesms.crypto.SessionUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase.BulkOperationsHandle; import org.thoughtcrime.securesms.database.RecipientDatabase.RegisteredState; 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 dc1a7a4945..2b062eb459 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -77,9 +77,10 @@ import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickList import org.thoughtcrime.securesms.conversation.ConversationAdapter.StickyHeaderViewHolder; import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; +import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; @@ -686,7 +687,7 @@ public class ConversationFragment extends LoggingFragment { boolean threadDeleted; if (messageRecord.isMms()) { - threadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); + threadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); } else { threadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); } @@ -727,7 +728,7 @@ public class ConversationFragment extends LoggingFragment { boolean threadDeleted; if (messageRecord.isMms()) { - threadDeleted = DatabaseFactory.getMmsDatabase(context).delete(messageRecord.getId()); + threadDeleted = DatabaseFactory.getMmsDatabase(context).deleteMessage(messageRecord.getId()); } else { threadDeleted = DatabaseFactory.getSmsDatabase(context).deleteMessage(messageRecord.getId()); } @@ -917,7 +918,7 @@ public class ConversationFragment extends LoggingFragment { } public long stageOutgoingMessage(OutgoingTextMessage message) { - MessageRecord messageRecord = DatabaseFactory.getSmsDatabase(getContext()).readerFor(message, threadId).getCurrent(); + MessageRecord messageRecord = SmsDatabase.readerFor(message, threadId).getCurrent(); if (getListAdapter() != null) { clearHeaderIfNotTyping(getListAdapter()); @@ -1084,7 +1085,7 @@ public class ConversationFragment extends LoggingFragment { return mmsDatabase.getOldestUnreadMentionDetails(threadId); }, (pair) -> { if (pair != null) { - jumpToMessage(pair.first, pair.second, () -> {}); + jumpToMessage(pair.first(), pair.second(), () -> {}); } }); } @@ -1309,7 +1310,7 @@ public class ConversationFragment extends LoggingFragment { .getViewOnceMessageManager() .scheduleIfNecessary(); - ApplicationDependencies.getJobManager().add(new MultiDeviceViewOnceOpenJob(new MessagingDatabase.SyncMessageId(messageRecord.getIndividualRecipient().getId(), messageRecord.getDateSent()))); + ApplicationDependencies.getJobManager().add(new MultiDeviceViewOnceOpenJob(new MessageDatabase.SyncMessageId(messageRecord.getIndividualRecipient().getId(), messageRecord.getDateSent()))); return tempUri; } catch (IOException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 6468a8361e..3456844249 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -78,6 +78,7 @@ import org.thoughtcrime.securesms.components.mention.MentionAnnotation; import org.thoughtcrime.securesms.contactshare.Contact; 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.SmsDatabase; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; @@ -1522,21 +1523,18 @@ public class ConversationItem extends LinearLayout implements BindableConversati if (message > -1) builder.setMessage(message); builder.setPositiveButton(R.string.yes, (dialogInterface, i) -> { - if (messageRecord.isMms()) { - MmsDatabase database = DatabaseFactory.getMmsDatabase(context); - database.markAsInsecure(messageRecord.getId()); - database.markAsOutbox(messageRecord.getId()); - database.markAsForcedSms(messageRecord.getId()); + MessageDatabase db = messageRecord.isMms() ? DatabaseFactory.getMmsDatabase(context) + : DatabaseFactory.getSmsDatabase(context); + db.markAsInsecure(messageRecord.getId()); + db.markAsOutbox(messageRecord.getId()); + db.markAsForcedSms(messageRecord.getId()); + + if (messageRecord.isMms()) { MmsSendJob.enqueue(context, ApplicationDependencies.getJobManager(), messageRecord.getId()); } else { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - database.markAsInsecure(messageRecord.getId()); - database.markAsOutbox(messageRecord.getId()); - database.markAsForcedSms(messageRecord.getId()); - ApplicationDependencies.getJobManager().add(new SmsSendJob(messageRecord.getId(), messageRecord.getIndividualRecipient())); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/MarkReadHelper.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/MarkReadHelper.java index e007fcf05e..3d42a297a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/MarkReadHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/MarkReadHelper.java @@ -5,7 +5,7 @@ import android.content.Context; import androidx.annotation.NonNull; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.logging.Log; @@ -42,8 +42,8 @@ class MarkReadHelper { debouncer.publish(() -> { EXECUTOR.execute(() -> { - ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); - List infos = threadDatabase.setReadSince(threadId, false, timestamp); + ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); + List infos = threadDatabase.setReadSince(threadId, false, timestamp); Log.d(TAG, "Marking " + infos.size() + " messages as read."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java index defa379c63..0c438f98db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeRepository.java @@ -11,9 +11,11 @@ import androidx.lifecycle.MutableLiveData; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.crypto.storage.TextSecureIdentityKeyStore; +import org.thoughtcrime.securesms.database.Database; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; @@ -133,8 +135,8 @@ final class SafetyNumberChangeRepository { @WorkerThread private void processOutgoingMessageRecord(@NonNull List changedRecipients, @NonNull MessageRecord messageRecord) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); for (ChangedRecipient changedRecipient : changedRecipients) { RecipientId id = changedRecipient.getRecipient().getId(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 90c34d7551..d55d12f5a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -94,7 +94,7 @@ import org.thoughtcrime.securesms.conversationlist.model.Conversation; import org.thoughtcrime.securesms.conversationlist.model.MessageResult; import org.thoughtcrime.securesms.conversationlist.model.SearchResult; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; 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 ab7a2a21a6..a81e8b4d2e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -82,7 +82,7 @@ public class DatabaseFactory { return getInstance(context).thread; } - public static SmsDatabase getSmsDatabase(Context context) { + public static MessageDatabase getSmsDatabase(Context context) { return getInstance(context).sms; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java index bde1c063ab..0316809ac7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java @@ -210,7 +210,7 @@ public class MediaDatabase extends Database { List attachments = attachmentDatabase.getAttachment(cursor); RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID))); long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID)); - boolean outgoing = MessagingDatabase.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX))); + boolean outgoing = MessageDatabase.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX))); long date; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java similarity index 81% rename from app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index 52ce19ea18..f1a3ae0f9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -6,11 +6,13 @@ import android.database.Cursor; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.annimon.stream.Stream; import com.google.protobuf.InvalidProtocolBufferException; import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteStatement; import org.thoughtcrime.securesms.database.documents.Document; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; @@ -22,9 +24,13 @@ 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.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.sms.IncomingTextMessage; +import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.util.JsonUtils; import org.whispersystems.libsignal.IdentityKey; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import java.io.IOException; @@ -34,12 +40,13 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.Set; -public abstract class MessagingDatabase extends Database implements MmsSmsColumns { +public abstract class MessageDatabase extends Database implements MmsSmsColumns { - private static final String TAG = MessagingDatabase.class.getSimpleName(); + private static final String TAG = MessageDatabase.class.getSimpleName(); - public MessagingDatabase(Context context, SQLCipherOpenHelper databaseHelper) { + public MessageDatabase(Context context, SQLCipherOpenHelper databaseHelper) { super(context, databaseHelper); } @@ -48,17 +55,76 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn protected abstract String getDateSentColumnName(); protected abstract String getDateReceivedColumnName(); + public abstract @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived); + 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 Cursor getExpirationStartedMessages(); + public abstract SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException; + public abstract Cursor getMessageCursor(long messageId); + public abstract MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException; + public abstract Cursor getVerboseMessageCursor(long messageId); + public abstract boolean hasReceivedAnyCallsSince(long threadId, long timestamp); + public abstract void markExpireStarted(long messageId); public abstract void markExpireStarted(long messageId, long startTime); public abstract void markExpireStarted(Collection messageId, long startTime); + public abstract void markAsEndSession(long id); + public abstract void markAsPreKeyBundle(long id); + public abstract void markAsInvalidVersionKeyExchange(long id); + public abstract void markAsSecure(long id); + public abstract void markAsInsecure(long id); + public abstract void markAsPush(long id); + public abstract void markAsForcedSms(long id); + public abstract void markAsDecryptFailed(long id); + public abstract void markAsDecryptDuplicate(long id); + public abstract void markAsNoSession(long id); + public abstract void markAsUnsupportedProtocolVersion(long id); + public abstract void markAsInvalidMessage(long id); + public abstract void markAsLegacyVersion(long id); + public abstract void markAsOutbox(long id); + public abstract void markAsPendingInsecureSmsFallback(long id); public abstract void markAsSent(long messageId, boolean secure); + public abstract void markAsSentFailed(long id); public abstract void markUnidentified(long messageId, boolean unidentified); - public abstract void markAsSending(long messageId); public abstract void markAsRemoteDelete(long messageId); + public abstract void markAsMissedCall(long id); + public abstract void markAsNotified(long id); + public abstract void markSmsStatus(long id, int status); + + public abstract boolean incrementSmsReceiptCount(SyncMessageId messageId, 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 @NonNull Pair insertReceivedCall(@NonNull RecipientId address); + public abstract @NonNull Pair insertOutgoingCall(@NonNull RecipientId address); + public abstract @NonNull Pair insertMissedCall(@NonNull RecipientId address); + + public abstract Optional insertMessageInbox(IncomingTextMessage message, long type); + public abstract Optional insertMessageInbox(IncomingTextMessage message); + public abstract long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener); + public abstract void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName); + + public abstract boolean deleteMessage(long messageId); + abstract void deleteThread(long threadId); + abstract void deleteMessagesInThreadBeforeDate(long threadId, long date); + abstract void deleteThreads(@NonNull Set threadIds); + abstract void deleteAllThreads(); + + abstract SQLiteDatabase beginTransaction(); + abstract void endTransaction(SQLiteDatabase database); + abstract SQLiteStatement createInsertStatement(SQLiteDatabase database); + + public abstract void ensureMigration(); - public abstract MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException; final int getInsecureMessagesSentForThread(long threadId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -256,7 +322,7 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn } } - protected List parseReactions(@NonNull Cursor cursor) { + protected static List parseReactions(@NonNull Cursor cursor) { byte[] raw = cursor.getBlob(cursor.getColumnIndexOrThrow(REACTIONS)); if (raw != null) { @@ -527,4 +593,8 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn return threadId; } } + + public interface InsertListener { + void onComplete(); + } } 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 dd46f66d26..0af33bb3c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -21,7 +21,6 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; -import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -32,6 +31,7 @@ import com.google.android.mms.pdu_alt.NotificationInd; import com.google.android.mms.pdu_alt.PduHeaders; import net.sqlcipher.database.SQLiteDatabase; +import net.sqlcipher.database.SQLiteStatement; import org.json.JSONArray; import org.json.JSONException; @@ -41,6 +41,7 @@ import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment; import org.thoughtcrime.securesms.contactshare.Contact; +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; @@ -52,6 +53,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Quote; import org.thoughtcrime.securesms.database.model.ReactionRecord; +import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.TrimThreadJob; @@ -70,11 +72,15 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo; import org.thoughtcrime.securesms.revealable.ViewOnceUtil; +import org.thoughtcrime.securesms.sms.IncomingTextMessage; +import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.util.CursorUtil; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SqlUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; +import org.whispersystems.libsignal.IdentityKey; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import java.io.Closeable; @@ -91,7 +97,7 @@ import java.util.Set; import static org.thoughtcrime.securesms.contactshare.Contact.Avatar; -public class MmsDatabase extends MessagingDatabase { +public class MmsDatabase extends MessageDatabase { private static final String TAG = MmsDatabase.class.getSimpleName(); @@ -266,6 +272,171 @@ public class MmsDatabase extends MessagingDatabase { return MESSAGE_BOX; } + @Override + public @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived) { + throw new UnsupportedOperationException(); + } + + @Override + int getMessageCountForThreadSummary(long threadId) { + return getMessageCountForThread(threadId); + } + + @Override + public Cursor getExpirationStartedMessages() { + String where = EXPIRE_STARTED + " > 0"; + return rawQuery(where, null); + } + + @Override + public SmsMessageRecord getSmsMessage(long messageId) { + throw new UnsupportedOperationException(); + } + + @Override + public Cursor getMessageCursor(long messageId) { + Cursor cursor = internalGetMessage(messageId); + setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId)); + return cursor; + } + + @Override + public Cursor getVerboseMessageCursor(long messageId) { + Cursor cursor = internalGetMessage(messageId); + setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId)); + return cursor; + } + + @Override + public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsEndSession(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsPreKeyBundle(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsInvalidVersionKeyExchange(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsSecure(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsPush(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsDecryptFailed(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsDecryptDuplicate(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsNoSession(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsUnsupportedProtocolVersion(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsInvalidMessage(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsLegacyVersion(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markAsMissedCall(long id) { + throw new UnsupportedOperationException(); + } + + @Override + public void markSmsStatus(long id, int status) { + 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(); + } + + @Override + public @NonNull Pair insertReceivedCall(@NonNull RecipientId address) { + throw new UnsupportedOperationException(); + } + + @Override + public @NonNull Pair insertOutgoingCall(@NonNull RecipientId address) { + throw new UnsupportedOperationException(); + } + + @Override + public @NonNull Pair insertMissedCall(@NonNull RecipientId address) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional insertMessageInbox(IncomingTextMessage message, long type) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional insertMessageInbox(IncomingTextMessage message) { + throw new UnsupportedOperationException(); + } + + @Override + public long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener) { + throw new UnsupportedOperationException(); + } + + @Override + public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) { + throw new UnsupportedOperationException(); + } + + @Override + void endTransaction(SQLiteDatabase database) { + + } + + @Override + SQLiteStatement createInsertStatement(SQLiteDatabase database) { + throw new UnsupportedOperationException(); + } + + @Override + public void ensureMigration() { + databaseHelper.getWritableDatabase(); + } + public boolean isGroupQuitMessage(long messageId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -442,18 +613,6 @@ public class MmsDatabase extends MessagingDatabase { " WHERE " + where + " GROUP BY " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID, arguments); } - public Cursor getMessage(long messageId) { - Cursor cursor = internalGetMessage(messageId); - setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId)); - return cursor; - } - - public Cursor getVerboseMessage(long messageId) { - Cursor cursor = internalGetMessage(messageId); - setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId)); - return cursor; - } - private Cursor internalGetMessage(long messageId) { return rawQuery(RAW_ID_WHERE, new String[] {messageId + ""}); } @@ -476,11 +635,6 @@ public class MmsDatabase extends MessagingDatabase { return readerFor(rawQuery(MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " IN (" + ids + ")", null)); } - public Reader getExpireStartedMessages() { - String where = EXPIRE_STARTED + " > 0"; - return readerFor(rawQuery(where, null)); - } - private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional threadId) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + @@ -570,6 +724,7 @@ public class MmsDatabase extends MessagingDatabase { // updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT, Optional.absent()); // } + @Override public void markAsInsecure(long messageId) { updateMailboxBitmask(messageId, Types.SECURE_MESSAGE_BIT, 0, Optional.absent()); } @@ -578,21 +733,6 @@ public class MmsDatabase extends MessagingDatabase { // updateMailboxBitmask(messageId, 0, Types.PUSH_MESSAGE_BIT, Optional.absent()); // } - public void markAsDecryptFailed(long messageId, long threadId) { - updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT, Optional.of(threadId)); - notifyConversationListeners(threadId); - } - - public void markAsDecryptDuplicate(long messageId, long threadId) { - updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT, Optional.of(threadId)); - notifyConversationListeners(threadId); - } - - public void markAsLegacyVersion(long messageId, long threadId) { - updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT, Optional.of(threadId)); - notifyConversationListeners(threadId); - } - @Override public void markUnidentified(long messageId, boolean unidentified) { ContentValues contentValues = new ContentValues(); @@ -650,6 +790,7 @@ public class MmsDatabase extends MessagingDatabase { database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)}); } + @Override public List setMessagesReadSince(long threadId, long sinceTimestamp) { if (sinceTimestamp == -1) { return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)}); @@ -875,7 +1016,7 @@ public class MmsDatabase extends MessagingDatabase { String quoteText = cursor.getString(cursor.getColumnIndexOrThrow(QUOTE_BODY)); boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(QUOTE_MISSING)) == 1; List quoteAttachments = Stream.of(associatedAttachments).filter(Attachment::isQuote).map(a -> (Attachment)a).toList(); - List quoteMentions = parseQuoteMentions(cursor); + List quoteMentions = parseQuoteMentions(context, cursor); List contacts = getSharedContacts(cursor, associatedAttachments); Set contactAttachments = new HashSet<>(Stream.of(contacts).map(Contact::getAvatarAttachment).filter(a -> a != null).toList()); List previews = getLinkPreviews(cursor, associatedAttachments); @@ -935,7 +1076,7 @@ public class MmsDatabase extends MessagingDatabase { } } - private List getSharedContacts(@NonNull Cursor cursor, @NonNull List attachments) { + private static List getSharedContacts(@NonNull Cursor cursor, @NonNull List attachments) { String serializedContacts = cursor.getString(cursor.getColumnIndexOrThrow(SHARED_CONTACTS)); if (TextUtils.isEmpty(serializedContacts)) { @@ -973,7 +1114,7 @@ public class MmsDatabase extends MessagingDatabase { return Collections.emptyList(); } - private List getLinkPreviews(@NonNull Cursor cursor, @NonNull List attachments) { + private static List getLinkPreviews(@NonNull Cursor cursor, @NonNull List attachments) { String serializedPreviews = cursor.getString(cursor.getColumnIndexOrThrow(LINK_PREVIEWS)); if (TextUtils.isEmpty(serializedPreviews)) { @@ -1333,7 +1474,8 @@ public class MmsDatabase extends MessagingDatabase { } } - public boolean delete(long messageId) { + @Override + public boolean deleteMessage(long messageId) { long threadId = getThreadIdForMessage(messageId); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); attachmentDatabase.deleteAttachmentsForMessage(messageId); @@ -1428,7 +1570,8 @@ public class MmsDatabase extends MessagingDatabase { return false; } - /*package*/ void deleteThreads(Set threadIds) { + @Override + void deleteThreads(Set threadIds) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); String where = ""; Cursor cursor = null; @@ -1443,7 +1586,7 @@ public class MmsDatabase extends MessagingDatabase { cursor = db.query(TABLE_NAME, new String[] {ID}, where, null, null, null, null); while (cursor != null && cursor.moveToNext()) { - delete(cursor.getLong(0)); + deleteMessage(cursor.getLong(0)); } } finally { @@ -1452,7 +1595,8 @@ public class MmsDatabase extends MessagingDatabase { } } - /*package*/void deleteMessagesInThreadBeforeDate(long threadId, long date) { + @Override + void deleteMessagesInThreadBeforeDate(long threadId, long date) { Cursor cursor = null; try { @@ -1469,7 +1613,7 @@ public class MmsDatabase extends MessagingDatabase { while (cursor != null && cursor.moveToNext()) { Log.i(TAG, "Trimming: " + cursor.getLong(0)); - delete(cursor.getLong(0)); + deleteMessage(cursor.getLong(0)); } } finally { @@ -1478,7 +1622,7 @@ public class MmsDatabase extends MessagingDatabase { } } - + @Override public void deleteAllThreads() { DatabaseFactory.getAttachmentDatabase(context).deleteAllAttachments(); DatabaseFactory.getGroupReceiptDatabase(context).deleteAllRows(); @@ -1487,8 +1631,7 @@ public class MmsDatabase extends MessagingDatabase { database.delete(TABLE_NAME, null, null); } - public @Nullable - ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() { + public @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() { SQLiteDatabase db = databaseHelper.getReadableDatabase(); ViewOnceExpirationInfo info = null; long nearestExpiration = Long.MAX_VALUE; @@ -1535,14 +1678,16 @@ public class MmsDatabase extends MessagingDatabase { } } - private @NonNull List parseQuoteMentions(Cursor cursor) { + private static @NonNull List parseQuoteMentions(@NonNull Context context, Cursor cursor) { byte[] raw = cursor.getBlob(cursor.getColumnIndexOrThrow(QUOTE_MENTIONS)); return MentionUtil.bodyRangeListToMentions(context, raw); } - public void beginTransaction() { + @Override + public SQLiteDatabase beginTransaction() { databaseHelper.getWritableDatabase().beginTransaction(); + return databaseHelper.getWritableDatabase(); } public void setTransactionSuccessful() { @@ -1553,7 +1698,7 @@ public class MmsDatabase extends MessagingDatabase { databaseHelper.getWritableDatabase().endTransaction(); } - public Reader readerFor(Cursor cursor) { + public static Reader readerFor(Cursor cursor) { return new Reader(cursor); } @@ -1661,12 +1806,14 @@ public class MmsDatabase extends MessagingDatabase { } } - public class Reader implements Closeable { + public static class Reader implements Closeable { - private final Cursor cursor; + private final Cursor cursor; + private final Context context; public Reader(Cursor cursor) { - this.cursor = cursor; + this.cursor = cursor; + this.context = ApplicationDependencies.getApplication(); } public MessageRecord getNext() { @@ -1812,7 +1959,7 @@ public class MmsDatabase extends MessagingDatabase { long quoteAuthor = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_AUTHOR)); CharSequence quoteText = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_BODY)); boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_MISSING)) == 1; - List quoteMentions = parseQuoteMentions(cursor); + List quoteMentions = parseQuoteMentions(context, cursor); List attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachment(cursor); List quoteAttachments = Stream.of(attachments).filter(Attachment::isQuote).toList(); SlideDeck quoteDeck = new SlideDeck(context, quoteAttachments); 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 223c525a5c..fd90f2cd5e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -25,7 +25,7 @@ import androidx.annotation.Nullable; import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteQueryBuilder; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.recipients.Recipient; @@ -118,10 +118,10 @@ public class MmsSmsDatabase extends Database { } private @NonNull Pair getGroupAddedBy(long threadId, long lastQuitChecked) { - MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked); - RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit); + MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked); + RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit); return new Pair<>(id, latestQuit); } @@ -209,14 +209,11 @@ public class MmsSmsDatabase extends Database { } public boolean checkMessageExists(@NonNull MessageRecord messageRecord) { - if (messageRecord.isMms()) { - try (Cursor mms = DatabaseFactory.getMmsDatabase(context).getMessage(messageRecord.getId())) { - return mms != null && mms.getCount() > 0; - } - } else { - try (Cursor sms = DatabaseFactory.getSmsDatabase(context).getMessageCursor(messageRecord.getId())) { - return sms != null && sms.getCount() > 0; - } + MessageDatabase db = messageRecord.isMms() ? DatabaseFactory.getMmsDatabase(context) + : DatabaseFactory.getSmsDatabase(context); + + try (Cursor cursor = db.getMessageCursor(messageRecord.getId())) { + return cursor != null && cursor.getCount() > 0; } } @@ -256,7 +253,7 @@ public class MmsSmsDatabase extends Database { public int getConversationCountForThreadSummary(long threadId) { int count = DatabaseFactory.getSmsDatabase(context).getMessageCountForThreadSummary(threadId); - count += DatabaseFactory.getMmsDatabase(context).getMessageCountForThread(threadId); + count += DatabaseFactory.getMmsDatabase(context).getMessageCountForThreadSummary(threadId); return count; } @@ -290,14 +287,14 @@ public class MmsSmsDatabase extends Database { } public void incrementDeliveryReceiptCount(SyncMessageId syncMessageId, long timestamp) { - DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, true); + DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, true); DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, true); } public boolean incrementReadReceiptCount(SyncMessageId syncMessageId, long timestamp) { boolean handled = false; - handled |= DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, false); + handled |= DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, false); handled |= DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, false); return handled; @@ -576,7 +573,7 @@ public class MmsSmsDatabase extends Database { private SmsDatabase.Reader getSmsReader() { if (smsReader == null) { - smsReader = DatabaseFactory.getSmsDatabase(context).readerFor(cursor); + smsReader = SmsDatabase.readerFor(cursor); } return smsReader; 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 97a351bd59..cbf7d5f451 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -21,7 +21,6 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.text.TextUtils; -import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -50,6 +49,7 @@ import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SqlUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import java.io.IOException; @@ -66,7 +66,7 @@ import java.util.Set; * * @author Moxie Marlinspike */ -public class SmsDatabase extends MessagingDatabase { +public class SmsDatabase extends MessageDatabase { private static final String TAG = SmsDatabase.class.getSimpleName(); @@ -142,6 +142,7 @@ public class SmsDatabase extends MessagingDatabase { super(context, databaseHelper); } + @Override protected String getTableName() { return TABLE_NAME; } @@ -175,6 +176,7 @@ public class SmsDatabase extends MessagingDatabase { notifyConversationListeners(threadId); } + @Override public @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -193,6 +195,7 @@ public class SmsDatabase extends MessagingDatabase { return null; } + @Override public long getThreadIdForMessage(long id) { String sql = "SELECT " + THREAD_ID + " FROM " + TABLE_NAME + " WHERE " + ID + " = ?"; String[] sqlArgs = new String[] {id+""}; @@ -212,21 +215,7 @@ public class SmsDatabase extends MessagingDatabase { } } - public int getMessageCount() { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); - Cursor cursor = null; - - try { - cursor = db.query(TABLE_NAME, new String[] {"COUNT(*)"}, null, null, null, null, null); - - if (cursor != null && cursor.moveToFirst()) return cursor.getInt(0); - else return 0; - } finally { - if (cursor != null) - cursor.close(); - } - } - + @Override public int getMessageCountForThreadSummary(long threadId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -247,6 +236,7 @@ public class SmsDatabase extends MessagingDatabase { return 0; } + @Override public int getMessageCountForThread(long threadId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -263,6 +253,7 @@ public class SmsDatabase extends MessagingDatabase { return 0; } + @Override public int getMessageCountForThread(long threadId, long beforeTime) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -279,62 +270,77 @@ public class SmsDatabase extends MessagingDatabase { return 0; } + @Override public void markAsEndSession(long id) { updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.END_SESSION_BIT); } + @Override public void markAsPreKeyBundle(long id) { updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT); } + @Override public void markAsInvalidVersionKeyExchange(long id) { updateTypeBitmask(id, 0, Types.KEY_EXCHANGE_INVALID_VERSION_BIT); } + @Override public void markAsSecure(long id) { updateTypeBitmask(id, 0, Types.SECURE_MESSAGE_BIT); } + @Override public void markAsInsecure(long id) { updateTypeBitmask(id, Types.SECURE_MESSAGE_BIT, 0); } + @Override public void markAsPush(long id) { updateTypeBitmask(id, 0, Types.PUSH_MESSAGE_BIT); } + @Override public void markAsForcedSms(long id) { updateTypeBitmask(id, Types.PUSH_MESSAGE_BIT, Types.MESSAGE_FORCE_SMS_BIT); } + @Override public void markAsDecryptFailed(long id) { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT); } + @Override public void markAsDecryptDuplicate(long id) { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT); } + @Override public void markAsNoSession(long id) { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT); } + @Override public void markAsUnsupportedProtocolVersion(long id) { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.UNSUPPORTED_MESSAGE_TYPE); } + @Override public void markAsInvalidMessage(long id) { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.INVALID_MESSAGE_TYPE); } + @Override public void markAsLegacyVersion(long id) { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT); } + @Override public void markAsOutbox(long id) { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_OUTBOX_TYPE); } + @Override public void markAsPendingInsecureSmsFallback(long id) { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_PENDING_INSECURE_SMS_FALLBACK); } @@ -349,6 +355,7 @@ public class SmsDatabase extends MessagingDatabase { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE); } + @Override public void markAsMissedCall(long id) { updateTypeBitmask(id, Types.TOTAL_MASK, Types.MISSED_CALL_TYPE); } @@ -416,7 +423,8 @@ public class SmsDatabase extends MessagingDatabase { notifyConversationListeners(threadId); } - public void markStatus(long id, int status) { + @Override + public void markSmsStatus(long id, int status) { Log.i(TAG, "Updating ID: " + id + " to status: " + status); ContentValues contentValues = new ContentValues(); contentValues.put(STATUS, status); @@ -429,10 +437,12 @@ public class SmsDatabase extends MessagingDatabase { notifyConversationListeners(threadId); } + @Override public void markAsSentFailed(long id) { updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE); } + @Override public void markAsNotified(long id) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); @@ -442,7 +452,8 @@ public class SmsDatabase extends MessagingDatabase { database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)}); } - public boolean incrementReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) { + @Override + public boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); boolean foundMessage = false; @@ -487,6 +498,7 @@ public class SmsDatabase extends MessagingDatabase { } } + @Override public List> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); List> expiring = new LinkedList<>(); @@ -531,10 +543,12 @@ public class SmsDatabase extends MessagingDatabase { return expiring; } + @Override public List setEntireThreadRead(long threadId) { return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)}); } + @Override public List setMessagesReadSince(long threadId, long sinceTimestamp) { if (sinceTimestamp == -1) { return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)}); @@ -543,6 +557,7 @@ public class SmsDatabase extends MessagingDatabase { } } + @Override public List setAllMessagesRead() { return setMessagesRead(READ + " = 0", null); } @@ -584,16 +599,12 @@ public class SmsDatabase extends MessagingDatabase { return results; } + @Override public Pair updateBundleMessageBody(long messageId, String body) { long type = Types.BASE_INBOX_TYPE | Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT; return updateMessageBodyAndType(messageId, body, Types.TOTAL_MASK, type); } - public void updateMessageBody(long messageId, String body) { - long type = 0; - updateMessageBodyAndType(messageId, body, Types.ENCRYPTION_MASK, type); - } - private Pair updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " + @@ -610,7 +621,8 @@ public class SmsDatabase extends MessagingDatabase { return new Pair<>(messageId, threadId); } - boolean hasReceivedAnyCallsSince(long threadId, long timestamp) { + @Override + public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); String[] projection = new String[]{SmsDatabase.TYPE}; String selection = THREAD_ID + " = ? AND " + DATE_RECEIVED + " > ? AND (" + TYPE + " = ? OR " + TYPE + " = ?)"; @@ -624,14 +636,17 @@ public class SmsDatabase extends MessagingDatabase { } } + @Override public @NonNull Pair insertReceivedCall(@NonNull RecipientId address) { return insertCallLog(address, Types.INCOMING_CALL_TYPE, false); } + @Override public @NonNull Pair insertOutgoingCall(@NonNull RecipientId address) { return insertCallLog(address, Types.OUTGOING_CALL_TYPE, false); } + @Override public @NonNull Pair insertMissedCall(@NonNull RecipientId address) { return insertCallLog(address, Types.MISSED_CALL_TYPE, true); } @@ -663,6 +678,7 @@ public class SmsDatabase extends MessagingDatabase { return new Pair<>(messageId, threadId); } + @Override public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); List groupRecords = DatabaseFactory.getGroupDatabase(context).getGroupsContainingMember(recipient.getId(), false); @@ -713,7 +729,8 @@ public class SmsDatabase extends MessagingDatabase { } } - protected Optional insertMessageInbox(IncomingTextMessage message, long type) { + @Override + public Optional insertMessageInbox(IncomingTextMessage message, long type) { if (message.isJoined()) { type = (type & (Types.TOTAL_MASK - Types.BASE_TYPE_MASK)) | Types.JOINED_TYPE; } else if (message.isPreKeyBundle()) { @@ -811,10 +828,12 @@ public class SmsDatabase extends MessagingDatabase { } } + @Override public Optional insertMessageInbox(IncomingTextMessage message) { return insertMessageInbox(message, Types.BASE_INBOX_TYPE); } + @Override public long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener) { @@ -866,17 +885,7 @@ public class SmsDatabase extends MessagingDatabase { return messageId; } - Cursor getMessages(int skip, int limit) { - SQLiteDatabase db = databaseHelper.getReadableDatabase(); - return db.query(TABLE_NAME, MESSAGE_PROJECTION, null, null, null, null, ID, skip + "," + limit); - } - - Cursor getOutgoingMessages() { - String outgoingSelection = TYPE + " & " + Types.BASE_TYPE_MASK + " = " + Types.BASE_OUTBOX_TYPE; - SQLiteDatabase db = databaseHelper.getReadableDatabase(); - return db.query(TABLE_NAME, MESSAGE_PROJECTION, outgoingSelection, null, null, null, null); - } - + @Override public Cursor getExpirationStartedMessages() { String where = EXPIRE_STARTED + " > 0"; SQLiteDatabase db = databaseHelper.getReadableDatabase(); @@ -884,7 +893,7 @@ public class SmsDatabase extends MessagingDatabase { } @Override - public SmsMessageRecord getMessageRecord(long messageId) throws NoSuchMessageException { + public SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException { SQLiteDatabase db = databaseHelper.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[]{messageId + ""}, null, null, null); Reader reader = new Reader(cursor); @@ -896,38 +905,42 @@ public class SmsDatabase extends MessagingDatabase { else return record; } - public Cursor getMessageCursor(long messageId) { - Cursor cursor = internalGetMessageCursor(messageId); - setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId)); - return cursor; - } - + @Override public Cursor getVerboseMessageCursor(long messageId) { - Cursor cursor = internalGetMessageCursor(messageId); + Cursor cursor = getMessageCursor(messageId); setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId)); return cursor; } - private Cursor internalGetMessageCursor(long messageId) { + @Override + public Cursor getMessageCursor(long messageId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); - Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null); - return cursor; + return db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null); } + @Override public boolean deleteMessage(long messageId) { - Log.i(TAG, "Deleting: " + messageId); - SQLiteDatabase db = databaseHelper.getWritableDatabase(); - long threadId = getThreadIdForMessage(messageId); + SQLiteDatabase db = databaseHelper.getWritableDatabase(); + long threadId = getThreadIdForMessage(messageId); + db.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""}); + boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false, true); + notifyConversationListeners(threadId); return threadDeleted; } + @Override public void ensureMigration() { databaseHelper.getWritableDatabase(); } + @Override + public MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException { + return getSmsMessage(messageId); + } + private boolean isDuplicate(IncomingTextMessage message, long threadId) { SQLiteDatabase database = databaseHelper.getReadableDatabase(); Cursor cursor = database.query(TABLE_NAME, null, DATE_SENT + " = ? AND " + RECIPIENT_ID + " = ? AND " + THREAD_ID + " = ?", @@ -941,12 +954,14 @@ public class SmsDatabase extends MessagingDatabase { } } - /*package */void deleteThread(long threadId) { + @Override + void deleteThread(long threadId) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""}); } - /*package*/void deleteMessagesInThreadBeforeDate(long threadId, long date) { + @Override + void deleteMessagesInThreadBeforeDate(long threadId, long date) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); String where = THREAD_ID + " = ? AND (CASE " + TYPE; @@ -959,7 +974,8 @@ public class SmsDatabase extends MessagingDatabase { db.delete(TABLE_NAME, where, new String[] {threadId + ""}); } - /*package*/ void deleteThreads(Set threadIds) { + @Override + void deleteThreads(@NonNull Set threadIds) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); String where = ""; @@ -972,23 +988,27 @@ public class SmsDatabase extends MessagingDatabase { db.delete(TABLE_NAME, where, null); } - /*package */ void deleteAllThreads() { + @Override + void deleteAllThreads() { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete(TABLE_NAME, null, null); } - /*package*/ SQLiteDatabase beginTransaction() { + @Override + SQLiteDatabase beginTransaction() { SQLiteDatabase database = databaseHelper.getWritableDatabase(); database.beginTransaction(); return database; } - /*package*/ void endTransaction(SQLiteDatabase database) { + @Override + void endTransaction(SQLiteDatabase database) { database.setTransactionSuccessful(); database.endTransaction(); } - /*package*/ SQLiteStatement createInsertStatement(SQLiteDatabase database) { + @Override + SQLiteStatement createInsertStatement(SQLiteDatabase database) { return database.compileStatement("INSERT INTO " + TABLE_NAME + " (" + RECIPIENT_ID + ", " + PERSON + ", " + DATE_SENT + ", " + @@ -1012,11 +1032,11 @@ public class SmsDatabase extends MessagingDatabase { public static final int STATUS_FAILED = 0x40; } - public Reader readerFor(Cursor cursor) { + public static Reader readerFor(Cursor cursor) { return new Reader(cursor); } - public OutgoingMessageReader readerFor(OutgoingTextMessage message, long threadId) { + public static OutgoingMessageReader readerFor(OutgoingTextMessage message, long threadId) { return new OutgoingMessageReader(message, threadId); } @@ -1056,12 +1076,14 @@ public class SmsDatabase extends MessagingDatabase { } } - public class Reader { + public static class Reader { - private final Cursor cursor; + private final Cursor cursor; + private final Context context; public Reader(Cursor cursor) { - this.cursor = cursor; + this.cursor = cursor; + this.context = ApplicationDependencies.getApplication(); } public SmsMessageRecord getNext() { @@ -1130,8 +1152,4 @@ public class SmsDatabase extends MessagingDatabase { } } - public interface InsertListener { - public void onComplete(); - } - } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java index 5c38af18e0..833582ff21 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java @@ -164,9 +164,9 @@ public class SmsMigrator { ProgressDescription progress, long theirThreadId, long ourThreadId) { - SmsDatabase ourSmsDatabase = DatabaseFactory.getSmsDatabase(context); - Cursor cursor = null; - SQLiteStatement statement = null; + MessageDatabase ourSmsDatabase = DatabaseFactory.getSmsDatabase(context); + Cursor cursor = null; + SQLiteStatement statement = null; try { Uri uri = Uri.parse("content://sms/conversations/" + theirThreadId); 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 8be2753361..1ff20dc6f6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -34,8 +34,8 @@ import net.sqlcipher.database.SQLiteDatabase; import org.jsoup.helper.StringUtil; import org.signal.storageservice.protos.groups.local.DecryptedGroup; import org.signal.storageservice.protos.groups.local.DecryptedMember; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.RecipientDatabase.RecipientSettings; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java index d833661f30..65d0b97b4b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java @@ -39,7 +39,7 @@ public class MessageDetailsLoader extends AbstractCursorLoader { case MmsSmsDatabase.SMS_TRANSPORT: return DatabaseFactory.getSmsDatabase(context).getVerboseMessageCursor(messageId); case MmsSmsDatabase.MMS_TRANSPORT: - return DatabaseFactory.getMmsDatabase(context).getVerboseMessage(messageId); + return DatabaseFactory.getMmsDatabase(context).getVerboseMessageCursor(messageId); default: throw new AssertionError("no valid message type specified"); } 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 5cdbdebd74..39357ada3e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupV1MessageProcessor.java @@ -9,9 +9,11 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; import com.google.protobuf.ByteString; +import org.thoughtcrime.securesms.database.Database; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; -import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -248,9 +250,9 @@ public final class GroupV1MessageProcessor { return threadId; } else { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - String body = Base64.encodeBytes(storage.toByteArray()); - IncomingTextMessage incoming = new IncomingTextMessage(Recipient.externalHighTrustPush(context, content.getSender()).getId(), content.getSenderDevice(), content.getTimestamp(), content.getServerReceivedTimestamp(), body, Optional.of(GroupId.v1orThrow(group.getGroupId())), 0, content.isNeedsReceipt()); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + String body = Base64.encodeBytes(storage.toByteArray()); + IncomingTextMessage incoming = new IncomingTextMessage(Recipient.externalHighTrustPush(context, content.getSender()).getId(), content.getSenderDevice(), content.getTimestamp(), content.getServerReceivedTimestamp(), body, Optional.of(GroupId.v1orThrow(group.getGroupId())), 0, content.isNeedsReceipt()); IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, storage, body); Optional insertResult = smsDatabase.insertMessageInbox(groupMessage); 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 970c194cb2..ca485e8553 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 @@ -16,6 +16,7 @@ import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.groups.GroupSecretParams; 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.RecipientDatabase; import org.thoughtcrime.securesms.database.SmsDatabase; @@ -407,7 +408,7 @@ public final class GroupsV2StateProcessor { Log.w(TAG, e); } } else { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); RecipientId sender = RecipientId.from(editor.get(), null); IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, "", Optional.of(groupId), 0, false); IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context); 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 801c974e1c..a4b12d0d47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java @@ -15,7 +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.MessagingDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupId; @@ -243,7 +243,7 @@ public class MmsDownloadJob extends BaseJob { Optional insertResult = database.insertMessageInbox(message, contentLocation, threadId); if (insertResult.isPresent()) { - database.delete(messageId); + database.deleteMessage(messageId); ApplicationDependencies.getMessageNotifier().updateNotification(context, insertResult.get().getThreadId()); } } 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 526a5d5016..5ac0cd6c35 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java @@ -6,19 +6,18 @@ import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.logging.Log; import androidx.annotation.NonNull; -import android.util.Pair; import com.google.android.mms.pdu_alt.GenericPdu; import com.google.android.mms.pdu_alt.NotificationInd; import com.google.android.mms.pdu_alt.PduHeaders; import com.google.android.mms.pdu_alt.PduParser; -import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.Util; +import org.whispersystems.libsignal.util.Pair; import java.io.IOException; @@ -79,8 +78,8 @@ public class MmsReceiveJob extends BaseJob { Log.i(TAG, "Inserted received MMS notification..."); - ApplicationDependencies.getJobManager().add(new MmsDownloadJob(messageAndThreadId.first, - messageAndThreadId.second, + ApplicationDependencies.getJobManager().add(new MmsDownloadJob(messageAndThreadId.first(), + messageAndThreadId.second(), true)); } else if (isNotification(pdu)) { Log.w(TAG, "*** Received blocked MMS, ignoring..."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java index 12d3552558..25455f91f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java @@ -12,7 +12,7 @@ import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -22,7 +22,6 @@ import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import java.io.IOException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob.java index 1dad76b4df..1feb3fc5ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceViewOnceOpenJob.java @@ -5,7 +5,7 @@ import androidx.annotation.NonNull; import com.fasterxml.jackson.annotation.JsonProperty; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -16,12 +16,10 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.messages.multidevice.ViewOnceOpenMessage; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import java.io.IOException; 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 c8a1a93796..ac6f395f24 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java @@ -11,7 +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.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.RecipientDatabase.UnidentifiedAccessMode; 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 e5187fa9f0..4cd2e930dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.text.TextUtils; -import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -29,13 +28,14 @@ import org.thoughtcrime.securesms.crypto.ProfileKeyUtil; import org.thoughtcrime.securesms.crypto.SecurityEvent; import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore; import org.thoughtcrime.securesms.database.AttachmentDatabase; +import org.thoughtcrime.securesms.database.Database; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.GroupReceiptDatabase; import org.thoughtcrime.securesms.database.GroupReceiptDatabase.GroupReceiptInfo; -import org.thoughtcrime.securesms.database.MessagingDatabase; -import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; @@ -94,6 +94,7 @@ import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.RemoteDeleteUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.libsignal.state.SessionStore; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException; import org.whispersystems.signalservice.api.groupsv2.NoCredentialForRedemptionTimeException; @@ -500,7 +501,7 @@ public final class PushProcessMessageJob extends BaseJob { Log.i(TAG, "handleCallOfferMessage..."); if (smsMessageId.isPresent()) { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); database.markAsMissedCall(smsMessageId.get()); } else { Intent intent = new Intent(context, WebRtcCallService.class); @@ -606,7 +607,7 @@ public final class PushProcessMessageJob extends BaseJob { private void handleEndSessionMessage(@NonNull SignalServiceContent content, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); IncomingTextMessage incomingTextMessage = new IncomingTextMessage(Recipient.externalHighTrustPush(context, content.getSender()).getId(), content.getSenderDevice(), content.getTimestamp(), @@ -639,7 +640,7 @@ public final class PushProcessMessageJob extends BaseJob { private long handleSynchronizeSentEndSessionMessage(@NonNull SentTranscriptMessage message) throws BadGroupIdException { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); Recipient recipient = getSyncMessageDestination(message); OutgoingTextMessage outgoingTextMessage = new OutgoingTextMessage(recipient, "", -1); OutgoingEndSessionMessage outgoingEndSessionMessage = new OutgoingEndSessionMessage(outgoingTextMessage); @@ -753,8 +754,8 @@ public final class PushProcessMessageJob extends BaseJob { MessageRecord targetMessage = DatabaseFactory.getMmsSmsDatabase(context).getMessageFor(reaction.getTargetSentTimestamp(), targetAuthor.getId()); if (targetMessage != null && !targetMessage.isRemoteDelete()) { - Recipient reactionAuthor = Recipient.externalHighTrustPush(context, content.getSender()); - MessagingDatabase db = targetMessage.isMms() ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + Recipient reactionAuthor = Recipient.externalHighTrustPush(context, content.getSender()); + MessageDatabase db = targetMessage.isMms() ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); if (reaction.isRemove()) { db.deleteReaction(targetMessage.getId(), reactionAuthor.getId()); @@ -779,7 +780,7 @@ public final class PushProcessMessageJob extends BaseJob { MessageRecord targetMessage = DatabaseFactory.getMmsSmsDatabase(context).getMessageFor(delete.getTargetSentTimestamp(), sender.getId()); if (targetMessage != null && RemoteDeleteUtil.isValidReceive(targetMessage, sender, content.getServerReceivedTimestamp())) { - MessagingDatabase db = targetMessage.isMms() ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = targetMessage.isMms() ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); db.markAsRemoteDelete(targetMessage.getId()); ApplicationDependencies.getMessageNotifier().updateNotification(context, targetMessage.getThreadId(), false); } else if (targetMessage == null) { @@ -985,13 +986,13 @@ public final class PushProcessMessageJob extends BaseJob { for (Pair expiringMessage : expiringText) { ApplicationContext.getInstance(context) .getExpiringMessageManager() - .scheduleDeletion(expiringMessage.first, false, envelopeTimestamp, expiringMessage.second); + .scheduleDeletion(expiringMessage.first(), false, envelopeTimestamp, expiringMessage.second()); } for (Pair expiringMessage : expiringMedia) { ApplicationContext.getInstance(context) .getExpiringMessageManager() - .scheduleDeletion(expiringMessage.first, true, envelopeTimestamp, expiringMessage.second); + .scheduleDeletion(expiringMessage.first(), true, envelopeTimestamp, expiringMessage.second()); } } @@ -1241,9 +1242,9 @@ public final class PushProcessMessageJob extends BaseJob { @NonNull Optional groupId) throws StorageFailedException, BadGroupIdException { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - String body = message.getBody().isPresent() ? message.getBody().get() : ""; - Recipient recipient = getMessageDestination(content, message); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); + String body = message.getBody().isPresent() ? message.getBody().get() : ""; + Recipient recipient = getMessageDestination(content, message); if (message.getExpiresInSeconds() != recipient.getExpireMessages()) { handleExpirationUpdate(content, message, Optional.absent(), groupId); @@ -1252,7 +1253,7 @@ public final class PushProcessMessageJob extends BaseJob { Long threadId; if (smsMessageId.isPresent() && !message.getGroupContext().isPresent()) { - threadId = database.updateBundleMessageBody(smsMessageId.get(), body).second; + threadId = database.updateBundleMessageBody(smsMessageId.get(), body).second(); } else { notifyTypingStoppedFromIncomingMessage(recipient, content.getSender(), content.getSenderDevice()); @@ -1293,7 +1294,7 @@ public final class PushProcessMessageJob extends BaseJob { long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient); boolean isGroup = recipient.isGroup(); - MessagingDatabase database; + MessageDatabase database; long messageId; if (isGroup) { @@ -1344,7 +1345,7 @@ public final class PushProcessMessageJob extends BaseJob { private void handleInvalidVersionMessage(@NonNull String sender, int senderDevice, long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1361,7 +1362,7 @@ public final class PushProcessMessageJob extends BaseJob { private void handleCorruptMessage(@NonNull String sender, int senderDevice, long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1378,7 +1379,7 @@ public final class PushProcessMessageJob extends BaseJob { private void handleNoSessionMessage(@NonNull String sender, int senderDevice, long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1398,7 +1399,7 @@ public final class PushProcessMessageJob extends BaseJob { long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp, groupId); @@ -1418,7 +1419,7 @@ public final class PushProcessMessageJob extends BaseJob { long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender.getIdentifier(), senderDevice, timestamp, groupId); @@ -1435,7 +1436,7 @@ public final class PushProcessMessageJob extends BaseJob { private void handleLegacyMessage(@NonNull String sender, int senderDevice, long timestamp, @NonNull Optional smsMessageId) { - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); if (!smsMessageId.isPresent()) { Optional insertResult = insertPlaceholder(sender, senderDevice, timestamp); @@ -1732,7 +1733,7 @@ public final class PushProcessMessageJob extends BaseJob { } private Optional insertPlaceholder(@NonNull String sender, int senderDevice, long timestamp, Optional groupId) { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); IncomingTextMessage textMessage = new IncomingTextMessage(Recipient.external(context, sender).getId(), senderDevice, timestamp, -1, "", groupId, 0, false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java index eb93380971..18cbbea57c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java @@ -2,7 +2,9 @@ package org.thoughtcrime.securesms.jobs; import androidx.annotation.NonNull; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.Database; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.RecipientDatabase.UnidentifiedAccessMode; import org.thoughtcrime.securesms.ApplicationContext; @@ -70,8 +72,8 @@ public class PushTextSendJob extends PushSendJob { @Override public void onPushSend() throws NoSuchMessageException, RetryLaterException { ExpiringMessageManager expirationManager = ApplicationContext.getInstance(context).getExpiringMessageManager(); - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - SmsMessageRecord record = database.getMessageRecord(messageId); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); + SmsMessageRecord record = database.getSmsMessage(messageId); if (!record.isPending() && !record.isFailed()) { warn(TAG, "Message " + messageId + " was already sent. Ignoring."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java index 61dd404797..a17ab49e2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReactionSendJob.java @@ -9,7 +9,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; @@ -67,7 +67,7 @@ public class ReactionSendJob extends BaseJob { throws NoSuchMessageException { MessageRecord message = isMms ? DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId) - : DatabaseFactory.getSmsDatabase(context).getMessageRecord(messageId); + : DatabaseFactory.getSmsDatabase(context).getSmsMessage(messageId); Recipient conversationRecipient = DatabaseFactory.getThreadDatabase(context).getRecipientForThreadId(message.getThreadId()); @@ -132,7 +132,7 @@ public class ReactionSendJob extends BaseJob { @Override protected void onRun() throws Exception { - MessagingDatabase db; + MessageDatabase db; MessageRecord message; if (isMms) { @@ -140,7 +140,7 @@ public class ReactionSendJob extends BaseJob { message = DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); } else { db = DatabaseFactory.getSmsDatabase(context); - message = DatabaseFactory.getSmsDatabase(context).getMessageRecord(messageId); + message = DatabaseFactory.getSmsDatabase(context).getSmsMessage(messageId); } Recipient targetAuthor = message.isOutgoing() ? Recipient.self() : message.getIndividualRecipient(); @@ -192,7 +192,7 @@ public class ReactionSendJob extends BaseJob { Log.w(TAG, "Failed to send the reaction to all recipients!"); - MessagingDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); if (remove && !db.hasReaction(messageId, reaction)) { Log.w(TAG, "Reaction removal failed, so adding the reaction back."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java index 172541ff71..25b9077bfc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java @@ -9,7 +9,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -57,7 +57,7 @@ public class RemoteDeleteSendJob extends BaseJob { throws NoSuchMessageException { MessageRecord message = isMms ? DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId) - : DatabaseFactory.getSmsDatabase(context).getMessageRecord(messageId); + : DatabaseFactory.getSmsDatabase(context).getSmsMessage(messageId); Recipient conversationRecipient = DatabaseFactory.getThreadDatabase(context).getRecipientForThreadId(message.getThreadId()); @@ -111,7 +111,7 @@ public class RemoteDeleteSendJob extends BaseJob { @Override protected void onRun() throws Exception { - MessagingDatabase db; + MessageDatabase db; MessageRecord message; if (isMms) { @@ -119,7 +119,7 @@ public class RemoteDeleteSendJob extends BaseJob { message = DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); } else { db = DatabaseFactory.getSmsDatabase(context); - message = DatabaseFactory.getSmsDatabase(context).getMessageRecord(messageId); + message = DatabaseFactory.getSmsDatabase(context).getSmsMessage(messageId); } long targetSentTimestamp = message.getDateSent(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java index d90b5823cf..c0190587e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java @@ -4,6 +4,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.telephony.SmsMessage; +import org.thoughtcrime.securesms.database.Database; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -11,7 +13,7 @@ import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraint; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.sms.IncomingTextMessage; @@ -110,7 +112,7 @@ public class SmsReceiveJob extends BaseJob { } private Optional storeMessage(IncomingTextMessage message) throws MigrationPendingException { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); database.ensureMigration(); if (TextSecurePreferences.getNeedsSqlCipherMigration(context)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java index 9d0cdd47e7..353bb216d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java @@ -9,6 +9,8 @@ import androidx.annotation.NonNull; import android.telephony.PhoneNumberUtils; import android.telephony.SmsManager; +import org.thoughtcrime.securesms.database.Database; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -77,8 +79,8 @@ public class SmsSendJob extends SendJob { throw new TooManyRetriesException(); } - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - SmsMessageRecord record = database.getMessageRecord(messageId); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); + SmsMessageRecord record = database.getSmsMessage(messageId); if (!record.isPending() && !record.isFailed()) { warn(TAG, "Message " + messageId + " was already sent. Ignoring."); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java index 3ca44ab800..a7acfec65b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java @@ -4,6 +4,8 @@ import android.app.Activity; import androidx.annotation.NonNull; import android.telephony.SmsManager; +import org.thoughtcrime.securesms.database.Database; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -86,13 +88,13 @@ public class SmsSentJob extends BaseJob { } private void handleDeliveredResult(long messageId, int result) { - DatabaseFactory.getSmsDatabase(context).markStatus(messageId, result); + DatabaseFactory.getSmsDatabase(context).markSmsStatus(messageId, result); } private void handleSentResult(long messageId, int result) { try { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - SmsMessageRecord record = database.getMessageRecord(messageId); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); + SmsMessageRecord record = database.getSmsMessage(messageId); switch (result) { case Activity.RESULT_OK: diff --git a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java index fa378c6208..1a1daa9b50 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java @@ -6,9 +6,9 @@ import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; -import org.thoughtcrime.securesms.conversation.ConversationMessage; import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -27,8 +27,8 @@ class LongMessageRepository { private final static String TAG = LongMessageRepository.class.getSimpleName(); - private final MmsDatabase mmsDatabase; - private final SmsDatabase smsDatabase; + private final MessageDatabase mmsDatabase; + private final MessageDatabase smsDatabase; LongMessageRepository(@NonNull Context context) { this.mmsDatabase = DatabaseFactory.getMmsDatabase(context); @@ -46,7 +46,7 @@ class LongMessageRepository { } @WorkerThread - private Optional getMmsLongMessage(@NonNull Context context, @NonNull MmsDatabase mmsDatabase, long messageId) { + private Optional getMmsLongMessage(@NonNull Context context, @NonNull MessageDatabase mmsDatabase, long messageId) { Optional record = getMmsMessage(mmsDatabase, messageId); if (record.isPresent()) { @@ -63,7 +63,7 @@ class LongMessageRepository { } @WorkerThread - private Optional getSmsLongMessage(@NonNull Context context, @NonNull SmsDatabase smsDatabase, long messageId) { + private Optional getSmsLongMessage(@NonNull Context context, @NonNull MessageDatabase smsDatabase, long messageId) { Optional record = getSmsMessage(smsDatabase, messageId); if (record.isPresent()) { @@ -75,16 +75,16 @@ class LongMessageRepository { @WorkerThread - private Optional getMmsMessage(@NonNull MmsDatabase mmsDatabase, long messageId) { - try (Cursor cursor = mmsDatabase.getMessage(messageId)) { - return Optional.fromNullable((MmsMessageRecord) mmsDatabase.readerFor(cursor).getNext()); + private Optional getMmsMessage(@NonNull MessageDatabase mmsDatabase, long messageId) { + try (Cursor cursor = mmsDatabase.getMessageCursor(messageId)) { + return Optional.fromNullable((MmsMessageRecord) MmsDatabase.readerFor(cursor).getNext()); } } @WorkerThread - private Optional getSmsMessage(@NonNull SmsDatabase smsDatabase, long messageId) { + private Optional getSmsMessage(@NonNull MessageDatabase smsDatabase, long messageId) { try (Cursor cursor = smsDatabase.getMessageCursor(messageId)) { - return Optional.fromNullable(smsDatabase.readerFor(cursor).getNext()); + return Optional.fromNullable(SmsDatabase.readerFor(cursor).getNext()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java index c838c2426b..687283e9af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java @@ -3,12 +3,15 @@ package org.thoughtcrime.securesms.messagedetails; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; +import android.os.Message; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import androidx.lifecycle.LiveData; +import org.thoughtcrime.securesms.database.Database; 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.database.SmsDatabase; @@ -85,9 +88,9 @@ final class MessageRecordLiveData extends LiveData { @WorkerThread private synchronized void handleSms() { - final SmsDatabase db = DatabaseFactory.getSmsDatabase(context); - final Cursor cursor = db.getVerboseMessageCursor(messageId); - final MessageRecord record = db.readerFor(cursor).getNext(); + final MessageDatabase db = DatabaseFactory.getSmsDatabase(context); + final Cursor cursor = db.getVerboseMessageCursor(messageId); + final MessageRecord record = SmsDatabase.readerFor(cursor).getNext(); postValue(record); cursor.registerContentObserver(obs); @@ -96,9 +99,9 @@ final class MessageRecordLiveData extends LiveData { @WorkerThread private synchronized void handleMms() { - final MmsDatabase db = DatabaseFactory.getMmsDatabase(context); - final Cursor cursor = db.getVerboseMessage(messageId); - final MessageRecord record = db.readerFor(cursor).getNext(); + final MessageDatabase db = DatabaseFactory.getMmsDatabase(context); + final Cursor cursor = db.getVerboseMessageCursor(messageId); + final MessageRecord record = MmsDatabase.readerFor(cursor).getNext(); postValue(record); cursor.registerContentObserver(obs); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index 43c17d4f7a..8f5dfa048a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -9,7 +9,7 @@ import androidx.core.util.Consumer; import org.signal.storageservice.protos.groups.local.DecryptedGroup; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -118,8 +118,8 @@ final class MessageRequestRepository { MessageSender.sendProfileKey(context, threadId); - List messageIds = DatabaseFactory.getThreadDatabase(context) - .setEntireThreadRead(threadId); + List messageIds = DatabaseFactory.getThreadDatabase(context) + .setEntireThreadRead(threadId); ApplicationDependencies.getMessageNotifier().updateNotification(context); MarkReadReceiver.process(context, messageIds); @@ -219,8 +219,8 @@ final class MessageRequestRepository { recipientDatabase.setProfileSharing(liveRecipient.getId(), true); liveRecipient.refresh(); - List messageIds = DatabaseFactory.getThreadDatabase(context) - .setEntireThreadRead(threadId); + List messageIds = DatabaseFactory.getThreadDatabase(context) + .setEntireThreadRead(threadId); ApplicationDependencies.getMessageNotifier().updateNotification(context); MarkReadReceiver.process(context, messageIds); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java index 25319e70cc..f1e033482c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java @@ -6,7 +6,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.PushDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; 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 6815af7991..fe07b9e2dc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/LegacyMigrationJob.java @@ -272,7 +272,7 @@ public class LegacyMigrationJob extends MigrationJob { Log.i(TAG, pendingAttachments.size() + " pending parts."); for (DatabaseAttachment attachment : pendingAttachments) { - final Reader reader = mmsDb.readerFor(mmsDb.getMessage(attachment.getMmsId())); + final Reader reader = MmsDatabase.readerFor(mmsDb.getMessageCursor(attachment.getMmsId())); final MessageRecord record = reader.getNext(); if (attachment.hasData()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java index 975908f2b7..a1b46c56cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java @@ -25,8 +25,8 @@ import android.os.AsyncTask; import androidx.core.app.NotificationManagerCompat; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.logging.Log; import java.util.LinkedList; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java index 013e65a792..47607225f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java @@ -26,8 +26,8 @@ import android.os.Bundle; import androidx.core.app.RemoteInput; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java index 3128a0a8dd..1cc60e1f33 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java @@ -45,17 +45,14 @@ import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.conversation.ConversationActivity; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MentionUtil; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.ThreadBodyUtil; -import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.messages.IncomingMessageObserver; import org.thoughtcrime.securesms.mms.Slide; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java index d0cc410d7e..93173db162 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java @@ -14,9 +14,9 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.ExpirationInfo; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase.ExpirationInfo; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob; import org.thoughtcrime.securesms.jobs.SendReadReceiptJob; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java index 41f29a3d34..3661524830 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java @@ -26,8 +26,8 @@ import android.os.Bundle; import androidx.core.app.RemoteInput; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsLoader.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsLoader.java index 7873ee0e4f..65a0d5aaa4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsLoader.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsLoader.java @@ -15,6 +15,8 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.components.emoji.EmojiUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.MmsDatabase; +import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.AbstractCursorLoader; @@ -49,8 +51,8 @@ public class ReactionsLoader implements ReactionsViewModel.Repository, LoaderMan SignalExecutors.BOUNDED.execute(() -> { data.moveToPosition(-1); - MessageRecord record = isMms ? DatabaseFactory.getMmsDatabase(appContext).readerFor(data).getNext() - : DatabaseFactory.getSmsDatabase(appContext).readerFor(data).getNext(); + MessageRecord record = isMms ? MmsDatabase.readerFor(data).getNext() + : SmsDatabase.readerFor(data).getNext(); if (record == null) { internalLiveData.postValue(Collections.emptyList()); @@ -86,7 +88,7 @@ public class ReactionsLoader implements ReactionsViewModel.Repository, LoaderMan @Override public Cursor getCursor() { - return DatabaseFactory.getMmsDatabase(context).getMessage(messageId); + return DatabaseFactory.getMmsDatabase(context).getMessageCursor(messageId); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiRepository.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiRepository.java index 47f21945ae..c6b5a5f3e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiRepository.java @@ -9,11 +9,10 @@ import androidx.annotation.StringRes; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.emoji.EmojiPageModel; import org.thoughtcrime.securesms.components.emoji.EmojiUtil; import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; @@ -72,7 +71,7 @@ final class ReactWithAnyEmojiRepository { void addEmojiToMessage(@NonNull String emoji, long messageId, boolean isMms) { SignalExecutors.BOUNDED.execute(() -> { try { - MessagingDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); MessageRecord messageRecord = db.getMessageRecord(messageId); ReactionRecord oldRecord = Stream.of(messageRecord.getReactions()) .filter(record -> record.getAuthor().equals(Recipient.self().getId())) diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageRepository.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageRepository.java index f0816cd427..6bb6fe0a69 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageRepository.java @@ -23,7 +23,7 @@ class ViewOnceMessageRepository { void getMessage(long messageId, @NonNull Callback> callback) { SignalExecutors.BOUNDED.execute(() -> { - try (MmsDatabase.Reader reader = mmsDatabase.readerFor(mmsDatabase.getMessage(messageId))) { + try (MmsDatabase.Reader reader = MmsDatabase.readerFor(mmsDatabase.getMessageCursor(messageId))) { MmsMessageRecord record = (MmsMessageRecord) reader.getNext(); callback.onComplete(Optional.fromNullable(record)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java index ab0c01f876..565dd2773e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java @@ -1,6 +1,8 @@ package org.thoughtcrime.securesms.service; import android.content.Context; + +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.database.DatabaseFactory; @@ -20,9 +22,9 @@ public class ExpiringMessageManager { private final TreeSet expiringMessageReferences = new TreeSet<>(new ExpiringMessageComparator()); private final Executor executor = Executors.newSingleThreadExecutor(); - private final SmsDatabase smsDatabase; - private final MmsDatabase mmsDatabase; - private final Context context; + private final MessageDatabase smsDatabase; + private final MessageDatabase mmsDatabase; + private final Context context; public ExpiringMessageManager(Context context) { this.context = context.getApplicationContext(); @@ -54,8 +56,8 @@ public class ExpiringMessageManager { private class LoadTask implements Runnable { public void run() { - SmsDatabase.Reader smsReader = smsDatabase.readerFor(smsDatabase.getExpirationStartedMessages()); - MmsDatabase.Reader mmsReader = mmsDatabase.getExpireStartedMessages(); + SmsDatabase.Reader smsReader = SmsDatabase.readerFor(smsDatabase.getExpirationStartedMessages()); + MmsDatabase.Reader mmsReader = MmsDatabase.readerFor(mmsDatabase.getExpirationStartedMessages()); MessageRecord messageRecord; @@ -103,7 +105,7 @@ public class ExpiringMessageManager { } if (expiredMessage != null) { - if (expiredMessage.mms) mmsDatabase.delete(expiredMessage.id); + if (expiredMessage.mms) mmsDatabase.deleteMessage(expiredMessage.id); else smsDatabase.deleteMessage(expiredMessage.id); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java index 81015ce36f..ddad832e09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java @@ -12,7 +12,6 @@ import android.os.IBinder; import android.os.ResultReceiver; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; -import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -58,6 +57,7 @@ import org.thoughtcrime.securesms.webrtc.locks.LockManager; import org.webrtc.EglBase; import org.webrtc.PeerConnection; import org.whispersystems.libsignal.IdentityKey; +import org.whispersystems.libsignal.util.Pair; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; @@ -461,7 +461,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, private void insertMissedCall(@NonNull RemotePeer remotePeer, boolean signal) { Pair messageAndThreadId = DatabaseFactory.getSmsDatabase(this).insertMissedCall(remotePeer.getId()); - ApplicationDependencies.getMessageNotifier().updateNotification(this, messageAndThreadId.second, signal); + ApplicationDependencies.getMessageNotifier().updateNotification(this, messageAndThreadId.second(), signal); } private void handleDenyCall(Intent intent) { 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 24c3f39af3..394d6ffce5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -34,9 +34,10 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper; import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.database.AttachmentDatabase; +import org.thoughtcrime.securesms.database.Database; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessagingDatabase; -import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; @@ -101,9 +102,9 @@ public class MessageSender { final boolean forceSms, final SmsDatabase.InsertListener insertListener) { - SmsDatabase database = DatabaseFactory.getSmsDatabase(context); - Recipient recipient = message.getRecipient(); - boolean keyExchange = message.isKeyExchange(); + MessageDatabase database = DatabaseFactory.getSmsDatabase(context); + Recipient recipient = message.getRecipient(); + boolean keyExchange = message.isKeyExchange(); long allocatedThreadId = DatabaseFactory.getThreadDatabase(context).getOrCreateValidThreadId(recipient, threadId); long messageId = database.insertMessageOutbox(allocatedThreadId, message, forceSms, System.currentTimeMillis(), insertListener); @@ -287,7 +288,7 @@ public class MessageSender { } public static void sendNewReaction(@NonNull Context context, long messageId, boolean isMms, @NonNull String emoji) { - MessagingDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); ReactionRecord reaction = new ReactionRecord(emoji, Recipient.self().getId(), System.currentTimeMillis(), System.currentTimeMillis()); db.addReaction(messageId, reaction); @@ -301,7 +302,7 @@ public class MessageSender { } public static void sendReactionRemoval(@NonNull Context context, long messageId, boolean isMms, @NonNull ReactionRecord reaction) { - MessagingDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); db.deleteReaction(messageId, reaction.getAuthor()); @@ -314,7 +315,7 @@ public class MessageSender { } public static void sendRemoteDelete(@NonNull Context context, long messageId, boolean isMms) { - MessagingDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); + MessageDatabase db = isMms ? DatabaseFactory.getMmsDatabase(context) : DatabaseFactory.getSmsDatabase(context); db.markAsRemoteDelete(messageId); db.markAsSending(messageId); @@ -519,9 +520,9 @@ public class MessageSender { private static void sendLocalTextSelf(Context context, long messageId) { try { ExpiringMessageManager expirationManager = ApplicationContext.getInstance(context).getExpiringMessageManager(); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context); - SmsMessageRecord message = smsDatabase.getMessageRecord(messageId); + SmsMessageRecord message = smsDatabase.getSmsMessage(messageId); SyncMessageId syncId = new SyncMessageId(Recipient.self().getId(), message.getDateSent()); smsDatabase.markAsSent(messageId, true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java index 133e4360c3..b62d1394c6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.util; import android.content.Context; -import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import androidx.annotation.NonNull; @@ -67,7 +66,7 @@ public class AttachmentUtil { .size(); if (attachmentCount <= 1) { - DatabaseFactory.getMmsDatabase(context).delete(mmsId); + DatabaseFactory.getMmsDatabase(context).deleteMessage(mmsId); } else { DatabaseFactory.getAttachmentDatabase(context).deleteAttachment(attachmentId); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java index 07c59053d7..53a5fcb843 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java @@ -14,7 +14,8 @@ import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord; -import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult; +import org.thoughtcrime.securesms.database.MessageDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase.InsertResult; import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.logging.Log; @@ -66,9 +67,9 @@ public class IdentityUtil { public static void markIdentityVerified(Context context, Recipient recipient, boolean verified, boolean remote) { - long time = System.currentTimeMillis(); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); + long time = System.currentTimeMillis(); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); try (GroupDatabase.Reader reader = groupDatabase.getGroups()) { @@ -120,9 +121,9 @@ public class IdentityUtil { } public static void markIdentityUpdate(@NonNull Context context, @NonNull RecipientId recipientId) { - long time = System.currentTimeMillis(); - SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); + long time = System.currentTimeMillis(); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); try (GroupDatabase.Reader reader = groupDatabase.getGroups()) { GroupDatabase.GroupRecord groupRecord; diff --git a/app/src/test/java/org/thoughtcrime/securesms/notifications/MarkReadReceiverTest.java b/app/src/test/java/org/thoughtcrime/securesms/notifications/MarkReadReceiverTest.java index e4270d8292..e044674708 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/notifications/MarkReadReceiverTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/notifications/MarkReadReceiverTest.java @@ -9,11 +9,10 @@ import com.annimon.stream.Stream; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import org.thoughtcrime.securesms.database.MessagingDatabase; +import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; @@ -61,12 +60,12 @@ public class MarkReadReceiverTest { List threads = Stream.range(4L, 7L).toList(); int expected = recipients.size() * threads.size() + 1; - List infoList = Stream.of(threads) - .flatMap(threadId -> Stream.of(recipients) + List infoList = Stream.of(threads) + .flatMap(threadId -> Stream.of(recipients) .map(recipientId -> createMarkedMessageInfo(threadId, recipientId))) - .toList(); + .toList(); - List duplicatedList = Util.concatenatedList(infoList, infoList); + List duplicatedList = Util.concatenatedList(infoList, infoList); // WHEN MarkReadReceiver.process(mockContext, duplicatedList); @@ -93,9 +92,9 @@ public class MarkReadReceiverTest { assertEquals("Should have 9 total combinations.", 9, threadRecipientPairs.size()); } - private MessagingDatabase.MarkedMessageInfo createMarkedMessageInfo(long threadId, @NonNull RecipientId recipientId) { - return new MessagingDatabase.MarkedMessageInfo(threadId, - new MessagingDatabase.SyncMessageId(recipientId, 0), - new MessagingDatabase.ExpirationInfo(0, 0, 0, false)); + private MessageDatabase.MarkedMessageInfo createMarkedMessageInfo(long threadId, @NonNull RecipientId recipientId) { + return new MessageDatabase.MarkedMessageInfo(threadId, + new MessageDatabase.SyncMessageId(recipientId, 0), + new MessageDatabase.ExpirationInfo(0, 0, 0, false)); } } \ No newline at end of file