From 9bcde73d14f78a8095e9dc70c4f7fa032e4ba46b Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 4 May 2020 09:57:26 +1000 Subject: [PATCH 1/2] Update FriendRequestView for friend request refactor --- .../Loki/Components/FriendRequestView.swift | 59 ++++++++----------- .../FriendRequestProtocol.swift | 4 +- 2 files changed, 27 insertions(+), 36 deletions(-) diff --git a/Signal/src/Loki/Components/FriendRequestView.swift b/Signal/src/Loki/Components/FriendRequestView.swift index 6143330cf..fe58c77d6 100644 --- a/Signal/src/Loki/Components/FriendRequestView.swift +++ b/Signal/src/Loki/Components/FriendRequestView.swift @@ -9,7 +9,7 @@ final class FriendRequestView : UIView { return isIncoming ? .incoming : .outgoing } - // MARK: Types + // MARK: Kind enum Kind : String { case incoming, outgoing } // MARK: Components @@ -90,7 +90,7 @@ final class FriendRequestView : UIView { mainStackView.pin(to: self) updateUI() // Observe friend request status changes - NotificationCenter.default.addObserver(self, selector: #selector(handleFriendRequestStatusChangedNotification), name: .messageFriendRequestStatusChanged, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(handleFriendRequestStatusChangedNotification), name: .userFriendRequestStatusChanged, object: nil) } deinit { @@ -100,50 +100,39 @@ final class FriendRequestView : UIView { // MARK: Updating @objc private func handleFriendRequestStatusChangedNotification(_ notification: Notification) { let messageID = notification.object as! String - guard messageID == message.uniqueId && TSMessage.fetch(uniqueId: messageID) != nil else { return } // It's possible for the message to be deleted at this point + // It's possible for the message to be deleted at this point + guard messageID == message.uniqueId && TSMessage.fetch(uniqueId: messageID) != nil else { return } message.reload() updateUI() } private func updateUI() { + // TODO: Expiration + let thread = message.thread + let friendRequestStatus = FriendRequestProtocol.getFriendRequestUIStatus(for: thread) + guard friendRequestStatus != .none, let contactID = thread.contactIdentifier() else { return } + let displayName = UserDisplayNameUtilities.getPrivateChatDisplayName(for: contactID) ?? contactID switch kind { case .incoming: - guard let message = message as? TSIncomingMessage else { preconditionFailure() } - buttonStackView.isHidden = message.friendRequestStatus != .pending + buttonStackView.isHidden = friendRequestStatus != .received spacer2.isHidden = buttonStackView.isHidden - let format: String = { - switch (message.friendRequestStatus) { - case .none, .sendingOrFailed: preconditionFailure() - case .pending: return NSLocalizedString("%@ sent you a session request", comment: "") - case .accepted: return NSLocalizedString("You've accepted %@'s session request", comment: "") - case .declined: return NSLocalizedString("You've declined %@'s session request", comment: "") - case .expired: return NSLocalizedString("%@'s session request has expired", comment: "") - default: preconditionFailure() - } - }() - let contactID = message.authorId - let displayName = UserDisplayNameUtilities.getPrivateChatDisplayName(for: contactID) ?? contactID + let format: String + switch friendRequestStatus { + case .none: format = NSLocalizedString("You've declined %@'s session request", comment: "") + case .friends: format = NSLocalizedString("You've accepted %@'s session request", comment: "") + case .received: format = NSLocalizedString("%@ sent you a session request", comment: "") + case .sent: return // Should never occur + } label.text = String(format: format, displayName) case .outgoing: - guard let message = message as? TSOutgoingMessage else { preconditionFailure() } - let format: String? = { - switch (message.friendRequestStatus) { - case .none: preconditionFailure() - case .sendingOrFailed: return nil - case .pending: return NSLocalizedString("You've sent %@ a session request", comment: "") - case .accepted: return NSLocalizedString("%@ accepted your session request", comment: "") - case .declined: preconditionFailure() - case .expired: return NSLocalizedString("Your session request to %@ has expired", comment: "") - default: preconditionFailure() - } - }() - if let format = format { - let contactID = message.thread.contactIdentifier()! - let displayName = UserDisplayNameUtilities.getPrivateChatDisplayName(for: contactID) ?? contactID - label.text = String(format: format, displayName) + let format: String + switch friendRequestStatus { + case .none: return // Should never occur + case .friends: format = NSLocalizedString("%@ accepted your session request", comment: "") + case .received: return // Should never occur + case .sent: format = NSLocalizedString("You've sent %@ a session request", comment: "") } - label.isHidden = (format == nil) - spacer1.isHidden = (label.isHidden) + label.text = String(format: format, displayName) } } diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index 81a9b4912..d82060f7f 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -82,6 +82,7 @@ public final class FriendRequestProtocol : NSObject { guard let thread = thread as? TSContactThread else { return .none } // If this is a note to self then we don't want to show the friend request guard !thread.isNoteToSelf() else { return .none } + // Gather friend request statuses for all linked devices var friendRequestStatuses: [LKFriendRequestStatus] = [] storage.dbReadConnection.read { transaction in let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: thread.contactIdentifier(), in: transaction) @@ -89,9 +90,10 @@ public final class FriendRequestProtocol : NSObject { storage.getFriendRequestStatus(for: $0, transaction: transaction) } } + // Return if friendRequestStatuses.contains(where: { $0 == .friends }) { return .friends } if friendRequestStatuses.contains(where: { $0 == .requestReceived }) { return .received } - if friendRequestStatuses.contains(where: { $0 == .requestSent }) { return .sent } + if friendRequestStatuses.contains(where: { $0 == .requestSent || $0 == .requestSending }) { return .sent } return .none } From 03ecdbd42fbbeabdf35b93d1072fc2d632d4ced8 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 4 May 2020 09:57:38 +1000 Subject: [PATCH 2/2] Avoid write transaction --- .../ViewControllers/ConversationView/Cells/OWSMessageCell.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 5686619b6..2f8f081ac 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -539,12 +539,12 @@ NS_ASSUME_NONNULL_BEGIN // Only show the first friend request that was received NSString *senderID = ((TSIncomingMessage *)message).authorId; __block NSMutableSet *linkedDeviceThreads; - [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { linkedDeviceThreads = [LKDatabaseUtilities getLinkedDeviceThreadsFor:senderID in:transaction].mutableCopy; }]; NSMutableArray *allFriendRequestMessages = @[].mutableCopy; for (TSContactThread *thread in linkedDeviceThreads) { - [thread enumerateInteractionsUsingBlock:^(TSInteraction *interaction) { + [thread enumerateInteractionsUsingBlock:^(TSInteraction *interaction) { // Starts a new write transaction internally TSIncomingMessage *message = [interaction as:TSIncomingMessage.class]; if (message != nil && message.isFriendRequest) { [allFriendRequestMessages addObject:message];