diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 77f0712e9..3ebc8ae68 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -115,14 +115,6 @@ NS_ASSUME_NONNULL_BEGIN return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage; } -- (TSThreadFriendRequestStatus)friendRequestStatus { - return self.message.thread.friendRequestStatus; -} - -- (BOOL)isFriendRequest { - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; -} - - (BOOL)shouldHaveSendFailureBadge { if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) { @@ -132,6 +124,18 @@ NS_ASSUME_NONNULL_BEGIN return outgoingMessage.messageState == TSOutgoingMessageStateFailed; } +- (TSThreadFriendRequestStatus)friendRequestStatus +{ + return [self.message.thread getFriendRequestStatus]; +} + +- (BOOL)isFriendRequest +{ + TSThreadFriendRequestStatus friendRequestStatus = self.friendRequestStatus; + return friendRequestStatus == TSThreadFriendRequestStatusPendingSend || friendRequestStatus == TSThreadFriendRequestStatusRequestSent + || friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; +} + #pragma mark - Load - (void)loadForDisplay @@ -369,7 +373,7 @@ NS_ASSUME_NONNULL_BEGIN } if (self.isFriendRequest) { - cellSize.height += [FriendRequestView calculateHeightWithMessage:(TSMessage *)self.viewItem.interaction conversationStyle:self.conversationStyle]; + cellSize.height += [FriendRequestView calculateHeightWithMessage:self.message conversationStyle:self.conversationStyle]; } cellSize = CGSizeCeil(cellSize); diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index e564ed4b6..e04011e77 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -1587,7 +1587,9 @@ typedef enum : NSUInteger { - (void)updateIsInputToolbarInteractionEnabled { // TODO: Listen to friend request updates and call this accordingly + /* TODO: Disabled temporarily [self.inputToolbar setUserInteractionEnabled:!self.thread.isPendingFriendRequest]; + */ } #pragma mark - Identity diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index 7021ba7a2..1299bcf1c 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -186,7 +186,9 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess // Loki: If we're not friends then always set the message to a friend request message // If we're friends then the assumption is that we have the other user's pre-key bundle - NSString *messageClassAsString = thread.isFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; + TSThreadFriendRequestStatus friendRequestStatus = [thread getFriendRequestStatusWithTransaction:transaction]; + BOOL isFriend = friendRequestStatus == TSThreadFriendRequestStatusFriends; + NSString *messageClassAsString = isFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; Class messageClass = NSClassFromString(messageClassAsString); TSOutgoingMessage *message = diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 39171a993..f73468a28 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -53,7 +53,6 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { @property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; -@property (atomic, readonly) TSThreadFriendRequestStatus friendRequestStatus; // Loki /** * Whether the object is a group thread or not. @@ -187,19 +186,11 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { - (void)updateWithMutedUntilDate:(NSDate *)mutedUntilDate transaction:(YapDatabaseReadWriteTransaction *)transaction; -#pragma mark - Loki Friend Request +#pragma mark - Loki Friend Request Handling -/// Check if this thread is a friend -- (BOOL)isFriend; +- (TSThreadFriendRequestStatus)getFriendRequestStatus; -/// Check if a friend request is pending -- (BOOL)isPendingFriendRequest; - -/// Check if a friend request has been sent to this thread -- (BOOL)hasSentFriendRequest; - -/// Check if a friend request has been received from this thread -- (BOOL)hasReceivedFriendRequest; +- (TSThreadFriendRequestStatus)getFriendRequestStatusWithTransaction:(YapDatabaseReadTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 87782ca15..d394250c0 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -155,8 +155,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa { [super saveWithTransaction:transaction]; - [self updateFriendRequestStatusWithTransaction:transaction]; - [SSKPreferences setHasSavedThreadWithValue:YES transaction:transaction]; } @@ -698,43 +696,24 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa # pragma mark - Loki Friend Request Handling -- (void)updateFriendRequestStatusWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (TSThreadFriendRequestStatus)getFriendRequestStatus { - OWSLogInfo(@"[Loki] updateFriendRequestStatus"); - YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName]; - NSUInteger interactionCount = [interactions numberOfItemsInGroup:self.uniqueId]; - if (interactionCount == 0) { - _friendRequestStatus = TSThreadFriendRequestStatusNone; - } else if (interactionCount == 1) { - TSInteraction *interaction = [interactions firstObjectInGroup:self.uniqueId]; - BOOL isIncomingMessage = interaction.interactionType == OWSInteractionType_IncomingMessage; - _friendRequestStatus = isIncomingMessage ? TSThreadFriendRequestStatusRequestReceived : TSThreadFriendRequestStatusRequestSent; - } else { - _friendRequestStatus = TSThreadFriendRequestStatusFriends; - } -} - -- (BOOL)isFriend -{ - return self.friendRequestStatus == TSThreadFriendRequestStatusFriends; -} - -- (BOOL)isPendingFriendRequest -{ - return self.friendRequestStatus == TSThreadFriendRequestStatusPendingSend || - self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || - self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; -} - -- (BOOL)hasSentFriendRequest -{ - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || - self.friendRequestStatus == TSThreadFriendRequestStatusRequestExpired; + __block TSThreadFriendRequestStatus friendRequestStatus; + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + friendRequestStatus = [self getFriendRequestStatusWithTransaction:transaction]; + }]; + return friendRequestStatus; } -- (BOOL)hasReceivedFriendRequest +- (TSThreadFriendRequestStatus)getFriendRequestStatusWithTransaction:(YapDatabaseReadTransaction *)transaction { - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; + YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName]; + NSUInteger interactionCount = [interactions numberOfItemsInGroup:self.uniqueId]; + if (interactionCount == 0) { return TSThreadFriendRequestStatusNone; } + if (interactionCount >= 2) { return TSThreadFriendRequestStatusFriends; } + TSInteraction *interaction = [interactions firstObjectInGroup:self.uniqueId]; + BOOL isIncomingMessage = interaction.interactionType == OWSInteractionType_IncomingMessage; + return isIncomingMessage ? TSThreadFriendRequestStatusRequestReceived : TSThreadFriendRequestStatusRequestSent; } @end diff --git a/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m b/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m index 3f68de6c8..9cfb6cc83 100644 --- a/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m +++ b/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m @@ -43,7 +43,7 @@ @try { return [self throws_loadPreKey:preKeyId]; } @catch (NSException *exception) { - OWSLogWarn(@"[Loki] New prekey had to be generated for %@", pubKey); + OWSLogWarn(@"[Loki] New prekey had to be generated for %@.", pubKey); return [self generateAndStorePreKeyForContact:pubKey]; } } diff --git a/SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift b/SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift index 695658fa7..dedefc976 100644 --- a/SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift +++ b/SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift @@ -18,7 +18,7 @@ return builder } - @objc public func preKeyBundle(withTransaction transaction: YapDatabaseReadWriteTransaction) -> PreKeyBundle? { + @objc public func createPreKeyBundle(withTransaction transaction: YapDatabaseReadWriteTransaction) -> PreKeyBundle? { let registrationId = accountManager.getOrGenerateRegistrationId(transaction) return PreKeyBundle(registrationId: Int32(registrationId), deviceId: Int32(deviceID), diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index f43e6b740..19ca5ef83 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -416,7 +416,7 @@ NS_ASSUME_NONNULL_BEGIN // Loki: Handle PreKeyBundle message if (contentProto.prekeyBundleMessage) { OWSLogInfo(@"Received a prekey bundle message from: %@", envelope.source); - PreKeyBundle *_Nullable bundle = [contentProto.prekeyBundleMessage preKeyBundleWithTransaction:transaction]; + PreKeyBundle *_Nullable bundle = [contentProto.prekeyBundleMessage createPreKeyBundleWithTransaction:transaction]; if (!bundle) { OWSFailDebug(@"Failed to create PreKeyBundle from message"); }