From 7efbeba2ef6e4100c8e283c5573351c938ada249 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Sat, 15 Feb 2020 15:07:35 -0700 Subject: [PATCH] plumb through thread to read receipt manager --- SignalServiceKit/src/Contacts/TSThread.m | 1 + .../Messages/Interactions/TSErrorMessage.m | 1 + .../Messages/Interactions/TSIncomingMessage.m | 7 +++++- .../src/Messages/Interactions/TSInfoMessage.m | 1 + .../src/Messages/OWSMessageManager.m | 2 ++ .../src/Messages/OWSReadReceiptManager.h | 2 ++ .../src/Messages/OWSReadReceiptManager.m | 23 ++++++++++++++++--- .../src/Messages/OWSReadTracking.h | 1 + SignalServiceKit/src/Messages/TSCall.m | 1 + 9 files changed, 35 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 1a103fe517..5bb9840804 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -365,6 +365,7 @@ ConversationColorName const ConversationColorNameDefault = ConversationColorName ? OWSReadCircumstanceReadOnThisDeviceWhilePendingMessageRequest : OWSReadCircumstanceReadOnThisDevice; [message markAsReadAtTimestamp:[NSDate ows_millisecondTimeStamp] + thread:self circumstance:circumstance transaction:transaction]; } diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m index 7c3a365e26..bb7ce1e0f6 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.m @@ -311,6 +311,7 @@ NSUInteger TSErrorMessageSchemaVersion = 2; } - (void)markAsReadAtTimestamp:(uint64_t)readTimestamp + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction { diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m index a24eca283a..5ff8d2a105 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.m @@ -194,11 +194,13 @@ const NSUInteger TSIncomingMessageSchemaVersion = 1; // We want to do this without triggering sending read receipts, so we pretend it was // read on a linked device. [self markAsReadAtTimestamp:[NSDate ows_millisecondTimeStamp] + thread:[self threadWithTransaction:transaction] circumstance:OWSReadCircumstanceReadOnLinkedDevice transaction:transaction]; } - (void)markAsReadAtTimestamp:(uint64_t)readTimestamp + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction { @@ -224,7 +226,10 @@ const NSUInteger TSIncomingMessageSchemaVersion = 1; expirationStartedAt:readTimestamp transaction:transaction]; - [OWSReadReceiptManager.sharedManager messageWasRead:self circumstance:circumstance transaction:transaction]; + [OWSReadReceiptManager.sharedManager messageWasRead:self + thread:thread + circumstance:circumstance + transaction:transaction]; [transaction addAsyncCompletion:^{ [[NSNotificationCenter defaultCenter] postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification diff --git a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m index 625976efc4..8455faa4b9 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSInfoMessage.m @@ -315,6 +315,7 @@ NSUInteger TSInfoMessageSchemaVersion = 2; } - (void)markAsReadAtTimestamp:(uint64_t)readTimestamp + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction { diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 9b33a93e8c..0c0237c834 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1786,6 +1786,7 @@ NS_ASSUME_NONNULL_BEGIN OWSFailDebug(@"Incoming messages from yourself are not supported."); // Don't send a read receipt for messages sent by ourselves. [incomingMessage markAsReadAtTimestamp:envelope.timestamp + thread:thread circumstance:OWSReadCircumstanceReadOnLinkedDevice transaction:transaction]; } @@ -1840,6 +1841,7 @@ NS_ASSUME_NONNULL_BEGIN // In case we already have a read receipt for this new message (this happens sometimes). [OWSReadReceiptManager.sharedManager applyEarlyReadReceiptsForIncomingMessage:incomingMessage + thread:thread transaction:transaction]; // TODO: Is this still necessary? diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.h b/SignalServiceKit/src/Messages/OWSReadReceiptManager.h index 83a0eba67e..5f4f8bfc7a 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.h +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.h @@ -93,12 +93,14 @@ NS_SWIFT_NAME(init(grdbId:uniqueId:recipientMap:sentTimestamp:)); transaction:(SDSAnyWriteTransaction *)transaction; - (void)applyEarlyReadReceiptsForIncomingMessage:(TSIncomingMessage *)message + thread:(TSThread *)thread transaction:(SDSAnyWriteTransaction *)transaction; #pragma mark - Locally Read // This method can be called from any thread. - (void)messageWasRead:(TSIncomingMessage *)message + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m index a1c61bbae9..fc85d28178 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m @@ -359,6 +359,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE ? OWSReadCircumstanceReadOnThisDeviceWhilePendingMessageRequest : OWSReadCircumstanceReadOnThisDevice; [self markMessagesAsRead:unreadMessages + thread:thread readTimestamp:readTimestamp circumstance:circumstance transaction:transaction]; @@ -368,6 +369,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE } - (void)messageWasRead:(TSIncomingMessage *)message + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction; { @@ -505,6 +507,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE #pragma mark - Linked Device Read Receipts - (void)applyEarlyReadReceiptsForIncomingMessage:(TSIncomingMessage *)message + thread:(TSThread *)thread transaction:(SDSAnyWriteTransaction *)transaction { OWSAssertDebug(message); @@ -526,6 +529,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE } [message markAsReadAtTimestamp:readReceipt.readTimestamp + thread:thread circumstance:OWSReadCircumstanceReadOnLinkedDevice transaction:transaction]; [readReceipt anyRemoveWithTransaction:transaction]; @@ -567,10 +571,18 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE if (messages.count > 0) { for (TSIncomingMessage *message in messages) { + TSThread *_Nullable thread = [message threadWithTransaction:transaction]; + if (thread == nil) { + OWSFailDebug(@"thread was unexpectedly nil"); + continue; + } NSTimeInterval secondsSinceRead = [NSDate new].timeIntervalSince1970 - readTimestamp / 1000; OWSAssertDebug([message isKindOfClass:[TSIncomingMessage class]]); OWSLogDebug(@"read on linked device %f seconds ago", secondsSinceRead); - [self markAsReadOnLinkedDevice:message readTimestamp:readTimestamp transaction:transaction]; + [self markAsReadOnLinkedDevice:message + thread:thread + readTimestamp:readTimestamp + transaction:transaction]; } } else { // Received read receipt for unknown incoming message. @@ -585,20 +597,23 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE } - (void)markAsReadOnLinkedDevice:(TSIncomingMessage *)message + thread:(TSThread *)thread readTimestamp:(uint64_t)readTimestamp transaction:(SDSAnyWriteTransaction *)transaction { OWSAssertDebug(message); + OWSAssertDebug(thread); OWSAssertDebug(transaction); // Always re-mark the message as read to ensure any earlier read time is applied to disappearing messages. [message markAsReadAtTimestamp:readTimestamp + thread:thread circumstance:OWSReadCircumstanceReadOnLinkedDevice transaction:transaction]; // Also mark any unread messages appearing earlier in the thread as read as well. [self markAsReadBeforeSortId:message.sortId - thread:[message threadWithTransaction:transaction] + thread:thread readTimestamp:readTimestamp circumstance:OWSReadCircumstanceReadOnLinkedDevice transaction:transaction]; @@ -623,12 +638,14 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE return; } [self markMessagesAsRead:unreadMessages + thread:thread readTimestamp:readTimestamp circumstance:circumstance transaction:transaction]; } - (void)markMessagesAsRead:(NSArray> *)unreadMessages + thread:(TSThread *)thread readTimestamp:(uint64_t)readTimestamp circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction @@ -649,7 +666,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE break; } for (id readItem in unreadMessages) { - [readItem markAsReadAtTimestamp:readTimestamp circumstance:circumstance transaction:transaction]; + [readItem markAsReadAtTimestamp:readTimestamp thread:thread circumstance:circumstance transaction:transaction]; } } diff --git a/SignalServiceKit/src/Messages/OWSReadTracking.h b/SignalServiceKit/src/Messages/OWSReadTracking.h index f91f65a7b4..dc3e00324d 100644 --- a/SignalServiceKit/src/Messages/OWSReadTracking.h +++ b/SignalServiceKit/src/Messages/OWSReadTracking.h @@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN * Used both for *responding* to a remote read receipt and in response to the local user's activity. */ - (void)markAsReadAtTimestamp:(uint64_t)readTimestamp + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Messages/TSCall.m b/SignalServiceKit/src/Messages/TSCall.m index c6830f4a15..68da274525 100644 --- a/SignalServiceKit/src/Messages/TSCall.m +++ b/SignalServiceKit/src/Messages/TSCall.m @@ -167,6 +167,7 @@ NSUInteger TSCallCurrentSchemaVersion = 1; } - (void)markAsReadAtTimestamp:(uint64_t)readTimestamp + thread:(TSThread *)thread circumstance:(OWSReadCircumstance)circumstance transaction:(SDSAnyWriteTransaction *)transaction {