diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index e9f030b4d..df8193e17 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -186,9 +186,7 @@ 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 prekey bundle - TSThreadFriendRequestStatus friendRequestStatus = thread.friendRequestStatus; - BOOL isFriend = friendRequestStatus == TSThreadFriendRequestStatusFriends; - NSString *messageClassAsString = isFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; + NSString *messageClassAsString = thread.isContactFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; Class messageClass = NSClassFromString(messageClassAsString); TSOutgoingMessage *message = diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index f9041ccaa..42fb63766 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -53,7 +53,14 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { @property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; +// Loki friend request handling @property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus; +/// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusPendingSend`, `TSThreadFriendRequestStatusRequestSent` +/// or `TSThreadFriendRequestStatusRequestReceived`. +@property (nonatomic, readonly) BOOL hasPendingFriendRequest; +@property (nonatomic, readonly) BOOL isContactFriend; +@property (nonatomic, readonly) BOOL hasCurrentUserSentFriendRequest; +@property (nonatomic, readonly) BOOL hasCurrentUserReceivedFriendRequest; /** * Whether the object is a group thread or not. @@ -191,9 +198,6 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { - (void)setFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; -/// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusPendingSend`, `TSThreadFriendRequestStatusRequestSent` or `TSThreadFriendRequestStatusRequestReceived`. -- (BOOL)hasPendingFriendRequest; - @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 4d28b8598..4d197d756 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -714,6 +714,21 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; } +- (BOOL)isContactFriend +{ + return self.friendRequestStatus == TSThreadFriendRequestStatusFriends; +} + +- (BOOL)hasCurrentUserSentFriendRequest +{ + return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent; +} + +- (BOOL)hasCurrentUserReceivedFriendRequest +{ + return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index f998a6c0d..af8d4517b 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1442,12 +1442,19 @@ NS_ASSUME_NONNULL_BEGIN return; } + // Loki: + // ======== if (envelope.type == SSKProtoEnvelopeTypeFriendRequest) { - [thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; - incomingMessage.isFriendRequest = YES; - } else if (incomingMessage.body == @"") { // Assumed to be an accept friend request message + if (thread.hasCurrentUserSentFriendRequest) { + [thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; + } else { + [thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; + incomingMessage.isFriendRequest = YES; // Saved below + } + } else if (!thread.isContactFriend) { [thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; } + // ======== [incomingMessage saveWithTransaction:transaction]; diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index bafd7c4c8..4e1d784e6 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1117,12 +1117,16 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; 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 + // Loki + // ======== if (messageType == TSFriendRequestMessageType) { [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:nil]; - } else if (message.body == @"") { // Assumed to be an accept friend request message + } else if (thread.hasCurrentUserReceivedFriendRequest) { + // If the thread's current friend request state is TSThreadFriendRequestStatusRequestReceived, and we're sending a message, + // that means we're accepting the request. Declining a friend request doesn't send a message. [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil]; } + // ======== // Invoke the completion handler [self messageSendDidSucceed:messageSend deviceMessages:deviceMessages