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.
This commit is contained in:
Greyson Parrelli
2022-12-30 15:56:47 -05:00
parent 3708cc5583
commit f149c0adb9
32 changed files with 883 additions and 989 deletions

View File

@@ -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) {

View File

@@ -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)

View File

@@ -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<Long, Conve
recipients.add(record.getRecipient());
needsResolve.add(record.getGroupMessageSender());
if (!MmsSmsColumns.Types.isGroupV2(record.getType())) {
if (!MessageTypes.isGroupV2(record.getType())) {
needsResolve.add(record.getRecipient().getId());
} else if (MmsSmsColumns.Types.isGroupUpdate(record.getType())) {
} else if (MessageTypes.isGroupUpdate(record.getType())) {
UpdateDescription description = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), record.getBody(), null);
needsResolve.addAll(description.getMentioned().stream().map(RecipientId::from).collect(Collectors.toList()));
}

View File

@@ -58,7 +58,7 @@ import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.components.TypingIndicatorView;
import org.thoughtcrime.securesms.components.emoji.EmojiStrings;
import org.thoughtcrime.securesms.conversationlist.model.ConversationSet;
import org.thoughtcrime.securesms.database.MmsSmsColumns;
import org.thoughtcrime.securesms.database.MessageTypes;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.database.model.LiveUpdateMessage;
import org.thoughtcrime.securesms.database.model.MessageRecord;
@@ -425,7 +425,7 @@ public final class ConversationListItem extends ConstraintLayout implements Bind
}
private void setStatusIcons(ThreadRecord thread) {
if (MmsSmsColumns.Types.isBadDecryptType(thread.getType())) {
if (MessageTypes.isBadDecryptType(thread.getType())) {
deliveryStatusIndicator.setNone();
alertView.setFailed();
} else if (!thread.isOutgoing() ||
@@ -508,51 +508,51 @@ public final class ConversationListItem extends ConstraintLayout implements Bind
if (!thread.isMessageRequestAccepted()) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_message_request), defaultTint);
} else if (MmsSmsColumns.Types.isGroupUpdate(thread.getType())) {
} else if (MessageTypes.isGroupUpdate(thread.getType())) {
if (thread.getRecipient().isPushV2Group()) {
return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getBody(), null), defaultTint);
} else {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_group_updated), R.drawable.ic_update_group_16, defaultTint);
}
} else if (MmsSmsColumns.Types.isGroupQuit(thread.getType())) {
} else if (MessageTypes.isGroupQuit(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_left_the_group), R.drawable.ic_update_group_leave_16, defaultTint);
} else if (MmsSmsColumns.Types.isKeyExchangeType(thread.getType())) {
} else if (MessageTypes.isKeyExchangeType(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ConversationListItem_key_exchange_message), defaultTint);
} else if (MmsSmsColumns.Types.isChatSessionRefresh(thread.getType())) {
} else if (MessageTypes.isChatSessionRefresh(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_chat_session_refreshed), R.drawable.ic_refresh_16, defaultTint);
} else if (MmsSmsColumns.Types.isNoRemoteSessionType(thread.getType())) {
} else if (MessageTypes.isNoRemoteSessionType(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session), defaultTint);
} else if (MmsSmsColumns.Types.isEndSessionType(thread.getType())) {
} else if (MessageTypes.isEndSessionType(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_secure_session_reset), defaultTint);
} else if (MmsSmsColumns.Types.isLegacyType(thread.getType())) {
} else if (MessageTypes.isLegacyType(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported), defaultTint);
} else if (MmsSmsColumns.Types.isDraftMessageType(thread.getType())) {
} else if (MessageTypes.isDraftMessageType(thread.getType())) {
String draftText = context.getString(R.string.ThreadRecord_draft);
return emphasisAdded(context, draftText + " " + thread.getBody(), defaultTint);
} else if (MmsSmsColumns.Types.isOutgoingAudioCall(thread.getType())) {
} else if (MessageTypes.isOutgoingAudioCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_called), R.drawable.ic_update_audio_call_outgoing_16, defaultTint);
} else if (MmsSmsColumns.Types.isOutgoingVideoCall(thread.getType())) {
} else if (MessageTypes.isOutgoingVideoCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_called), R.drawable.ic_update_video_call_outgoing_16, defaultTint);
} else if (MmsSmsColumns.Types.isIncomingAudioCall(thread.getType())) {
} else if (MessageTypes.isIncomingAudioCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you), R.drawable.ic_update_audio_call_incoming_16, defaultTint);
} else if (MmsSmsColumns.Types.isIncomingVideoCall(thread.getType())) {
} else if (MessageTypes.isIncomingVideoCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you), R.drawable.ic_update_video_call_incoming_16, defaultTint);
} else if (MmsSmsColumns.Types.isMissedAudioCall(thread.getType())) {
} else if (MessageTypes.isMissedAudioCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_audio_call), R.drawable.ic_update_audio_call_missed_16, defaultTint);
} else if (MmsSmsColumns.Types.isMissedVideoCall(thread.getType())) {
} else if (MessageTypes.isMissedVideoCall(thread.getType())) {
return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_video_call), R.drawable.ic_update_video_call_missed_16, defaultTint);
} else if (MmsSmsColumns.Types.isGroupCall(thread.getType())) {
} else if (MessageTypes.isGroupCall(thread.getType())) {
return emphasisAdded(context, MessageRecord.getGroupCallUpdateDescription(context, thread.getBody(), false), defaultTint);
} else if (MmsSmsColumns.Types.isJoinedType(thread.getType())) {
} else if (MessageTypes.isJoinedType(thread.getType())) {
return emphasisAdded(recipientToStringAsync(thread.getRecipient().getId(), r -> 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();

View File

@@ -157,11 +157,11 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
companion object Deserializer : Serializer<Call, Cursor> {
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
}
}

View File

@@ -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<DatabaseAttachment> 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));

View File

@@ -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<MarkedMessageInfo> 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<MarkedMessageInfo> setOutgoingGiftsRevealed(@NonNull List<Long> 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<MarkedMessageInfo> 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<UUID> 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<InsertResult> 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<NetworkFailure> 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<InsertResult> 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<RecipientId, EarlyReceiptCache.Receipt> 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<MessageRecord> 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<MessageRecord> results = new ArrayList<>(reader.getCount());
@@ -3091,7 +3120,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
public Set<Long> 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<Long> ids = new HashSet<>();
@@ -3202,7 +3231,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
}
public List<MessageRecord> 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<String> 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<String> 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<Long> 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) {

View File

@@ -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.
* <p>
* 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.
* <p>
* 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}.
*
* <pre>
* ____________________________________________ 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
* </pre>
*/
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;
}
}

View File

@@ -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}.
*
* <pre>
* ____________________________________________ 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
* </pre>
*/
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;
// }
}
}

View File

@@ -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<MessageRecord> 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);
}

View File

@@ -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
"""
}

View File

@@ -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 {

View File

@@ -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()) {

View File

@@ -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);
}
}

View File

@@ -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));

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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() {

View File

@@ -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
)

View File

@@ -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;

View File

@@ -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));

View File

@@ -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)
)

View File

@@ -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