From f149c0adb9685241a4e8ef96750a3f3a75e6fb57 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 30 Dec 2022 15:56:47 -0500 Subject: [PATCH] Remove MmsSmsColumns. All the columns got moved to MessageTable. I kept the types though and renamed the class to MessageTypes because it's a lot of boring domain-specific code. --- .../securesms/backup/FullBackupExporter.java | 5 +- .../conversation/drafts/DraftRepository.kt | 4 +- .../ConversationListDataSource.java | 6 +- .../ConversationListItem.java | 52 +- .../securesms/database/CallTable.kt | 6 +- .../securesms/database/MediaTable.java | 6 +- .../securesms/database/MessageTable.java | 383 +++++++------- .../securesms/database/MessageTypes.java | 352 +++++++++++++ .../securesms/database/MmsSmsColumns.java | 488 ------------------ .../securesms/database/MmsSmsTable.java | 132 +++-- .../securesms/database/SearchTable.kt | 24 +- .../securesms/database/ThreadTable.kt | 16 +- .../database/helpers/ClassicOpenHelper.java | 4 +- .../database/model/DisplayRecord.java | 70 +-- .../database/model/MediaMmsMessageRecord.java | 9 +- .../database/model/MessageRecord.java | 36 +- .../model/NotificationMmsMessageRecord.java | 2 +- .../securesms/database/model/StatusUtil.java | 21 +- .../database/model/ThreadRecord.java | 10 +- .../v2/NotificationStateProvider.kt | 8 +- .../securesms/search/SearchRepository.java | 5 +- .../service/SmsDeliveryListener.java | 8 +- .../reply/group/StoryGroupReplyDataSource.kt | 4 +- .../securesms/util/MessageRecordUtil.kt | 4 +- .../database/GV2UpdateTransformer.kt | 8 +- .../MessageBitmaskColumnTransformer.kt | 112 ++-- .../securesms/database/FakeMessageRecords.kt | 2 +- .../securesms/database/MmsDatabaseTest.kt | 15 +- .../securesms/database/MmsSmsDatabaseTest.kt | 10 +- .../securesms/database/SmsDatabaseTest.kt | 14 +- .../securesms/database/TestMms.kt | 26 +- .../securesms/database/TestSms.kt | 30 +- 32 files changed, 883 insertions(+), 989 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java index 292555ae32..bbafbe1c2c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.database.GroupReceiptTable; import org.thoughtcrime.securesms.database.KeyValueDatabase; import org.thoughtcrime.securesms.database.MentionTable; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.OneTimePreKeyTable; import org.thoughtcrime.securesms.database.PendingRetryReceiptTable; import org.thoughtcrime.securesms.database.ReactionTable; @@ -578,12 +577,12 @@ public class FullBackupExporter extends FullBackupBase { } private static boolean isNonExpiringMmsMessage(@NonNull Cursor cursor) { - return cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsColumns.EXPIRES_IN)) <= 0 && + return cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.EXPIRES_IN)) <= 0 && cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.VIEW_ONCE)) <= 0; } private static boolean isNonExpiringSmsMessage(@NonNull Cursor cursor) { - return cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsColumns.EXPIRES_IN)) <= 0; + return cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.EXPIRES_IN)) <= 0; } private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, @NonNull MessageId messageId) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt index 5804305cce..81a6bddcdb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt @@ -11,7 +11,7 @@ import org.thoughtcrime.securesms.components.mention.MentionAnnotation import org.thoughtcrime.securesms.database.DraftTable import org.thoughtcrime.securesms.database.DraftTable.Drafts import org.thoughtcrime.securesms.database.MentionUtil -import org.thoughtcrime.securesms.database.MmsSmsColumns +import org.thoughtcrime.securesms.database.MessageTypes import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.ThreadTable import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -46,7 +46,7 @@ class DraftRepository( } draftTable.replaceDrafts(actualThreadId, drafts) - threadTable.updateSnippet(actualThreadId, drafts.getSnippet(context), drafts.getUriSnippet(), System.currentTimeMillis(), MmsSmsColumns.Types.BASE_DRAFT_TYPE, true) + threadTable.updateSnippet(actualThreadId, drafts.getSnippet(context), drafts.getUriSnippet(), System.currentTimeMillis(), MessageTypes.BASE_DRAFT_TYPE, true) } else if (threadId > 0) { draftTable.clearDrafts(threadId) threadTable.update(threadId, unarchive = false, allowDeletion = false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java index b03a9c2796..7de282ad48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java @@ -14,7 +14,7 @@ import org.signal.paging.PagedDataSource; import org.thoughtcrime.securesms.conversationlist.model.Conversation; import org.thoughtcrime.securesms.conversationlist.model.ConversationFilter; import org.thoughtcrime.securesms.conversationlist.model.ConversationReader; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -77,9 +77,9 @@ abstract class ConversationListDataSource implements PagedDataSource new SpannableString(context.getString(R.string.ThreadRecord_s_is_on_signal, r.getDisplayName(context))))); - } else if (MmsSmsColumns.Types.isExpirationTimerUpdate(thread.getType())) { + } else if (MessageTypes.isExpirationTimerUpdate(thread.getType())) { int seconds = (int) (thread.getExpiresIn() / 1000); if (seconds <= 0) { return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_messages_disabled), R.drawable.ic_update_timer_disabled_16, defaultTint); } String time = ExpirationUtil.getExpirationDisplayValue(context, seconds); return emphasisAdded(context, context.getString(R.string.ThreadRecord_disappearing_message_time_updated_to_s, time), R.drawable.ic_update_timer_16, defaultTint); - } else if (MmsSmsColumns.Types.isIdentityUpdate(thread.getType())) { + } else if (MessageTypes.isIdentityUpdate(thread.getType())) { return emphasisAdded(recipientToStringAsync(thread.getRecipient().getId(), r -> { if (r.isGroup()) { return new SpannableString(context.getString(R.string.ThreadRecord_safety_number_changed)); @@ -560,17 +560,17 @@ public final class ConversationListItem extends ConstraintLayout implements Bind return new SpannableString(context.getString(R.string.ThreadRecord_your_safety_number_with_s_has_changed, r.getDisplayName(context))); } })); - } else if (MmsSmsColumns.Types.isIdentityVerified(thread.getType())) { + } else if (MessageTypes.isIdentityVerified(thread.getType())) { return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_verified), defaultTint); - } else if (MmsSmsColumns.Types.isIdentityDefault(thread.getType())) { + } else if (MessageTypes.isIdentityDefault(thread.getType())) { return emphasisAdded(context, context.getString(R.string.ThreadRecord_you_marked_unverified), defaultTint); - } else if (MmsSmsColumns.Types.isUnsupportedMessageType(thread.getType())) { + } else if (MessageTypes.isUnsupportedMessageType(thread.getType())) { return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_could_not_be_processed), defaultTint); - } else if (MmsSmsColumns.Types.isProfileChange(thread.getType())) { + } else if (MessageTypes.isProfileChange(thread.getType())) { return emphasisAdded(context, "", defaultTint); - } else if (MmsSmsColumns.Types.isChangeNumber(thread.getType()) || MmsSmsColumns.Types.isBoostRequest(thread.getType())) { + } else if (MessageTypes.isChangeNumber(thread.getType()) || MessageTypes.isBoostRequest(thread.getType())) { return emphasisAdded(context, "", defaultTint); - } else if (MmsSmsColumns.Types.isBadDecryptType(thread.getType())) { + } else if (MessageTypes.isBadDecryptType(thread.getType())) { return emphasisAdded(context, context.getString(R.string.ThreadRecord_delivery_issue), defaultTint); } else { ThreadTable.Extra extra = thread.getExtra(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt index 52048c165e..eb5262f87f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt @@ -157,11 +157,11 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl companion object Deserializer : Serializer { fun getMessageType(type: Type, direction: Direction, event: Event): Long { return if (direction == Direction.INCOMING && event == Event.MISSED) { - if (type == Type.VIDEO_CALL) MmsSmsColumns.Types.MISSED_VIDEO_CALL_TYPE else MmsSmsColumns.Types.MISSED_AUDIO_CALL_TYPE + if (type == Type.VIDEO_CALL) MessageTypes.MISSED_VIDEO_CALL_TYPE else MessageTypes.MISSED_AUDIO_CALL_TYPE } else if (direction == Direction.INCOMING) { - if (type == Type.VIDEO_CALL) MmsSmsColumns.Types.INCOMING_VIDEO_CALL_TYPE else MmsSmsColumns.Types.INCOMING_AUDIO_CALL_TYPE + if (type == Type.VIDEO_CALL) MessageTypes.INCOMING_VIDEO_CALL_TYPE else MessageTypes.INCOMING_AUDIO_CALL_TYPE } else { - if (type == Type.VIDEO_CALL) MmsSmsColumns.Types.OUTGOING_VIDEO_CALL_TYPE else MmsSmsColumns.Types.OUTGOING_AUDIO_CALL_TYPE + if (type == Type.VIDEO_CALL) MessageTypes.OUTGOING_VIDEO_CALL_TYPE else MessageTypes.OUTGOING_AUDIO_CALL_TYPE } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.java index c0227f37e1..c6a74220ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaTable.java @@ -59,7 +59,7 @@ public class MediaTable extends DatabaseTable { + " ON " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.MMS_ID + " = " + MessageTable.TABLE_NAME + "." + MessageTable.ID + " " + "LEFT JOIN " + ThreadTable.TABLE_NAME + " ON " + ThreadTable.TABLE_NAME + "." + ThreadTable.ID + " = " + MessageTable.TABLE_NAME + "." + MessageTable.THREAD_ID + " " - + "WHERE " + AttachmentTable.MMS_ID + " IN (SELECT " + MmsSmsColumns.ID + + "WHERE " + AttachmentTable.MMS_ID + " IN (SELECT " + MessageTable.ID + " FROM " + MessageTable.TABLE_NAME + " WHERE " + MessageTable.THREAD_ID + " __EQUALITY__ ?) AND (%s) AND " + MessageTable.VIEW_ONCE + " = 0 AND " @@ -194,11 +194,11 @@ public class MediaTable extends DatabaseTable { List attachments = attachmentDatabase.getAttachments(cursor); RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.RECIPIENT_ID))); long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.THREAD_ID)); - boolean outgoing = MessageTable.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.TYPE))); + boolean outgoing = MessageTypes.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.TYPE))); long date; - if (MessageTable.Types.isPushType(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.TYPE)))) { + if (MessageTypes.isPushType(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.TYPE)))) { date = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.DATE_SENT)); } else { date = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.DATE_RECEIVED)); 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 acffd6b227..ac8963330a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java @@ -117,34 +117,65 @@ import java.util.UUID; import static org.thoughtcrime.securesms.contactshare.Contact.Avatar; -public class MessageTable extends DatabaseTable implements MmsSmsColumns, RecipientIdDatabaseReference, ThreadIdDatabaseReference { +public class MessageTable extends DatabaseTable implements MessageTypes, RecipientIdDatabaseReference, ThreadIdDatabaseReference { private static final String TAG = Log.tag(MessageTable.class); - public static final String TABLE_NAME = "mms"; - static final String MMS_CONTENT_LOCATION = "ct_l"; - static final String MMS_EXPIRY = "exp"; - public static final String MMS_MESSAGE_TYPE = "m_type"; - static final String MMS_MESSAGE_SIZE = "m_size"; - static final String MMS_STATUS = "st"; - static final String MMS_TRANSACTION_ID = "tr_id"; - static final String NETWORK_FAILURES = "network_failures"; + public static final String TABLE_NAME = "mms"; + public static final String ID = "_id"; + public static final String DATE_SENT = "date_sent"; + public static final String DATE_RECEIVED = "date_received"; + public static final String TYPE = "type"; + public static final String DATE_SERVER = "date_server"; + public static final String THREAD_ID = "thread_id"; + public static final String READ = "read"; + public static final String BODY = "body"; + public static final String RECIPIENT_ID = "recipient_id"; + public static final String RECIPIENT_DEVICE_ID = "recipient_device_id"; + public static final String DELIVERY_RECEIPT_COUNT = "delivery_receipt_count"; + public static final String READ_RECEIPT_COUNT = "read_receipt_count"; + public static final String VIEWED_RECEIPT_COUNT = "viewed_receipt_count"; + public static final String MISMATCHED_IDENTITIES = "mismatched_identities"; + public static final String SMS_SUBSCRIPTION_ID = "subscription_id"; + public static final String EXPIRES_IN = "expires_in"; + public static final String EXPIRE_STARTED = "expire_started"; + public static final String NOTIFIED = "notified"; + public static final String NOTIFIED_TIMESTAMP = "notified_timestamp"; + public static final String UNIDENTIFIED = "unidentified"; + public static final String REACTIONS_UNREAD = "reactions_unread"; + public static final String REACTIONS_LAST_SEEN = "reactions_last_seen"; + public static final String REMOTE_DELETED = "remote_deleted"; + public static final String SERVER_GUID = "server_guid"; + public static final String RECEIPT_TIMESTAMP = "receipt_timestamp"; + public static final String EXPORT_STATE = "export_state"; + public static final String EXPORTED = "exported"; + public static final String MMS_CONTENT_LOCATION = "ct_l"; + public static final String MMS_EXPIRY = "exp"; + public static final String MMS_MESSAGE_TYPE = "m_type"; + public static final String MMS_MESSAGE_SIZE = "m_size"; + public static final String MMS_STATUS = "st"; + public static final String MMS_TRANSACTION_ID = "tr_id"; + public static final String NETWORK_FAILURES = "network_failures"; + public static final String QUOTE_ID = "quote_id"; + public static final String QUOTE_AUTHOR = "quote_author"; + public static final String QUOTE_BODY = "quote_body"; + public static final String QUOTE_MISSING = "quote_missing"; + public static final String QUOTE_MENTIONS = "quote_mentions"; + public static final String QUOTE_TYPE = "quote_type"; + public static final String SHARED_CONTACTS = "shared_contacts"; + public static final String LINK_PREVIEWS = "link_previews"; + public static final String MENTIONS_SELF = "mentions_self"; + public static final String MESSAGE_RANGES = "message_ranges"; + public static final String VIEW_ONCE = "view_once"; + public static final String STORY_TYPE = "story_type"; + public static final String PARENT_STORY_ID = "parent_story_id"; - static final String QUOTE_ID = "quote_id"; - static final String QUOTE_AUTHOR = "quote_author"; - static final String QUOTE_BODY = "quote_body"; - static final String QUOTE_MISSING = "quote_missing"; - static final String QUOTE_MENTIONS = "quote_mentions"; - static final String QUOTE_TYPE = "quote_type"; - - static final String SHARED_CONTACTS = "shared_contacts"; - static final String LINK_PREVIEWS = "link_previews"; - static final String MENTIONS_SELF = "mentions_self"; - static final String MESSAGE_RANGES = "message_ranges"; - - public static final String VIEW_ONCE = "view_once"; - public static final String STORY_TYPE = "story_type"; - static final String PARENT_STORY_ID = "parent_story_id"; + public static class Status { + public static final int STATUS_NONE = -1; + public static final int STATUS_COMPLETE = 0; + public static final int STATUS_PENDING = 0x20; + public static final int STATUS_FAILED = 0x40; + } public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DATE_SENT + " INTEGER NOT NULL, " + @@ -206,7 +237,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi "CREATE INDEX IF NOT EXISTS mms_thread_story_parent_story_index ON " + TABLE_NAME + " (" + THREAD_ID + ", " + DATE_RECEIVED + "," + STORY_TYPE + "," + PARENT_STORY_ID + ");", "CREATE INDEX IF NOT EXISTS mms_quote_id_quote_author_index ON " + TABLE_NAME + "(" + QUOTE_ID + ", " + QUOTE_AUTHOR + ");", "CREATE INDEX IF NOT EXISTS mms_exported_index ON " + TABLE_NAME + " (" + EXPORTED + ");", - "CREATE INDEX IF NOT EXISTS mms_id_type_payment_transactions_index ON " + TABLE_NAME + " (" + ID + "," + TYPE + ") WHERE " + TYPE + " & " + Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION + " != 0;" + "CREATE INDEX IF NOT EXISTS mms_id_type_payment_transactions_index ON " + TABLE_NAME + " (" + ID + "," + TYPE + ") WHERE " + TYPE + " & " + MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION + " != 0;" }; private static final String[] MMS_PROJECTION_BASE = new String[] { @@ -259,7 +290,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi private static final String[] MMS_PROJECTION = SqlUtil.appendArg(MMS_PROJECTION_BASE, "NULL AS " + AttachmentTable.ATTACHMENT_JSON_ALIAS); private static final String[] MMS_PROJECTION_WITH_ATTACHMENTS = SqlUtil.appendArg(MMS_PROJECTION_BASE, "json_group_array(json_object(" + - "'" + AttachmentTable.ROW_ID + "', " + AttachmentTable.TABLE_NAME + "." + AttachmentTable.ROW_ID + ", " + + "'" + 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 + ", " + @@ -305,7 +336,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi String[] columns = new String[]{RECIPIENT_ID}; String query = THREAD_ID + " = ? AND " + TYPE + " & ? AND " + DATE_RECEIVED + " >= ?"; - long type = Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT | Types.GROUP_UPDATE_BIT | Types.BASE_INBOX_TYPE; + long type = MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT | MessageTypes.GROUP_UPDATE_BIT | MessageTypes.BASE_INBOX_TYPE; String[] args = new String[]{String.valueOf(threadId), String.valueOf(type), String.valueOf(minimumDateReceived)}; String limit = "1"; @@ -329,14 +360,14 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - String[] projection = SqlUtil.buildArgs(MmsSmsColumns.TYPE); + String[] projection = SqlUtil.buildArgs(TYPE); String selection = THREAD_ID + " = ? AND " + DATE_RECEIVED + " > ? AND (" + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " = ? OR " + TYPE + " =?)"; String[] selectionArgs = SqlUtil.buildArgs(threadId, timestamp, - Types.INCOMING_AUDIO_CALL_TYPE, - Types.INCOMING_VIDEO_CALL_TYPE, - Types.MISSED_AUDIO_CALL_TYPE, - Types.MISSED_VIDEO_CALL_TYPE); + MessageTypes.INCOMING_AUDIO_CALL_TYPE, + MessageTypes.INCOMING_VIDEO_CALL_TYPE, + MessageTypes.MISSED_AUDIO_CALL_TYPE, + MessageTypes.MISSED_VIDEO_CALL_TYPE); try (Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, null)) { return cursor != null && cursor.moveToFirst(); @@ -344,43 +375,43 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public void markAsEndSession(long id) { - updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.END_SESSION_BIT); + updateTypeBitmask(id, MessageTypes.KEY_EXCHANGE_MASK, MessageTypes.END_SESSION_BIT); } public void markAsInvalidVersionKeyExchange(long id) { - updateTypeBitmask(id, 0, Types.KEY_EXCHANGE_INVALID_VERSION_BIT); + updateTypeBitmask(id, 0, MessageTypes.KEY_EXCHANGE_INVALID_VERSION_BIT); } public void markAsSecure(long id) { - updateTypeBitmask(id, 0, Types.SECURE_MESSAGE_BIT); + updateTypeBitmask(id, 0, MessageTypes.SECURE_MESSAGE_BIT); } public void markAsPush(long id) { - updateTypeBitmask(id, 0, Types.PUSH_MESSAGE_BIT); + updateTypeBitmask(id, 0, MessageTypes.PUSH_MESSAGE_BIT); } public void markAsDecryptFailed(long id) { - updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT); + updateTypeBitmask(id, MessageTypes.ENCRYPTION_MASK, MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT); } public void markAsNoSession(long id) { - updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT); + updateTypeBitmask(id, MessageTypes.ENCRYPTION_MASK, MessageTypes.ENCRYPTION_REMOTE_NO_SESSION_BIT); } public void markAsUnsupportedProtocolVersion(long id) { - updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.UNSUPPORTED_MESSAGE_TYPE); + updateTypeBitmask(id, MessageTypes.BASE_TYPE_MASK, MessageTypes.UNSUPPORTED_MESSAGE_TYPE); } public void markAsInvalidMessage(long id) { - updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.INVALID_MESSAGE_TYPE); + updateTypeBitmask(id, MessageTypes.BASE_TYPE_MASK, MessageTypes.INVALID_MESSAGE_TYPE); } public void markAsLegacyVersion(long id) { - updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT); + updateTypeBitmask(id, MessageTypes.ENCRYPTION_MASK, MessageTypes.ENCRYPTION_REMOTE_LEGACY_BIT); } public void markAsMissedCall(long id, boolean isVideoOffer) { - updateTypeBitmask(id, Types.TOTAL_MASK, isVideoOffer ? Types.MISSED_VIDEO_CALL_TYPE : Types.MISSED_AUDIO_CALL_TYPE); + updateTypeBitmask(id, MessageTypes.TOTAL_MASK, isVideoOffer ? MessageTypes.MISSED_VIDEO_CALL_TYPE : MessageTypes.MISSED_AUDIO_CALL_TYPE); } public void markSmsStatus(long id, int status) { @@ -404,7 +435,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi db.beginTransaction(); try { db.execSQL("UPDATE " + TABLE_NAME + - " SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + + " SET " + TYPE + " = (" + TYPE + " & " + (MessageTypes.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + " WHERE " + ID + " = ?", SqlUtil.buildArgs(id)); threadId = getThreadIdForMessage(id); @@ -423,7 +454,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi private InsertResult updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " + - TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + ") " + + TYPE + " = (" + TYPE + " & " + (MessageTypes.TOTAL_MASK - maskOff) + " | " + maskOn + ") " + "WHERE " + ID + " = ?", new String[] {body, messageId + ""}); @@ -436,14 +467,14 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public InsertResult 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); + long type = MessageTypes.BASE_INBOX_TYPE | MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT; + return updateMessageBodyAndType(messageId, body, MessageTypes.TOTAL_MASK, type); } public @NonNull List getViewedIncomingMessages(long threadId) { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{ ID, RECIPIENT_ID, DATE_SENT, TYPE, THREAD_ID, STORY_TYPE}; - String where = THREAD_ID + " = ? AND " + VIEWED_RECEIPT_COUNT + " > 0 AND " + TYPE + " & " + Types.BASE_INBOX_TYPE + " = " + Types.BASE_INBOX_TYPE; + String where = THREAD_ID + " = ? AND " + VIEWED_RECEIPT_COUNT + " > 0 AND " + TYPE + " & " + MessageTypes.BASE_INBOX_TYPE + " = " + MessageTypes.BASE_INBOX_TYPE; String[] args = SqlUtil.buildArgs(threadId); @@ -491,7 +522,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi try (Cursor cursor = database.query(TABLE_NAME, columns, where, null, null, null, null)) { while (cursor != null && cursor.moveToNext()) { long type = CursorUtil.requireLong(cursor, TYPE); - if (Types.isSecureType(type) && Types.isInboxType(type)) { + if (MessageTypes.isSecureType(type) && MessageTypes.isInboxType(type)) { long messageId = CursorUtil.requireLong(cursor, ID); long threadId = CursorUtil.requireLong(cursor, THREAD_ID); RecipientId recipientId = RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)); @@ -524,7 +555,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public @NonNull List setOutgoingGiftsRevealed(@NonNull List messageIds) { String[] projection = SqlUtil.buildArgs(ID, RECIPIENT_ID, DATE_SENT, THREAD_ID, STORY_TYPE); - String where = ID + " IN (" + Util.join(messageIds, ",") + ") AND (" + getOutgoingTypeClause() + ") AND (" + TYPE + " & " + Types.SPECIAL_TYPES_MASK + " = " + Types.SPECIAL_TYPE_GIFT_BADGE + ") AND " + VIEWED_RECEIPT_COUNT + " = 0"; + String where = ID + " IN (" + Util.join(messageIds, ",") + ") AND (" + getOutgoingTypeClause() + ") AND (" + TYPE + " & " + MessageTypes.SPECIAL_TYPES_MASK + " = " + MessageTypes.SPECIAL_TYPE_GIFT_BADGE + ") AND " + VIEWED_RECEIPT_COUNT + " = 0"; List results = new LinkedList<>(); getWritableDatabase().beginTransaction(); @@ -560,7 +591,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public @NonNull InsertResult insertCallLog(@NonNull RecipientId recipientId, long type, long timestamp) { - boolean unread = Types.isMissedAudioCall(type) || Types.isMissedVideoCall(type); + boolean unread = MessageTypes.isMissedAudioCall(type) || MessageTypes.isMissedVideoCall(type); Recipient recipient = Recipient.resolved(recipientId); long threadId = SignalDatabase.threads().getOrCreateThreadIdFor(recipient); @@ -589,7 +620,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public void updateCallLog(long messageId, long type) { - boolean unread = Types.isMissedAudioCall(type) || Types.isMissedVideoCall(type); + boolean unread = MessageTypes.isMissedAudioCall(type) || MessageTypes.isMissedVideoCall(type); ContentValues values = new ContentValues(2); values.put(TYPE, type); values.put(READ, unread ? 0 : 1); @@ -646,7 +677,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_SENT, timestamp); values.put(READ, markRead ? 1 : 0); values.put(BODY, body); - values.put(TYPE, Types.GROUP_CALL_TYPE); + values.put(TYPE, MessageTypes.GROUP_CALL_TYPE); values.put(THREAD_ID, threadId); db.insert(TABLE_NAME, null, values); @@ -682,7 +713,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi threadId = SignalDatabase.threads().getOrCreateThreadIdFor(recipient); String where = TYPE + " = ? AND " + THREAD_ID + " = ?"; - String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId); + String[] args = SqlUtil.buildArgs(MessageTypes.GROUP_CALL_TYPE, threadId); boolean sameEraId = false; try (MmsReader reader = new MmsReader(db.query(TABLE_NAME, MMS_PROJECTION, where, args, null, null, DATE_RECEIVED + " DESC", "1"))) { @@ -722,7 +753,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_SENT, timestamp); values.put(READ, 0); values.put(BODY, body); - values.put(TYPE, Types.GROUP_CALL_TYPE); + values.put(TYPE, MessageTypes.GROUP_CALL_TYPE); values.put(THREAD_ID, threadId); db.insert(TABLE_NAME, null, values); @@ -745,7 +776,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public boolean updatePreviousGroupCall(long threadId, @Nullable String peekGroupCallEraId, @NonNull Collection peekJoinedUuids, boolean isCallFull) { SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); String where = TYPE + " = ? AND " + THREAD_ID + " = ?"; - String[] args = SqlUtil.buildArgs(Types.GROUP_CALL_TYPE, threadId); + String[] args = SqlUtil.buildArgs(MessageTypes.GROUP_CALL_TYPE, threadId); boolean sameEraId = false; try (MmsReader reader = new MmsReader(db.query(TABLE_NAME, MMS_PROJECTION, where, args, null, null, DATE_RECEIVED + " DESC", "1"))) { @@ -786,40 +817,40 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi boolean tryToCollapseJoinRequestEvents = false; if (message.isJoined()) { - type = (type & (Types.TOTAL_MASK - Types.BASE_TYPE_MASK)) | Types.JOINED_TYPE; + type = (type & (MessageTypes.TOTAL_MASK - MessageTypes.BASE_TYPE_MASK)) | MessageTypes.JOINED_TYPE; } else if (message.isPreKeyBundle()) { - type |= Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT; + type |= MessageTypes.KEY_EXCHANGE_BIT | MessageTypes.KEY_EXCHANGE_BUNDLE_BIT; } else if (message.isSecureMessage()) { - type |= Types.SECURE_MESSAGE_BIT; + type |= MessageTypes.SECURE_MESSAGE_BIT; } else if (message.isGroup()) { IncomingGroupUpdateMessage incomingGroupUpdateMessage = (IncomingGroupUpdateMessage) message; - type |= Types.SECURE_MESSAGE_BIT; + type |= MessageTypes.SECURE_MESSAGE_BIT; if (incomingGroupUpdateMessage.isGroupV2()) { - type |= Types.GROUP_V2_BIT | Types.GROUP_UPDATE_BIT; + type |= MessageTypes.GROUP_V2_BIT | MessageTypes.GROUP_UPDATE_BIT; if (incomingGroupUpdateMessage.isJustAGroupLeave()) { - type |= Types.GROUP_LEAVE_BIT; + type |= MessageTypes.GROUP_LEAVE_BIT; } else if (incomingGroupUpdateMessage.isCancelJoinRequest()) { tryToCollapseJoinRequestEvents = true; } } else if (incomingGroupUpdateMessage.isUpdate()) { - type |= Types.GROUP_UPDATE_BIT; + type |= MessageTypes.GROUP_UPDATE_BIT; } else if (incomingGroupUpdateMessage.isQuit()) { - type |= Types.GROUP_LEAVE_BIT; + type |= MessageTypes.GROUP_LEAVE_BIT; } } else if (message.isEndSession()) { - type |= Types.SECURE_MESSAGE_BIT; - type |= Types.END_SESSION_BIT; + type |= MessageTypes.SECURE_MESSAGE_BIT; + type |= MessageTypes.END_SESSION_BIT; } - if (message.isPush()) type |= Types.PUSH_MESSAGE_BIT; - if (message.isIdentityUpdate()) type |= Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT; - if (message.isContentPreKeyBundle()) type |= Types.KEY_EXCHANGE_CONTENT_FORMAT; + if (message.isPush()) type |= MessageTypes.PUSH_MESSAGE_BIT; + if (message.isIdentityUpdate()) type |= MessageTypes.KEY_EXCHANGE_IDENTITY_UPDATE_BIT; + if (message.isContentPreKeyBundle()) type |= MessageTypes.KEY_EXCHANGE_CONTENT_FORMAT; - if (message.isIdentityVerified()) type |= Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; - else if (message.isIdentityDefault()) type |= Types.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT; + if (message.isIdentityVerified()) type |= MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; + else if (message.isIdentityDefault()) type |= MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT; Recipient recipient = Recipient.resolved(message.getSender()); @@ -836,7 +867,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi message.isIdentityVerified() || message.isIdentityDefault() || message.isJustAGroupLeave() || - (type & Types.GROUP_UPDATE_BIT) > 0; + (type & MessageTypes.GROUP_UPDATE_BIT) > 0; boolean unread = !silent && (Util.isDefaultSmsProvider(context) || message.isSecureMessage() || @@ -901,7 +932,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public Optional insertMessageInbox(IncomingTextMessage message) { - return insertMessageInbox(message, Types.BASE_INBOX_TYPE); + return insertMessageInbox(message, MessageTypes.BASE_INBOX_TYPE); } public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) { @@ -938,7 +969,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.PROFILE_CHANGE_TYPE); + values.put(TYPE, MessageTypes.PROFILE_CHANGE_TYPE); values.put(THREAD_ID, threadId); values.put(BODY, body); @@ -985,7 +1016,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.GV1_MIGRATION_TYPE); + values.put(TYPE, MessageTypes.GV1_MIGRATION_TYPE); values.put(THREAD_ID, threadId); if (!membershipChange.isEmpty()) { @@ -1020,7 +1051,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.CHANGE_NUMBER_TYPE); + values.put(TYPE, MessageTypes.CHANGE_NUMBER_TYPE); values.put(THREAD_ID, threadId); values.putNull(BODY); @@ -1048,7 +1079,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.BOOST_REQUEST_TYPE); + values.put(TYPE, MessageTypes.BOOST_REQUEST_TYPE); values.put(THREAD_ID, threadId); values.putNull(BODY); @@ -1062,7 +1093,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.THREAD_MERGE_TYPE); + values.put(TYPE, MessageTypes.THREAD_MERGE_TYPE); values.put(THREAD_ID, threadId); values.put(BODY, Base64.encodeBytes(event.toByteArray())); @@ -1078,7 +1109,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, 1); - values.put(TYPE, Types.SMS_EXPORT_TYPE); + values.put(TYPE, MessageTypes.SMS_EXPORT_TYPE); values.put(THREAD_ID, threadId); values.putNull(BODY); @@ -1518,8 +1549,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{ID}; - long type = Types.getOutgoingEncryptedMessageType() | Types.GROUP_LEAVE_BIT; - String query = ID + " = ? AND " + TYPE + " & " + type + " = " + type + " AND " + TYPE + " & " + Types.GROUP_V2_BIT + " = 0"; + long type = MessageTypes.getOutgoingEncryptedMessageType() | MessageTypes.GROUP_LEAVE_BIT; + String query = ID + " = ? AND " + TYPE + " & " + type + " = " + type + " AND " + TYPE + " & " + MessageTypes.GROUP_V2_BIT + " = 0"; String[] args = SqlUtil.buildArgs(messageId); try (Cursor cursor = db.query(TABLE_NAME, columns, query, args, null, null, null, null)) { @@ -1535,8 +1566,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] columns = new String[]{DATE_SENT}; - long type = Types.getOutgoingEncryptedMessageType() | Types.GROUP_LEAVE_BIT; - String query = THREAD_ID + " = ? AND " + TYPE + " & " + type + " = " + type + " AND " + TYPE + " & " + Types.GROUP_V2_BIT + " = 0 AND " + DATE_SENT + " < ?"; + long type = MessageTypes.getOutgoingEncryptedMessageType() | MessageTypes.GROUP_LEAVE_BIT; + String query = THREAD_ID + " = ? AND " + TYPE + " & " + type + " = " + type + " AND " + TYPE + " & " + MessageTypes.GROUP_V2_BIT + " = 0 AND " + DATE_SENT + " < ?"; String[] args = new String[]{String.valueOf(threadId), String.valueOf(quitTimeBarrier)}; String orderBy = DATE_SENT + " DESC"; String limit = "1"; @@ -1606,8 +1637,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } private @NonNull SqlUtil.Query buildMeaningfulMessagesQuery(long threadId) { - String query = THREAD_ID + " = ? AND " + STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ? AND (NOT " + TYPE + " & ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " & " + MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS + " != " + MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS + ")"; - return SqlUtil.buildQuery(query, threadId, 0, 0, MmsSmsColumns.Types.IGNORABLE_TYPESMASK_WHEN_COUNTING, Types.PROFILE_CHANGE_TYPE, Types.CHANGE_NUMBER_TYPE, Types.SMS_EXPORT_TYPE, Types.BOOST_REQUEST_TYPE); + String query = THREAD_ID + " = ? AND " + STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ? AND (NOT " + TYPE + " & ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " & " + MessageTypes.GROUP_V2_LEAVE_BITS + " != " + MessageTypes.GROUP_V2_LEAVE_BITS + ")"; + return SqlUtil.buildQuery(query, threadId, 0, 0, MessageTypes.IGNORABLE_TYPESMASK_WHEN_COUNTING, MessageTypes.PROFILE_CHANGE_TYPE, MessageTypes.CHANGE_NUMBER_TYPE, MessageTypes.SMS_EXPORT_TYPE, MessageTypes.BOOST_REQUEST_TYPE); } public void addFailures(long messageId, List failure) { @@ -1651,7 +1682,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi .run()) { while (cursor.moveToNext()) { - if (Types.isOutgoingMessageType(CursorUtil.requireLong(cursor, TYPE))) { + if (MessageTypes.isOutgoingMessageType(CursorUtil.requireLong(cursor, TYPE))) { RecipientId theirRecipientId = RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)); RecipientId ourRecipientId = messageId.getRecipientId(); String columnName = receiptType.getColumnName(); @@ -1807,7 +1838,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi db.beginTransaction(); try { db.execSQL("UPDATE " + TABLE_NAME + - " SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + + " SET " + TYPE + " = (" + TYPE + " & " + (MessageTypes.TOTAL_MASK - maskOff) + " | " + maskOn + " )" + " WHERE " + ID + " = ?", new String[] { id + "" }); if (threadId.isPresent()) { @@ -1821,18 +1852,18 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public void markAsOutbox(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_OUTBOX_TYPE, Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_OUTBOX_TYPE, Optional.of(threadId)); } public void markAsForcedSms(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.PUSH_MESSAGE_BIT, Types.MESSAGE_FORCE_SMS_BIT, Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.PUSH_MESSAGE_BIT, MessageTypes.MESSAGE_FORCE_SMS_BIT, Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); } public void markAsRateLimited(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, 0, Types.MESSAGE_RATE_LIMITED_BIT, Optional.of(threadId)); + updateMailboxBitmask(messageId, 0, MessageTypes.MESSAGE_RATE_LIMITED_BIT, Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); } @@ -1843,7 +1874,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi try { for (long id : ids) { long threadId = getThreadIdForMessage(id); - updateMailboxBitmask(id, Types.MESSAGE_RATE_LIMITED_BIT, 0, Optional.of(threadId)); + updateMailboxBitmask(id, MessageTypes.MESSAGE_RATE_LIMITED_BIT, 0, Optional.of(threadId)); } db.setTransactionSuccessful(); @@ -1854,27 +1885,27 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public void markAsPendingInsecureSmsFallback(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_PENDING_INSECURE_SMS_FALLBACK, Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_PENDING_INSECURE_SMS_FALLBACK, Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); } public void markAsSending(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE, Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENDING_TYPE, Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners(); } public void markAsSentFailed(long messageId) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE, Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENT_FAILED_TYPE, Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners(); } public void markAsSent(long messageId, boolean secure) { long threadId = getThreadIdForMessage(messageId); - updateMailboxBitmask(messageId, Types.BASE_TYPE_MASK, Types.BASE_SENT_TYPE | (secure ? Types.PUSH_MESSAGE_BIT | Types.SECURE_MESSAGE_BIT : 0), Optional.of(threadId)); + updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENT_TYPE | (secure ? MessageTypes.PUSH_MESSAGE_BIT | MessageTypes.SECURE_MESSAGE_BIT : 0), Optional.of(threadId)); ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId)); ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners(); } @@ -1932,7 +1963,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public void markAsInsecure(long messageId) { - updateMailboxBitmask(messageId, Types.SECURE_MESSAGE_BIT, 0, Optional.empty()); + updateMailboxBitmask(messageId, MessageTypes.SECURE_MESSAGE_BIT, 0, Optional.empty()); } public void markUnidentified(long messageId, boolean unidentified) { @@ -2055,7 +2086,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi cursor = database.query(TABLE_NAME, new String[] { ID, RECIPIENT_ID, DATE_SENT, TYPE, EXPIRES_IN, EXPIRE_STARTED, THREAD_ID, STORY_TYPE }, where, arguments, null, null, null); while(cursor != null && cursor.moveToNext()) { - if (Types.isSecureType(CursorUtil.requireLong(cursor, TYPE))) { + if (MessageTypes.isSecureType(CursorUtil.requireLong(cursor, TYPE))) { long threadId = CursorUtil.requireLong(cursor, THREAD_ID); RecipientId recipientId = RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)); long dateSent = CursorUtil.requireLong(cursor, DATE_SENT); @@ -2235,20 +2266,20 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } } - if (body != null && (Types.isGroupQuit(outboxType) || Types.isGroupUpdate(outboxType))) { - return OutgoingMessage.groupUpdateMessage(recipient, new MessageGroupContext(body, Types.isGroupV2(outboxType)), attachments, timestamp, 0, false, quote, contacts, previews, mentions); - } else if (Types.isExpirationTimerUpdate(outboxType)) { + if (body != null && (MessageTypes.isGroupQuit(outboxType) || MessageTypes.isGroupUpdate(outboxType))) { + return OutgoingMessage.groupUpdateMessage(recipient, new MessageGroupContext(body, MessageTypes.isGroupV2(outboxType)), attachments, timestamp, 0, false, quote, contacts, previews, mentions); + } else if (MessageTypes.isExpirationTimerUpdate(outboxType)) { return OutgoingMessage.expirationUpdateMessage(recipient, timestamp, expiresIn); - } else if (Types.isPaymentsNotification(outboxType)) { + } else if (MessageTypes.isPaymentsNotification(outboxType)) { return OutgoingMessage.paymentNotificationMessage(recipient, Objects.requireNonNull(body), timestamp, expiresIn); - } else if (Types.isPaymentsRequestToActivate(outboxType)) { + } else if (MessageTypes.isPaymentsRequestToActivate(outboxType)) { return OutgoingMessage.requestToActivatePaymentsMessage(recipient, timestamp, expiresIn); - } else if (Types.isPaymentsActivated(outboxType)) { + } else if (MessageTypes.isPaymentsActivated(outboxType)) { return OutgoingMessage.paymentsActivatedMessage(recipient, timestamp, expiresIn); } GiftBadge giftBadge = null; - if (body != null && Types.isGiftBadge(outboxType)) { + if (body != null && MessageTypes.isGiftBadge(outboxType)) { giftBadge = GiftBadge.parseFrom(Base64.decode(body)); } @@ -2262,7 +2293,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi distributionType, storyType, parentStoryId, - Types.isStoryReaction(outboxType), + MessageTypes.isStoryReaction(outboxType), quote, contacts, previews, @@ -2270,7 +2301,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi networkFailures, mismatches, giftBadge, - Types.isSecureType(outboxType)); + MessageTypes.isSecureType(outboxType)); return message; } @@ -2373,7 +2404,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi ContentValues contentValues = new ContentValues(); - boolean silentUpdate = (mailbox & Types.GROUP_UPDATE_BIT) > 0; + boolean silentUpdate = (mailbox & MessageTypes.GROUP_UPDATE_BIT) > 0; contentValues.put(DATE_SENT, retrieved.getSentTimeMillis()); contentValues.put(DATE_SERVER, retrieved.getServerTimeMillis()); @@ -2436,7 +2467,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi !keepThreadArchived); boolean isNotStoryGroupReply = retrieved.getParentStoryId() == null || !retrieved.getParentStoryId().isGroupReply(); - if (!Types.isPaymentsActivated(mailbox) && !Types.isPaymentsRequestToActivate(mailbox) && !Types.isExpirationTimerUpdate(mailbox) && !retrieved.getStoryType().isStory() && isNotStoryGroupReply) { + if (!MessageTypes.isPaymentsActivated(mailbox) && !MessageTypes.isPaymentsRequestToActivate(mailbox) && !MessageTypes.isExpirationTimerUpdate(mailbox) && !retrieved.getStoryType().isStory() && isNotStoryGroupReply) { boolean incrementUnreadMentions = !retrieved.getMentions().isEmpty() && retrieved.getMentions().stream().anyMatch(m -> m.getRecipientId().equals(Recipient.self().getId())); SignalDatabase.threads().incrementUnread(threadId, 1, incrementUnreadMentions ? 1 : 0); SignalDatabase.threads().update(threadId, !keepThreadArchived); @@ -2451,26 +2482,26 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi String contentLocation, long threadId) throws MmsException { - long type = Types.BASE_INBOX_TYPE; + long type = MessageTypes.BASE_INBOX_TYPE; if (retrieved.isPushMessage()) { - type |= Types.PUSH_MESSAGE_BIT; + type |= MessageTypes.PUSH_MESSAGE_BIT; } if (retrieved.isExpirationUpdate()) { - type |= Types.EXPIRATION_TIMER_UPDATE_BIT; + type |= MessageTypes.EXPIRATION_TIMER_UPDATE_BIT; } if (retrieved.isPaymentsNotification()) { - type |= Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; } if (retrieved.isActivatePaymentsRequest()) { - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; } if (retrieved.isPaymentsActivated()) { - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATED; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED; } return insertMessageInbox(retrieved, contentLocation, threadId, type); @@ -2479,20 +2510,20 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public Optional insertSecureDecryptedMessageInbox(IncomingMediaMessage retrieved, long threadId) throws MmsException { - long type = Types.BASE_INBOX_TYPE | Types.SECURE_MESSAGE_BIT; + long type = MessageTypes.BASE_INBOX_TYPE | MessageTypes.SECURE_MESSAGE_BIT; if (retrieved.isPushMessage()) { - type |= Types.PUSH_MESSAGE_BIT; + type |= MessageTypes.PUSH_MESSAGE_BIT; } if (retrieved.isExpirationUpdate()) { - type |= Types.EXPIRATION_TIMER_UPDATE_BIT; + type |= MessageTypes.EXPIRATION_TIMER_UPDATE_BIT; } boolean hasSpecialType = false; if (retrieved.isStoryReaction()) { hasSpecialType = true; - type |= Types.SPECIAL_TYPE_STORY_REACTION; + type |= MessageTypes.SPECIAL_TYPE_STORY_REACTION; } if (retrieved.getGiftBadge() != null) { @@ -2500,28 +2531,28 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_GIFT_BADGE; + type |= MessageTypes.SPECIAL_TYPE_GIFT_BADGE; } if (retrieved.isPaymentsNotification()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; } if (retrieved.isActivatePaymentsRequest()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; } if (retrieved.isPaymentsActivated()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATED; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED; } return insertMessageInbox(retrieved, "", threadId, type); @@ -2549,7 +2580,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi contentValues.put(RECIPIENT_ID, RecipientId.UNKNOWN.serialize()); } - contentValues.put(TYPE, Types.BASE_INBOX_TYPE); + contentValues.put(TYPE, MessageTypes.BASE_INBOX_TYPE); contentValues.put(THREAD_ID, threadId); contentValues.put(MMS_STATUS, MmsStatus.DOWNLOAD_INITIALIZED); contentValues.put(DATE_RECEIVED, generatePduCompatTimestamp(System.currentTimeMillis())); @@ -2567,9 +2598,9 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public @NonNull InsertResult insertChatSessionRefreshedMessage(@NonNull RecipientId recipientId, long senderDeviceId, long sentTimestamp) { SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); long threadId = SignalDatabase.threads().getOrCreateThreadIdFor(Recipient.resolved(recipientId)); - long type = Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT; + long type = MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT; - type = type & (Types.TOTAL_MASK - Types.ENCRYPTION_MASK) | Types.ENCRYPTION_REMOTE_FAILED_BIT; + type = type & (MessageTypes.TOTAL_MASK - MessageTypes.ENCRYPTION_MASK) | MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT; ContentValues values = new ContentValues(); values.put(RECIPIENT_ID, recipientId.serialize()); @@ -2602,7 +2633,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi values.put(DATE_RECEIVED, receivedTimestamp); values.put(DATE_SERVER, -1); values.put(READ, 0); - values.put(TYPE, Types.BAD_DECRYPT_TYPE); + values.put(TYPE, MessageTypes.BAD_DECRYPT_TYPE); values.put(THREAD_ID, threadId); databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values); @@ -2642,7 +2673,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi private void markGiftRedemptionState(long messageId, @NonNull GiftBadge.RedemptionState redemptionState) { String[] projection = SqlUtil.buildArgs(BODY, THREAD_ID); - String where = "(" + TYPE + " & " + Types.SPECIAL_TYPES_MASK + " = " + Types.SPECIAL_TYPE_GIFT_BADGE + ") AND " + + String where = "(" + TYPE + " & " + MessageTypes.SPECIAL_TYPES_MASK + " = " + MessageTypes.SPECIAL_TYPE_GIFT_BADGE + ") AND " + ID + " = ?"; String[] args = SqlUtil.buildArgs(messageId); boolean updated = false; @@ -2688,40 +2719,38 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi @Nullable InsertListener insertListener) throws MmsException { - SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); + long type = MessageTypes.BASE_SENDING_TYPE; - long type = Types.BASE_SENDING_TYPE; + if (message.isSecure()) type |= (MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT); + if (forceSms) type |= MessageTypes.MESSAGE_FORCE_SMS_BIT; - if (message.isSecure()) type |= (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT); - if (forceSms) type |= Types.MESSAGE_FORCE_SMS_BIT; + if (message.isSecure()) type |= (MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT); + else if (message.isEndSession()) type |= MessageTypes.END_SESSION_BIT; - if (message.isSecure()) type |= (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT); - else if (message.isEndSession()) type |= Types.END_SESSION_BIT; - - if (message.isIdentityVerified()) type |= Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; - else if (message.isIdentityDefault()) type |= Types.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT; + if (message.isIdentityVerified()) type |= MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; + else if (message.isIdentityDefault()) type |= MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT; if (message.isGroup()) { if (message.isV2Group()) { - type |= Types.GROUP_V2_BIT | Types.GROUP_UPDATE_BIT; + type |= MessageTypes.GROUP_V2_BIT | MessageTypes.GROUP_UPDATE_BIT; if (message.isJustAGroupLeave()) { - type |= Types.GROUP_LEAVE_BIT; + type |= MessageTypes.GROUP_LEAVE_BIT; } } else { MessageGroupContext.GroupV1Properties properties = message.requireGroupV1Properties(); - if (properties.isUpdate()) type |= Types.GROUP_UPDATE_BIT; - else if (properties.isQuit()) type |= Types.GROUP_LEAVE_BIT; + if (properties.isUpdate()) type |= MessageTypes.GROUP_UPDATE_BIT; + else if (properties.isQuit()) type |= MessageTypes.GROUP_LEAVE_BIT; } } if (message.isExpirationUpdate()) { - type |= Types.EXPIRATION_TIMER_UPDATE_BIT; + type |= MessageTypes.EXPIRATION_TIMER_UPDATE_BIT; } boolean hasSpecialType = false; if (message.isStoryReaction()) { hasSpecialType = true; - type |= Types.SPECIAL_TYPE_STORY_REACTION; + type |= MessageTypes.SPECIAL_TYPE_STORY_REACTION; } if (message.getGiftBadge() != null) { @@ -2729,28 +2758,28 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_GIFT_BADGE; + type |= MessageTypes.SPECIAL_TYPE_GIFT_BADGE; } if (message.isPaymentsNotification()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION; } if (message.isRequestToActivatePayments()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; } if (message.isPaymentsActivated()) { if (hasSpecialType) { throw new MmsException("Cannot insert message with multiple special types."); } - type |= Types.SPECIAL_TYPE_PAYMENTS_ACTIVATED; + type |= MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED; } Map earlyDeliveryReceipts = earlyDeliveryReceiptCache.remove(message.getSentTimeMillis()); @@ -3052,7 +3081,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi try (Cursor cursor = database.query(TABLE_NAME, new String[] { TYPE }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) { if (cursor != null && cursor.moveToNext()) { long type = cursor.getLong(cursor.getColumnIndexOrThrow(TYPE)); - return Types.isSentType(type); + return MessageTypes.isSentType(type); } } return false; @@ -3060,7 +3089,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public List getProfileChangeDetailsRecords(long threadId, long afterTimestamp) { String where = THREAD_ID + " = ? AND " + DATE_RECEIVED + " >= ? AND " + TYPE + " = ?"; - String[] args = SqlUtil.buildArgs(threadId, afterTimestamp, Types.PROFILE_CHANGE_TYPE); + String[] args = SqlUtil.buildArgs(threadId, afterTimestamp, MessageTypes.PROFILE_CHANGE_TYPE); try (MmsReader reader = mmsReaderFor(queryMessages(where, args, true, -1))) { List results = new ArrayList<>(reader.getCount()); @@ -3091,7 +3120,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public Set getAllRateLimitedMessageIds() { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - String where = "(" + TYPE + " & " + Types.TOTAL_MASK + " & " + Types.MESSAGE_RATE_LIMITED_BIT + ") > 0"; + String where = "(" + TYPE + " & " + MessageTypes.TOTAL_MASK + " & " + MessageTypes.MESSAGE_RATE_LIMITED_BIT + ") > 0"; Set ids = new HashSet<>(); @@ -3202,7 +3231,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } public List getMessagesInThreadAfterInclusive(long threadId, long timestamp, long limit) { - String where = TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? AND " + + String where = TABLE_NAME + "." + THREAD_ID + " = ? AND " + TABLE_NAME + "." + DATE_RECEIVED + " >= ?"; String[] args = SqlUtil.buildArgs(threadId, timestamp); @@ -3268,7 +3297,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi try (Cursor cursor = SQLiteDatabaseExtensionsKt .select(getReadableDatabase(), "COUNT(*)") .from(TABLE_NAME) - .where(RECIPIENT_ID + " = ? AND " + TYPE + " = ?", recipientId, MmsSmsColumns.Types.CHANGE_NUMBER_TYPE) + .where(RECIPIENT_ID + " = ? AND " + TYPE + " = ?", recipientId, MessageTypes.CHANGE_NUMBER_TYPE) .run()) { if (cursor.moveToFirst()) { @@ -3348,9 +3377,9 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } final @NonNull String getOutgoingTypeClause() { - List segments = new ArrayList<>(Types.OUTGOING_MESSAGE_TYPES.length); - for (long outgoingMessageType : Types.OUTGOING_MESSAGE_TYPES) { - segments.add("(" + TABLE_NAME + "." + TYPE + " & " + Types.BASE_TYPE_MASK + " = " + outgoingMessageType + ")"); + List segments = new ArrayList<>(MessageTypes.OUTGOING_MESSAGE_TYPES.length); + for (long outgoingMessageType : MessageTypes.OUTGOING_MESSAGE_TYPES) { + segments.add("(" + TABLE_NAME + "." + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + " = " + outgoingMessageType + ")"); } return Util.join(segments, " OR "); @@ -3387,7 +3416,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public boolean hasSmsExportMessage(long threadId) { return SQLiteDatabaseExtensionsKt.exists(getReadableDatabase(), TABLE_NAME) - .where(THREAD_ID_WHERE + " AND " + TYPE + " = ?", threadId, Types.SMS_EXPORT_TYPE) + .where(THREAD_ID_WHERE + " AND " + TYPE + " = ?", threadId, MessageTypes.SMS_EXPORT_TYPE) .run(); } @@ -3398,7 +3427,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi final int getSecureMessageCount(long threadId) { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[] {"COUNT(*)"}; - String query = getSecureMessageClause() + "AND " + MmsSmsColumns.THREAD_ID + " = ?"; + String query = getSecureMessageClause() + "AND " + THREAD_ID + " = ?"; String[] args = new String[]{String.valueOf(threadId)}; try (Cursor cursor = db.query(TABLE_NAME, projection, query, args, null, null, null, null)) { @@ -3414,8 +3443,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); String[] projection = new String[] {"COUNT(*)"}; String query = getOutgoingSecureMessageClause() + - "AND " + MmsSmsColumns.THREAD_ID + " = ? " + - "AND (" + TYPE + " & " + Types.GROUP_LEAVE_BIT + " = 0 OR " + TYPE + " & " + Types.GROUP_V2_BIT + " = " + Types.GROUP_V2_BIT + ")"; + "AND " + THREAD_ID + " = ? " + + "AND (" + TYPE + " & " + MessageTypes.GROUP_LEAVE_BIT + " = 0 OR " + TYPE + " & " + MessageTypes.GROUP_V2_BIT + " = " + MessageTypes.GROUP_V2_BIT + ")"; String[] args = new String[]{String.valueOf(threadId)}; try (Cursor cursor = db.query(TABLE_NAME, projection, query, args, null, null, null, null)) { @@ -3488,17 +3517,17 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } private String getOutgoingInsecureMessageClause() { - return "(" + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_SENT_TYPE + " AND NOT (" + TYPE + " & " + Types.SECURE_MESSAGE_BIT + ")"; + return "(" + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_SENT_TYPE + " AND NOT (" + TYPE + " & " + MessageTypes.SECURE_MESSAGE_BIT + ")"; } private String getOutgoingSecureMessageClause() { - return "(" + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_SENT_TYPE + " AND (" + TYPE + " & " + (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT) + ")"; + return "(" + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_SENT_TYPE + " AND (" + TYPE + " & " + (MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT) + ")"; } private String getSecureMessageClause() { - String isSent = "(" + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_SENT_TYPE; - String isReceived = "(" + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_INBOX_TYPE; - String isSecure = "(" + TYPE + " & " + (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT) + ")"; + String isSent = "(" + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_SENT_TYPE; + String isReceived = "(" + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_INBOX_TYPE; + String isSecure = "(" + TYPE + " & " + (MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT) + ")"; return String.format(Locale.ENGLISH, "(%s OR %s) AND %s", isSent, isReceived, isSecure); } @@ -3508,10 +3537,10 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } protected String getInsecureMessageClause(long threadId) { - String isSent = "(" + TABLE_NAME + "." + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_SENT_TYPE; - String isReceived = "(" + TABLE_NAME + "." + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_INBOX_TYPE; - String isSecure = "(" + TABLE_NAME + "." + TYPE + " & " + (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT) + ")"; - String isNotSecure = "(" + TABLE_NAME + "." + TYPE + " <= " + (Types.BASE_TYPE_MASK | Types.MESSAGE_ATTRIBUTE_MASK) + ")"; + String isSent = "(" + TABLE_NAME + "." + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_SENT_TYPE; + String isReceived = "(" + TABLE_NAME + "." + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_INBOX_TYPE; + String isSecure = "(" + TABLE_NAME + "." + TYPE + " & " + (MessageTypes.SECURE_MESSAGE_BIT | MessageTypes.PUSH_MESSAGE_BIT) + ")"; + String isNotSecure = "(" + TABLE_NAME + "." + TYPE + " <= " + (MessageTypes.BASE_TYPE_MASK | MessageTypes.MESSAGE_ATTRIBUTE_MASK) + ")"; String whereClause = String.format(Locale.ENGLISH, "(%s OR %s) AND NOT %s AND %s", isSent, isReceived, isSecure, isNotSecure); @@ -3655,7 +3684,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public List getIncomingPaymentRequestThreads() { Cursor cursor = SQLiteDatabaseExtensionsKt.select(getReadableDatabase(), "DISTINCT " + THREAD_ID) .from(TABLE_NAME) - .where("(" + TYPE + " & " + Types.BASE_TYPE_MASK + ") = " + Types.BASE_INBOX_TYPE + " AND (" + TYPE + " & ?) != 0", Types.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST) + .where("(" + TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_INBOX_TYPE + " AND (" + TYPE + " & ?) != 0", MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST) .run(); return CursorExtensionsKt.readToList(cursor, c -> CursorUtil.requireLong(c, THREAD_ID)); @@ -3664,7 +3693,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi public @Nullable MessageId getPaymentMessage(@NonNull UUID paymentUuid) { Cursor cursor = SQLiteDatabaseExtensionsKt.select(getReadableDatabase(), ID) .from(TABLE_NAME) - .where(TYPE + " & ? != 0 AND body = ?", Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION, paymentUuid) + .where(TYPE + " & ? != 0 AND body = ?", MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION, paymentUuid) .run(); long id = CursorExtensionsKt.readToSingleLong(cursor, -1); @@ -3685,7 +3714,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi @Override public void remapThread(long fromId, long toId) { ContentValues values = new ContentValues(); - values.put(MmsSmsColumns.THREAD_ID, toId); + values.put(THREAD_ID, toId); getWritableDatabase().update(TABLE_NAME, values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId)); } @@ -4159,7 +4188,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi 0, threadId, message.getBody(), slideDeck, - message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(), + message.isSecure() ? MessageTypes.getOutgoingEncryptedMessageType() : MessageTypes.getOutgoingSmsMessageType(), Collections.emptySet(), Collections.emptySet(), message.getSubscriptionId(), @@ -4269,8 +4298,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi int deliveryReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.DELIVERY_RECEIPT_COUNT)); int readReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.READ_RECEIPT_COUNT)); int subscriptionId = cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.SMS_SUBSCRIPTION_ID)); - int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.VIEWED_RECEIPT_COUNT)); - long receiptTimestamp = CursorUtil.requireLong(cursor, MmsSmsColumns.RECEIPT_TIMESTAMP); + int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.VIEWED_RECEIPT_COUNT)); + long receiptTimestamp = CursorUtil.requireLong(cursor, MessageTable.RECEIPT_TIMESTAMP); StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE)); ParentStoryId parentStoryId = ParentStoryId.deserialize(CursorUtil.requireLong(cursor, PARENT_STORY_ID)); String body = cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.BODY)); @@ -4291,7 +4320,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi SlideDeck slideDeck = new SlideDeck(context, new MmsNotificationAttachment(status, messageSize)); GiftBadge giftBadge = null; - if (body != null && Types.isGiftBadge(mailbox)) { + if (body != null && MessageTypes.isGiftBadge(mailbox)) { try { giftBadge = GiftBadge.parseFrom(Base64.decode(body)); } catch (IOException e) { @@ -4329,8 +4358,8 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi boolean remoteDelete = cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.REMOTE_DELETED)) == 1; boolean mentionsSelf = CursorUtil.requireBoolean(cursor, MENTIONS_SELF); long notifiedTimestamp = CursorUtil.requireLong(cursor, NOTIFIED_TIMESTAMP); - int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(MmsSmsColumns.VIEWED_RECEIPT_COUNT)); - long receiptTimestamp = CursorUtil.requireLong(cursor, MmsSmsColumns.RECEIPT_TIMESTAMP); + int viewedReceiptCount = cursor.getInt(cursor.getColumnIndexOrThrow(VIEWED_RECEIPT_COUNT)); + long receiptTimestamp = CursorUtil.requireLong(cursor, RECEIPT_TIMESTAMP); byte[] messageRangesData = CursorUtil.requireBlob(cursor, MESSAGE_RANGES); StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE)); ParentStoryId parentStoryId = ParentStoryId.deserialize(CursorUtil.requireLong(cursor, PARENT_STORY_ID)); @@ -4338,7 +4367,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi if (!TextSecurePreferences.isReadReceiptsEnabled(context)) { readReceiptCount = 0; - if (MmsSmsColumns.Types.isOutgoingMessageType(box) && !storyType.isStory()) { + if (MessageTypes.isOutgoingMessageType(box) && !storyType.isStory()) { viewedReceiptCount = 0; } } @@ -4364,7 +4393,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi } GiftBadge giftBadge = null; - if (body != null && Types.isGiftBadge(box)) { + if (body != null && MessageTypes.isGiftBadge(box)) { try { giftBadge = GiftBadge.parseFrom(Base64.decode(body)); } catch (IOException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java new file mode 100644 index 0000000000..22f29e8cc2 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java @@ -0,0 +1,352 @@ +package org.thoughtcrime.securesms.database; + +/** + * For storage efficiency, all types are stored within a single 64-bit integer column in the + * database. There are various areas reserved for different classes of data. + *

+ * When carving out a new area, if it's storing a bunch of mutually-exclusive flags (like in + * {@link #BASE_TYPE_MASK}, you should store integers in that area. If multiple flags can be set + * within a category, you'll have to store them as bits. Just keep in mind that storing as bits + * means we can store less data (i.e. 4 bits can store 16 exclusive values, or 4 non-exclusive + * values). This was not always followed in the past, and now we've wasted some space. + *

+ * Note: We technically could use up to 64 bits, but {@link #TOTAL_MASK} is currently just set to + * look at 32. Theoretically if we needed more bits, we could just use them and expand the size of + * {@link #TOTAL_MASK}. + * + *

+ *    ____________________________________________ SPECIAL TYPES ({@link #SPECIAL_TYPES_MASK}
+ *   |       _____________________________________ ENCRYPTION ({@link #ENCRYPTION_MASK})
+ *   |      |        _____________________________ SECURE MESSAGE INFORMATION (no mask, but look at {@link #SECURE_MESSAGE_BIT})
+ *   |      |       |     ________________________ GROUPS (no mask, but look at {@link #GROUP_UPDATE_BIT})
+ *   |      |       |    |       _________________ KEY_EXCHANGE ({@link #KEY_EXCHANGE_MASK})
+ *   |      |       |    |      |       _________  MESSAGE_ATTRIBUTES ({@link #MESSAGE_ATTRIBUTE_MASK})
+ *   |      |       |    |      |      |     ____  BASE_TYPE ({@link #BASE_TYPE_MASK})
+ *  _|   ___|___   _|   _|   ___|__    |  __|_
+ * |  | |       | |  | |  | |       | | ||    |
+ * 0000 0000 0000 0000 0000 0000 0000 0000 0000
+ * 
+ */ +public interface MessageTypes { + long TOTAL_MASK = 0xFFFFFFFFFL; + + // Base Types + long BASE_TYPE_MASK = 0x1F; + + long INCOMING_AUDIO_CALL_TYPE = 1; + long OUTGOING_AUDIO_CALL_TYPE = 2; + long MISSED_AUDIO_CALL_TYPE = 3; + long JOINED_TYPE = 4; + long UNSUPPORTED_MESSAGE_TYPE = 5; + long INVALID_MESSAGE_TYPE = 6; + long PROFILE_CHANGE_TYPE = 7; + long MISSED_VIDEO_CALL_TYPE = 8; + long GV1_MIGRATION_TYPE = 9; + long INCOMING_VIDEO_CALL_TYPE = 10; + long OUTGOING_VIDEO_CALL_TYPE = 11; + long GROUP_CALL_TYPE = 12; + long BAD_DECRYPT_TYPE = 13; + long CHANGE_NUMBER_TYPE = 14; + long BOOST_REQUEST_TYPE = 15; + long THREAD_MERGE_TYPE = 16; + long SMS_EXPORT_TYPE = 17; + + long BASE_INBOX_TYPE = 20; + long BASE_OUTBOX_TYPE = 21; + long BASE_SENDING_TYPE = 22; + long BASE_SENT_TYPE = 23; + long BASE_SENT_FAILED_TYPE = 24; + long BASE_PENDING_SECURE_SMS_FALLBACK = 25; + long BASE_PENDING_INSECURE_SMS_FALLBACK = 26; + long BASE_DRAFT_TYPE = 27; + + long[] OUTGOING_MESSAGE_TYPES = { BASE_OUTBOX_TYPE, BASE_SENT_TYPE, + BASE_SENDING_TYPE, BASE_SENT_FAILED_TYPE, + BASE_PENDING_SECURE_SMS_FALLBACK, + BASE_PENDING_INSECURE_SMS_FALLBACK, + OUTGOING_AUDIO_CALL_TYPE, OUTGOING_VIDEO_CALL_TYPE }; + + // Message attributes + long MESSAGE_ATTRIBUTE_MASK = 0xE0; + long MESSAGE_RATE_LIMITED_BIT = 0x80; + long MESSAGE_FORCE_SMS_BIT = 0x40; + // Note: Might be wise to reserve 0x20 -- it would let us expand BASE_MASK by a bit if needed + + // Key Exchange Information + long KEY_EXCHANGE_MASK = 0xFF00; + long KEY_EXCHANGE_BIT = 0x8000; + long KEY_EXCHANGE_IDENTITY_VERIFIED_BIT = 0x4000; + long KEY_EXCHANGE_IDENTITY_DEFAULT_BIT = 0x2000; + long KEY_EXCHANGE_CORRUPTED_BIT = 0x1000; + long KEY_EXCHANGE_INVALID_VERSION_BIT = 0x800; + long KEY_EXCHANGE_BUNDLE_BIT = 0x400; + long KEY_EXCHANGE_IDENTITY_UPDATE_BIT = 0x200; + long KEY_EXCHANGE_CONTENT_FORMAT = 0x100; + + // Secure Message Information + long SECURE_MESSAGE_BIT = 0x800000; + long END_SESSION_BIT = 0x400000; + long PUSH_MESSAGE_BIT = 0x200000; + + // Group Message Information + long GROUP_UPDATE_BIT = 0x10000; + // Note: Leave bit was previous QUIT bit for GV1, now also general member leave for GV2 + long GROUP_LEAVE_BIT = 0x20000; + long EXPIRATION_TIMER_UPDATE_BIT = 0x40000; + long GROUP_V2_BIT = 0x80000; + long GROUP_V2_LEAVE_BITS = GROUP_V2_BIT | GROUP_LEAVE_BIT | GROUP_UPDATE_BIT; + + // Encrypted Storage Information XXX + long ENCRYPTION_MASK = 0xFF000000; +// long ENCRYPTION_SYMMETRIC_BIT = 0x80000000; Deprecated +// long ENCRYPTION_ASYMMETRIC_BIT = 0x40000000; Deprecated + long ENCRYPTION_REMOTE_BIT = 0x20000000; + long ENCRYPTION_REMOTE_FAILED_BIT = 0x10000000; + long ENCRYPTION_REMOTE_NO_SESSION_BIT = 0x08000000; + long ENCRYPTION_REMOTE_DUPLICATE_BIT = 0x04000000; + long ENCRYPTION_REMOTE_LEGACY_BIT = 0x02000000; + + // Special message types + long SPECIAL_TYPES_MASK = 0xF00000000L; + long SPECIAL_TYPE_STORY_REACTION = 0x100000000L; + long SPECIAL_TYPE_GIFT_BADGE = 0x200000000L; + long SPECIAL_TYPE_PAYMENTS_NOTIFICATION = 0x300000000L; + long SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST = 0x400000000L; + long SPECIAL_TYPE_PAYMENTS_ACTIVATED = 0x800000000L; + + long IGNORABLE_TYPESMASK_WHEN_COUNTING = END_SESSION_BIT | KEY_EXCHANGE_IDENTITY_UPDATE_BIT | KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; + + static boolean isStoryReaction(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_STORY_REACTION; + } + + static boolean isGiftBadge(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_GIFT_BADGE; + } + + static boolean isPaymentsNotification(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_NOTIFICATION; + } + + static boolean isPaymentsRequestToActivate(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; + } + + static boolean isPaymentsActivated(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_ACTIVATED; + } + + static boolean isDraftMessageType(long type) { + return (type & BASE_TYPE_MASK) == BASE_DRAFT_TYPE; + } + + static boolean isFailedMessageType(long type) { + return (type & BASE_TYPE_MASK) == BASE_SENT_FAILED_TYPE; + } + + static boolean isOutgoingMessageType(long type) { + for (long outgoingType : OUTGOING_MESSAGE_TYPES) { + if ((type & BASE_TYPE_MASK) == outgoingType) + return true; + } + + return false; + } + + static long getOutgoingEncryptedMessageType() { + return BASE_SENDING_TYPE | SECURE_MESSAGE_BIT | PUSH_MESSAGE_BIT; + } + + static long getOutgoingSmsMessageType() { + return BASE_SENDING_TYPE; + } + + static boolean isForcedSms(long type) { + return (type & MESSAGE_FORCE_SMS_BIT) != 0; + } + + static boolean isPendingMessageType(long type) { + return + (type & BASE_TYPE_MASK) == BASE_OUTBOX_TYPE || + (type & BASE_TYPE_MASK) == BASE_SENDING_TYPE; + } + + static boolean isSentType(long type) { + return (type & BASE_TYPE_MASK) == BASE_SENT_TYPE; + } + + static boolean isPendingSecureSmsFallbackType(long type) { + return (type & BASE_TYPE_MASK) == BASE_PENDING_SECURE_SMS_FALLBACK; + } + + static boolean isPendingInsecureSmsFallbackType(long type) { + return (type & BASE_TYPE_MASK) == BASE_PENDING_INSECURE_SMS_FALLBACK; + } + + static boolean isInboxType(long type) { + return (type & BASE_TYPE_MASK) == BASE_INBOX_TYPE; + } + + static boolean isJoinedType(long type) { + return (type & BASE_TYPE_MASK) == JOINED_TYPE; + } + + static boolean isUnsupportedMessageType(long type) { + return (type & BASE_TYPE_MASK) == UNSUPPORTED_MESSAGE_TYPE; + } + + static boolean isInvalidMessageType(long type) { + return (type & BASE_TYPE_MASK) == INVALID_MESSAGE_TYPE; + } + + static boolean isBadDecryptType(long type) { + return (type & BASE_TYPE_MASK) == BAD_DECRYPT_TYPE; + } + + static boolean isThreadMergeType(long type) { + return (type & BASE_TYPE_MASK) == THREAD_MERGE_TYPE; + } + + static boolean isSecureType(long type) { + return (type & SECURE_MESSAGE_BIT) != 0; + } + + static boolean isPushType(long type) { + return (type & PUSH_MESSAGE_BIT) != 0; + } + + static boolean isEndSessionType(long type) { + return (type & END_SESSION_BIT) != 0; + } + + static boolean isKeyExchangeType(long type) { + return (type & KEY_EXCHANGE_BIT) != 0; + } + + static boolean isIdentityVerified(long type) { + return (type & KEY_EXCHANGE_IDENTITY_VERIFIED_BIT) != 0; + } + + static boolean isIdentityDefault(long type) { + return (type & KEY_EXCHANGE_IDENTITY_DEFAULT_BIT) != 0; + } + + static boolean isCorruptedKeyExchange(long type) { + return (type & KEY_EXCHANGE_CORRUPTED_BIT) != 0; + } + + static boolean isInvalidVersionKeyExchange(long type) { + return (type & KEY_EXCHANGE_INVALID_VERSION_BIT) != 0; + } + + static boolean isBundleKeyExchange(long type) { + return (type & KEY_EXCHANGE_BUNDLE_BIT) != 0; + } + + static boolean isContentBundleKeyExchange(long type) { + return (type & KEY_EXCHANGE_CONTENT_FORMAT) != 0; + } + + static boolean isIdentityUpdate(long type) { + return (type & KEY_EXCHANGE_IDENTITY_UPDATE_BIT) != 0; + } + + static boolean isRateLimited(long type) { + return (type & MESSAGE_RATE_LIMITED_BIT) != 0; + } + + static boolean isCallLog(long type) { + return isIncomingAudioCall(type) || + isIncomingVideoCall(type) || + isOutgoingAudioCall(type) || + isOutgoingVideoCall(type) || + isMissedAudioCall(type) || + isMissedVideoCall(type) || + isGroupCall(type); + } + + static boolean isExpirationTimerUpdate(long type) { + return (type & EXPIRATION_TIMER_UPDATE_BIT) != 0; + } + + static boolean isIncomingAudioCall(long type) { + return type == INCOMING_AUDIO_CALL_TYPE; + } + + static boolean isIncomingVideoCall(long type) { + return type == INCOMING_VIDEO_CALL_TYPE; + } + + static boolean isOutgoingAudioCall(long type) { + return type == OUTGOING_AUDIO_CALL_TYPE; + } + + static boolean isOutgoingVideoCall(long type) { + return type == OUTGOING_VIDEO_CALL_TYPE; + } + + static boolean isMissedAudioCall(long type) { + return type == MISSED_AUDIO_CALL_TYPE; + } + + static boolean isMissedVideoCall(long type) { + return type == MISSED_VIDEO_CALL_TYPE; + } + + static boolean isGroupCall(long type) { + return type == GROUP_CALL_TYPE; + } + + static boolean isGroupUpdate(long type) { + return (type & GROUP_UPDATE_BIT) != 0; + } + + static boolean isGroupV2(long type) { + return (type & GROUP_V2_BIT) != 0; + } + + static boolean isGroupQuit(long type) { + return (type & GROUP_LEAVE_BIT) != 0 && (type & GROUP_V2_BIT) == 0; + } + + static boolean isChatSessionRefresh(long type) { + return (type & ENCRYPTION_REMOTE_FAILED_BIT) != 0; + } + + static boolean isDuplicateMessageType(long type) { + return (type & ENCRYPTION_REMOTE_DUPLICATE_BIT) != 0; + } + + static boolean isNoRemoteSessionType(long type) { + return (type & ENCRYPTION_REMOTE_NO_SESSION_BIT) != 0; + } + + static boolean isLegacyType(long type) { + return (type & ENCRYPTION_REMOTE_LEGACY_BIT) != 0 || + (type & ENCRYPTION_REMOTE_BIT) != 0; + } + + static boolean isProfileChange(long type) { + return type == PROFILE_CHANGE_TYPE; + } + + static boolean isGroupV1MigrationEvent(long type) { + return type == GV1_MIGRATION_TYPE; + } + + static boolean isChangeNumber(long type) { + return type == CHANGE_NUMBER_TYPE; + } + + static boolean isBoostRequest(long type) { + return type == BOOST_REQUEST_TYPE; + } + + static boolean isSmsExport(long type) { + return type == SMS_EXPORT_TYPE; + } + + static boolean isGroupV2LeaveOnly(long type) { + return (type & GROUP_V2_LEAVE_BITS) == GROUP_V2_LEAVE_BITS; + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java deleted file mode 100644 index c8af7d3c9f..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java +++ /dev/null @@ -1,488 +0,0 @@ -package org.thoughtcrime.securesms.database; - -import androidx.annotation.VisibleForTesting; - -@SuppressWarnings("UnnecessaryInterfaceModifier") -public interface MmsSmsColumns { - - public static final String ID = "_id"; - public static final String DATE_SENT = "date_sent"; - public static final String DATE_RECEIVED = "date_received"; - public static final String TYPE = "type"; - public static final String DATE_SERVER = "date_server"; - public static final String THREAD_ID = "thread_id"; - public static final String READ = "read"; - public static final String BODY = "body"; - public static final String RECIPIENT_ID = "recipient_id"; - public static final String RECIPIENT_DEVICE_ID = "recipient_device_id"; - public static final String DELIVERY_RECEIPT_COUNT = "delivery_receipt_count"; - public static final String READ_RECEIPT_COUNT = "read_receipt_count"; - public static final String VIEWED_RECEIPT_COUNT = "viewed_receipt_count"; - public static final String MISMATCHED_IDENTITIES = "mismatched_identities"; - public static final String UNIQUE_ROW_ID = "unique_row_id"; - public static final String SMS_SUBSCRIPTION_ID = "subscription_id"; - public static final String EXPIRES_IN = "expires_in"; - public static final String EXPIRE_STARTED = "expire_started"; - public static final String NOTIFIED = "notified"; - public static final String NOTIFIED_TIMESTAMP = "notified_timestamp"; - public static final String UNIDENTIFIED = "unidentified"; - public static final String REACTIONS_UNREAD = "reactions_unread"; - public static final String REACTIONS_LAST_SEEN = "reactions_last_seen"; - public static final String REMOTE_DELETED = "remote_deleted"; - public static final String SERVER_GUID = "server_guid"; - public static final String RECEIPT_TIMESTAMP = "receipt_timestamp"; - public static final String EXPORT_STATE = "export_state"; - public static final String EXPORTED = "exported"; - - public static class Status { - public static final int STATUS_NONE = -1; - public static final int STATUS_COMPLETE = 0; - public static final int STATUS_PENDING = 0x20; - public static final int STATUS_FAILED = 0x40; - } - - /** - * For storage efficiency, all types are stored within a single 64-bit integer column in the - * database. There are various areas reserved for different classes of data. - * - * When carving out a new area, if it's storing a bunch of mutually-exclusive flags (like in - * {@link #BASE_TYPE_MASK}, you should store integers in that area. If multiple flags can be set - * within a category, you'll have to store them as bits. Just keep in mind that storing as bits - * means we can store less data (i.e. 4 bits can store 16 exclusive values, or 4 non-exclusive - * values). This was not always followed in the past, and now we've wasted some space. - * - * Note: We technically could use up to 64 bits, but {@link #TOTAL_MASK} is currently just set to - * look at 32. Theoretically if we needed more bits, we could just use them and expand the size of - * {@link #TOTAL_MASK}. - * - *
-   *    ____________________________________________ SPECIAL TYPES ({@link #SPECIAL_TYPES_MASK}
-   *   |       _____________________________________ ENCRYPTION ({@link #ENCRYPTION_MASK})
-   *   |      |        _____________________________ SECURE MESSAGE INFORMATION (no mask, but look at {@link #SECURE_MESSAGE_BIT})
-   *   |      |       |     ________________________ GROUPS (no mask, but look at {@link #GROUP_UPDATE_BIT})
-   *   |      |       |    |       _________________ KEY_EXCHANGE ({@link #KEY_EXCHANGE_MASK})
-   *   |      |       |    |      |       _________  MESSAGE_ATTRIBUTES ({@link #MESSAGE_ATTRIBUTE_MASK})
-   *   |      |       |    |      |      |     ____  BASE_TYPE ({@link #BASE_TYPE_MASK})
-   *  _|   ___|___   _|   _|   ___|__    |  __|_
-   * |  | |       | |  | |  | |       | | ||    |
-   * 0000 0000 0000 0000 0000 0000 0000 0000 0000
-   * 
- */ - public static class Types { - - protected static final long TOTAL_MASK = 0xFFFFFFFFFL; - - // Base Types - protected static final long BASE_TYPE_MASK = 0x1F; - - protected static final long INCOMING_AUDIO_CALL_TYPE = 1; - protected static final long OUTGOING_AUDIO_CALL_TYPE = 2; - protected static final long MISSED_AUDIO_CALL_TYPE = 3; - protected static final long JOINED_TYPE = 4; - protected static final long UNSUPPORTED_MESSAGE_TYPE = 5; - protected static final long INVALID_MESSAGE_TYPE = 6; - protected static final long PROFILE_CHANGE_TYPE = 7; - protected static final long MISSED_VIDEO_CALL_TYPE = 8; - protected static final long GV1_MIGRATION_TYPE = 9; - protected static final long INCOMING_VIDEO_CALL_TYPE = 10; - protected static final long OUTGOING_VIDEO_CALL_TYPE = 11; - protected static final long GROUP_CALL_TYPE = 12; - protected static final long BAD_DECRYPT_TYPE = 13; - protected static final long CHANGE_NUMBER_TYPE = 14; - protected static final long BOOST_REQUEST_TYPE = 15; - protected static final long THREAD_MERGE_TYPE = 16; - protected static final long SMS_EXPORT_TYPE = 17; - - protected static final long BASE_INBOX_TYPE = 20; - protected static final long BASE_OUTBOX_TYPE = 21; - protected static final long BASE_SENDING_TYPE = 22; - protected static final long BASE_SENT_TYPE = 23; - protected static final long BASE_SENT_FAILED_TYPE = 24; - protected static final long BASE_PENDING_SECURE_SMS_FALLBACK = 25; - protected static final long BASE_PENDING_INSECURE_SMS_FALLBACK = 26; - public static final long BASE_DRAFT_TYPE = 27; - - protected static final long[] OUTGOING_MESSAGE_TYPES = {BASE_OUTBOX_TYPE, BASE_SENT_TYPE, - BASE_SENDING_TYPE, BASE_SENT_FAILED_TYPE, - BASE_PENDING_SECURE_SMS_FALLBACK, - BASE_PENDING_INSECURE_SMS_FALLBACK, - OUTGOING_AUDIO_CALL_TYPE, OUTGOING_VIDEO_CALL_TYPE}; - - // Message attributes - protected static final long MESSAGE_ATTRIBUTE_MASK = 0xE0; - protected static final long MESSAGE_RATE_LIMITED_BIT = 0x80; - protected static final long MESSAGE_FORCE_SMS_BIT = 0x40; - // Note: Might be wise to reserve 0x20 -- it would let us expand BASE_MASK by a bit if needed - - // Key Exchange Information - protected static final long KEY_EXCHANGE_MASK = 0xFF00; - protected static final long KEY_EXCHANGE_BIT = 0x8000; - protected static final long KEY_EXCHANGE_IDENTITY_VERIFIED_BIT = 0x4000; - protected static final long KEY_EXCHANGE_IDENTITY_DEFAULT_BIT = 0x2000; - protected static final long KEY_EXCHANGE_CORRUPTED_BIT = 0x1000; - protected static final long KEY_EXCHANGE_INVALID_VERSION_BIT = 0x800; - protected static final long KEY_EXCHANGE_BUNDLE_BIT = 0x400; - protected static final long KEY_EXCHANGE_IDENTITY_UPDATE_BIT = 0x200; - protected static final long KEY_EXCHANGE_CONTENT_FORMAT = 0x100; - - // Secure Message Information - protected static final long SECURE_MESSAGE_BIT = 0x800000; - protected static final long END_SESSION_BIT = 0x400000; - protected static final long PUSH_MESSAGE_BIT = 0x200000; - - // Group Message Information - protected static final long GROUP_UPDATE_BIT = 0x10000; - // Note: Leave bit was previous QUIT bit for GV1, now also general member leave for GV2 - protected static final long GROUP_LEAVE_BIT = 0x20000; - protected static final long EXPIRATION_TIMER_UPDATE_BIT = 0x40000; - protected static final long GROUP_V2_BIT = 0x80000; - protected static final long GROUP_V2_LEAVE_BITS = GROUP_V2_BIT | GROUP_LEAVE_BIT | GROUP_UPDATE_BIT; - - // Encrypted Storage Information XXX - public static final long ENCRYPTION_MASK = 0xFF000000; - // public static final long ENCRYPTION_SYMMETRIC_BIT = 0x80000000; Deprecated - // protected static final long ENCRYPTION_ASYMMETRIC_BIT = 0x40000000; Deprecated - protected static final long ENCRYPTION_REMOTE_BIT = 0x20000000; - protected static final long ENCRYPTION_REMOTE_FAILED_BIT = 0x10000000; - protected static final long ENCRYPTION_REMOTE_NO_SESSION_BIT = 0x08000000; - protected static final long ENCRYPTION_REMOTE_DUPLICATE_BIT = 0x04000000; - protected static final long ENCRYPTION_REMOTE_LEGACY_BIT = 0x02000000; - - // Special message types - public static final long SPECIAL_TYPES_MASK = 0xF00000000L; - public static final long SPECIAL_TYPE_STORY_REACTION = 0x100000000L; - public static final long SPECIAL_TYPE_GIFT_BADGE = 0x200000000L; - protected static final long SPECIAL_TYPE_PAYMENTS_NOTIFICATION = 0x300000000L; - protected static final long SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST = 0x400000000L; - protected static final long SPECIAL_TYPE_PAYMENTS_ACTIVATED = 0x800000000L; - - static final long IGNORABLE_TYPESMASK_WHEN_COUNTING = Types.END_SESSION_BIT | Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT | Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; - - public static boolean isStoryReaction(long type) { - return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_STORY_REACTION; - } - - public static boolean isGiftBadge(long type) { - return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_GIFT_BADGE; - } - - public static boolean isPaymentsNotification(long type) { - return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_NOTIFICATION; - } - - public static boolean isPaymentsRequestToActivate(long type) { - return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST; - } - - public static boolean isPaymentsActivated(long type) { - return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_ACTIVATED; - } - - public static boolean isDraftMessageType(long type) { - return (type & BASE_TYPE_MASK) == BASE_DRAFT_TYPE; - } - - public static boolean isFailedMessageType(long type) { - return (type & BASE_TYPE_MASK) == BASE_SENT_FAILED_TYPE; - } - - public static boolean isOutgoingMessageType(long type) { - for (long outgoingType : OUTGOING_MESSAGE_TYPES) { - if ((type & BASE_TYPE_MASK) == outgoingType) - return true; - } - - return false; - } - - public static long getOutgoingEncryptedMessageType() { - return Types.BASE_SENDING_TYPE | Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT; - } - - public static long getOutgoingSmsMessageType() { - return Types.BASE_SENDING_TYPE; - } - - public static boolean isForcedSms(long type) { - return (type & MESSAGE_FORCE_SMS_BIT) != 0; - } - - public static boolean isPendingMessageType(long type) { - return - (type & BASE_TYPE_MASK) == BASE_OUTBOX_TYPE || - (type & BASE_TYPE_MASK) == BASE_SENDING_TYPE; - } - - public static boolean isSentType(long type) { - return (type & BASE_TYPE_MASK) == BASE_SENT_TYPE; - } - - public static boolean isPendingSmsFallbackType(long type) { - return (type & BASE_TYPE_MASK) == BASE_PENDING_INSECURE_SMS_FALLBACK || - (type & BASE_TYPE_MASK) == BASE_PENDING_SECURE_SMS_FALLBACK; - } - - public static boolean isPendingSecureSmsFallbackType(long type) { - return (type & BASE_TYPE_MASK) == BASE_PENDING_SECURE_SMS_FALLBACK; - } - - public static boolean isPendingInsecureSmsFallbackType(long type) { - return (type & BASE_TYPE_MASK) == BASE_PENDING_INSECURE_SMS_FALLBACK; - } - - public static boolean isInboxType(long type) { - return (type & BASE_TYPE_MASK) == BASE_INBOX_TYPE; - } - - public static boolean isJoinedType(long type) { - return (type & BASE_TYPE_MASK) == JOINED_TYPE; - } - - public static boolean isUnsupportedMessageType(long type) { - return (type & BASE_TYPE_MASK) == UNSUPPORTED_MESSAGE_TYPE; - } - - public static boolean isInvalidMessageType(long type) { - return (type & BASE_TYPE_MASK) == INVALID_MESSAGE_TYPE; - } - - public static boolean isBadDecryptType(long type) { - return (type & BASE_TYPE_MASK) == BAD_DECRYPT_TYPE; - } - - public static boolean isThreadMergeType(long type) { - return (type & BASE_TYPE_MASK) == THREAD_MERGE_TYPE; - } - - public static boolean isSecureType(long type) { - return (type & SECURE_MESSAGE_BIT) != 0; - } - - public static boolean isPushType(long type) { - return (type & PUSH_MESSAGE_BIT) != 0; - } - - public static boolean isEndSessionType(long type) { - return (type & END_SESSION_BIT) != 0; - } - - public static boolean isKeyExchangeType(long type) { - return (type & KEY_EXCHANGE_BIT) != 0; - } - - public static boolean isIdentityVerified(long type) { - return (type & KEY_EXCHANGE_IDENTITY_VERIFIED_BIT) != 0; - } - - public static boolean isIdentityDefault(long type) { - return (type & KEY_EXCHANGE_IDENTITY_DEFAULT_BIT) != 0; - } - - public static boolean isCorruptedKeyExchange(long type) { - return (type & KEY_EXCHANGE_CORRUPTED_BIT) != 0; - } - - public static boolean isInvalidVersionKeyExchange(long type) { - return (type & KEY_EXCHANGE_INVALID_VERSION_BIT) != 0; - } - - public static boolean isBundleKeyExchange(long type) { - return (type & KEY_EXCHANGE_BUNDLE_BIT) != 0; - } - - public static boolean isContentBundleKeyExchange(long type) { - return (type & KEY_EXCHANGE_CONTENT_FORMAT) != 0; - } - - public static boolean isIdentityUpdate(long type) { - return (type & KEY_EXCHANGE_IDENTITY_UPDATE_BIT) != 0; - } - - public static boolean isRateLimited(long type) { - return (type & MESSAGE_RATE_LIMITED_BIT) != 0; - } - - public static boolean isCallLog(long type) { - return isIncomingAudioCall(type) || - isIncomingVideoCall(type) || - isOutgoingAudioCall(type) || - isOutgoingVideoCall(type) || - isMissedAudioCall(type) || - isMissedVideoCall(type) || - isGroupCall(type); - } - - public static boolean isExpirationTimerUpdate(long type) { - return (type & EXPIRATION_TIMER_UPDATE_BIT) != 0; - } - - public static boolean isIncomingAudioCall(long type) { - return type == INCOMING_AUDIO_CALL_TYPE; - } - - public static boolean isIncomingVideoCall(long type) { - return type == INCOMING_VIDEO_CALL_TYPE; - } - - public static boolean isOutgoingAudioCall(long type) { - return type == OUTGOING_AUDIO_CALL_TYPE; - } - - public static boolean isOutgoingVideoCall(long type) { - return type == OUTGOING_VIDEO_CALL_TYPE; - } - - public static boolean isMissedAudioCall(long type) { - return type == MISSED_AUDIO_CALL_TYPE; - } - - public static boolean isMissedVideoCall(long type) { - return type == MISSED_VIDEO_CALL_TYPE; - } - - public static boolean isGroupCall(long type) { - return type == GROUP_CALL_TYPE; - } - - public static boolean isGroupUpdate(long type) { - return (type & GROUP_UPDATE_BIT) != 0; - } - - public static boolean isGroupV2(long type) { - return (type & GROUP_V2_BIT) != 0; - } - - public static boolean isGroupQuit(long type) { - return (type & GROUP_LEAVE_BIT) != 0 && (type & GROUP_V2_BIT) == 0; - } - - public static boolean isChatSessionRefresh(long type) { - return (type & ENCRYPTION_REMOTE_FAILED_BIT) != 0; - } - - public static boolean isDuplicateMessageType(long type) { - return (type & ENCRYPTION_REMOTE_DUPLICATE_BIT) != 0; - } - - public static boolean isDecryptInProgressType(long type) { - return (type & 0x40000000) != 0; // Inline deprecated asymmetric encryption type - } - - public static boolean isNoRemoteSessionType(long type) { - return (type & ENCRYPTION_REMOTE_NO_SESSION_BIT) != 0; - } - - public static boolean isLegacyType(long type) { - return (type & ENCRYPTION_REMOTE_LEGACY_BIT) != 0 || - (type & ENCRYPTION_REMOTE_BIT) != 0; - } - - public static boolean isProfileChange(long type) { - return type == PROFILE_CHANGE_TYPE; - } - - public static boolean isGroupV1MigrationEvent(long type) { - return type == GV1_MIGRATION_TYPE; - } - - public static boolean isChangeNumber(long type) { - return type == CHANGE_NUMBER_TYPE; - } - - public static boolean isBoostRequest(long type) { - return type == BOOST_REQUEST_TYPE; - } - - public static boolean isSmsExport(long type) { - return type == SMS_EXPORT_TYPE; - } - - public static boolean isGroupV2LeaveOnly(long type) { - return (type & GROUP_V2_LEAVE_BITS) == GROUP_V2_LEAVE_BITS; - } - - public static long translateFromSystemBaseType(long theirType) { -// public static final int NONE_TYPE = 0; -// public static final int INBOX_TYPE = 1; -// public static final int SENT_TYPE = 2; -// public static final int SENT_PENDING = 4; -// public static final int FAILED_TYPE = 5; - - switch ((int)theirType) { - case 1: return BASE_INBOX_TYPE; - case 2: return BASE_SENT_TYPE; - case 3: return BASE_DRAFT_TYPE; - case 4: return BASE_OUTBOX_TYPE; - case 5: return BASE_SENT_FAILED_TYPE; - case 6: return BASE_OUTBOX_TYPE; - } - - return BASE_INBOX_TYPE; - } - - public static int translateToSystemBaseType(long type) { - if (isInboxType(type)) return 1; - else if (isOutgoingMessageType(type)) return 2; - else if (isFailedMessageType(type)) return 5; - - return 1; - } - -// -// -// -// public static final int NONE_TYPE = 0; -// public static final int INBOX_TYPE = 1; -// public static final int SENT_TYPE = 2; -// public static final int SENT_PENDING = 4; -// public static final int FAILED_TYPE = 5; -// -// public static final int OUTBOX_TYPE = 43; // Messages are stored local encrypted and need delivery. -// -// -// public static final int ENCRYPTING_TYPE = 42; // Messages are stored local encrypted and need async encryption and delivery. -// public static final int SECURE_SENT_TYPE = 44; // Messages were sent with async encryption. -// public static final int SECURE_RECEIVED_TYPE = 45; // Messages were received with async decryption. -// public static final int FAILED_DECRYPT_TYPE = 46; // Messages were received with async encryption and failed to decrypt. -// public static final int DECRYPTING_TYPE = 47; // Messages are in the process of being asymmetricaly decrypted. -// public static final int NO_SESSION_TYPE = 48; // Messages were received with async encryption but there is no session yet. -// -// public static final int OUTGOING_KEY_EXCHANGE_TYPE = 49; -// public static final int INCOMING_KEY_EXCHANGE_TYPE = 50; -// public static final int STALE_KEY_EXCHANGE_TYPE = 51; -// public static final int PROCESSED_KEY_EXCHANGE_TYPE = 52; -// -// public static final int[] OUTGOING_MESSAGE_TYPES = {SENT_TYPE, SENT_PENDING, ENCRYPTING_TYPE, -// OUTBOX_TYPE, SECURE_SENT_TYPE, -// FAILED_TYPE, OUTGOING_KEY_EXCHANGE_TYPE}; -// -// public static boolean isFailedMessageType(long type) { -// return type == FAILED_TYPE; -// } -// -// public static boolean isOutgoingMessageType(long type) { -// for (int outgoingType : OUTGOING_MESSAGE_TYPES) { -// if (type == outgoingType) -// return true; -// } -// -// return false; -// } -// -// public static boolean isPendingMessageType(long type) { -// return type == SENT_PENDING || type == ENCRYPTING_TYPE || type == OUTBOX_TYPE; -// } -// -// public static boolean isSecureType(long type) { -// return -// type == SECURE_SENT_TYPE || type == ENCRYPTING_TYPE || -// type == SECURE_RECEIVED_TYPE || type == DECRYPTING_TYPE; -// } -// -// public static boolean isKeyExchangeType(long type) { -// return type == OUTGOING_KEY_EXCHANGE_TYPE || type == INCOMING_KEY_EXCHANGE_TYPE; -// } - } - - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java index 70af8998ad..efe692164d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsTable.java @@ -62,37 +62,35 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import static org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS; - 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 " + MmsSmsColumns.ID, - MmsSmsColumns.BODY, - MmsSmsColumns.TYPE, - MmsSmsColumns.THREAD_ID, - MmsSmsColumns.RECIPIENT_ID, - MmsSmsColumns.RECIPIENT_DEVICE_ID, - MmsSmsColumns.DATE_SENT, - MmsSmsColumns.DATE_RECEIVED, - MmsSmsColumns.DATE_SERVER, + 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, - MmsSmsColumns.UNIDENTIFIED, + MessageTable.UNIDENTIFIED, MessageTable.MMS_CONTENT_LOCATION, MessageTable.MMS_TRANSACTION_ID, MessageTable.MMS_MESSAGE_SIZE, MessageTable.MMS_EXPIRY, MessageTable.MMS_STATUS, - MmsSmsColumns.DELIVERY_RECEIPT_COUNT, - MmsSmsColumns.READ_RECEIPT_COUNT, - MmsSmsColumns.MISMATCHED_IDENTITIES, + MessageTable.DELIVERY_RECEIPT_COUNT, + MessageTable.READ_RECEIPT_COUNT, + MessageTable.MISMATCHED_IDENTITIES, MessageTable.NETWORK_FAILURES, - MmsSmsColumns.SMS_SUBSCRIPTION_ID, - MmsSmsColumns.EXPIRES_IN, - MmsSmsColumns.EXPIRE_STARTED, - MmsSmsColumns.NOTIFIED, + MessageTable.SMS_SUBSCRIPTION_ID, + MessageTable.EXPIRES_IN, + MessageTable.EXPIRE_STARTED, + MessageTable.NOTIFIED, MessageTable.QUOTE_ID, MessageTable.QUOTE_AUTHOR, MessageTable.QUOTE_BODY, @@ -102,21 +100,21 @@ public class MmsSmsTable extends DatabaseTable { MessageTable.SHARED_CONTACTS, MessageTable.LINK_PREVIEWS, MessageTable.VIEW_ONCE, - MmsSmsColumns.READ, - MmsSmsColumns.REACTIONS_UNREAD, - MmsSmsColumns.REACTIONS_LAST_SEEN, - MmsSmsColumns.REMOTE_DELETED, + MessageTable.READ, + MessageTable.REACTIONS_UNREAD, + MessageTable.REACTIONS_LAST_SEEN, + MessageTable.REMOTE_DELETED, MessageTable.MENTIONS_SELF, - MmsSmsColumns.NOTIFIED_TIMESTAMP, - MmsSmsColumns.VIEWED_RECEIPT_COUNT, - MmsSmsColumns.RECEIPT_TIMESTAMP, + MessageTable.NOTIFIED_TIMESTAMP, + MessageTable.VIEWED_RECEIPT_COUNT, + MessageTable.RECEIPT_TIMESTAMP, MessageTable.MESSAGE_RANGES, MessageTable.STORY_TYPE, MessageTable.PARENT_STORY_ID}; - private static final String SNIPPET_QUERY = "SELECT " + MmsSmsColumns.ID + ", " + MmsSmsColumns.TYPE + ", " + MessageTable.DATE_RECEIVED + " FROM " + MessageTable.TABLE_NAME + " " + - "WHERE " + MmsSmsColumns.THREAD_ID + " = ? AND " + MessageTable.TYPE + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0 " + - "ORDER BY " + MmsSmsColumns.DATE_RECEIVED + " DESC " + + private static final String SNIPPET_QUERY = "SELECT " + MessageTable.ID + ", " + MessageTable.TYPE + ", " + MessageTable.DATE_RECEIVED + " FROM " + MessageTable.TABLE_NAME + " " + + "WHERE " + MessageTable.THREAD_ID + " = ? AND " + MessageTable.TYPE + " & " + MessageTypes.GROUP_V2_LEAVE_BITS + " != " + MessageTypes.GROUP_V2_LEAVE_BITS + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0 " + + "ORDER BY " + MessageTable.DATE_RECEIVED + " DESC " + "LIMIT 1"; public MmsSmsTable(Context context, SignalDatabase databaseHelper) { @@ -152,8 +150,8 @@ public class MmsSmsTable extends DatabaseTable { public int getMessagePositionOnOrAfterTimestamp(long threadId, long timestamp) { String[] projection = new String[] { "COUNT(*)" }; - String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + - MmsSmsColumns.DATE_RECEIVED + " >= " + timestamp + " AND " + + String selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + + MessageTable.DATE_RECEIVED + " >= " + timestamp + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0"; try (Cursor cursor = queryTables(projection, selection, null, null, false)) { @@ -167,7 +165,7 @@ public class MmsSmsTable extends DatabaseTable { public @Nullable MessageRecord getMessageFor(long timestamp, RecipientId authorId) { Recipient author = Recipient.resolved(authorId); - try (Cursor cursor = queryTables(PROJECTION, MmsSmsColumns.DATE_SENT + " = " + timestamp, null, null, true)) { + try (Cursor cursor = queryTables(PROJECTION, MessageTable.DATE_SENT + " = " + timestamp, null, null, true)) { MmsSmsTable.Reader reader = readerFor(cursor); MessageRecord messageRecord; @@ -196,8 +194,8 @@ public class MmsSmsTable extends DatabaseTable { public Cursor getConversation(long threadId, long offset, long limit) { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - String order = MmsSmsColumns.DATE_RECEIVED + " DESC"; - String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0"; + 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); @@ -211,7 +209,7 @@ public class MmsSmsTable extends DatabaseTable { public @NonNull MessageRecord getConversationSnippet(long threadId) throws NoSuchMessageException { try (Cursor cursor = getConversationSnippetCursor(threadId)) { if (cursor.moveToFirst()) { - long id = CursorUtil.requireLong(cursor, MmsSmsColumns.ID); + long id = CursorUtil.requireLong(cursor, MessageTable.ID); return SignalDatabase.messages().getMessageRecord(id); } else { throw new NoSuchMessageException("no message"); @@ -229,7 +227,7 @@ public class MmsSmsTable extends DatabaseTable { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.rawQuery(SNIPPET_QUERY, SqlUtil.buildArgs(threadId))) { if (cursor.moveToFirst()) { - return CursorUtil.requireLong(cursor, MmsSmsColumns.TYPE); + return CursorUtil.requireLong(cursor, MessageTable.TYPE); } else { throw new NoSuchMessageException("no message"); } @@ -243,18 +241,18 @@ public class MmsSmsTable extends DatabaseTable { stickyQuery.append(" OR "); } stickyQuery.append("(") - .append(MmsSmsColumns.THREAD_ID + " = ") + .append(MessageTable.THREAD_ID + " = ") .append(stickyThread.getConversationId().getThreadId()) .append(" AND ") - .append(MmsSmsColumns.DATE_RECEIVED) + .append(MessageTable.DATE_RECEIVED) .append(" >= ") .append(stickyThread.getEarliestTimestamp()) .append(getStickyWherePartForParentStoryId(stickyThread.getConversationId().getGroupStoryId())) .append(")"); } - String order = MmsSmsColumns.DATE_RECEIVED + " ASC"; - String selection = MmsSmsColumns.NOTIFIED + " = 0 AND " + MessageTable.STORY_TYPE + " = 0 AND (" + MmsSmsColumns.READ + " = 0 OR " + MmsSmsColumns.REACTIONS_UNREAD + " = 1" + (stickyQuery.length() > 0 ? " OR (" + stickyQuery + ")" : "") + ")"; + 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); } @@ -324,7 +322,7 @@ public class MmsSmsTable extends DatabaseTable { String query; if (targetMessage.getQuote().getAuthor().equals(Recipient.self().getId())) { - query = MessageTable.DATE_SENT + " = " + targetMessage.getQuote().getId() + " AND (" + MmsSmsColumns.TYPE + " & " + MmsSmsColumns.Types.BASE_TYPE_MASK + ") = " + MmsSmsColumns.Types.BASE_SENT_TYPE; + query = MessageTable.DATE_SENT + " = " + targetMessage.getQuote().getId() + " AND (" + MessageTable.TYPE + " & " + MessageTypes.BASE_TYPE_MASK + ") = " + MessageTypes.BASE_SENT_TYPE; } else { query = MessageTable.DATE_SENT + " = " + targetMessage.getQuote().getId() + " AND " + MessageTable.RECIPIENT_ID + " = '" + targetMessage.getQuote().getAuthor().serialize() + "'"; } @@ -349,7 +347,7 @@ public class MmsSmsTable extends DatabaseTable { 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 = MmsSmsColumns.DATE_RECEIVED + " DESC"; + String order = MessageTable.DATE_RECEIVED + " DESC"; List records = new ArrayList<>(); @@ -383,7 +381,7 @@ public class MmsSmsTable extends DatabaseTable { } public int getUnreadCount(long threadId) { - String selection = MmsSmsColumns.READ + " = 0 AND " + MessageTable.STORY_TYPE + " = 0 AND " + MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; + String selection = MessageTable.READ + " = 0 AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.THREAD_ID + " = " + threadId + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; try (Cursor cursor = queryTables(PROJECTION, selection, null, null, false)) { return cursor != null ? cursor.getCount() : 0; @@ -441,7 +439,7 @@ public class MmsSmsTable extends DatabaseTable { } public int getMessageCountBeforeDate(long date) { - String selection = MmsSmsColumns.DATE_RECEIVED + " < " + date; + String selection = MessageTable.DATE_RECEIVED + " < " + date; try (Cursor cursor = queryTables(new String[] { "COUNT(*)" }, selection, null, null, false)) { if (cursor != null && cursor.moveToFirst()) { @@ -643,12 +641,12 @@ public class MmsSmsTable extends DatabaseTable { private @NonNull MessageExportState getMessageExportState(@NonNull MessageId messageId) throws NoSuchMessageException { String table = MessageTable.TABLE_NAME; - String[] projection = SqlUtil.buildArgs(MmsSmsColumns.EXPORT_STATE); + String[] projection = SqlUtil.buildArgs(MessageTable.EXPORT_STATE); String[] args = SqlUtil.buildArgs(messageId.getId()); try (Cursor cursor = getReadableDatabase().query(table, projection, ID_WHERE, args, null, null, null, null)) { if (cursor.moveToFirst()) { - byte[] bytes = CursorUtil.requireBlob(cursor, MmsSmsColumns.EXPORT_STATE); + byte[] bytes = CursorUtil.requireBlob(cursor, MessageTable.EXPORT_STATE); if (bytes == null) { return MessageExportState.getDefaultInstance(); } else { @@ -684,7 +682,7 @@ public class MmsSmsTable extends DatabaseTable { String table = MessageTable.TABLE_NAME; ContentValues contentValues = new ContentValues(1); - contentValues.put(MmsSmsColumns.EXPORTED, MessageExportStatus.EXPORTED.getCode()); + contentValues.put(MessageTable.EXPORTED, MessageExportStatus.EXPORTED.getCode()); getWritableDatabase().update(table, contentValues, ID_WHERE, SqlUtil.buildArgs(messageId.getId())); } @@ -693,7 +691,7 @@ public class MmsSmsTable extends DatabaseTable { String table = MessageTable.TABLE_NAME; ContentValues contentValues = new ContentValues(1); - contentValues.put(MmsSmsColumns.EXPORTED, MessageExportStatus.ERROR.getCode()); + contentValues.put(MessageTable.EXPORTED, MessageExportStatus.ERROR.getCode()); getWritableDatabase().update(table, contentValues, ID_WHERE, SqlUtil.buildArgs(messageId.getId())); } @@ -702,7 +700,7 @@ public class MmsSmsTable extends DatabaseTable { String table = MessageTable.TABLE_NAME; ContentValues contentValues = new ContentValues(1); - contentValues.put(MmsSmsColumns.EXPORT_STATE, messageExportState.toByteArray()); + contentValues.put(MessageTable.EXPORT_STATE, messageExportState.toByteArray()); getWritableDatabase().update(table, contentValues, ID_WHERE, SqlUtil.buildArgs(messageId.getId())); } @@ -756,18 +754,18 @@ public class MmsSmsTable extends DatabaseTable { } public int getQuotedMessagePosition(long threadId, long quoteId, @NonNull RecipientId recipientId) { - String order = MmsSmsColumns.DATE_RECEIVED + " DESC"; - String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0" + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; + String order = MessageTable.DATE_RECEIVED + " DESC"; + String selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0" + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; - try (Cursor cursor = queryTables(new String[]{ MmsSmsColumns.DATE_SENT, MmsSmsColumns.RECIPIENT_ID, MmsSmsColumns.REMOTE_DELETED}, selection, order, null, false)) { + try (Cursor cursor = queryTables(new String[]{ MessageTable.DATE_SENT, MessageTable.RECIPIENT_ID, MessageTable.REMOTE_DELETED}, selection, order, null, false)) { boolean isOwnNumber = Recipient.resolved(recipientId).isSelf(); while (cursor != null && cursor.moveToNext()) { boolean quoteIdMatches = cursor.getLong(0) == quoteId; - boolean recipientIdMatches = recipientId.equals(RecipientId.from(CursorUtil.requireLong(cursor, MmsSmsColumns.RECIPIENT_ID))); + boolean recipientIdMatches = recipientId.equals(RecipientId.from(CursorUtil.requireLong(cursor, MessageTable.RECIPIENT_ID))); if (quoteIdMatches && (recipientIdMatches || isOwnNumber)) { - if (CursorUtil.requireBoolean(cursor, MmsSmsColumns.REMOTE_DELETED)) { + if (CursorUtil.requireBoolean(cursor, MessageTable.REMOTE_DELETED)) { return -1; } else { return cursor.getPosition(); @@ -779,10 +777,10 @@ public class MmsSmsTable extends DatabaseTable { } public int getMessagePositionInConversation(long threadId, long receivedTimestamp, @NonNull RecipientId recipientId) { - String order = MmsSmsColumns.DATE_RECEIVED + " DESC"; - String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0" + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; + String order = MessageTable.DATE_RECEIVED + " DESC"; + String selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + MessageTable.STORY_TYPE + " = 0" + " AND " + MessageTable.PARENT_STORY_ID + " <= 0"; - try (Cursor cursor = queryTables(new String[]{ MmsSmsColumns.DATE_RECEIVED, MmsSmsColumns.RECIPIENT_ID, MmsSmsColumns.REMOTE_DELETED}, selection, order, null, false)) { + try (Cursor cursor = queryTables(new String[]{ MessageTable.DATE_RECEIVED, MessageTable.RECIPIENT_ID, MessageTable.REMOTE_DELETED}, selection, order, null, false)) { boolean isOwnNumber = Recipient.resolved(recipientId).isSelf(); while (cursor != null && cursor.moveToNext()) { @@ -790,7 +788,7 @@ public class MmsSmsTable extends DatabaseTable { boolean recipientIdMatches = recipientId.equals(RecipientId.from(cursor.getLong(1))); if (timestampMatches && (recipientIdMatches || isOwnNumber)) { - if (CursorUtil.requireBoolean(cursor, MmsSmsColumns.REMOTE_DELETED)) { + if (CursorUtil.requireBoolean(cursor, MessageTable.REMOTE_DELETED)) { return -1; } else { return cursor.getPosition(); @@ -825,14 +823,14 @@ public class MmsSmsTable extends DatabaseTable { final String selection; if (groupStoryId > 0) { - order = MmsSmsColumns.DATE_RECEIVED + " ASC"; - selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + - MmsSmsColumns.DATE_RECEIVED + " < " + receivedTimestamp + " AND " + + order = MessageTable.DATE_RECEIVED + " ASC"; + selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + + MessageTable.DATE_RECEIVED + " < " + receivedTimestamp + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " = " + groupStoryId; } else { - order = MmsSmsColumns.DATE_RECEIVED + " DESC"; - selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + - MmsSmsColumns.DATE_RECEIVED + " > " + receivedTimestamp + " AND " + + order = MessageTable.DATE_RECEIVED + " DESC"; + selection = MessageTable.THREAD_ID + " = " + threadId + " AND " + + MessageTable.DATE_RECEIVED + " > " + receivedTimestamp + " AND " + MessageTable.STORY_TYPE + " = 0 AND " + MessageTable.PARENT_STORY_ID + " <= 0"; } @@ -845,10 +843,10 @@ public class MmsSmsTable extends DatabaseTable { } public long getTimestampForFirstMessageAfterDate(long date) { - String order = MmsSmsColumns.DATE_RECEIVED + " ASC"; - String selection = MmsSmsColumns.DATE_RECEIVED + " > " + date; + String order = MessageTable.DATE_RECEIVED + " ASC"; + String selection = MessageTable.DATE_RECEIVED + " > " + date; - try (Cursor cursor = queryTables(new String[] { MmsSmsColumns.DATE_RECEIVED }, selection, order, "1", false)) { + try (Cursor cursor = queryTables(new String[] { MessageTable.DATE_RECEIVED }, selection, order, "1", false)) { if (cursor != null && cursor.moveToFirst()) { return cursor.getLong(0); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt index 87f1e3b28e..f06566c761 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt @@ -18,8 +18,8 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa const val MMS_FTS_TABLE_NAME = "mms_fts" const val ID = "rowid" - const val BODY = MmsSmsColumns.BODY - const val THREAD_ID = MmsSmsColumns.THREAD_ID + const val BODY = MessageTable.BODY + const val THREAD_ID = MessageTable.THREAD_ID const val SNIPPET = "snippet" const val CONVERSATION_RECIPIENT = "conversation_recipient" const val MESSAGE_RECIPIENT = "message_recipient" @@ -52,12 +52,13 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa """ ) + @Language("sql") private const val MESSAGES_QUERY = """ SELECT ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} AS $CONVERSATION_RECIPIENT, - ${MessageTable.TABLE_NAME}.${MmsSmsColumns.RECIPIENT_ID} AS $MESSAGE_RECIPIENT, + ${MessageTable.TABLE_NAME}.${MessageTable.RECIPIENT_ID} AS $MESSAGE_RECIPIENT, snippet($MMS_FTS_TABLE_NAME, -1, '', '', '$SNIPPET_WRAP', 7) AS $SNIPPET, - ${MessageTable.TABLE_NAME}.${MmsSmsColumns.DATE_RECEIVED}, + ${MessageTable.TABLE_NAME}.${MessageTable.DATE_RECEIVED}, $MMS_FTS_TABLE_NAME.$THREAD_ID, $MMS_FTS_TABLE_NAME.$BODY, $MMS_FTS_TABLE_NAME.$ID AS $MESSAGE_ID, @@ -68,18 +69,19 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa INNER JOIN ${ThreadTable.TABLE_NAME} ON $MMS_FTS_TABLE_NAME.$THREAD_ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.ID} WHERE $MMS_FTS_TABLE_NAME MATCH ? AND - ${MessageTable.TABLE_NAME}.${MessageTable.TYPE} & ${MmsSmsColumns.Types.GROUP_V2_BIT} = 0 AND - ${MessageTable.TABLE_NAME}.${MessageTable.TYPE} & ${MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION} = 0 - ORDER BY ${MmsSmsColumns.DATE_RECEIVED} DESC + ${MessageTable.TABLE_NAME}.${MessageTable.TYPE} & ${MessageTypes.GROUP_V2_BIT} = 0 AND + ${MessageTable.TABLE_NAME}.${MessageTable.TYPE} & ${MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION} = 0 + ORDER BY ${MessageTable.DATE_RECEIVED} DESC LIMIT 500 """ + @Language("sql") private const val MESSAGES_FOR_THREAD_QUERY = """ SELECT ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} AS $CONVERSATION_RECIPIENT, - ${MessageTable.TABLE_NAME}.${MmsSmsColumns.RECIPIENT_ID} AS $MESSAGE_RECIPIENT, + ${MessageTable.TABLE_NAME}.${MessageTable.RECIPIENT_ID} AS $MESSAGE_RECIPIENT, snippet($MMS_FTS_TABLE_NAME, -1, '', '', '$SNIPPET_WRAP', 7) AS $SNIPPET, - ${MessageTable.TABLE_NAME}.${MmsSmsColumns.DATE_RECEIVED}, + ${MessageTable.TABLE_NAME}.${MessageTable.DATE_RECEIVED}, $MMS_FTS_TABLE_NAME.$THREAD_ID, $MMS_FTS_TABLE_NAME.$BODY, $MMS_FTS_TABLE_NAME.$ID AS $MESSAGE_ID, @@ -90,8 +92,8 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa INNER JOIN ${ThreadTable.TABLE_NAME} ON $MMS_FTS_TABLE_NAME.$THREAD_ID = ${ThreadTable.TABLE_NAME}.${ThreadTable.ID} WHERE $MMS_FTS_TABLE_NAME MATCH ? AND - ${MessageTable.TABLE_NAME}.${MmsSmsColumns.THREAD_ID} = ? - ORDER BY ${MmsSmsColumns.DATE_RECEIVED} DESC + ${MessageTable.TABLE_NAME}.${MessageTable.THREAD_ID} = ? + ORDER BY ${MessageTable.DATE_RECEIVED} DESC LIMIT 500 """ } 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 c102260146..c5e5365ab3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -342,7 +342,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa mmsSms.getConversation(threadId).use { cursor -> if (cursor.count > length) { cursor.moveToPosition(length - 1) - max(trimBeforeDate, cursor.requireLong(MmsSmsColumns.DATE_RECEIVED)) + max(trimBeforeDate, cursor.requireLong(MessageTable.DATE_RECEIVED)) } else { trimBeforeDate } @@ -1364,7 +1364,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa if (drafts.isNotEmpty()) { val threadRecord: ThreadRecord? = getThreadRecord(threadId) if (threadRecord != null && - threadRecord.type == MmsSmsColumns.Types.BASE_DRAFT_TYPE && + threadRecord.type == MessageTypes.BASE_DRAFT_TYPE && threadRecord.date > record.timestamp ) { return false @@ -1626,12 +1626,12 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } private fun isSilentType(type: Long): Boolean { - return MmsSmsColumns.Types.isProfileChange(type) || - MmsSmsColumns.Types.isGroupV1MigrationEvent(type) || - MmsSmsColumns.Types.isChangeNumber(type) || - MmsSmsColumns.Types.isBoostRequest(type) || - MmsSmsColumns.Types.isGroupV2LeaveOnly(type) || - MmsSmsColumns.Types.isThreadMergeType(type) + return MessageTypes.isProfileChange(type) || + MessageTypes.isGroupV1MigrationEvent(type) || + MessageTypes.isChangeNumber(type) || + MessageTypes.isBoostRequest(type) || + MessageTypes.isGroupV2LeaveOnly(type) || + MessageTypes.isThreadMergeType(type) } fun readerFor(cursor: Cursor): Reader { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java index ceda538c53..f3c1a70ff1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.database.DraftTable; import org.thoughtcrime.securesms.database.GroupTable; import org.thoughtcrime.securesms.database.GroupReceiptTable; import org.thoughtcrime.securesms.database.IdentityTable; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.database.PushTable; import org.thoughtcrime.securesms.database.RecipientTable; @@ -405,7 +405,7 @@ public class ClassicOpenHelper extends SQLiteOpenHelper { cursor = db.query("sms", new String[] { "_id", "body", "type"}, "type & ? == 0", - new String[] {String.valueOf(MmsSmsColumns.Types.ENCRYPTION_MASK)}, + new String[] {String.valueOf(MessageTypes.ENCRYPTION_MASK)}, null, null, null); while (cursor.moveToNext()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java index a4df887ab5..f3766b0dfe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -22,7 +22,9 @@ import android.text.SpannableString; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTable; +import org.thoughtcrime.securesms.database.MessageTable.Status; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.recipients.Recipient; /** @@ -69,15 +71,15 @@ public abstract class DisplayRecord { public boolean isFailed() { return - MmsSmsColumns.Types.isFailedMessageType(type) || - MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) || - deliveryStatus >= MmsSmsColumns.Status.STATUS_FAILED; + MessageTypes.isFailedMessageType(type) || + MessageTypes.isPendingSecureSmsFallbackType(type) || + deliveryStatus >= MessageTable.Status.STATUS_FAILED; } public boolean isPending() { - return MmsSmsColumns.Types.isPendingMessageType(type) && - !MmsSmsColumns.Types.isIdentityVerified(type) && - !MmsSmsColumns.Types.isIdentityDefault(type); + return MessageTypes.isPendingMessageType(type) && + !MessageTypes.isIdentityVerified(type) && + !MessageTypes.isIdentityDefault(type); } @VisibleForTesting @@ -86,11 +88,11 @@ public abstract class DisplayRecord { } public boolean isSent() { - return MmsSmsColumns.Types.isSentType(type); + return MessageTypes.isSentType(type); } public boolean isOutgoing() { - return MmsSmsColumns.Types.isOutgoingMessageType(type); + return MessageTypes.isOutgoingMessageType(type); } public abstract SpannableString getDisplayBody(@NonNull Context context); @@ -112,23 +114,23 @@ public abstract class DisplayRecord { } public boolean isKeyExchange() { - return MmsSmsColumns.Types.isKeyExchangeType(type); + return MessageTypes.isKeyExchangeType(type); } public boolean isEndSession() { - return MmsSmsColumns.Types.isEndSessionType(type); + return MessageTypes.isEndSessionType(type); } public boolean isGroupUpdate() { - return MmsSmsColumns.Types.isGroupUpdate(type); + return MessageTypes.isGroupUpdate(type); } public boolean isGroupV2() { - return MmsSmsColumns.Types.isGroupV2(type); + return MessageTypes.isGroupV2(type); } public boolean isGroupQuit() { - return MmsSmsColumns.Types.isGroupQuit(type); + return MessageTypes.isGroupQuit(type); } public boolean isGroupAction() { @@ -136,59 +138,59 @@ public abstract class DisplayRecord { } public boolean isExpirationTimerUpdate() { - return MmsSmsColumns.Types.isExpirationTimerUpdate(type); + return MessageTypes.isExpirationTimerUpdate(type); } public boolean isCallLog() { - return MmsSmsColumns.Types.isCallLog(type); + return MessageTypes.isCallLog(type); } public boolean isJoined() { - return MmsSmsColumns.Types.isJoinedType(type); + return MessageTypes.isJoinedType(type); } public boolean isIncomingAudioCall() { - return MmsSmsColumns.Types.isIncomingAudioCall(type); + return MessageTypes.isIncomingAudioCall(type); } public boolean isIncomingVideoCall() { - return MmsSmsColumns.Types.isIncomingVideoCall(type); + return MessageTypes.isIncomingVideoCall(type); } public boolean isOutgoingAudioCall() { - return MmsSmsColumns.Types.isOutgoingAudioCall(type); + return MessageTypes.isOutgoingAudioCall(type); } public boolean isOutgoingVideoCall() { - return MmsSmsColumns.Types.isOutgoingVideoCall(type); + return MessageTypes.isOutgoingVideoCall(type); } public final boolean isMissedAudioCall() { - return MmsSmsColumns.Types.isMissedAudioCall(type); + return MessageTypes.isMissedAudioCall(type); } public final boolean isMissedVideoCall() { - return MmsSmsColumns.Types.isMissedVideoCall(type); + return MessageTypes.isMissedVideoCall(type); } public final boolean isGroupCall() { - return MmsSmsColumns.Types.isGroupCall(type); + return MessageTypes.isGroupCall(type); } public boolean isVerificationStatusChange() { - return MmsSmsColumns.Types.isIdentityDefault(type) || MmsSmsColumns.Types.isIdentityVerified(type); + return MessageTypes.isIdentityDefault(type) || MessageTypes.isIdentityVerified(type); } public boolean isProfileChange() { - return MmsSmsColumns.Types.isProfileChange(type); + return MessageTypes.isProfileChange(type); } public boolean isChangeNumber() { - return MmsSmsColumns.Types.isChangeNumber(type); + return MessageTypes.isChangeNumber(type); } public boolean isBoostRequest() { - return MmsSmsColumns.Types.isBoostRequest(type); + return MessageTypes.isBoostRequest(type); } public int getDeliveryStatus() { @@ -215,8 +217,8 @@ public abstract class DisplayRecord { } public boolean isDelivered() { - return (deliveryStatus >= MmsSmsColumns.Status.STATUS_COMPLETE && - deliveryStatus < MmsSmsColumns.Status.STATUS_PENDING) || deliveryReceiptCount > 0; + return (deliveryStatus >= Status.STATUS_COMPLETE && + deliveryStatus < Status.STATUS_PENDING) || deliveryReceiptCount > 0; } public boolean isRemoteViewed() { @@ -228,18 +230,18 @@ public abstract class DisplayRecord { } public boolean isPendingInsecureSmsFallback() { - return MmsSmsColumns.Types.isPendingInsecureSmsFallbackType(type); + return MessageTypes.isPendingInsecureSmsFallbackType(type); } public boolean isPaymentNotification() { - return MmsSmsColumns.Types.isPaymentsNotification(type); + return MessageTypes.isPaymentsNotification(type); } public boolean isPaymentsRequestToActivate() { - return MmsSmsColumns.Types.isPaymentsRequestToActivate(type); + return MessageTypes.isPaymentsRequestToActivate(type); } public boolean isPaymentsActivated() { - return MmsSmsColumns.Types.isPaymentsActivated(type); + return MessageTypes.isPaymentsActivated(type); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 8e28fbae65..22061cf913 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -32,7 +32,8 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.database.CallTable; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsColumns.Status; +import org.thoughtcrime.securesms.database.MessageTable.Status; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; @@ -129,11 +130,11 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { @Override @WorkerThread public SpannableString getDisplayBody(@NonNull Context context) { - if (MessageTable.Types.isChatSessionRefresh(type)) { + if (MessageTypes.isChatSessionRefresh(type)) { return emphasisAdded(context.getString(R.string.MmsMessageRecord_bad_encrypted_mms_message)); - } else if (MessageTable.Types.isDuplicateMessageType(type)) { + } else if (MessageTypes.isDuplicateMessageType(type)) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message)); - } else if (MessageTable.Types.isNoRemoteSessionType(type)) { + } else if (MessageTypes.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MmsMessageRecord_mms_message_encrypted_for_non_existing_session)); } else if (isLegacyMessage()) { return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 293abd1d26..603ae426b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -41,7 +41,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupChange; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; @@ -139,11 +139,11 @@ public abstract class MessageRecord extends DisplayRecord { public abstract boolean isMmsNotification(); public boolean isSecure() { - return MmsSmsColumns.Types.isSecureType(type); + return MessageTypes.isSecureType(type); } public boolean isLegacyMessage() { - return MmsSmsColumns.Types.isLegacyType(type); + return MessageTypes.isLegacyType(type); } @@ -493,7 +493,7 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isPush() { - return MmsSmsColumns.Types.isPushType(type) && !MmsSmsColumns.Types.isForcedSms(type); + return MessageTypes.isPushType(type) && !MessageTypes.isForcedSms(type); } public long getTimestamp() { @@ -508,15 +508,15 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isForcedSms() { - return MmsSmsColumns.Types.isForcedSms(type); + return MessageTypes.isForcedSms(type); } public boolean isIdentityVerified() { - return MmsSmsColumns.Types.isIdentityVerified(type); + return MessageTypes.isIdentityVerified(type); } public boolean isIdentityDefault() { - return MmsSmsColumns.Types.isIdentityDefault(type); + return MessageTypes.isIdentityDefault(type); } public boolean isIdentityMismatchFailure() { @@ -524,43 +524,43 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isBundleKeyExchange() { - return MmsSmsColumns.Types.isBundleKeyExchange(type); + return MessageTypes.isBundleKeyExchange(type); } public boolean isContentBundleKeyExchange() { - return MmsSmsColumns.Types.isContentBundleKeyExchange(type); + return MessageTypes.isContentBundleKeyExchange(type); } public boolean isRateLimited() { - return MmsSmsColumns.Types.isRateLimited(type); + return MessageTypes.isRateLimited(type); } public boolean isIdentityUpdate() { - return MmsSmsColumns.Types.isIdentityUpdate(type); + return MessageTypes.isIdentityUpdate(type); } public boolean isCorruptedKeyExchange() { - return MmsSmsColumns.Types.isCorruptedKeyExchange(type); + return MessageTypes.isCorruptedKeyExchange(type); } public boolean isBadDecryptType() { - return MmsSmsColumns.Types.isBadDecryptType(type); + return MessageTypes.isBadDecryptType(type); } public boolean isThreadMergeEventType() { - return MmsSmsColumns.Types.isThreadMergeType(type); + return MessageTypes.isThreadMergeType(type); } public boolean isSmsExportType() { - return MmsSmsColumns.Types.isSmsExport(type); + return MessageTypes.isSmsExport(type); } public boolean isInvalidVersionKeyExchange() { - return MmsSmsColumns.Types.isInvalidVersionKeyExchange(type); + return MessageTypes.isInvalidVersionKeyExchange(type); } public boolean isGroupV1MigrationEvent() { - return MmsSmsColumns.Types.isGroupV1MigrationEvent(type); + return MessageTypes.isGroupV1MigrationEvent(type); } public @NonNull GroupMigrationMembershipChange getGroupV1MigrationMembershipChanges() { @@ -612,7 +612,7 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isChatSessionRefresh() { - return MmsSmsColumns.Types.isChatSessionRefresh(type); + return MessageTypes.isChatSessionRefresh(type); } public boolean isInMemoryMessageRecord() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index 07bf00472b..f30a7f1bb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -24,7 +24,7 @@ import androidx.annotation.Nullable; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsColumns.Status; +import org.thoughtcrime.securesms.database.MessageTable.Status; import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge; import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.recipients.Recipient; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java index fb4b2b1219..f77d7a93c6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java @@ -1,28 +1,29 @@ package org.thoughtcrime.securesms.database.model; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTable; +import org.thoughtcrime.securesms.database.MessageTypes; final class StatusUtil { private StatusUtil() {} static boolean isDelivered(long deliveryStatus, int deliveryReceiptCount) { - return (deliveryStatus >= MmsSmsColumns.Status.STATUS_COMPLETE && - deliveryStatus < MmsSmsColumns.Status.STATUS_PENDING) || deliveryReceiptCount > 0; + return (deliveryStatus >= MessageTable.Status.STATUS_COMPLETE && + deliveryStatus < MessageTable.Status.STATUS_PENDING) || deliveryReceiptCount > 0; } static boolean isPending(long type) { - return MmsSmsColumns.Types.isPendingMessageType(type) && - !MmsSmsColumns.Types.isIdentityVerified(type) && - !MmsSmsColumns.Types.isIdentityDefault(type); + return MessageTypes.isPendingMessageType(type) && + !MessageTypes.isIdentityVerified(type) && + !MessageTypes.isIdentityDefault(type); } static boolean isFailed(long type, long deliveryStatus) { - return MmsSmsColumns.Types.isFailedMessageType(type) || - MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) || - deliveryStatus >= MmsSmsColumns.Status.STATUS_FAILED; + return MessageTypes.isFailedMessageType(type) || + MessageTypes.isPendingSecureSmsFallbackType(type) || + deliveryStatus >= MessageTable.Status.STATUS_FAILED; } static boolean isVerificationStatusChange(long type) { - return MmsSmsColumns.Types.isIdentityDefault(type) || MmsSmsColumns.Types.isIdentityVerified(type); + return MessageTypes.isIdentityDefault(type) || MessageTypes.isIdentityVerified(type); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java index 2ebcfd4061..9e8229db74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -22,7 +22,7 @@ import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTypes; import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.database.ThreadTable.Extra; import org.thoughtcrime.securesms.recipients.Recipient; @@ -141,15 +141,15 @@ public final class ThreadRecord { } public boolean isOutgoing() { - return MmsSmsColumns.Types.isOutgoingMessageType(type); + return MessageTypes.isOutgoingMessageType(type); } public boolean isOutgoingAudioCall() { - return MmsSmsColumns.Types.isOutgoingAudioCall(type); + return MessageTypes.isOutgoingAudioCall(type); } public boolean isOutgoingVideoCall() { - return MmsSmsColumns.Types.isOutgoingVideoCall(type); + return MessageTypes.isOutgoingVideoCall(type); } public boolean isVerificationStatusChange() { @@ -169,7 +169,7 @@ public final class ThreadRecord { } public boolean isPendingInsecureSmsFallback() { - return MmsSmsColumns.Types.isPendingInsecureSmsFallbackType(type); + return MessageTypes.isPendingInsecureSmsFallbackType(type); } public boolean isDelivered() { 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 22bc1e58a7..4d1b5cb127 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 @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.notifications.v2 import androidx.annotation.WorkerThread import org.signal.core.util.CursorUtil import org.signal.core.util.logging.Log -import org.thoughtcrime.securesms.database.MmsSmsColumns +import org.thoughtcrime.securesms.database.MessageTable import org.thoughtcrime.securesms.database.MmsSmsTable import org.thoughtcrime.securesms.database.NoSuchMessageException import org.thoughtcrime.securesms.database.RecipientTable @@ -36,7 +36,7 @@ object NotificationStateProvider { while (record != null) { val threadRecipient: Recipient? = SignalDatabase.threads.getRecipientForThreadId(record.threadId) if (threadRecipient != null) { - val hasUnreadReactions = CursorUtil.requireInt(unreadMessages, MmsSmsColumns.REACTIONS_UNREAD) == 1 + val hasUnreadReactions = CursorUtil.requireInt(unreadMessages, MessageTable.REACTIONS_UNREAD) == 1 val conversationId = ConversationId.fromMessageRecord(record) val parentRecord = conversationId.groupStoryId?.let { @@ -57,9 +57,9 @@ object NotificationStateProvider { threadRecipient = threadRecipient, thread = conversationId, stickyThread = stickyThreads.containsKey(conversationId), - isUnreadMessage = CursorUtil.requireInt(unreadMessages, MmsSmsColumns.READ) == 0, + isUnreadMessage = CursorUtil.requireInt(unreadMessages, MessageTable.READ) == 0, hasUnreadReactions = hasUnreadReactions, - lastReactionRead = CursorUtil.requireLong(unreadMessages, MmsSmsColumns.REACTIONS_LAST_SEEN), + lastReactionRead = CursorUtil.requireLong(unreadMessages, MessageTable.REACTIONS_LAST_SEEN), isParentStorySentBySelf = parentRecord?.isOutgoing ?: false, hasSelfRepliedToStory = hasSelfRepliedToGroupStory ?: false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java index c1b7210c90..02a5dc9dc1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java @@ -19,7 +19,6 @@ import org.thoughtcrime.securesms.database.GroupTable; import org.thoughtcrime.securesms.database.MentionTable; import org.thoughtcrime.securesms.database.MentionUtil; import org.thoughtcrime.securesms.database.MessageTable; -import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.database.SearchTable; import org.thoughtcrime.securesms.database.SignalDatabase; @@ -451,8 +450,8 @@ public class SearchRepository { Recipient messageRecipient = Recipient.live(messageRecipientId).get(); String body = CursorUtil.requireString(cursor, SearchTable.BODY); String bodySnippet = CursorUtil.requireString(cursor, SearchTable.SNIPPET); - long receivedMs = CursorUtil.requireLong(cursor, MmsSmsColumns.DATE_RECEIVED); - long threadId = CursorUtil.requireLong(cursor, MmsSmsColumns.THREAD_ID); + long receivedMs = CursorUtil.requireLong(cursor, MessageTable.DATE_RECEIVED); + long threadId = CursorUtil.requireLong(cursor, MessageTable.THREAD_ID); int messageId = CursorUtil.requireInt(cursor, SearchTable.MESSAGE_ID); boolean isMms = CursorUtil.requireInt(cursor, SearchTable.IS_MMS) == 1; diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java index 1739cea8c3..b8cc3fb1cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java @@ -6,7 +6,7 @@ import android.content.Intent; import android.telephony.SmsMessage; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobs.SmsSentJob; @@ -55,9 +55,9 @@ public class SmsDeliveryListener extends BroadcastReceiver { // Note: https://stackoverflow.com/a/33240109 if ("3gpp2".equals(intent.getStringExtra("format"))) { Log.w(TAG, "Correcting for CDMA delivery receipt..."); - if (status >> 24 <= 0) status = MmsSmsColumns.Status.STATUS_COMPLETE; - else if (status >> 24 == 2) status = MmsSmsColumns.Status.STATUS_PENDING; - else if (status >> 24 == 3) status = MmsSmsColumns.Status.STATUS_FAILED; + if (status >> 24 <= 0) status = MessageTable.Status.STATUS_COMPLETE; + else if (status >> 24 == 2) status = MessageTable.Status.STATUS_PENDING; + else if (status >> 24 == 3) status = MessageTable.Status.STATUS_FAILED; } jobManager.add(new SmsSentJob(messageId, isMultipart, DELIVERED_SMS_ACTION, status, runAttempt)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyDataSource.kt index 47d551660c..62348decf3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyDataSource.kt @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.stories.viewer.reply.group import org.signal.paging.PagedDataSource import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.database.MessageTable -import org.thoughtcrime.securesms.database.MmsSmsColumns +import org.thoughtcrime.securesms.database.MessageTypes import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MmsMessageRecord @@ -38,7 +38,7 @@ class StoryGroupReplyDataSource(private val parentStoryId: Long) : PagedDataSour private fun readRowFromRecord(record: MmsMessageRecord): ReplyBody { return when { record.isRemoteDelete -> ReplyBody.RemoteDelete(record) - MmsSmsColumns.Types.isStoryReaction(record.type) -> ReplyBody.Reaction(record) + MessageTypes.isStoryReaction(record.type) -> ReplyBody.Reaction(record) else -> ReplyBody.Text( ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(ApplicationDependencies.getApplication(), record) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt index 4cd6f607bf..32734743c6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt @@ -4,7 +4,7 @@ package org.thoughtcrime.securesms.util import android.content.Context import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.database.MmsSmsColumns +import org.thoughtcrime.securesms.database.MessageTypes import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord @@ -42,7 +42,7 @@ fun MessageRecord.hasThumbnail(): Boolean = isMms && (this as MmsMessageRecord).slideDeck.thumbnailSlide != null fun MessageRecord.isStoryReaction(): Boolean = - isMms && MmsSmsColumns.Types.isStoryReaction(type) + isMms && MessageTypes.isStoryReaction(type) fun MessageRecord.isStory(): Boolean = isMms && (this as MmsMessageRecord).storyType.isStory diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/database/GV2UpdateTransformer.kt b/app/src/spinner/java/org/thoughtcrime/securesms/database/GV2UpdateTransformer.kt index 0883fb4d3b..532345a047 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/database/GV2UpdateTransformer.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/database/GV2UpdateTransformer.kt @@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.util.Base64 object GV2UpdateTransformer : ColumnTransformer { override fun matches(tableName: String?, columnName: String): Boolean { - return columnName == MmsSmsColumns.BODY && (tableName == null || tableName == MessageTable.TABLE_NAME) + return columnName == MessageTable.BODY && (tableName == null || tableName == MessageTable.TABLE_NAME) } override fun transform(tableName: String?, columnName: String, cursor: Cursor): String { @@ -23,9 +23,9 @@ object GV2UpdateTransformer : ColumnTransformer { return DefaultColumnTransformer.transform(tableName, columnName, cursor) } - val body: String? = CursorUtil.requireString(cursor, MmsSmsColumns.BODY) + val body: String? = CursorUtil.requireString(cursor, MessageTable.BODY) - return if (MmsSmsColumns.Types.isGroupV2(type) && MmsSmsColumns.Types.isGroupUpdate(type) && body != null) { + return if (MessageTypes.isGroupV2(type) && MessageTypes.isGroupUpdate(type) && body != null) { val decoded = Base64.decode(body) val decryptedGroupV2Context = DecryptedGroupV2Context.parseFrom(decoded) val gv2ChangeDescription: UpdateDescription = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), body, null) @@ -39,7 +39,7 @@ object GV2UpdateTransformer : ColumnTransformer { private fun Cursor.getMessageType(): Long { return when { - getColumnIndex(MmsSmsColumns.TYPE) != -1 -> requireLong(MmsSmsColumns.TYPE) + getColumnIndex(MessageTable.TYPE) != -1 -> requireLong(MessageTable.TYPE) else -> -1 } } diff --git a/app/src/spinner/java/org/thoughtcrime/securesms/database/MessageBitmaskColumnTransformer.kt b/app/src/spinner/java/org/thoughtcrime/securesms/database/MessageBitmaskColumnTransformer.kt index fb4852aa4d..889c3640c3 100644 --- a/app/src/spinner/java/org/thoughtcrime/securesms/database/MessageBitmaskColumnTransformer.kt +++ b/app/src/spinner/java/org/thoughtcrime/securesms/database/MessageBitmaskColumnTransformer.kt @@ -3,62 +3,62 @@ package org.thoughtcrime.securesms.database import android.database.Cursor import org.signal.core.util.requireLong import org.signal.spinner.ColumnTransformer -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BAD_DECRYPT_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_DRAFT_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_INBOX_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_OUTBOX_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_PENDING_INSECURE_SMS_FALLBACK -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_PENDING_SECURE_SMS_FALLBACK -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_SENDING_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_SENT_FAILED_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_SENT_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BASE_TYPE_MASK -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.BOOST_REQUEST_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.CHANGE_NUMBER_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.ENCRYPTION_REMOTE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.ENCRYPTION_REMOTE_DUPLICATE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.ENCRYPTION_REMOTE_FAILED_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.ENCRYPTION_REMOTE_LEGACY_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.ENCRYPTION_REMOTE_NO_SESSION_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.END_SESSION_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.EXPIRATION_TIMER_UPDATE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_LEAVE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_UPDATE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.GV1_MIGRATION_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.INCOMING_AUDIO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.INCOMING_VIDEO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.INVALID_MESSAGE_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.JOINED_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_BUNDLE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_CONTENT_FORMAT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_CORRUPTED_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.KEY_EXCHANGE_INVALID_VERSION_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.MESSAGE_FORCE_SMS_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.MESSAGE_RATE_LIMITED_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.MISSED_AUDIO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.MISSED_VIDEO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.OUTGOING_AUDIO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.OUTGOING_MESSAGE_TYPES -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.OUTGOING_VIDEO_CALL_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.PROFILE_CHANGE_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.PUSH_MESSAGE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SECURE_MESSAGE_BIT -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SMS_EXPORT_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPES_MASK -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPE_GIFT_BADGE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_ACTIVATED -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPE_PAYMENTS_NOTIFICATION -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.SPECIAL_TYPE_STORY_REACTION -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.THREAD_MERGE_TYPE -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types.UNSUPPORTED_MESSAGE_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BAD_DECRYPT_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_DRAFT_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_INBOX_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_OUTBOX_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_PENDING_INSECURE_SMS_FALLBACK +import org.thoughtcrime.securesms.database.MessageTypes.BASE_PENDING_SECURE_SMS_FALLBACK +import org.thoughtcrime.securesms.database.MessageTypes.BASE_SENDING_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_SENT_FAILED_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_SENT_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.BASE_TYPE_MASK +import org.thoughtcrime.securesms.database.MessageTypes.BOOST_REQUEST_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.CHANGE_NUMBER_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.ENCRYPTION_REMOTE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.ENCRYPTION_REMOTE_DUPLICATE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT +import org.thoughtcrime.securesms.database.MessageTypes.ENCRYPTION_REMOTE_LEGACY_BIT +import org.thoughtcrime.securesms.database.MessageTypes.ENCRYPTION_REMOTE_NO_SESSION_BIT +import org.thoughtcrime.securesms.database.MessageTypes.END_SESSION_BIT +import org.thoughtcrime.securesms.database.MessageTypes.EXPIRATION_TIMER_UPDATE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.GROUP_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.GROUP_LEAVE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.GROUP_UPDATE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.GROUP_V2_BIT +import org.thoughtcrime.securesms.database.MessageTypes.GROUP_V2_LEAVE_BITS +import org.thoughtcrime.securesms.database.MessageTypes.GV1_MIGRATION_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.INCOMING_AUDIO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.INCOMING_VIDEO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.INVALID_MESSAGE_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.JOINED_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_BUNDLE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_CONTENT_FORMAT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_CORRUPTED_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_IDENTITY_UPDATE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT +import org.thoughtcrime.securesms.database.MessageTypes.KEY_EXCHANGE_INVALID_VERSION_BIT +import org.thoughtcrime.securesms.database.MessageTypes.MESSAGE_FORCE_SMS_BIT +import org.thoughtcrime.securesms.database.MessageTypes.MESSAGE_RATE_LIMITED_BIT +import org.thoughtcrime.securesms.database.MessageTypes.MISSED_AUDIO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.MISSED_VIDEO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.OUTGOING_AUDIO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.OUTGOING_MESSAGE_TYPES +import org.thoughtcrime.securesms.database.MessageTypes.OUTGOING_VIDEO_CALL_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.PROFILE_CHANGE_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.PUSH_MESSAGE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.SECURE_MESSAGE_BIT +import org.thoughtcrime.securesms.database.MessageTypes.SMS_EXPORT_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPES_MASK +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPE_GIFT_BADGE +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION +import org.thoughtcrime.securesms.database.MessageTypes.SPECIAL_TYPE_STORY_REACTION +import org.thoughtcrime.securesms.database.MessageTypes.THREAD_MERGE_TYPE +import org.thoughtcrime.securesms.database.MessageTypes.UNSUPPORTED_MESSAGE_TYPE object MessageBitmaskColumnTransformer : ColumnTransformer { diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/FakeMessageRecords.kt b/app/src/test/java/org/thoughtcrime/securesms/database/FakeMessageRecords.kt index 7765aa3691..be74aaa27b 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/FakeMessageRecords.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/FakeMessageRecords.kt @@ -115,7 +115,7 @@ object FakeMessageRecords { body: String = "body", slideDeck: SlideDeck = SlideDeck(), partCount: Int = slideDeck.slides.count(), - mailbox: Long = MmsSmsColumns.Types.BASE_INBOX_TYPE, + mailbox: Long = MessageTypes.BASE_INBOX_TYPE, mismatches: Set = emptySet(), failures: Set = emptySet(), subscriptionId: Int = -1, diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/MmsDatabaseTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/MmsDatabaseTest.kt index 72809301b8..96bd22cea3 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/MmsDatabaseTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/MmsDatabaseTest.kt @@ -12,7 +12,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config -import org.thoughtcrime.securesms.database.MmsSmsColumns.Types import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.database.model.StoryViewState import org.thoughtcrime.securesms.testing.TestDatabaseUtil @@ -40,37 +39,37 @@ class MmsDatabaseTest { @Test fun `isGroupQuitMessage when normal message, return false`() { - val id = TestMms.insert(db, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT) + val id = TestMms.insert(db, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT) assertFalse(messageTable.isGroupQuitMessage(id)) } @Test fun `isGroupQuitMessage when legacy quit message, return true`() { - val id = TestMms.insert(db, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT or Types.GROUP_LEAVE_BIT) + val id = TestMms.insert(db, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT or MessageTypes.GROUP_LEAVE_BIT) assertTrue(messageTable.isGroupQuitMessage(id)) } @Test fun `isGroupQuitMessage when GV2 leave update, return false`() { - val id = TestMms.insert(db, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT or Types.GROUP_LEAVE_BIT or Types.GROUP_V2_BIT or Types.GROUP_UPDATE_BIT) + val id = TestMms.insert(db, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT or MessageTypes.GROUP_LEAVE_BIT or MessageTypes.GROUP_V2_BIT or MessageTypes.GROUP_UPDATE_BIT) assertFalse(messageTable.isGroupQuitMessage(id)) } @Test fun `getLatestGroupQuitTimestamp when only normal message, return -1`() { - TestMms.insert(db, threadId = 1, sentTimeMillis = 1, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT) + TestMms.insert(db, threadId = 1, sentTimeMillis = 1, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT) assertEquals(-1, messageTable.getLatestGroupQuitTimestamp(1, 4)) } @Test fun `getLatestGroupQuitTimestamp when legacy quit, return message timestamp`() { - TestMms.insert(db, threadId = 1, sentTimeMillis = 2, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT or Types.GROUP_LEAVE_BIT) + TestMms.insert(db, threadId = 1, sentTimeMillis = 2, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT or MessageTypes.GROUP_LEAVE_BIT) assertEquals(2, messageTable.getLatestGroupQuitTimestamp(1, 4)) } @Test fun `getLatestGroupQuitTimestamp when GV2 leave update message, return -1`() { - TestMms.insert(db, threadId = 1, sentTimeMillis = 3, type = Types.BASE_SENDING_TYPE or Types.SECURE_MESSAGE_BIT or Types.PUSH_MESSAGE_BIT or Types.GROUP_LEAVE_BIT or Types.GROUP_V2_BIT or Types.GROUP_UPDATE_BIT) + TestMms.insert(db, threadId = 1, sentTimeMillis = 3, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT or MessageTypes.GROUP_LEAVE_BIT or MessageTypes.GROUP_V2_BIT or MessageTypes.GROUP_UPDATE_BIT) assertEquals(-1, messageTable.getLatestGroupQuitTimestamp(1, 4)) } @@ -109,7 +108,7 @@ class MmsDatabaseTest { @Test fun `Given only outgoing story in database, when I getStoryViewState, then I expect VIEWED`() { - TestMms.insert(db, threadId = 1, storyType = StoryType.STORY_WITH_REPLIES, type = Types.BASE_OUTBOX_TYPE) + TestMms.insert(db, threadId = 1, storyType = StoryType.STORY_WITH_REPLIES, type = MessageTypes.BASE_OUTBOX_TYPE) assertEquals(StoryViewState.VIEWED, messageTable.getStoryViewState(1)) } } 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 88152830b8..ab547027e9 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/MmsSmsDatabaseTest.kt @@ -40,7 +40,7 @@ class MmsSmsDatabaseTest { TestSms.insert(db) mmsSmsTable.getConversationSnippetCursor(1).use { cursor -> cursor.moveToFirst() - assertEquals(1, CursorUtil.requireLong(cursor, MmsSmsColumns.ID)) + assertEquals(1, CursorUtil.requireLong(cursor, MessageTable.ID)) } } @@ -49,7 +49,7 @@ class MmsSmsDatabaseTest { TestMms.insert(db) mmsSmsTable.getConversationSnippetCursor(1).use { cursor -> cursor.moveToFirst() - assertEquals(1, CursorUtil.requireLong(cursor, MmsSmsColumns.ID)) + assertEquals(1, CursorUtil.requireLong(cursor, MessageTable.ID)) } } @@ -60,13 +60,13 @@ class MmsSmsDatabaseTest { TestMms.insert(db, receivedTimestampMillis = timestamp + 2) mmsSmsTable.getConversationSnippetCursor(1).use { cursor -> cursor.moveToFirst() - assertEquals(1, CursorUtil.requireLong(cursor, MmsSmsColumns.ID)) + assertEquals(1, CursorUtil.requireLong(cursor, MessageTable.ID)) } - TestSms.insert(db, receivedTimestampMillis = timestamp + 3, type = MmsSmsColumns.Types.BASE_SENDING_TYPE or MmsSmsColumns.Types.SECURE_MESSAGE_BIT or MmsSmsColumns.Types.PUSH_MESSAGE_BIT or MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS) + TestSms.insert(db, receivedTimestampMillis = timestamp + 3, type = MessageTypes.BASE_SENDING_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT or MessageTypes.GROUP_V2_LEAVE_BITS) mmsSmsTable.getConversationSnippetCursor(1).use { cursor -> cursor.moveToFirst() - assertEquals(1, CursorUtil.requireLong(cursor, MmsSmsColumns.ID)) + assertEquals(1, CursorUtil.requireLong(cursor, MessageTable.ID)) } } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt index 2864cdf04f..a07f5db505 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt @@ -61,7 +61,7 @@ class SmsDatabaseTest { @Test fun `hasMeaningfulMessage when GV2 create message only, return true`() { - TestSms.insert(db, type = MmsSmsColumns.Types.BASE_INBOX_TYPE or MmsSmsColumns.Types.SECURE_MESSAGE_BIT or MmsSmsColumns.Types.GROUP_V2_BIT or MmsSmsColumns.Types.GROUP_UPDATE_BIT) + TestSms.insert(db, type = MessageTypes.BASE_INBOX_TYPE or MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.GROUP_V2_BIT or MessageTypes.GROUP_UPDATE_BIT) assertTrue(messageTable.hasMeaningfulMessage(1)) } @@ -69,22 +69,22 @@ class SmsDatabaseTest { fun `hasMeaningfulMessage when empty and then with ignored types, always return false`() { assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.IGNORABLE_TYPESMASK_WHEN_COUNTING) + TestSms.insert(db, type = MessageTypes.IGNORABLE_TYPESMASK_WHEN_COUNTING) assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.PROFILE_CHANGE_TYPE) + TestSms.insert(db, type = MessageTypes.PROFILE_CHANGE_TYPE) assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.CHANGE_NUMBER_TYPE) + TestSms.insert(db, type = MessageTypes.CHANGE_NUMBER_TYPE) assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.BOOST_REQUEST_TYPE) + TestSms.insert(db, type = MessageTypes.BOOST_REQUEST_TYPE) assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.SMS_EXPORT_TYPE) + TestSms.insert(db, type = MessageTypes.SMS_EXPORT_TYPE) assertFalse(messageTable.hasMeaningfulMessage(1)) - TestSms.insert(db, type = MmsSmsColumns.Types.BASE_INBOX_TYPE or MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS) + TestSms.insert(db, type = MessageTypes.BASE_INBOX_TYPE or MessageTypes.GROUP_V2_LEAVE_BITS) assertFalse(messageTable.hasMeaningfulMessage(1)) } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/TestMms.kt b/app/src/test/java/org/thoughtcrime/securesms/database/TestMms.kt index d8f0e18a6e..68d15b90a2 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/TestMms.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/TestMms.kt @@ -24,7 +24,7 @@ object TestMms { expiresIn: Long = 0, viewOnce: Boolean = false, distributionType: Int = ThreadTable.DistributionTypes.DEFAULT, - type: Long = MmsSmsColumns.Types.BASE_INBOX_TYPE, + type: Long = MessageTypes.BASE_INBOX_TYPE, unread: Boolean = false, viewed: Boolean = false, threadId: Long = 1, @@ -69,7 +69,7 @@ object TestMms { message: OutgoingMessage, recipientId: RecipientId = message.recipient.id, body: String = message.body, - type: Long = MmsSmsColumns.Types.BASE_INBOX_TYPE, + type: Long = MessageTypes.BASE_INBOX_TYPE, unread: Boolean = false, viewed: Boolean = false, threadId: Long = 1, @@ -80,19 +80,19 @@ object TestMms { put(MessageTable.MMS_MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ) put(MessageTable.TYPE, type) - put(MmsSmsColumns.THREAD_ID, threadId) - put(MmsSmsColumns.READ, if (unread) 0 else 1) + put(MessageTable.THREAD_ID, threadId) + put(MessageTable.READ, if (unread) 0 else 1) put(MessageTable.DATE_RECEIVED, receivedTimestampMillis) - put(MmsSmsColumns.SMS_SUBSCRIPTION_ID, message.subscriptionId) - put(MmsSmsColumns.EXPIRES_IN, message.expiresIn) + put(MessageTable.SMS_SUBSCRIPTION_ID, message.subscriptionId) + put(MessageTable.EXPIRES_IN, message.expiresIn) put(MessageTable.VIEW_ONCE, message.isViewOnce) - put(MmsSmsColumns.RECIPIENT_ID, recipientId.serialize()) - put(MmsSmsColumns.DELIVERY_RECEIPT_COUNT, 0) - put(MmsSmsColumns.RECEIPT_TIMESTAMP, 0) - put(MmsSmsColumns.VIEWED_RECEIPT_COUNT, if (viewed) 1 else 0) + put(MessageTable.RECIPIENT_ID, recipientId.serialize()) + put(MessageTable.DELIVERY_RECEIPT_COUNT, 0) + put(MessageTable.RECEIPT_TIMESTAMP, 0) + put(MessageTable.VIEWED_RECEIPT_COUNT, if (viewed) 1 else 0) put(MessageTable.STORY_TYPE, message.storyType.code) - put(MmsSmsColumns.BODY, body) + put(MessageTable.BODY, body) put(MessageTable.MENTIONS_SELF, 0) } @@ -101,8 +101,8 @@ object TestMms { fun markAsRemoteDelete(db: SQLiteDatabase, messageId: Long) { val values = ContentValues() - values.put(MmsSmsColumns.REMOTE_DELETED, 1) - values.putNull(MmsSmsColumns.BODY) + values.put(MessageTable.REMOTE_DELETED, 1) + values.putNull(MessageTable.BODY) values.putNull(MessageTable.QUOTE_BODY) values.putNull(MessageTable.QUOTE_AUTHOR) values.put(MessageTable.QUOTE_TYPE, -1) diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/TestSms.kt b/app/src/test/java/org/thoughtcrime/securesms/database/TestSms.kt index 717b075f65..1b6f3d4a93 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/TestSms.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/TestSms.kt @@ -25,7 +25,7 @@ object TestSms { expiresInMillis: Long = 0, unidentified: Boolean = false, serverGuid: String = UUID.randomUUID().toString(), - type: Long = MmsSmsColumns.Types.BASE_INBOX_TYPE, + type: Long = MessageTypes.BASE_INBOX_TYPE, unread: Boolean = false, threadId: Long = 1 ): Long { @@ -54,24 +54,24 @@ object TestSms { fun insert( db: AndroidSQLiteDatabase, message: IncomingTextMessage, - type: Long = MmsSmsColumns.Types.BASE_INBOX_TYPE, + type: Long = MessageTypes.BASE_INBOX_TYPE, unread: Boolean = false, threadId: Long = 1 ): Long { val values = ContentValues().apply { - put(MmsSmsColumns.RECIPIENT_ID, message.sender.serialize()) - put(MmsSmsColumns.RECIPIENT_DEVICE_ID, message.senderDeviceId) - put(MmsSmsColumns.DATE_RECEIVED, message.receivedTimestampMillis) - put(MmsSmsColumns.DATE_SENT, message.sentTimestampMillis) - put(MmsSmsColumns.DATE_SERVER, message.serverTimestampMillis) - put(MmsSmsColumns.READ, if (unread) 0 else 1) - put(MmsSmsColumns.SMS_SUBSCRIPTION_ID, message.subscriptionId) - put(MmsSmsColumns.EXPIRES_IN, message.expiresIn) - put(MmsSmsColumns.UNIDENTIFIED, message.isUnidentified) - put(MmsSmsColumns.BODY, message.messageBody) - put(MmsSmsColumns.TYPE, type) - put(MmsSmsColumns.THREAD_ID, threadId) - put(MmsSmsColumns.SERVER_GUID, message.serverGuid) + put(MessageTable.RECIPIENT_ID, message.sender.serialize()) + put(MessageTable.RECIPIENT_DEVICE_ID, message.senderDeviceId) + put(MessageTable.DATE_RECEIVED, message.receivedTimestampMillis) + put(MessageTable.DATE_SENT, message.sentTimestampMillis) + put(MessageTable.DATE_SERVER, message.serverTimestampMillis) + put(MessageTable.READ, if (unread) 0 else 1) + put(MessageTable.SMS_SUBSCRIPTION_ID, message.subscriptionId) + put(MessageTable.EXPIRES_IN, message.expiresIn) + put(MessageTable.UNIDENTIFIED, message.isUnidentified) + put(MessageTable.BODY, message.messageBody) + put(MessageTable.TYPE, type) + put(MessageTable.THREAD_ID, threadId) + put(MessageTable.SERVER_GUID, message.serverGuid) } return db.insert(MessageTable.TABLE_NAME, null, values)