diff --git a/Signal/src/Loki/Messaging/NewConversationVC.swift b/Signal/src/Loki/Messaging/NewConversationVC.swift index 46c7b2cc3..ba63e612d 100644 --- a/Signal/src/Loki/Messaging/NewConversationVC.swift +++ b/Signal/src/Loki/Messaging/NewConversationVC.swift @@ -106,10 +106,6 @@ final class NewConversationVC : OWSViewController, OWSQRScannerDelegate { let alert = UIAlertController(title: NSLocalizedString("Invalid Public Key", comment: ""), message: NSLocalizedString("Please check the public key you entered and try again.", comment: ""), preferredStyle: .alert) alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil)) presentAlert(alert) - } else if OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey == hexEncodedPublicKey { - let alert = UIAlertController(title: NSLocalizedString("Can't Start Conversation", comment: ""), message: NSLocalizedString("Please enter the public key of the person you'd like to message.", comment: ""), preferredStyle: .alert) - alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil)) - presentAlert(alert) } else { let thread = TSContactThread.getOrCreateThread(contactId: hexEncodedPublicKey) Analytics.shared.track("New Conversation Started") diff --git a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift index debad3b84..1d94a962c 100644 --- a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift +++ b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift @@ -23,7 +23,7 @@ public final class LokiDatabaseUtilities : NSObject { // MARK: Device Links @objc(getLinkedDeviceHexEncodedPublicKeysFor:in:) - public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set { + public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set { let storage = OWSPrimaryStorage.shared() let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey var result = Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in @@ -34,9 +34,16 @@ public final class LokiDatabaseUtilities : NSObject { } @objc(getLinkedDeviceThreadsFor:in:) - public static func getLinkedDeviceThreads(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set { + public static func getLinkedDeviceThreads(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set { return Set(getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction).compactMap { TSContactThread.getWithContactId($0, transaction: transaction) }) } + + @objc(isUserLinkedDevice:in:) + public static func isUserLinkedDevice(_ hexEncodedPublicKey: String, transaction: YapDatabaseReadTransaction) -> Bool { + let userHexEncodedPublicKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey + let userLinkedDeviceHexEncodedPublicKeys = getLinkedDeviceHexEncodedPublicKeys(for: userHexEncodedPublicKey, in: transaction) + return userLinkedDeviceHexEncodedPublicKeys.contains(hexEncodedPublicKey) + } @objc(getMasterHexEncodedPublicKeyFor:in:) public static func objc_getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? { diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 9b76ef1d7..26c149166 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -674,14 +674,17 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; return failureHandler(error); } - // In the "self-send" special case, we ony need to send a sync message with a delivery receipt. - if ([thread isKindOfClass:[TSContactThread class]] && - [((TSContactThread *)thread).contactIdentifier isEqualToString:self.tsAccountManager.localNumber]) { - // Send to self. - OWSAssertDebug(message.recipientIds.count == 1); - // Don't mark self-sent messages as read (or sent) until the sync transcript is sent. - successHandler(); - return; + // Loki: Handle note to self case + if ([thread isKindOfClass:[TSContactThread class]]) { + __block BOOL isNoteToSelf; + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + isNoteToSelf = [LKDatabaseUtilities isUserLinkedDevice:((TSContactThread *)thread).contactIdentifier in:transaction]; + }]; + if (isNoteToSelf) { + [self sendSyncTranscriptForMessage:message isRecipientUpdate:NO success:^{ } failure:^(NSError *error) { }]; + successHandler(); + return; + } } if (thread.isGroupThread) { @@ -1541,19 +1544,15 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; failure:(RetryableFailureHandler)failure { dispatch_block_t success = ^{ - TSThread *_Nullable thread = message.thread; - if (thread && [thread isKindOfClass:[TSContactThread class]] && - [thread.contactIdentifier isEqualToString:self.tsAccountManager.localNumber]) { - OWSAssertDebug(message.recipientIds.count == 1); - // Don't mark self-sent messages as read (or sent) until the sync transcript is sent. - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + TSThread *thread = message.thread; + // Loki: Handle note to self case + if (thread && [thread isKindOfClass:[TSContactThread class]] && [LKDatabaseUtilities isUserLinkedDevice:thread.contactIdentifier in:transaction]) { for (NSString *recipientId in message.sendingRecipientIds) { - [message updateWithReadRecipientId:recipientId - readTimestamp:message.timestamp - transaction:transaction]; + [message updateWithReadRecipientId:recipientId readTimestamp:message.timestamp transaction:transaction]; } - }]; - } + } + }]; successParam(); }; @@ -1647,9 +1646,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; if ([messageSend.message isKindOfClass:OWSOutgoingSyncMessage.class]) { [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey; - NSMutableSet *linkedDeviceHexEncodedPublicKeys = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy; - [linkedDeviceHexEncodedPublicKeys removeObject:userHexEncodedPublicKey]; - recipientIDs = [recipientIDs setByAddingObjectsFromSet:linkedDeviceHexEncodedPublicKeys].mutableCopy; + recipientIDs = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy; }]; } diff --git a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m index b6a66f261..3d51b8f38 100644 --- a/SignalServiceKit/src/Messages/OWSReadReceiptManager.m +++ b/SignalServiceKit/src/Messages/OWSReadReceiptManager.m @@ -286,7 +286,12 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE self.toLinkedDevicesReadReceiptMap[threadUniqueId] = newReadReceipt; } - if ([message.authorId isEqualToString:[TSAccountManager localNumber]]) { + __block BOOL isNoteToSelf; + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + isNoteToSelf = [LKDatabaseUtilities isUserLinkedDevice:message.authorId in:transaction]; + }]; + + if (isNoteToSelf) { OWSLogVerbose(@"Ignoring read receipt for self-sender."); return; } diff --git a/SignalServiceKit/src/Util/TypingIndicators.swift b/SignalServiceKit/src/Util/TypingIndicators.swift index fe9f53fc8..c6a091a34 100644 --- a/SignalServiceKit/src/Util/TypingIndicators.swift +++ b/SignalServiceKit/src/Util/TypingIndicators.swift @@ -323,8 +323,16 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators { return } - // Don't send any typing indicators for groups - guard !thread.isGroupThread() else { return } + // Don't send typing indicators in group or note to self threads + if (thread.isGroupThread()) { + return + } else { + var isNoteToSelf = false + OWSPrimaryStorage.shared().dbReadConnection.read { transaction in + isNoteToSelf = LokiDatabaseUtilities.isUserLinkedDevice(thread.contactIdentifier()!, transaction: transaction) + } + if isNoteToSelf { return } + } let message = TypingIndicatorMessage(thread: thread, action: action) messageSender.sendPromise(message: message).retainUntilComplete()