diff --git a/src/Devices/OWSReadReceiptsProcessor.m b/src/Devices/OWSReadReceiptsProcessor.m index 8816a4cb4..c531ce8b0 100644 --- a/src/Devices/OWSReadReceiptsProcessor.m +++ b/src/Devices/OWSReadReceiptsProcessor.m @@ -87,7 +87,9 @@ NSString *const OWSReadReceiptsProcessorMarkedMessageAsReadNotification = if (message) { OWSAssert(message.thread); - NSMutableArray> *interactionToMarkAsRead = [NSMutableArray new]; + // Mark all unread messages in this thread that are as old or older than the read + // receipt. + NSMutableArray> *interactionsToMarkAsRead = [NSMutableArray new]; [self.storageManager.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [[transaction ext:TSUnseenDatabaseViewExtensionName] enumerateRowsInGroup:message.uniqueThreadId @@ -99,21 +101,22 @@ NSString *const OWSReadReceiptsProcessorMarkedMessageAsReadNotification = BOOL *stop) { TSInteraction *interaction = object; - if (interaction.timestampForSorting < message.timestampForSorting) { + if (interaction.timestampForSorting <= message.timestampForSorting) { *stop = YES; return; } id possiblyRead = (id)object; OWSAssert(!possiblyRead.read); - [interactionToMarkAsRead addObject:possiblyRead]; + [interactionsToMarkAsRead addObject:possiblyRead]; }]; - for (id possiblyRead in interactionToMarkAsRead) { + for (id possiblyRead in interactionsToMarkAsRead) { // Don't send a read receipt in response to a read receipt. [possiblyRead markAsReadWithTransaction:transaction sendReadReceipt:NO]; } }]; + OWSAssert(interactionsToMarkAsRead.count > 0); [OWSDisappearingMessagesJob setExpirationForMessage:message expirationStartedAt:readReceipt.timestamp]; // If it was previously saved, no need to keep it around any longer.