From c23b6782e8c6855faf9b589018991a3daeeece0f Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 6 Nov 2019 16:09:09 +1100 Subject: [PATCH] Fix friend request display logic --- .../ConversationView/Cells/OWSMessageCell.m | 35 +++++++++++++++++-- .../Loki/Database/LokiDatabaseUtilities.swift | 5 +++ .../src/Loki/Utilities/NSSet+Functional.h | 1 + .../src/Loki/Utilities/NSSet+Functional.m | 9 +++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 980db5544..944719347 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -213,7 +213,7 @@ NS_ASSUME_NONNULL_BEGIN } } - if (self.message.isFriendRequest) { + if ([self shouldShowFriendRequestUIForMessage:self.message]) { self.friendRequestView = [[LKFriendRequestView alloc] initWithMessage:self.message]; self.friendRequestView.delegate = self.friendRequestViewDelegate; [self.contentView addSubview:self.friendRequestView]; @@ -383,7 +383,7 @@ NS_ASSUME_NONNULL_BEGIN cellSize.width += self.sendFailureBadgeSize + self.sendFailureBadgeSpacing; } - if (self.message.isFriendRequest) { + if ([self shouldShowFriendRequestUIForMessage:self.message]) { cellSize.height += [LKFriendRequestView calculateHeightWithMessage:self.message conversationStyle:self.conversationStyle]; } @@ -468,7 +468,7 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssertDebug(self.delegate); - if (self.message.isFriendRequest) { + if ([self shouldShowFriendRequestUIForMessage:self.message]) { return; } @@ -530,6 +530,35 @@ NS_ASSUME_NONNULL_BEGIN return location.y <= headerBottom.y; } +#pragma mark - Convenience + +- (BOOL)shouldShowFriendRequestUIForMessage:(TSMessage *)message +{ + if ([message isKindOfClass:TSOutgoingMessage.class]) { + return message.isFriendRequest; + } else { + if (message.isFriendRequest) { + // Only show an incoming friend request if the user isn't yet friends with any of the other user's devices + NSString *senderID = ((TSIncomingMessage *)message).authorId; + NSMutableSet *threads = [NSMutableSet new]; + [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + NSSet *deviceLinks = [LKDatabaseUtilities getDeviceLinksFor:senderID in:transaction]; + for (LKDeviceLink *deviceLink in deviceLinks) { + [threads addObject:[TSContactThread getThreadWithContactId:deviceLink.master.hexEncodedPublicKey transaction:transaction]]; + [threads addObject:[TSContactThread getThreadWithContactId:deviceLink.slave.hexEncodedPublicKey transaction:transaction]]; + } + }]; + BOOL isFriend = [threads contains:^BOOL(NSObject *object) { + TSContactThread *thread = (TSContactThread *)object; + return thread.isContactFriend; + }]; + return !isFriend; + } else { + return NO; + } + } +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift index 8e2c2abf5..643632831 100644 --- a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift +++ b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift @@ -27,6 +27,11 @@ public final class LokiDatabaseUtilities : NSObject { return OWSPrimaryStorage.shared().getMasterHexEncodedPublicKey(for: slaveHexEncodedPublicKey, in: transaction) } + @objc(getDeviceLinksFor:in:) + public static func objc_getDeviceLinks(for masterHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set { + return OWSPrimaryStorage.shared().getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction) + } + // MARK: Public Chats private static let publicChatCollection = "LokiPublicChatCollection" diff --git a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.h b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.h index 9808cc05f..c95e56e33 100644 --- a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.h +++ b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.h @@ -3,5 +3,6 @@ - (BOOL)contains:(BOOL (^)(NSObject *))predicate; - (NSSet *)filtered:(BOOL (^)(NSObject *))isIncluded; +- (NSSet *)map:(NSObject *(^)(NSObject *))transform; @end diff --git a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m index c2ad2098b..5e01748d0 100644 --- a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m +++ b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m @@ -20,4 +20,13 @@ return result; } +- (NSSet *)map:(NSObject *(^)(NSObject *))transform { + NSMutableSet *result = [NSMutableSet new]; + for (NSObject *object in self) { + NSObject *transformedObject = transform(object); + [result addObject:transformedObject]; + } + return result; +} + @end