diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 8361a3a07..07e48363b 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -53,6 +53,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { @property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; +@property (nonatomic, readonly) TSInteraction *lastInteraction; // Loki friend request handling // ======== @property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus; diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 4160e5360..990b81cc1 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -281,6 +281,16 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa }]; } +- (TSInteraction *)lastInteraction +{ + __block TSInteraction *interaction; + [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName]; + interaction = [interactions lastObjectInGroup:self.uniqueId]; + }]; + return interaction; +} + /** * Useful for tests and debugging. In production use an enumeration method. */ diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index b0604bc3f..d87770167 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -51,6 +51,7 @@ #import "TSQuotedMessage.h" #import #import +#import #import #import #import @@ -1475,7 +1476,10 @@ NS_ASSUME_NONNULL_BEGIN // we can end up in a deadlock where both users' threads' friend request statuses are // TSThreadFriendRequestStatusRequestSent. [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class]; + if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) { + [existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + } // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; @@ -1486,13 +1490,16 @@ NS_ASSUME_NONNULL_BEGIN // request. Alice's thread's friend request status is reset to // TSThreadFriendRequestStatusRequestReceived. [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; + message.friendRequestStatus = TSMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction. } } else if (!thread.isContactFriend) { // If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message, // it must be a friend request accepted message. Declining a friend request doesn't send a message. [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class]; + if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) { + [existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + } } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index e8106c007..a0c8355c7 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1122,7 +1122,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; // Set the expiration date NSTimeInterval expirationInterval = 72 * kHourInterval; NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; @@ -1141,7 +1140,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // ======== if (messageType == TSFriendRequestMessageType) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; } // ======== // Handle the error