Remove isMms from MessageId.

This commit is contained in:
Greyson Parrelli
2022-12-14 21:45:52 -05:00
parent 60ae883df6
commit 3850c9c89d
33 changed files with 103 additions and 172 deletions

View File

@@ -259,7 +259,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal
messageValues += ContentValues().apply {
put(MessageTable.PAYLOAD_ID, payloadId)
put(MessageTable.MESSAGE_ID, messageId.id)
put(MessageTable.IS_MMS, if (messageId.mms) 1 else 0)
put(MessageTable.IS_MMS, 0)
}
}
SqlUtil.buildBulkInsert(MessageTable.TABLE_NAME, arrayOf(MessageTable.PAYLOAD_ID, MessageTable.MESSAGE_ID, MessageTable.IS_MMS), messageValues)
@@ -292,8 +292,7 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal
while (messageCursor.moveToNext()) {
messageIds.add(
MessageId(
id = CursorUtil.requireLong(messageCursor, MessageTable.MESSAGE_ID),
mms = CursorUtil.requireBoolean(messageCursor, MessageTable.IS_MMS)
id = CursorUtil.requireLong(messageCursor, MessageTable.MESSAGE_ID)
)
)
}

View File

@@ -454,7 +454,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
db.endTransaction();
}
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(id, false));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(id));
ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners();
}
@@ -498,7 +498,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
SyncMessageId syncMessageId = new SyncMessageId(recipientId, dateSent);
StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE));
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId, true), null));
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId), null));
}
return results;
@@ -536,7 +536,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
long dateSent = CursorUtil.requireLong(cursor, DATE_SENT);
SyncMessageId syncMessageId = new SyncMessageId(recipientId, dateSent);
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId, true), null));
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId), null));
ContentValues contentValues = new ContentValues();
contentValues.put(VIEWED_RECEIPT_COUNT, 1);
@@ -575,7 +575,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
SyncMessageId syncMessageId = new SyncMessageId(recipientId, dateSent);
StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE));
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId, true), null));
results.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId), null));
ContentValues contentValues = new ContentValues();
contentValues.put(VIEWED_RECEIPT_COUNT, 1);
@@ -1327,7 +1327,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
RecipientId rowRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID)));
if (Recipient.self().getId().equals(authorId) || rowRecipientId.equals(authorId)) {
return new MessageId(CursorUtil.requireLong(cursor, ID), true);
return new MessageId(CursorUtil.requireLong(cursor, ID));
}
}
}
@@ -1700,7 +1700,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
SignalDatabase.groupReceipts().update(ourRecipientId, id, status, timestamp);
messageUpdates.add(new MessageUpdate(threadId, new MessageId(id, true)));
messageUpdates.add(new MessageUpdate(threadId, new MessageId(id)));
}
}
}
@@ -1855,13 +1855,13 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
public void markAsForcedSms(long messageId) {
long threadId = getThreadIdForMessage(messageId);
updateMailboxBitmask(messageId, Types.PUSH_MESSAGE_BIT, Types.MESSAGE_FORCE_SMS_BIT, Optional.of(threadId));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
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));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
}
public void clearRateLimitStatus(@NonNull Collection<Long> ids) {
@@ -1883,27 +1883,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));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
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));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
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));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
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));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners();
}
@@ -1930,7 +1930,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
deletedAttachments = SignalDatabase.attachments().deleteAttachmentsForMessage(messageId);
SignalDatabase.mentions().deleteMentionsForMessage(messageId);
SignalDatabase.messageLog().deleteAllRelatedToMessage(messageId, true);
SignalDatabase.reactions().deleteReactions(new MessageId(messageId, true));
SignalDatabase.reactions().deleteReactions(new MessageId(messageId));
deleteGroupStoryReplies(messageId);
disassociateStoryQuotes(messageId);
@@ -1942,7 +1942,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
db.endTransaction();
}
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
ApplicationDependencies.getDatabaseObserver().notifyConversationListListeners();
if (deletedAttachments) {
@@ -1956,7 +1956,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
contentValues.put(MMS_STATUS, state);
database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {messageId + ""});
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
}
public void markAsInsecure(long messageId) {
@@ -2035,7 +2035,6 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
public @NonNull List<StoryType> getStoryTypes(@NonNull List<MessageId> messageIds) {
List<Long> mmsMessages = messageIds.stream()
.filter(MessageId::isMms)
.map(MessageId::getId)
.collect(java.util.stream.Collectors.toList());
@@ -2056,7 +2055,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
}
return messageIds.stream().map(id -> {
if (id.isMms() && storyTypes.containsKey(id.getId())) {
if (storyTypes.containsKey(id.getId())) {
return storyTypes.get(id.getId());
} else {
return StoryType.NONE;
@@ -2096,7 +2095,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
StoryType storyType = StoryType.fromCode(CursorUtil.requireInt(cursor, STORY_TYPE));
if (!recipientId.equals(releaseChannelId)) {
result.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId, true), expirationInfo));
result.add(new MarkedMessageInfo(threadId, syncMessageId, new MessageId(messageId), expirationInfo));
}
}
}
@@ -2698,7 +2697,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
}
if (updated) {
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(new MessageId(messageId));
notifyConversationListeners(threadId);
}
}
@@ -2863,7 +2862,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
if (!message.getStoryType().isStory()) {
if (message.getOutgoingQuote() == null) {
ApplicationDependencies.getDatabaseObserver().notifyMessageInsertObservers(threadId, new MessageId(messageId, true));
ApplicationDependencies.getDatabaseObserver().notifyMessageInsertObservers(threadId, new MessageId(messageId));
} else {
ApplicationDependencies.getDatabaseObserver().notifyConversationListeners(threadId);
}
@@ -3702,7 +3701,7 @@ public class MessageTable extends DatabaseTable implements MmsSmsColumns, Recipi
long id = CursorExtensionsKt.readToSingleLong(cursor, -1);
if (id != -1) {
return new MessageId(id, TABLE_NAME.equals(MessageTable.TABLE_NAME));
return new MessageId(id);
} else {
return null;
}

View File

@@ -277,10 +277,6 @@ public class MmsSmsTable extends DatabaseTable {
}
public MessageId getRootOfQuoteChain(@NonNull MessageId id) {
if (!id.isMms()) {
return id;
}
MmsMessageRecord targetMessage;
try {
targetMessage = (MmsMessageRecord) SignalDatabase.messages().getMessageRecord(id.getId());
@@ -302,7 +298,7 @@ public class MmsSmsTable extends DatabaseTable {
try (Reader reader = new Reader(queryTables(PROJECTION, query, null, "1", false))) {
MessageRecord record;
if ((record = reader.getNext()) != null) {
return getRootOfQuoteChain(new MessageId(record.getId(), record.isMms()));
return getRootOfQuoteChain(new MessageId(record.getId()));
}
}
@@ -312,7 +308,7 @@ public class MmsSmsTable extends DatabaseTable {
public List<MessageRecord> getAllMessagesThatQuote(@NonNull MessageId id) {
MessageRecord targetMessage;
try {
targetMessage = id.isMms() ? SignalDatabase.messages().getMessageRecord(id.getId()) : SignalDatabase.messages().getMessageRecord(id.getId());
targetMessage = SignalDatabase.messages().getMessageRecord(id.getId());
} catch (NoSuchMessageException e) {
throw new IllegalArgumentException("Invalid message ID!");
}
@@ -327,7 +323,7 @@ public class MmsSmsTable extends DatabaseTable {
MessageRecord record;
while ((record = reader.getNext()) != null) {
records.add(record);
records.addAll(getAllMessagesThatQuote(new MessageId(record.getId(), record.isMms())));
records.addAll(getAllMessagesThatQuote(new MessageId(record.getId())));
}
}
@@ -442,11 +438,7 @@ public class MmsSmsTable extends DatabaseTable {
}
public long getThreadId(MessageId messageId) {
if (messageId.isMms()) {
return SignalDatabase.messages().getThreadIdForMessage(messageId.getId());
} else {
return SignalDatabase.messages().getThreadIdForMessage(messageId.getId());
}
return SignalDatabase.messages().getThreadIdForMessage(messageId.getId());
}
/**

View File

@@ -90,8 +90,7 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
while (cursor.moveToNext()) {
val reaction: ReactionRecord = readReaction(cursor)
val messageId = MessageId(
id = CursorUtil.requireLong(cursor, MESSAGE_ID),
mms = CursorUtil.requireBoolean(cursor, IS_MMS)
id = CursorUtil.requireLong(cursor, MESSAGE_ID)
)
var reactionsList: MutableList<ReactionRecord>? = messageIdToReactions[messageId]
@@ -114,7 +113,7 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
try {
val values = ContentValues().apply {
put(MESSAGE_ID, messageId.id)
put(IS_MMS, if (messageId.mms) 1 else 0)
put(IS_MMS, 0)
put(EMOJI, reaction.emoji)
put(AUTHOR_ID, reaction.author.serialize())
put(DATE_SENT, reaction.dateSent)
@@ -122,12 +121,7 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
}
writableDatabase.insert(TABLE_NAME, null, values)
if (messageId.mms) {
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), false)
} else {
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), false)
}
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), false)
writableDatabase.setTransactionSuccessful()
} finally {
@@ -140,16 +134,12 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
fun deleteReaction(messageId: MessageId, recipientId: RecipientId) {
writableDatabase.beginTransaction()
try {
val query = "$MESSAGE_ID = ? AND $IS_MMS = ? AND $AUTHOR_ID = ?"
val args = SqlUtil.buildArgs(messageId.id, if (messageId.mms) 1 else 0, recipientId)
writableDatabase
.delete(TABLE_NAME)
.where("$MESSAGE_ID = ? AND $AUTHOR_ID = ?", messageId.id, recipientId)
.run()
writableDatabase.delete(TABLE_NAME, query, args)
if (messageId.mms) {
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), true)
} else {
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), true)
}
SignalDatabase.messages.updateReactionsUnread(writableDatabase, messageId.id, hasReactions(messageId), true)
writableDatabase.setTransactionSuccessful()
} finally {
@@ -160,7 +150,10 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
}
fun deleteReactions(messageId: MessageId) {
writableDatabase.delete(TABLE_NAME, "$MESSAGE_ID = ? AND $IS_MMS = ?", SqlUtil.buildArgs(messageId.id, if (messageId.mms) 1 else 0))
writableDatabase
.delete(TABLE_NAME)
.where("$MESSAGE_ID = ?", messageId.id)
.run()
}
fun hasReaction(messageId: MessageId, reaction: ReactionRecord): Boolean {

View File

@@ -184,7 +184,7 @@ class StorySendTable(context: Context, databaseHelper: SignalDatabase) : Databas
null
).use { cursor ->
while (cursor.moveToNext()) {
messageIds += MessageId(cursor.requireLong(MESSAGE_ID), true)
messageIds += MessageId(cursor.requireLong(MESSAGE_ID))
}
}

View File

@@ -4,31 +4,14 @@ import android.os.Parcelable
import kotlinx.parcelize.Parcelize
/**
* Represents a pair of values that can be used to find a message. Because we have two tables,
* that means this has both the primary key and a boolean indicating which table it's in.
* Represents the primary key in a [MessageId].
*/
@Parcelize
data class MessageId(
val id: Long,
@get:JvmName("isMms") val mms: Boolean
val id: Long
) : Parcelable {
fun serialize(): String {
return "$id|$mms"
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as MessageId
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id.hashCode()
return "$id|true"
}
companion object {
@@ -36,9 +19,9 @@ data class MessageId(
* Returns null for invalid IDs. Useful when pulling a possibly-unset ID from a database, or something like that.
*/
@JvmStatic
fun fromNullable(id: Long, mms: Boolean): MessageId? {
fun fromNullable(id: Long): MessageId? {
return if (id > 0) {
MessageId(id, mms)
MessageId(id)
} else {
null
}
@@ -47,7 +30,7 @@ data class MessageId(
@JvmStatic
fun deserialize(serialized: String): MessageId {
val parts: List<String> = serialized.split("|")
return MessageId(parts[0].toLong(), parts[1].toBoolean())
return MessageId(parts[0].toLong())
}
}
}

View File

@@ -12,7 +12,7 @@ import kotlin.math.abs
sealed class ParentStoryId(protected val id: Long) {
abstract fun serialize(): Long
fun asMessageId(): MessageId = MessageId(abs(id), true)
fun asMessageId(): MessageId = MessageId(abs(id))
fun isGroupReply() = serialize() > 0
fun isDirectReply() = !isGroupReply()