diff --git a/Signal/src/Loki/FriendRequestView.swift b/Signal/src/Loki/FriendRequestView.swift index 2c6e9386c..ee235936b 100644 --- a/Signal/src/Loki/FriendRequestView.swift +++ b/Signal/src/Loki/FriendRequestView.swift @@ -130,7 +130,7 @@ let totalHeight: CGFloat = { switch kind { case .incoming: - let buttonHeight = dummyFriendRequestView.buttonHeight + let buttonHeight = dummyFriendRequestView.buttonStackView.isHidden ? 0 : dummyFriendRequestView.buttonHeight return topSpacing + messageHeight + buttonHeight case .outgoing: return topSpacing + messageHeight diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 8d725c715..838f816c4 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -207,8 +207,6 @@ NS_ASSUME_NONNULL_BEGIN } if (self.message.isFriendRequest) { - // At this point, self.message.thread.friendRequestStatus should be either TSThreadFriendRequestStatusRequestReceived, - // TSThreadFriendRequestStatusPendingSend or TSThreadFriendRequestStatusRequestSent NSString *rawKind = self.message.interactionType == OWSInteractionType_IncomingMessage ? @"incoming" : @"outgoing"; self.friendRequestView = [[FriendRequestView alloc] initWithRawKind:rawKind]; self.friendRequestView.message = self.message; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 48a3a888d..6096926aa 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4303,8 +4303,7 @@ typedef enum : NSUInteger { - (void)declineFriendRequest:(TSIncomingMessage *)friendRequest { // Reset friend request status - self.thread.friendRequestStatus = TSThreadFriendRequestStatusNone; - [self.thread save]; + [self.thread setFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; // Delete prekeys NSString *contactID = self.thread.recipientIdentifiers.firstObject; OWSPrimaryStorage *primaryStorage = SSKEnvironment.shared.primaryStorage; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index ae8ea7de3..f9041ccaa 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -189,6 +189,8 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { #pragma mark - Loki Friend Request Handling +- (void)setFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; + /// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusPendingSend`, `TSThreadFriendRequestStatusRequestSent` or `TSThreadFriendRequestStatusRequestReceived`. - (BOOL)hasPendingFriendRequest; diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 25748186d..4d28b8598 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -698,6 +698,16 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa #pragma mark - Loki Friend Request Handling +- (void)setFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +{ + self.friendRequestStatus = friendRequestStatus; + if (transaction == nil) { + [self save]; + } else { + [self saveWithTransaction:transaction]; + } +} + - (BOOL)hasPendingFriendRequest { return self.friendRequestStatus == TSThreadFriendRequestStatusPendingSend || self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index 803dc181d..c8a9d9a1a 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -69,6 +69,10 @@ NS_ASSUME_NONNULL_BEGIN - (void)updateWithLinkPreview:(OWSLinkPreview *)linkPreview transaction:(YapDatabaseReadWriteTransaction *)transaction; +#pragma mark - Loki Friend Request Handling + +- (void)setIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 14af436cf..7229721b4 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -440,6 +440,16 @@ static const NSUInteger OWSMessageSchemaVersion = 4; #pragma mark - Loki Friend Request Handling +- (void)setIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + self.isFriendRequest = isFriendRequest; + if (transaction == nil) { + [self save]; + } else { + [self saveWithTransaction:transaction]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 85c9d15a9..f998a6c0d 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1443,12 +1443,10 @@ NS_ASSUME_NONNULL_BEGIN } if (envelope.type == SSKProtoEnvelopeTypeFriendRequest) { - thread.friendRequestStatus = TSThreadFriendRequestStatusRequestReceived; - [thread saveWithTransaction:transaction]; + [thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; incomingMessage.isFriendRequest = YES; } else if (incomingMessage.body == @"") { // Assumed to be an accept friend request message - thread.friendRequestStatus = TSThreadFriendRequestStatusFriends; - [thread saveWithTransaction:transaction]; + [thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; } [incomingMessage saveWithTransaction:transaction]; diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index f0a87597b..bafd7c4c8 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1111,21 +1111,17 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Update the thread's friend request status if needed NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; if (messageType == TSFriendRequestMessageType) { - message.thread.friendRequestStatus = TSThreadFriendRequestStatusPendingSend; - [message.thread save]; - message.isFriendRequest = YES; - [message save]; + [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusPendingSend withTransaction:nil]; + [message setIsFriendRequest:YES withTransaction:nil]; } BOOL isPoWRequired = YES; // TODO: Base on message type [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired] .thenOn(OWSDispatch.sendingQueue, ^(id result) { // Update the thread's friend request status if needed if (messageType == TSFriendRequestMessageType) { - message.thread.friendRequestStatus = TSThreadFriendRequestStatusRequestSent; - [message.thread save]; + [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:nil]; } else if (message.body == @"") { // Assumed to be an accept friend request message - message.thread.friendRequestStatus = TSThreadFriendRequestStatusFriends; - [message.thread save]; + [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil]; } // Invoke the completion handler [self messageSendDidSucceed:messageSend @@ -1136,8 +1132,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; .catchOn(OWSDispatch.sendingQueue, ^(NSError *error) { // Update the thread's friend request status if needed if (messageType == TSFriendRequestMessageType) { - message.thread.friendRequestStatus = TSThreadFriendRequestStatusNone; - [message.thread save]; + [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; } // Handle the error NSUInteger statusCode = 0;