From dc2956d05bd955b1c3fa8e16176cf457f0d43a36 Mon Sep 17 00:00:00 2001 From: Sagar <85388413+Sagar0-0@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:45:35 +0530 Subject: [PATCH] Update quoteIds for edited message and ignore stale messages in isQuoted. --- .../securesms/database/MessageTable.kt | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 5fdac0f729..f920c75dfa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -2693,6 +2693,9 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } quoteAttachments += retrieved.quote.attachments + } else { + contentValues.put(QUOTE_ID, 0) + contentValues.put(QUOTE_AUTHOR, 0) } val (messageId, insertedAttachments) = insertMediaMessage( @@ -2716,6 +2719,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } if (editedMessage != null) { + writableDatabase.update(TABLE_NAME) + .values(QUOTE_ID to retrieved.sentTimeMillis) + .where("$QUOTE_ID = ?", editedMessage.dateSent) + .run() + if (retrieved.quote != null && editedMessage.quote != null) { writableDatabase.execSQL( """ @@ -3116,6 +3124,9 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat if (editedMessage == null) { quoteAttachments += message.outgoingQuote.attachments } + } else { + contentValues.put(QUOTE_ID, 0) + contentValues.put(QUOTE_AUTHOR, 0) } val updatedBodyAndMentions = MentionUtil.updateBodyAndMentionsWithPlaceholders(message.body, message.mentions) @@ -3168,6 +3179,13 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } } + if (editedMessage != null) { + writableDatabase.update(TABLE_NAME) + .values(QUOTE_ID to message.sentTimeMillis) + .where("$QUOTE_ID = ?", editedMessage.dateSent) + .run() + } + if (message.messageToEdit > 0) { writableDatabase.update(TABLE_NAME) .values(LATEST_REVISION_ID to messageId) @@ -4054,8 +4072,12 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat */ fun isQuoted(messageRecord: MessageRecord): Boolean { return readableDatabase - .exists(TABLE_NAME) - .where("$QUOTE_ID = ? AND $QUOTE_AUTHOR = ? AND $SCHEDULED_DATE = ?", messageRecord.dateSent, messageRecord.fromRecipient.id, -1) + .exists(TABLE_NAME).where( + "$QUOTE_ID = ? AND $QUOTE_AUTHOR = ? AND $SCHEDULED_DATE = ? AND $ID NOT IN (SELECT $ORIGINAL_MESSAGE_ID FROM $TABLE_NAME)", + messageRecord.dateSent, + messageRecord.fromRecipient.id, + -1 + ) .run() } @@ -4080,19 +4102,24 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val quotedIds: MutableSet = mutableSetOf() + val pastRevisionMessageIds = records.mapNotNull { it.originalMessageId?.id }.toSet() + buildCustomCollectionQuery("$QUOTE_ID = ? AND $QUOTE_AUTHOR = ? AND $SCHEDULED_DATE = ?", args).forEach { query -> readableDatabase - .select(QUOTE_ID, QUOTE_AUTHOR) + .select(ID, QUOTE_ID, QUOTE_AUTHOR) .from(TABLE_NAME) .where(query.where, query.whereArgs) .run() .forEach { cursor -> - val quoteLocator = QuoteDescriptor( - timestamp = cursor.requireLong(QUOTE_ID), - author = RecipientId.from(cursor.requireNonNullString(QUOTE_AUTHOR)) - ) + val messageId = cursor.requireLong(ID) + if (messageId !in pastRevisionMessageIds) { + val quoteLocator = QuoteDescriptor( + timestamp = cursor.requireLong(QUOTE_ID), + author = RecipientId.from(cursor.requireNonNullString(QUOTE_AUTHOR)) + ) - quotedIds += byQuoteDescriptor[quoteLocator]!!.id + quotedIds += byQuoteDescriptor[quoteLocator]!!.id + } } }