From b1345104da25ade6253e6f0d326c3082476a3dc6 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Fri, 1 May 2020 13:17:11 +1000 Subject: [PATCH] Remove saveFriendRequestStatus in TSThread. --- .../ConversationViewController.m | 34 +++++++---- SignalMessaging/profiles/OWSProfileManager.m | 6 +- SignalServiceKit/src/Contacts/TSThread.h | 18 ------ SignalServiceKit/src/Contacts/TSThread.m | 59 +------------------ .../Loki/Database/OWSPrimaryStorage+Loki.m | 3 + .../FriendRequestExpirationJob.swift | 5 +- .../FriendRequestProtocol.swift | 13 ++++ .../Loki/Utilities/Notification+Loki.swift | 4 +- 8 files changed, 50 insertions(+), 92 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index a83c0b5ac..df59c216a 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -421,8 +421,8 @@ typedef enum : NSUInteger { name:UIKeyboardDidChangeFrameNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(handleThreadFriendRequestStatusChangedNotification:) - name:NSNotification.threadFriendRequestStatusChanged + selector:@selector(handleUserFriendRequestStatusChangedNotification:) + name:NSNotification.userFriendRequestStatusChanged object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleThreadSessionRestoreDevicesChangedNotifiaction:) @@ -529,17 +529,29 @@ typedef enum : NSUInteger { [self resetContentAndLayout]; } -- (void)handleThreadFriendRequestStatusChangedNotification:(NSNotification *)notification +- (void)handleUserFriendRequestStatusChangedNotification:(NSNotification *)notification { // Check thread - NSString *threadID = (NSString *)notification.object; - if (![threadID isEqualToString:self.thread.uniqueId]) { return; } - // Ensure thread instance is up to date - [self.thread reload]; - // Update UI - [self.viewItems.lastObject clearCachedLayoutState]; - [self updateInputToolbar]; - [self resetContentAndLayout]; + NSString *hexEncodedPublicKey = (NSString *)notification.object; + if (self.thread.isGroupThread) { return; } + + __block BOOL shouldReload = [self.thread.contactIdentifier isEqualToString:hexEncodedPublicKey]; + + // Check to see if this is a linked device + if (![self.thread.contactIdentifier isEqualToString:hexEncodedPublicKey]) { + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + NSSet *linkedDevices = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:self.thread.contactIdentifier in:transaction]; + shouldReload = [linkedDevices containsObject:hexEncodedPublicKey]; + }]; + } + if (shouldReload) { + // Ensure thread instance is up to date + [self.thread reload]; + // Update UI + [self.viewItems.lastObject clearCachedLayoutState]; + [self updateInputToolbar]; + [self resetContentAndLayout]; + } } - (void)handleThreadSessionRestoreDevicesChangedNotifiaction:(NSNotification *)notification diff --git a/SignalMessaging/profiles/OWSProfileManager.m b/SignalMessaging/profiles/OWSProfileManager.m index 128d70084..cf4fb1365 100644 --- a/SignalMessaging/profiles/OWSProfileManager.m +++ b/SignalMessaging/profiles/OWSProfileManager.m @@ -19,7 +19,7 @@ #import #import #import -#import +#import #import #import #import @@ -920,8 +920,8 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error); TSGroupThread *groupThread = (TSGroupThread *)thread; NSData *groupId = groupThread.groupModel.groupId; return [self isGroupIdInProfileWhitelist:groupId]; - } else if (thread.friendRequestStatus == LKThreadFriendRequestStatusFriends) { - return true; + } else if ([LKFriendRequestProtocol isFriendsWithLinkedDevicesOfHexEncodedPublicKey:thread.contactIdentifier]) { + return true } else { NSString *recipientId = thread.contactIdentifier; return [self isUserInProfileWhitelist:recipientId]; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index b05f1cc99..03f3db7f6 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -29,22 +29,6 @@ extern ConversationColorName const ConversationColorNameSteel; extern ConversationColorName const kConversationColorName_Default; -// TODO: Remove this once we don't use it -typedef NS_ENUM(NSInteger, LKThreadFriendRequestStatus) { - /// New conversation; no messages sent or received. - LKThreadFriendRequestStatusNone, - /// This state is used to lock the input early while sending. - LKThreadFriendRequestStatusRequestSending, - /// Friend request sent; awaiting response. - LKThreadFriendRequestStatusRequestSent, - /// Friend request received; awaiting user input. - LKThreadFriendRequestStatusRequestReceived, - /// We are friends with the other user in this thread. - LKThreadFriendRequestStatusFriends, - /// A friend request was sent, but it timed out (i.e. the other user didn't accept within the allocated time). - LKThreadFriendRequestStatusRequestExpired -} __deprecated_enum_msg("Use LKFriendRequestStatus instead"); - /** * TSThread is the superclass of TSContactThread and TSGroupThread */ @@ -205,8 +189,6 @@ typedef NS_ENUM(NSInteger, LKThreadFriendRequestStatus) { #pragma mark - Loki Friend Request Handling -- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction __deprecated_msg("use OWSPrimaryStorate.setFriendRequestStatus instead"); - /** Remove any outgoing friend request message which failed to send */ diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index bf53651ef..64744bbea 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -92,13 +92,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa } else { _conversationColorName = [self.class stableColorNameForNewConversationWithString:self.uniqueId]; } - - // Loki: Friend request logic doesn't apply to group chats - if (self.isGroupThread) { - _friendRequestStatus = LKThreadFriendRequestStatusFriends; - } else { - _friendRequestStatus = LKThreadFriendRequestStatusNone; - } } return self; @@ -730,7 +723,8 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (void)removeOldFriendRequestMessagesIfNeeded:(OWSInteractionType)interactionType withTransaction:(YapDatabaseReadWriteTransaction *)transaction { // If we're friends with the person then we don't need to remove any friend request messages - if (self.friendRequestStatus == LKThreadFriendRequestStatusFriends) { return; } + if (self.isGroupThread) { return; } + if ([LKFriendRequestProtocol isFriendsWithLinkedDevicesOfHexEncodedPublicKey:self.contactIdentifier]) { return; } NSMutableArray *idsToRemove = [NSMutableArray new]; __block TSMessage *_Nullable messageToKeep = nil; // We want to keep this interaction and not remove it @@ -774,55 +768,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa } } -- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction -{ - self.friendRequestStatus = friendRequestStatus; - [LKLogger print:[NSString stringWithFormat:@"[Loki] Setting thread friend request status to %@.", self.friendRequestStatusDescription]]; - void (^postNotification)() = ^() { - [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; - }; - if (transaction == nil) { - [self save]; - [self.dbReadWriteConnection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; - } else { - [self saveWithTransaction:transaction]; - [transaction.connection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; - } -} - -- (NSString *)friendRequestStatusDescription -{ - switch (self.friendRequestStatus) { - case LKThreadFriendRequestStatusNone: return @"none"; - case LKThreadFriendRequestStatusRequestSending: return @"sending"; - case LKThreadFriendRequestStatusRequestSent: return @"sent"; - case LKThreadFriendRequestStatusRequestReceived: return @"received"; - case LKThreadFriendRequestStatusFriends: return @"friends"; - case LKThreadFriendRequestStatusRequestExpired: return @"expired"; - } -} - -- (BOOL)hasPendingFriendRequest -{ - return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSending || self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent - || self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived; -} - -- (BOOL)isContactFriend -{ - return self.friendRequestStatus == LKThreadFriendRequestStatusFriends; -} - -- (BOOL)hasCurrentUserSentFriendRequest -{ - return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent; -} - -- (BOOL)hasCurrentUserReceivedFriendRequest -{ - return self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived; -} - @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m index 3fd82c247..202d4aeef 100644 --- a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m +++ b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m @@ -236,6 +236,9 @@ - (void)setFriendRequestStatus:(LKFriendRequestStatus)friendRequestStatus forContact:(NSString *)hexEncodedPublicKey transaction:(YapDatabaseReadWriteTransaction *)transaction { [transaction setObject:@(friendRequestStatus) forKey:hexEncodedPublicKey inCollection:LKFriendRequestCollection]; + [transaction addCompletionQueue:dispatch_get_main_queue() completionBlock:^{ + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.userFriendRequestStatusChanged object:hexEncodedPublicKey]; + }]; } @end diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestExpirationJob.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestExpirationJob.swift index bdd04fb28..9de00ada7 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestExpirationJob.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestExpirationJob.swift @@ -6,6 +6,7 @@ public final class FriendRequestExpirationJob : NSObject { private let databaseConnection: YapDatabaseConnection private let messageFinder = ExpiringFriendRequestFinder() + private let storage: OWSPrimaryStorage // These properties should only be accessed on the main thread. private var hasStarted = false @@ -19,6 +20,7 @@ public final class FriendRequestExpirationJob : NSObject { /// Create a `FriendRequestExpireJob`. /// This will create an auto-running job which will set friend requests to expired. @objc public init(withPrimaryStorage primaryStorage: OWSPrimaryStorage) { + storage = primaryStorage databaseConnection = primaryStorage.newDatabaseConnection() super.init() @@ -108,6 +110,7 @@ public final class FriendRequestExpirationJob : NSObject { strongSelf.databaseConnection.readWrite { transaction in strongSelf.messageFinder.enumurateMessagesPendingExpiration(with: { message in + guard message.thread is TSContactThread else { return } // Sanity check guard message.friendRequestExpiresAt <= now else { @@ -123,7 +126,7 @@ public final class FriendRequestExpirationJob : NSObject { } // Loki: Expire the friend request message - message.thread.saveFriendRequestStatus(.requestExpired, with: transaction) + strongSelf.storage.setFriendRequestStatus(.requestExpired, for: message.thread.contactIdentifier()!, transaction: transaction) message.saveFriendRequestStatus(.expired, with: transaction) message.saveFriendRequestExpires(at: 0, with: transaction) }, transaction: transaction) diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index cec88d22f..4578bb4b2 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -22,6 +22,19 @@ public final class FriendRequestProtocol : NSObject { } // MARK: - General + @objc(isFriendsWithLinkedDevicesOfHexEncodedPublicKey:) + public static func isFriendsWithLinkedDevices(of hexEncodedPublicKey: String) -> Bool { + var isFriends = false + storage.dbReadConnection.read { transaction in + let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) + let friendRequestStatuses = linkedDevices.map { device in + return storage.getFriendRequestStatus(for: device, transaction: transaction) + } + isFriends = friendRequestStatuses.contains(where: { $0 == .friends }) + } + return isFriends + } + @objc(shouldInputBarBeEnabledForThread:) public static func shouldInputBarBeEnabled(for thread: TSThread) -> Bool { // Friend requests have nothing to do with groups, so if this isn't a contact thread the input bar should be enabled diff --git a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift index 33859f32a..eb7c5bd75 100644 --- a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift +++ b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift @@ -3,7 +3,7 @@ public extension Notification.Name { // State changes public static let contactOnlineStatusChanged = Notification.Name("contactOnlineStatusChanged") - public static let threadFriendRequestStatusChanged = Notification.Name("threadFriendRequestStatusChanged") + public static let userFriendRequestStatusChanged = Notification.Name("userFriendRequestStatusChanged") public static let groupThreadUpdated = Notification.Name("groupThreadUpdated") public static let messageFriendRequestStatusChanged = Notification.Name("messageFriendRequestStatusChanged") public static let threadDeleted = Notification.Name("threadDeleted") @@ -26,7 +26,7 @@ public extension Notification.Name { // State changes @objc public static let contactOnlineStatusChanged = Notification.Name.contactOnlineStatusChanged.rawValue as NSString - @objc public static let threadFriendRequestStatusChanged = Notification.Name.threadFriendRequestStatusChanged.rawValue as NSString + @objc public static let userFriendRequestStatusChanged = Notification.Name.userFriendRequestStatusChanged.rawValue as NSString @objc public static let groupThreadUpdated = Notification.Name.groupThreadUpdated.rawValue as NSString @objc public static let messageFriendRequestStatusChanged = Notification.Name.messageFriendRequestStatusChanged.rawValue as NSString @objc public static let threadDeleted = Notification.Name.threadDeleted.rawValue as NSString