mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-19 08:09:12 +01:00
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:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user