From 4942da1d23aab2e6e22d540f67ebf63f32b61e50 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 26 Nov 2020 13:23:35 +1100 Subject: [PATCH] Send read receipts again --- .../Cells/OWSQuotedMessageView.m | 7 +- .../Control Messages/ReadReceipt.swift | 4 +- SessionMessagingKit/Messages/Message.swift | 2 +- .../Messages/Signal/TSIncomingMessage.m | 1 - .../Blocking/OWSBlockingManager.m | 70 +------------------ .../Link Previews/OWSLinkPreview.swift | 2 +- .../Quotes/OWSQuotedReplyModel.m | 2 - .../Read Tracking/OWSOutgoingReceiptManager.m | 59 ++++------------ .../Read Tracking/OWSReadReceiptManager.m | 28 +------- .../Typing Indicators/TypingIndicators.swift | 5 +- .../{Utilities => To Do}/SignalRecipient.h | 0 .../{Utilities => To Do}/SignalRecipient.m | 0 .../Utilities/OWSAudioPlayer.m | 2 - SessionMessagingKit/Utilities/OWSSounds.m | 3 +- Signal.xcodeproj/project.pbxproj | 4 +- 15 files changed, 26 insertions(+), 163 deletions(-) rename SessionMessagingKit/{Utilities => To Do}/SignalRecipient.h (100%) rename SessionMessagingKit/{Utilities => To Do}/SignalRecipient.m (100%) diff --git a/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m b/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m index ae44305ed..6b35ee2ca 100644 --- a/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m +++ b/Session/Signal/ConversationView/Cells/OWSQuotedMessageView.m @@ -543,12 +543,7 @@ const CGFloat kRemotelySourcedContentRowSpacing = 4; NSString *_Nullable localNumber = [TSAccountManager localNumber]; NSString *quotedAuthorText; if ([localNumber isEqualToString:self.quotedMessage.authorId]) { - - if (self.isOutgoing) { - quotedAuthorText = NSLocalizedString(@"You", @""); - } else { - quotedAuthorText = NSLocalizedString(@"You", @""); - } + quotedAuthorText = NSLocalizedString(@"You", @""); } else { __block NSString *quotedAuthor = [SSKEnvironment.shared.profileManager profileNameForRecipientWithID:self.quotedMessage.authorId] ?: self.quotedMessage.authorId; diff --git a/SessionMessagingKit/Messages/Control Messages/ReadReceipt.swift b/SessionMessagingKit/Messages/Control Messages/ReadReceipt.swift index fc475c023..0c5d5ecf5 100644 --- a/SessionMessagingKit/Messages/Control Messages/ReadReceipt.swift +++ b/SessionMessagingKit/Messages/Control Messages/ReadReceipt.swift @@ -2,9 +2,11 @@ import SessionUtilitiesKit @objc(SNReadReceipt) public final class ReadReceipt : ControlMessage { - public var timestamps: [UInt64]? + @objc public var timestamps: [UInt64]? // MARK: Initialization + public override init() { super.init() } + internal init(timestamps: [UInt64]) { super.init() self.timestamps = timestamps diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index abfd2887a..0f04c20db 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -3,7 +3,7 @@ @objc(SNMessage) public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility public var id: String? - public var threadID: String? + @objc public var threadID: String? public var sentTimestamp: UInt64? public var receivedTimestamp: UInt64? public var recipient: String? diff --git a/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m index 69e3a0f3a..6be45f3a8 100644 --- a/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSIncomingMessage.m @@ -141,7 +141,6 @@ NS_ASSUME_NONNULL_BEGIN return; } - NSTimeInterval secondsAgoRead = ((NSTimeInterval)[NSDate millisecondTimestamp] - (NSTimeInterval)readTimestamp) / 1000; _read = YES; [self saveWithTransaction:transaction]; diff --git a/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m b/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m index 7ed42eb79..2ef11e634 100644 --- a/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m +++ b/SessionMessagingKit/Sending & Receiving/Blocking/OWSBlockingManager.m @@ -253,7 +253,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if (sendSyncMessage) { - [self sendBlockListSyncMessageWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds]; + } else { // If this update came from an incoming block list sync message, // update the "synced blocked list" state immediately, @@ -299,70 +299,9 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan _blockedGroupMap = [NSMutableDictionary new]; } - [self syncBlockListIfNecessary]; [self observeNotifications]; } -- (void)syncBlockList -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:self.blockedGroupIds]; - }); -} - -// This method should only be called from within a synchronized block. -- (void)syncBlockListIfNecessary -{ - // If we haven't yet successfully synced the current "block list" changes, - // try again to sync now. - NSArray *syncedBlockedPhoneNumbers = - [self.dbConnection objectForKey:kOWSBlockingManager_SyncedBlockedPhoneNumbersKey - inCollection:kOWSBlockingManager_BlockListCollection]; - NSSet *syncedBlockedPhoneNumberSet = - [[NSSet alloc] initWithArray:(syncedBlockedPhoneNumbers ?: [NSArray new])]; - - NSArray *syncedBlockedGroupIds = - [self.dbConnection objectForKey:kOWSBlockingManager_SyncedBlockedGroupIdsKey - inCollection:kOWSBlockingManager_BlockListCollection]; - NSSet *syncedBlockedGroupIdSet = [[NSSet alloc] initWithArray:(syncedBlockedGroupIds ?: [NSArray new])]; - - NSArray *localBlockedGroupIds = self.blockedGroupIds; - NSSet *localBlockedGroupIdSet = [[NSSet alloc] initWithArray:localBlockedGroupIds]; - - if ([self.blockedPhoneNumberSet isEqualToSet:syncedBlockedPhoneNumberSet] && - [localBlockedGroupIdSet isEqualToSet:syncedBlockedGroupIdSet]) { - return; - } - - [self sendBlockListSyncMessageWithPhoneNumbers:self.blockedPhoneNumbers groupIds:localBlockedGroupIds]; -} - -- (void)sendBlockListSyncMessageWithPhoneNumbers:(NSArray *)blockedPhoneNumbers - groupIds:(NSArray *)blockedGroupIds -{ - // TODO TODO TODO - - /* - OWSAssertDebug(blockedPhoneNumbers); - OWSAssertDebug(blockedGroupIds); - - OWSBlockedPhoneNumbersMessage *message = - [[OWSBlockedPhoneNumbersMessage alloc] initWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds]; - - [self.messageSender sendMessage:message - success:^{ - OWSLogInfo(@"Successfully sent blocked phone numbers sync message"); - - // DURABLE CLEANUP - we could replace the custom durability logic in this class - // with a durable JobQueue. - [self saveSyncedBlockListWithPhoneNumbers:blockedPhoneNumbers groupIds:blockedGroupIds]; - } - failure:^(NSError *error) { - OWSLogError(@"Failed to send blocked phone numbers sync message with error: %@", error); - }]; - */ -} - /// Records the last block list which we successfully synced. - (void)saveSyncedBlockListWithPhoneNumbers:(NSArray *)blockedPhoneNumbers groupIds:(NSArray *)blockedGroupIds @@ -380,12 +319,7 @@ NSString *const kOWSBlockingManager_SyncedBlockedGroupIdsKey = @"kOWSBlockingMan - (void)applicationDidBecomeActive:(NSNotification *)notification { - [AppReadiness runNowOrWhenAppDidBecomeReady:^{ - @synchronized(self) - { - [self syncBlockListIfNecessary]; - } - }]; + } @end diff --git a/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift b/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift index f134d9971..f3e1f697a 100644 --- a/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift +++ b/SessionMessagingKit/Sending & Receiving/Link Previews/OWSLinkPreview.swift @@ -224,7 +224,7 @@ public class OWSLinkPreview: MTLModel { let filePath = OWSFileSystem.temporaryFilePath(withFileExtension: fileExtension) do { try imageData.write(to: NSURL.fileURL(withPath: filePath), options: .atomicWrite) - } catch let error as NSError { + } catch { return nil } diff --git a/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m index 2505ae6ee..59dada4d7 100644 --- a/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m +++ b/SessionMessagingKit/Sending & Receiving/Quotes/OWSQuotedReplyModel.m @@ -126,8 +126,6 @@ NS_ASSUME_NONNULL_BEGIN return nil; } - TSThread *thread = [message threadWithTransaction:transaction]; - uint64_t timestamp = message.timestamp; NSString *_Nullable authorId = ^{ diff --git a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m index 0bb42314a..1dde261bb 100644 --- a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSOutgoingReceiptManager.m @@ -103,7 +103,6 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa } NSMutableArray *sendPromises = [NSMutableArray array]; - [sendPromises addObjectsFromArray:[self sendReceiptsForReceiptType:OWSReceiptType_Delivery]]; [sendPromises addObjectsFromArray:[self sendReceiptsForReceiptType:OWSReceiptType_Read]]; if (sendPromises.count < 1) { @@ -149,8 +148,8 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa NSMutableArray *sendPromises = [NSMutableArray array]; for (NSString *recipientId in queuedReceiptMap) { - NSSet *timestamps = queuedReceiptMap[recipientId]; - if (timestamps.count < 1) { + NSSet *timestampsAsSet = queuedReceiptMap[recipientId]; + if (timestampsAsSet.count < 1) { continue; } @@ -160,51 +159,19 @@ NSString *const kOutgoingReadReceiptManagerCollection = @"kOutgoingReadReceiptMa continue; } - // TODO TODO TODO - - /* - OWSReceiptsForSenderMessage *message; - NSString *receiptName; - switch (receiptType) { - case OWSReceiptType_Delivery: - message = - [OWSReceiptsForSenderMessage deliveryReceiptsForSenderMessageWithThread:thread - messageTimestamps:timestamps.allObjects]; - receiptName = @"Delivery"; - break; - case OWSReceiptType_Read: - message = [OWSReceiptsForSenderMessage readReceiptsForSenderMessageWithThread:thread - messageTimestamps:timestamps.allObjects]; - receiptName = @"Read"; - break; + SNReadReceipt *readReceipt = [SNReadReceipt new]; + NSMutableArray *timestamps = [NSMutableArray new]; + for (NSNumber *timestamp in timestampsAsSet) { + [timestamps addObject:timestamp]; } - - AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { - [self.messageSender sendMessage:message - success:^{ - OWSLogInfo( - @"Successfully sent %lu %@ receipts to sender.", (unsigned long)timestamps.count, receiptName); - - // DURABLE CLEANUP - we could replace the custom durability logic in this class - // with a durable JobQueue. - [self dequeueReceiptsWithRecipientId:recipientId timestamps:timestamps receiptType:receiptType]; - - // The value doesn't matter, we just need any non-NSError value. - resolve(@(1)); - } - failure:^(NSError *error) { - OWSLogError(@"Failed to send %@ receipts to sender with error: %@", receiptName, error); - - if (error.domain == OWSSignalServiceKitErrorDomain - && error.code == OWSErrorCodeNoSuchSignalRecipient) { - [self dequeueReceiptsWithRecipientId:recipientId timestamps:timestamps receiptType:receiptType]; - } - - resolve(error); - }]; + readReceipt.timestamps = timestamps; + [LKStorage writeWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + AnyPromise *promise = [SNMessageSender sendNonDurably:readReceipt inThread:thread usingTransaction:transaction] + .thenOn(self.serialQueue, ^(id object) { + [self dequeueReceiptsWithRecipientId:recipientId timestamps:timestampsAsSet receiptType:@"Read"]; + }); + [sendPromises addObject:promise]; }]; - [sendPromises addObject:sendPromise]; - */ } return [sendPromises copy]; diff --git a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m index 67006c39d..cb7c6be47 100644 --- a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m @@ -234,46 +234,20 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE - (void)messageWasReadLocally:(TSIncomingMessage *)message { - // TODO TODO TODO - - /* dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized(self) { - NSString *threadUniqueId = message.uniqueThreadId; - OWSAssertDebug(threadUniqueId.length > 0); - NSString *messageAuthorId = message.authorId; - OWSAssertDebug(messageAuthorId.length > 0); - OWSLinkedDeviceReadReceipt *newReadReceipt = - [[OWSLinkedDeviceReadReceipt alloc] initWithSenderId:messageAuthorId - messageIdTimestamp:message.timestamp - readTimestamp:[NSDate ows_millisecondTimeStamp]]; - - OWSLinkedDeviceReadReceipt *_Nullable oldReadReceipt = self.toLinkedDevicesReadReceiptMap[threadUniqueId]; - if (oldReadReceipt && oldReadReceipt.messageIdTimestamp > newReadReceipt.messageIdTimestamp) { - // If there's an existing "linked device" read receipt for the same thread with - // a newer timestamp, discard this "linked device" read receipt. - OWSLogVerbose(@"Ignoring redundant read receipt for linked devices."); - } else { - OWSLogVerbose(@"Enqueuing read receipt for linked devices."); - self.toLinkedDevicesReadReceiptMap[threadUniqueId] = newReadReceipt; - } - - if (![LKSessionMetaProtocol shouldSendReceiptInThread:message.thread]) { - return; - } + if (!message.thread.isGroupThread) { return; } // Don't send read receipts in group threads if ([self areReadReceiptsEnabled]) { - OWSLogVerbose(@"Enqueuing read receipt for sender."); [self.outgoingReceiptManager enqueueReadReceiptForEnvelope:messageAuthorId timestamp:message.timestamp]; } [self scheduleProcessing]; } }); - */ } #pragma mark - Read Receipts From Recipient diff --git a/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift b/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift index 2ac63c633..5894c3b33 100644 --- a/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift +++ b/SessionMessagingKit/Sending & Receiving/Typing Indicators/TypingIndicators.swift @@ -272,11 +272,8 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { let typingIndicator = TypingIndicator() typingIndicator.kind = action - typingIndicator.threadID = thread.uniqueId! - let destination = Message.Destination.from(thread) - let job = MessageSendJob(message: typingIndicator, destination: destination) Storage.write { transaction in - SessionMessagingKit.JobQueue.shared.add(job, using: transaction) + MessageSender.send(typingIndicator, in: thread, using: transaction) } } } diff --git a/SessionMessagingKit/Utilities/SignalRecipient.h b/SessionMessagingKit/To Do/SignalRecipient.h similarity index 100% rename from SessionMessagingKit/Utilities/SignalRecipient.h rename to SessionMessagingKit/To Do/SignalRecipient.h diff --git a/SessionMessagingKit/Utilities/SignalRecipient.m b/SessionMessagingKit/To Do/SignalRecipient.m similarity index 100% rename from SessionMessagingKit/Utilities/SignalRecipient.m rename to SessionMessagingKit/To Do/SignalRecipient.m diff --git a/SessionMessagingKit/Utilities/OWSAudioPlayer.m b/SessionMessagingKit/Utilities/OWSAudioPlayer.m index 740da5f6a..2656a5b1e 100644 --- a/SessionMessagingKit/Utilities/OWSAudioPlayer.m +++ b/SessionMessagingKit/Utilities/OWSAudioPlayer.m @@ -111,8 +111,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)playWithAudioActivity:(OWSAudioActivity *)audioActivity { - BOOL success = [self.audioSession startAudioActivity:audioActivity]; - [self.audioPlayerPoller invalidate]; self.delegate.audioPlaybackState = AudioPlaybackState_Playing; diff --git a/SessionMessagingKit/Utilities/OWSSounds.m b/SessionMessagingKit/Utilities/OWSSounds.m index 95b7edd20..4415402db 100644 --- a/SessionMessagingKit/Utilities/OWSSounds.m +++ b/SessionMessagingKit/Utilities/OWSSounds.m @@ -37,7 +37,6 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob _soundURL = url; SystemSoundID newSoundID; - OSStatus status = AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &newSoundID); _soundID = newSoundID; return self; @@ -45,7 +44,7 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob - (void)dealloc { - OSStatus status = AudioServicesDisposeSystemSoundID(_soundID); + } @end diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 422377e07..ac88a5784 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -2822,6 +2822,8 @@ C33FDBEC255A581B00E217F9 /* OWSRecipientIdentity.m */, C32C5C92256DD12D003C73A2 /* OWSUDManager.swift */, C33FDBB9255A581600E217F9 /* ProfileManagerProtocol.h */, + C33FDAEC255A580500E217F9 /* SignalRecipient.h */, + C33FDBB7255A581600E217F9 /* SignalRecipient.m */, C33FDB94255A581300E217F9 /* TSAccountManager.h */, C33FDB88255A581200E217F9 /* TSAccountManager.m */, ); @@ -3338,8 +3340,6 @@ C3BBE0B42554F0E10050F1E3 /* ProofOfWork.swift */, C33FDB91255A581200E217F9 /* ProtoUtils.h */, C33FDA6C255A57FA00E217F9 /* ProtoUtils.m */, - C33FDAEC255A580500E217F9 /* SignalRecipient.h */, - C33FDBB7255A581600E217F9 /* SignalRecipient.m */, C38EEF09255B49A8007E1867 /* SNProtoEnvelope+Conversion.swift */, C33FDB31255A580A00E217F9 /* SSKEnvironment.h */, C33FDAF4255A580600E217F9 /* SSKEnvironment.m */,