diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt index 6423e0346a..063949641f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt @@ -7,6 +7,7 @@ import androidx.core.content.contentValuesOf import org.signal.core.util.SqlUtil import org.signal.core.util.delete import org.signal.core.util.deleteAll +import org.signal.core.util.exists import org.signal.core.util.forEach import org.signal.core.util.logging.Log import org.signal.core.util.readToList @@ -127,6 +128,13 @@ class GroupReceiptTable(context: Context?, databaseHelper: SignalDatabase?) : Da } } + fun hasReceipt(mmsId: Long, recipientId: RecipientId): Boolean { + return readableDatabase + .exists(TABLE_NAME) + .where("$MMS_ID = ? AND $RECIPIENT_ID = ?", mmsId, recipientId) + .run() + } + fun getGroupReceiptInfo(mmsId: Long): List { return readableDatabase .select() 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 eebf6d467b..cc4b007c47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -5540,6 +5540,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return emptySet() } + // Only allow updating receipts for a group message if the sender is actually a member (stories are excluded because a single story timestamp can map to multiple messages) + if (!receiptData.forIndividualChat && receiptData.storyType == StoryType.NONE && !groupReceipts.hasReceipt(receiptData.messageId, receiptAuthor)) { + return emptySet() + } + if (!receiptData.marked) { // We set the receipt_timestamp to the max of the two values because that single column represents the timestamp of the last receipt of any type. // That means we want to update it for each new receipt type, but we never want the time to go backwards.