diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__handleStoryMessageTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__handleStoryMessageTest.kt index eec3024d6..7e97bf4b0 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__handleStoryMessageTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessor__handleStoryMessageTest.kt @@ -72,7 +72,7 @@ class MessageContentProcessor__handleStoryMessageTest : MessageContentProcessorT runTestWithContent(contentProto = storyContent) - val replyId = SignalDatabase.mmsSms.getConversation(senderThreadId, 0, 1).use { + val replyId = SignalDatabase.messages.getConversation(senderThreadId, 0, 1).use { it.moveToFirst() it.requireLong(MessageTable.ID) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java index c0923bf95..340c23084 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java @@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.conversation.ConversationData.MessageRequestDa import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.database.CallTable; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; @@ -94,7 +93,6 @@ public class ConversationDataSource implements PagedDataSource load(int start, int length, @NonNull CancellationSignal cancellationSignal) { Stopwatch stopwatch = new Stopwatch("load(" + start + ", " + length + "), thread " + threadId); - MmsSmsTable db = SignalDatabase.mmsSms(); List records = new ArrayList<>(length); MentionHelper mentionHelper = new MentionHelper(); QuotedHelper quotedHelper = new QuotedHelper(); @@ -104,7 +102,7 @@ public class ConversationDataSource implements PagedDataSource referencedIds = new HashSet<>(); - try (MessageTable.Reader reader = MessageTable.mmsReaderFor(db.getConversation(threadId, start, length))) { + try (MessageTable.Reader reader = MessageTable.mmsReaderFor(SignalDatabase.messages().getConversation(threadId, start, length))) { MessageRecord record; while ((record = reader.getNext()) != null && !cancellationSignal.isCanceled()) { records.add(record); @@ -144,7 +142,7 @@ public class ConversationDataSource implements PagedDataSource messageIds = new LinkedList<>(); private Map> messageIdToAttachments = new HashMap<>(); - void add(MessageRecord record) { + public void add(MessageRecord record) { if (record.isMms()) { messageIds.add(record.getId()); } } - void fetchAttachments(Context context) { + public void addAll(List records) { + for (MessageRecord record : records) { + add(record); + } + } + + public void fetchAttachments() { messageIdToAttachments = SignalDatabase.attachments().getAttachmentsForMessages(messageIds); } - @NonNull List buildUpdatedModels(@NonNull Context context, @NonNull List records) { + public @NonNull List buildUpdatedModels(@NonNull Context context, @NonNull List records) { return records.stream() .map(record -> { if (record instanceof MediaMmsMessageRecord) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 0406df866..8299dae7b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -179,6 +179,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.database.identity.IdentityRecordList; import org.thoughtcrime.securesms.database.model.IdentityRecord; +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -4185,11 +4186,15 @@ public class ConversationParentFragment extends Fragment Context context = ApplicationDependencies.getApplication(); - MessageRecord messageRecord = SignalDatabase.mmsSms().getMessageFor(quoteId.getId(), quoteId.getAuthor()); + MessageRecord messageRecord = SignalDatabase.messages().getMessageFor(quoteId.getId(), quoteId.getAuthor()); if (messageRecord == null) { return null; } + if (messageRecord instanceof MediaMmsMessageRecord) { + messageRecord = ((MediaMmsMessageRecord) messageRecord).withAttachments(context, SignalDatabase.attachments().getAttachmentsForMessage(messageRecord.getId())); + } + return ConversationMessageFactory.createWithUnresolvedData(context, messageRecord); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt index f45314c79..73b34654e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt @@ -54,14 +54,21 @@ class MessageQuotesRepository { return emptyList() } - val replyRecords: List = SignalDatabase.mmsSms.getAllMessagesThatQuote(rootMessageId) + var replyRecords: List = SignalDatabase.messages.getAllMessagesThatQuote(rootMessageId) - val replies: List = ConversationDataSource.ReactionHelper() - .apply { - addAll(replyRecords) - fetchReactions() - } - .buildUpdatedModels(replyRecords) + val reactionHelper = ConversationDataSource.ReactionHelper() + val attachmentHelper = ConversationDataSource.AttachmentHelper() + + reactionHelper.addAll(replyRecords) + attachmentHelper.addAll(replyRecords) + + reactionHelper.fetchReactions() + attachmentHelper.fetchAttachments() + + replyRecords = reactionHelper.buildUpdatedModels(replyRecords) + replyRecords = attachmentHelper.buildUpdatedModels(ApplicationDependencies.getApplication(), replyRecords) + + val replies: List = replyRecords .map { replyRecord -> val replyQuote: Quote? = replyRecord.getQuote() if (replyQuote != null && replyQuote.id == originalRecord!!.dateSent) { @@ -76,13 +83,23 @@ class MessageQuotesRepository { originalRecord = SignalDatabase.payments.updateMessageWithPayment(originalRecord) } - val originalMessage: List = ConversationDataSource.ReactionHelper() + originalRecord = ConversationDataSource.ReactionHelper() .apply { add(originalRecord) fetchReactions() } .buildUpdatedModels(listOf(originalRecord)) - .map { ConversationMessageFactory.createWithUnresolvedData(application, it, it.getDisplayBody(application), false) } + .get(0) + + originalRecord = ConversationDataSource.AttachmentHelper() + .apply { + add(originalRecord) + fetchAttachments() + } + .buildUpdatedModels(ApplicationDependencies.getApplication(), listOf(originalRecord)) + .get(0) + + val originalMessage: ConversationMessage = ConversationMessageFactory.createWithUnresolvedData(application, originalRecord, originalRecord.getDisplayBody(application), false) return replies + originalMessage } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java index 559ebe82a..55eb498ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java @@ -84,6 +84,7 @@ import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingMessage; import org.thoughtcrime.securesms.mms.QuoteModel; import org.thoughtcrime.securesms.mms.SlideDeck; +import org.thoughtcrime.securesms.notifications.v2.DefaultMessageNotifier; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo; @@ -3267,7 +3268,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie db.beginTransaction(); try { - try (MessageTable.Reader reader = MessageTable.mmsReaderFor(SignalDatabase.mmsSms().getConversation(threadId, 0, 2))) { + try (MessageTable.Reader reader = MessageTable.mmsReaderFor(getConversation(threadId, 0, 2))) { MessageRecord latestMessage = reader.getNext(); if (latestMessage != null && latestMessage.isGroupV2()) { Optional changeEditor = message.getChangeEditor(); @@ -3694,6 +3695,41 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie return id; } + public List getAllMessagesThatQuote(@NonNull MessageId id) { + MessageRecord targetMessage; + try { + targetMessage = getMessageRecord(id.getId()); + } catch (NoSuchMessageException e) { + throw new IllegalArgumentException("Invalid message ID!"); + } + + RecipientId author = targetMessage.isOutgoing() ? Recipient.self().getId() : targetMessage.getRecipient().getId(); + String query = QUOTE_ID + " = " + targetMessage.getDateSent() + " AND " + QUOTE_AUTHOR + " = " + author.serialize(); + String order = DATE_RECEIVED + " DESC"; + + List records = new ArrayList<>(); + + try (Reader reader = new MmsReader(getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, query, null, null, null, order))) { + MessageRecord record; + while ((record = reader.getNext()) != null) { + records.add(record); + records.addAll(getAllMessagesThatQuote(new MessageId(record.getId()))); + } + } + + Collections.sort(records, (lhs, rhs) -> { + if (lhs.getDateReceived() > rhs.getDateReceived()) { + return -1; + } else if (lhs.getDateReceived() < rhs.getDateReceived()) { + return 1; + } else { + return 0; + } + }); + + return records; + } + public int getQuotedMessagePosition(long threadId, long quoteId, @NonNull RecipientId recipientId) { String[] projection = new String[]{ DATE_SENT, RECIPIENT_ID, REMOTE_DELETED}; String order = DATE_RECEIVED + " DESC"; @@ -3748,7 +3784,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie /** * Retrieves the position of the message with the provided timestamp in the query results you'd - * get from calling {@link MmsSmsTable#getConversation(long)}. + * get from calling {@link #getConversation(long)}. * * Note: This could give back incorrect results in the situation where multiple messages have the * same received timestamp. However, because this was designed to determine where to scroll to, @@ -4275,6 +4311,85 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie return new TimestampReadResult(expiring, threads); } + /** + * Finds a message by timestamp+author. + * Does *not* include attachments. + */ + public @Nullable MessageRecord getMessageFor(long timestamp, RecipientId authorId) { + Recipient author = Recipient.resolved(authorId); + + String query = DATE_SENT + " = ?"; + String[] args = SqlUtil.buildArgs(timestamp); + + try (Cursor cursor = getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, query, args, null, null, null)) { + MessageTable.Reader reader = MessageTable.mmsReaderFor(cursor); + + MessageRecord messageRecord; + + while ((messageRecord = reader.getNext()) != null) { + if ((author.isSelf() && messageRecord.isOutgoing()) || + (!author.isSelf() && messageRecord.getIndividualRecipient().getId().equals(authorId))) + { + return messageRecord; + } + } + } + + return null; + } + + /** + * A cursor containing all of the messages in a given thread, in the proper order. + * This does *not* have attachments in it. + */ + public Cursor getConversation(long threadId) { + return getConversation(threadId, 0, 0); + } + + /** + * A cursor containing all of the messages in a given thread, in the proper order, respecting offset/limit. + * This does *not* have attachments in it. + */ + public Cursor getConversation(long threadId, long offset, long limit) { + String selection = THREAD_ID + " = ? AND " + STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ?"; + String[] args = SqlUtil.buildArgs(threadId, 0, 0); + String order = DATE_RECEIVED + " DESC"; + String limitStr = limit > 0 || offset > 0 ? offset + ", " + limit : null; + + return getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, selection, args, null, null, order, limitStr); + } + + public Cursor getMessagesForNotificationState(Collection stickyThreads) { + StringBuilder stickyQuery = new StringBuilder(); + for (DefaultMessageNotifier.StickyThread stickyThread : stickyThreads) { + if (stickyQuery.length() > 0) { + stickyQuery.append(" OR "); + } + stickyQuery.append("(") + .append(MessageTable.THREAD_ID + " = ") + .append(stickyThread.getConversationId().getThreadId()) + .append(" AND ") + .append(MessageTable.DATE_RECEIVED) + .append(" >= ") + .append(stickyThread.getEarliestTimestamp()) + .append(getStickyWherePartForParentStoryId(stickyThread.getConversationId().getGroupStoryId())) + .append(")"); + } + + String order = MessageTable.DATE_RECEIVED + " ASC"; + String selection = MessageTable.NOTIFIED + " = 0 AND " + MessageTable.STORY_TYPE + " = 0 AND (" + MessageTable.READ + " = 0 OR " + MessageTable.REACTIONS_UNREAD + " = 1" + (stickyQuery.length() > 0 ? " OR (" + stickyQuery + ")" : "") + ")"; + + return getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, selection, null, null, null, order); + } + + private @NonNull String getStickyWherePartForParentStoryId(@Nullable Long parentStoryId) { + if (parentStoryId == null) { + return " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; + } + + return " AND " + MessageTable.PARENT_STORY_ID + " = " + parentStoryId; + } + @Override public void remapRecipient(@NonNull RecipientId fromId, @NonNull RecipientId toId) { ContentValues values = new ContentValues(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java deleted file mode 100644 index 2a4718adf..000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (C) 2011 Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.thoughtcrime.securesms.database; - -import android.content.Context; -import android.database.Cursor; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import net.zetetic.database.sqlcipher.SQLiteQueryBuilder; - -import org.signal.core.util.SqlUtil; -import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.database.model.MessageId; -import org.thoughtcrime.securesms.database.model.MessageRecord; -import org.thoughtcrime.securesms.notifications.v2.DefaultMessageNotifier; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.recipients.RecipientId; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -public class MmsSmsTable extends DatabaseTable { - - @SuppressWarnings("unused") - private static final String TAG = Log.tag(MmsSmsTable.class); - - private static final String[] PROJECTION = { MessageTable.TABLE_NAME + "." + MessageTable.ID + " AS " + MessageTable.ID, - MessageTable.BODY, - MessageTable.TYPE, - MessageTable.THREAD_ID, - MessageTable.RECIPIENT_ID, - MessageTable.RECIPIENT_DEVICE_ID, - MessageTable.DATE_SENT, - MessageTable.DATE_RECEIVED, - MessageTable.DATE_SERVER, - MessageTable.MMS_MESSAGE_TYPE, - MessageTable.UNIDENTIFIED, - MessageTable.MMS_CONTENT_LOCATION, - MessageTable.MMS_TRANSACTION_ID, - MessageTable.MMS_MESSAGE_SIZE, - MessageTable.MMS_EXPIRY, - MessageTable.MMS_STATUS, - MessageTable.DELIVERY_RECEIPT_COUNT, - MessageTable.READ_RECEIPT_COUNT, - MessageTable.MISMATCHED_IDENTITIES, - MessageTable.NETWORK_FAILURES, - MessageTable.SMS_SUBSCRIPTION_ID, - MessageTable.EXPIRES_IN, - MessageTable.EXPIRE_STARTED, - MessageTable.NOTIFIED, - MessageTable.QUOTE_ID, - MessageTable.QUOTE_AUTHOR, - MessageTable.QUOTE_BODY, - MessageTable.QUOTE_MISSING, - MessageTable.QUOTE_TYPE, - MessageTable.QUOTE_MENTIONS, - MessageTable.SHARED_CONTACTS, - MessageTable.LINK_PREVIEWS, - MessageTable.VIEW_ONCE, - MessageTable.READ, - MessageTable.REACTIONS_UNREAD, - MessageTable.REACTIONS_LAST_SEEN, - MessageTable.REMOTE_DELETED, - MessageTable.MENTIONS_SELF, - MessageTable.NOTIFIED_TIMESTAMP, - MessageTable.VIEWED_RECEIPT_COUNT, - MessageTable.RECEIPT_TIMESTAMP, - MessageTable.MESSAGE_RANGES, - MessageTable.STORY_TYPE, - MessageTable.PARENT_STORY_ID}; - - public MmsSmsTable(Context context, SignalDatabase databaseHelper) { - super(context, databaseHelper); - } - - public @Nullable MessageRecord getMessageFor(long timestamp, RecipientId authorId) { - Recipient author = Recipient.resolved(authorId); - - try (Cursor cursor = queryTables(PROJECTION, MessageTable.DATE_SENT + " = " + timestamp, null, null, true)) { - MessageTable.Reader reader = MessageTable.mmsReaderFor(cursor); - - MessageRecord messageRecord; - - while ((messageRecord = reader.getNext()) != null) { - if ((author.isSelf() && messageRecord.isOutgoing()) || - (!author.isSelf() && messageRecord.getIndividualRecipient().getId().equals(authorId))) - { - return messageRecord; - } - } - } - - return null; - } - - public Cursor getConversation(long threadId, long offset, long limit) { - SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - String order = MessageTable.DATE_RECEIVED + " DESC"; - String selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0"; - String limitStr = limit > 0 || offset > 0 ? offset + ", " + limit : null; - String query = buildQuery(PROJECTION, selection, order, limitStr, false); - - return db.rawQuery(query, null); - } - - public Cursor getConversation(long threadId) { - return getConversation(threadId, 0, 0); - } - public Cursor getMessagesForNotificationState(Collection stickyThreads) { - StringBuilder stickyQuery = new StringBuilder(); - for (DefaultMessageNotifier.StickyThread stickyThread : stickyThreads) { - if (stickyQuery.length() > 0) { - stickyQuery.append(" OR "); - } - stickyQuery.append("(") - .append(MessageTable.THREAD_ID + " = ") - .append(stickyThread.getConversationId().getThreadId()) - .append(" AND ") - .append(MessageTable.DATE_RECEIVED) - .append(" >= ") - .append(stickyThread.getEarliestTimestamp()) - .append(getStickyWherePartForParentStoryId(stickyThread.getConversationId().getGroupStoryId())) - .append(")"); - } - - String order = MessageTable.DATE_RECEIVED + " ASC"; - String selection = MessageTable.NOTIFIED + " = 0 AND " + MessageTable.STORY_TYPE + " = 0 AND (" + MessageTable.READ + " = 0 OR " + MessageTable.REACTIONS_UNREAD + " = 1" + (stickyQuery.length() > 0 ? " OR (" + stickyQuery + ")" : "") + ")"; - - return queryTables(PROJECTION, selection, order, null, true); - } - - public List getAllMessagesThatQuote(@NonNull MessageId id) { - MessageRecord targetMessage; - try { - targetMessage = SignalDatabase.messages().getMessageRecord(id.getId()); - } catch (NoSuchMessageException e) { - throw new IllegalArgumentException("Invalid message ID!"); - } - - RecipientId author = targetMessage.isOutgoing() ? Recipient.self().getId() : targetMessage.getRecipient().getId(); - String query = MessageTable.QUOTE_ID + " = " + targetMessage.getDateSent() + " AND " + MessageTable.QUOTE_AUTHOR + " = " + author.serialize(); - String order = MessageTable.DATE_RECEIVED + " DESC"; - - List records = new ArrayList<>(); - - try (MessageTable.Reader reader = new MessageTable.MmsReader(queryTables(PROJECTION, query, order, null, true))) { - MessageRecord record; - while ((record = reader.getNext()) != null) { - records.add(record); - records.addAll(getAllMessagesThatQuote(new MessageId(record.getId()))); - } - } - - Collections.sort(records, (lhs, rhs) -> { - if (lhs.getDateReceived() > rhs.getDateReceived()) { - return -1; - } else if (lhs.getDateReceived() < rhs.getDateReceived()) { - return 1; - } else { - return 0; - } - }); - - return records; - } - - private @NonNull String getStickyWherePartForParentStoryId(@Nullable Long parentStoryId) { - if (parentStoryId == null) { - return " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; - } - - return " AND " + MessageTable.PARENT_STORY_ID + " = " + parentStoryId; - } - - private static @NonNull String buildQuery(String[] projection, String selection, String order, String limit, boolean includeAttachments) { - String attachmentJsonJoin; - if (includeAttachments) { - attachmentJsonJoin = "json_group_array(json_object(" + "'" + AttachmentTable.ROW_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + ", " + - "'" + AttachmentTable.UNIQUE_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UNIQUE_ID + ", " + - "'" + AttachmentTable.MMS_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + "," + - "'" + AttachmentTable.SIZE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.SIZE + ", " + - "'" + AttachmentTable.FILE_NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FILE_NAME + ", " + - "'" + AttachmentTable.DATA + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DATA + ", " + - "'" + AttachmentTable.CONTENT_TYPE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_TYPE + ", " + - "'" + AttachmentTable.CDN_NUMBER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CDN_NUMBER + ", " + - "'" + AttachmentTable.CONTENT_LOCATION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_LOCATION + ", " + - "'" + AttachmentTable.FAST_PREFLIGHT_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.FAST_PREFLIGHT_ID + ", " + - "'" + AttachmentTable.VOICE_NOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VOICE_NOTE + ", " + - "'" + AttachmentTable.BORDERLESS + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.BORDERLESS + ", " + - "'" + AttachmentTable.VIDEO_GIF + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VIDEO_GIF + ", " + - "'" + AttachmentTable.WIDTH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.WIDTH + ", " + - "'" + AttachmentTable.HEIGHT + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.HEIGHT + ", " + - "'" + AttachmentTable.QUOTE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.QUOTE + ", " + - "'" + AttachmentTable.CONTENT_DISPOSITION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CONTENT_DISPOSITION + ", " + - "'" + AttachmentTable.NAME + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.NAME + ", " + - "'" + AttachmentTable.TRANSFER_STATE + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFER_STATE + ", " + - "'" + AttachmentTable.CAPTION + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.CAPTION + ", " + - "'" + AttachmentTable.STICKER_PACK_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_ID + ", " + - "'" + AttachmentTable.STICKER_PACK_KEY + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_PACK_KEY + ", " + - "'" + AttachmentTable.STICKER_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_ID + ", " + - "'" + AttachmentTable.STICKER_EMOJI + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.STICKER_EMOJI + ", " + - "'" + AttachmentTable.VISUAL_HASH + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.VISUAL_HASH + ", " + - "'" + AttachmentTable.TRANSFORM_PROPERTIES + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.TRANSFORM_PROPERTIES + ", " + - "'" + AttachmentTable.DISPLAY_ORDER + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.DISPLAY_ORDER + ", " + - "'" + AttachmentTable.UPLOAD_TIMESTAMP + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.UPLOAD_TIMESTAMP + "))"; - } else { - attachmentJsonJoin = "NULL"; - } - - projection = SqlUtil.appendArg(projection, attachmentJsonJoin + " AS " + AttachmentTable.ATTACHMENT_JSON_ALIAS); - - SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder(); - - if (includeAttachments) { - mmsQueryBuilder.setDistinct(true); - } - - if (includeAttachments) { - mmsQueryBuilder.setTables(MessageTable.TABLE_NAME + " LEFT OUTER JOIN " + AttachmentTable.TABLE_NAME + - " ON " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " = " + MessageTable.TABLE_NAME + "." + MessageTable.ID); - } else { - mmsQueryBuilder.setTables(MessageTable.TABLE_NAME); - } - - String mmsGroupBy = includeAttachments ? MessageTable.TABLE_NAME + "." + MessageTable.ID : null; - - return mmsQueryBuilder.buildQuery(projection, selection, null, mmsGroupBy, null, order, limit); - } - - private Cursor queryTables(String[] projection, String selection, String order, String limit, boolean includeAttachments) { - String query = buildQuery(projection, selection, order, limit, includeAttachments); - - return databaseHelper.getSignalReadableDatabase().rawQuery(query, null); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt index d7136bfc1..d037f78c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt @@ -42,7 +42,6 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data val attachmentTable: AttachmentTable = AttachmentTable(context, this, attachmentSecret) val mediaTable: MediaTable = MediaTable(context, this) val threadTable: ThreadTable = ThreadTable(context, this) - val mmsSmsTable: MmsSmsTable = MmsSmsTable(context, this) val identityTable: IdentityTable = IdentityTable(context, this) val draftTable: DraftTable = DraftTable(context, this) val pushTable: PushTable = PushTable(context, this) @@ -431,11 +430,6 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data val messageSearch: SearchTable get() = instance!!.searchTable - @get:JvmStatic - @get:JvmName("mmsSms") - val mmsSms: MmsSmsTable - get() = instance!!.mmsSmsTable - @get:JvmStatic @get:JvmName("notificationProfiles") val notificationProfiles: NotificationProfileDatabase diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 38bfd7072..aab8fb552 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.database.SignalDatabase.Companion.groupReceipt import org.thoughtcrime.securesms.database.SignalDatabase.Companion.mentions import org.thoughtcrime.securesms.database.SignalDatabase.Companion.messageLog import org.thoughtcrime.securesms.database.SignalDatabase.Companion.messages -import org.thoughtcrime.securesms.database.SignalDatabase.Companion.mmsSms import org.thoughtcrime.securesms.database.SignalDatabase.Companion.recipients import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageRecord @@ -339,7 +338,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } val finalTrimBeforeDate = if (length != NO_TRIM_MESSAGE_COUNT_SET && length > 0) { - mmsSms.getConversation(threadId).use { cursor -> + messages.getConversation(threadId).use { cursor -> if (cursor.count > length) { cursor.moveToPosition(length - 1) max(trimBeforeDate, cursor.requireLong(MessageTable.DATE_RECEIVED)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/insights/InsightsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/insights/InsightsRepository.java index 8eba99fb1..3d3157ecc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/insights/InsightsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/insights/InsightsRepository.java @@ -11,7 +11,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.mms.OutgoingMessage; diff --git a/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderRepository.java b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderRepository.java index 9acfe62f0..82e793b94 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/invites/InviteReminderRepository.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.invites; import android.content.Context; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.recipients.Recipient; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigration.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigration.java index 685d0d5ed..373775db0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigration.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigration.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.jobmanager.migrations; import androidx.annotation.NonNull; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.JobMigration; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessEarlyMessagesJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessEarlyMessagesJob.kt index 3de9b6ec7..26622aa95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessEarlyMessagesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessEarlyMessagesJob.kt @@ -36,7 +36,7 @@ class PushProcessEarlyMessagesJob private constructor(parameters: Parameters) : override fun onRun() { val earlyIds: List = ApplicationDependencies.getEarlyMessageCache().allReferencedIds - .filter { SignalDatabase.mmsSms.getMessageFor(it.sentTimestamp, it.sender) != null } + .filter { SignalDatabase.messages.getMessageFor(it.sentTimestamp, it.sender) != null } .sortedBy { it.sentTimestamp } if (earlyIds.isNotEmpty()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java index 063a5a791..33dd31e04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.java @@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.FullScreenDialogFragment; import org.thoughtcrime.securesms.conversation.colors.Colorizer; import org.thoughtcrime.securesms.conversation.colors.RecyclerViewColorizer; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackController; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionPlayerHolder; 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 335fca665..51491b821 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java @@ -10,7 +10,6 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.crypto.ReentrantSessionLock; import org.thoughtcrime.securesms.database.GroupTable; import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupChangeBusyException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index b6e20531c..522613fff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.database.GroupReceiptTable.GroupReceiptInfo; import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.database.MessageTable.InsertResult; import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.PaymentTable; import org.thoughtcrime.securesms.database.PaymentMetaDataUtil; @@ -971,7 +970,7 @@ public final class MessageContentProcessor { } Recipient targetAuthor = Recipient.externalPush(reaction.getTargetAuthor()); - MessageRecord targetMessage = SignalDatabase.mmsSms().getMessageFor(reaction.getTargetSentTimestamp(), targetAuthor.getId()); + MessageRecord targetMessage = SignalDatabase.messages().getMessageFor(reaction.getTargetSentTimestamp(), targetAuthor.getId()); if (targetMessage == null) { warn(String.valueOf(content.getTimestamp()), "[handleReaction] Could not find matching message! Putting it in the early message cache. timestamp: " + reaction.getTargetSentTimestamp() + " author: " + targetAuthor.getId()); @@ -1025,7 +1024,7 @@ public final class MessageContentProcessor { SignalServiceDataMessage.RemoteDelete delete = message.getRemoteDelete().get(); - MessageRecord targetMessage = SignalDatabase.mmsSms().getMessageFor(delete.getTargetSentTimestamp(), senderRecipient.getId()); + MessageRecord targetMessage = SignalDatabase.messages().getMessageFor(delete.getTargetSentTimestamp(), senderRecipient.getId()); if (targetMessage != null && RemoteDeleteUtil.isValidReceive(targetMessage, senderRecipient, content.getServerReceivedTimestamp())) { MessageTable db = targetMessage.isMms() ? SignalDatabase.messages() : SignalDatabase.messages(); @@ -1442,7 +1441,7 @@ public final class MessageContentProcessor { List records = Stream.of(viewedMessages) .map(message -> { RecipientId author = Recipient.externalPush(message.getSender()).getId(); - return SignalDatabase.mmsSms().getMessageFor(message.getTimestamp(), author); + return SignalDatabase.messages().getMessageFor(message.getTimestamp(), author); }) .filter(message -> message != null && message.isMms()) .toList(); @@ -1475,7 +1474,7 @@ public final class MessageContentProcessor { RecipientId author = Recipient.externalPush(openMessage.getSender()).getId(); long timestamp = openMessage.getTimestamp(); - MessageRecord record = SignalDatabase.mmsSms().getMessageFor(timestamp, author); + MessageRecord record = SignalDatabase.messages().getMessageFor(timestamp, author); if (record != null && record.isMms()) { SignalDatabase.attachments().deleteAttachmentFilesForViewOnceMessage(record.getId()); @@ -2351,9 +2350,7 @@ public final class MessageContentProcessor { return threadId; } - private void handleGroupRecipientUpdate(@NonNull SentTranscriptMessage message, long envelopeTimestamp) - throws BadGroupIdException - { + private void handleGroupRecipientUpdate(@NonNull SentTranscriptMessage message, long envelopeTimestamp) { log(envelopeTimestamp, "Group recipient update."); Recipient recipient = getSyncMessageDestination(message); @@ -2363,8 +2360,7 @@ public final class MessageContentProcessor { return; } - MmsSmsTable database = SignalDatabase.mmsSms(); - MessageRecord record = database.getMessageFor(message.getTimestamp(), Recipient.self().getId()); + MessageRecord record = SignalDatabase.messages().getMessageFor(message.getTimestamp(), Recipient.self().getId()); if (record == null) { warn("Got recipient update for non-existing message! Skipping."); @@ -2911,7 +2907,7 @@ public final class MessageContentProcessor { MessageId relatedMessage = messageLogEntry.getRelatedMessages().get(0); return SignalDatabase.messages().getMessageRecordOrNull(relatedMessage.getId()); } else { - return SignalDatabase.mmsSms().getMessageFor(sentTimestamp, Recipient.self().getId()); + return SignalDatabase.messages().getMessageFor(sentTimestamp, Recipient.self().getId()); } } @@ -2951,7 +2947,7 @@ public final class MessageContentProcessor { } RecipientId author = Recipient.externalPush(quote.get().getAuthor()).getId(); - MessageRecord message = SignalDatabase.mmsSms().getMessageFor(quote.get().getId(), author); + MessageRecord message = SignalDatabase.messages().getMessageFor(quote.get().getId(), author); if (message != null && !message.isRemoteDelete()) { log("Found matching message record..."); @@ -2962,6 +2958,10 @@ public final class MessageContentProcessor { if (message.isMms()) { MmsMessageRecord mmsMessage = (MmsMessageRecord) message; + if (mmsMessage instanceof MediaMmsMessageRecord) { + mmsMessage = ((MediaMmsMessageRecord) mmsMessage).withAttachments(context, SignalDatabase.attachments().getAttachmentsForMessage(mmsMessage.getId())); + } + mentions.addAll(SignalDatabase.mentions().getMentionsForMessage(mmsMessage.getId())); if (mmsMessage.isViewOnce()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationStateProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationStateProvider.kt index 143bbb474..6561d30ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationStateProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationStateProvider.kt @@ -7,9 +7,11 @@ import org.thoughtcrime.securesms.database.MessageTable import org.thoughtcrime.securesms.database.NoSuchMessageException import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.ReactionRecord +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.isStoryReaction @@ -25,7 +27,7 @@ object NotificationStateProvider { fun constructNotificationState(stickyThreads: Map, notificationProfile: NotificationProfile?): NotificationState { val messages: MutableList = mutableListOf() - SignalDatabase.mmsSms.getMessagesForNotificationState(stickyThreads.values).use { unreadMessages -> + SignalDatabase.messages.getMessagesForNotificationState(stickyThreads.values).use { unreadMessages -> if (unreadMessages.count == 0) { return NotificationState.EMPTY } @@ -50,6 +52,13 @@ object NotificationStateProvider { SignalDatabase.messages.hasGroupReplyOrReactionInStory(it) } + if (record is MediaMmsMessageRecord) { + val attachments = SignalDatabase.attachments.getAttachmentsForMessage(record.id) + if (attachments.isNotEmpty()) { + record = record.withAttachments(ApplicationDependencies.getApplication(), attachments) + } + } + messages += NotificationMessage( messageRecord = record, reactions = if (hasUnreadReactions) SignalDatabase.reactions.getReactions(MessageId(record.id)) else emptyList(), 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 ff0d880d1..8bb4b03a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -36,7 +36,6 @@ import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.database.SignalDatabase; @@ -61,7 +60,6 @@ import org.thoughtcrime.securesms.jobs.IndividualSendJob; import org.thoughtcrime.securesms.jobs.ReactionSendJob; import org.thoughtcrime.securesms.jobs.RemoteDeleteSendJob; import org.thoughtcrime.securesms.jobs.ResumableUploadSpecJob; -import org.thoughtcrime.securesms.jobs.SmsSendJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.mediasend.Media; diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt index 21c46796b..9bc231f26 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt @@ -18,6 +18,7 @@ import com.bumptech.glide.load.resource.SimpleResource import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.databaseprotos.StoryTextPost @@ -112,7 +113,13 @@ data class StoryTextPostModel( override fun handles(source: StoryTextPostModel, options: Options): Boolean = true override fun decode(source: StoryTextPostModel, width: Int, height: Int, options: Options): Resource { - val message = SignalDatabase.mmsSms.getMessageFor(source.storySentAtMillis, source.storyAuthor) + val message = SignalDatabase.messages.getMessageFor(source.storySentAtMillis, source.storyAuthor).run { + if (this is MediaMmsMessageRecord) { + this.withAttachments(ApplicationDependencies.getApplication(), SignalDatabase.attachments.getAttachmentsForMessage(this.id)) + } else { + this + } + } val view = StoryTextPostView(ContextThemeWrapper(ApplicationDependencies.getApplication(), R.style.TextSecure_DarkNoActionBar)) val typeface = TypefaceCache.get( ApplicationDependencies.getApplication(), diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt index 2f184748e..df71f2c9d 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt @@ -17,7 +17,6 @@ import org.thoughtcrime.securesms.testing.TestDatabaseUtil @Config(manifest = Config.NONE, application = Application::class) class MmsSmsDatabaseTest { - private lateinit var mmsSmsTable: MmsSmsTable private lateinit var messageTable: MessageTable private lateinit var db: SQLiteDatabase @@ -28,7 +27,6 @@ class MmsSmsDatabaseTest { } db = sqlCipher.writableDatabase - mmsSmsTable = MmsSmsTable(ApplicationProvider.getApplicationContext(), sqlCipher) messageTable = MessageTable(ApplicationProvider.getApplicationContext(), sqlCipher) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigrationTest.java b/app/src/test/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigrationTest.java index 9609d7825..b596d0c00 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigrationTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/jobmanager/migrations/SendReadReceiptsJobMigrationTest.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.jobmanager.migrations; import org.junit.Test; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsTable; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.JobMigration; import org.thoughtcrime.securesms.jobs.SendReadReceiptJob;