diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 125344f10..77f0712e9 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -115,14 +115,12 @@ NS_ASSUME_NONNULL_BEGIN return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage; } -- (TSThreadFriendRequestState)friendRequestState { - return self.isIncoming ? TSThreadFriendRequestStateRequestReceived : TSThreadFriendRequestStateRequestSent; -// return self.message.thread.friendRequestState; +- (TSThreadFriendRequestStatus)friendRequestStatus { + return self.message.thread.friendRequestStatus; } - (BOOL)isFriendRequest { - return YES; - // return self.friendRequestState == TSThreadFriendRequestStateRequestSent || self.friendRequestState == TSThreadFriendRequestStateRequestReceived; + return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; } - (BOOL)shouldHaveSendFailureBadge @@ -217,9 +215,9 @@ NS_ASSUME_NONNULL_BEGIN } if (self.isFriendRequest) { - // At this point, self.friendRequestState should be either TSThreadFriendRequestStateRequestReceived, - // TSThreadFriendRequestStatePendingSend or TSThreadFriendRequestStateRequestSent - NSString *rawKind = self.friendRequestState == TSThreadFriendRequestStateRequestReceived ? @"incoming" : @"outgoing"; + // At this point, self.friendRequestStatus should be either TSThreadFriendRequestStatusRequestReceived, + // TSThreadFriendRequestStatusPendingSend or TSThreadFriendRequestStatusRequestSent + NSString *rawKind = self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived ? @"incoming" : @"outgoing"; self.friendRequestView = [[FriendRequestView alloc] initWithRawKind:rawKind]; self.friendRequestView.message = self.message; self.friendRequestView.delegate = self.friendRequestViewDelegate; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 0bcbcead0..39171a993 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -30,19 +30,19 @@ extern ConversationColorName const ConversationColorNameSteel; extern ConversationColorName const kConversationColorName_Default; // Loki: Friend request state -typedef NS_ENUM(NSInteger, TSThreadFriendRequestState) { +typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { // New conversation, no messages sent or received - TSThreadFriendRequestStateNone, + TSThreadFriendRequestStatusNone, // This state is used to lock the input early while sending - TSThreadFriendRequestStatePendingSend, + TSThreadFriendRequestStatusPendingSend, // Friend request sent, awaiting response - TSThreadFriendRequestStateRequestSent, + TSThreadFriendRequestStatusRequestSent, // Friend request received, awaiting user input - TSThreadFriendRequestStateRequestReceived, + TSThreadFriendRequestStatusRequestReceived, // We are friends with the user of this thread - TSThreadFriendRequestStateFriends, + TSThreadFriendRequestStatusFriends, // Friend request sent but it timed out (user didn't accept within x time) - TSThreadFriendRequestStateRequestExpired, + TSThreadFriendRequestStatusRequestExpired }; /** @@ -53,9 +53,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestState) { @property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; - -// Loki: The current friend request state with this thread -@property (atomic, readonly) TSThreadFriendRequestState friendRequestState; +@property (atomic, readonly) TSThreadFriendRequestStatus friendRequestStatus; // Loki /** * Whether the object is a group thread or not. diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index f0697b5a5..233dfab82 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -50,8 +50,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa @property (nonatomic, copy, nullable) NSString *messageDraft; @property (atomic, nullable) NSDate *mutedUntilDate; -@property (atomic) TSThreadFriendRequestState friendRequestState; - // DEPRECATED - not used since migrating to sortId // but keeping these properties around to ease any pain in the back-forth // migration while testing. Eventually we can safely delete these as they aren't used anywhere. @@ -86,9 +84,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa if (self) { _creationDate = [NSDate date]; _messageDraft = nil; - - // We are initially not friends - _friendRequestState = TSThreadFriendRequestStateNone; NSString *_Nullable contactId = self.contactIdentifier; if (contactId.length > 0) { @@ -159,6 +154,8 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { [super saveWithTransaction:transaction]; + + [self updateFriendRequestStatusWithTransaction:transaction]; [SSKPreferences setHasSavedThreadWithValue:YES transaction:transaction]; } @@ -699,33 +696,44 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa }]; } -# pragma mark - Loki Friend Request +# pragma mark - Loki Friend Request Handling + +- (void)updateFriendRequestStatusWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + OWSLogInfo(@"[Loki] updateFriendRequestStatus"); + NSUInteger numberOfInteractions = self.numberOfInteractions; + if (numberOfInteractions == 0) { + _friendRequestStatus = TSThreadFriendRequestStatusNone; + } else if (numberOfInteractions == 1) { + YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName]; + TSInteraction *interaction = [interactions firstObjectInGroup:self.uniqueId]; + _friendRequestStatus = interaction.interactionType == OWSInteractionType_IncomingMessage ? TSThreadFriendRequestStatusRequestReceived : TSThreadFriendRequestStatusRequestSent; + } else { + _friendRequestStatus = TSThreadFriendRequestStatusFriends; + } +} - (BOOL)isFriend { - return _friendRequestState == TSThreadFriendRequestStateFriends; + return self.friendRequestStatus == TSThreadFriendRequestStatusFriends; } - (BOOL)isPendingFriendRequest { - return ( - _friendRequestState == TSThreadFriendRequestStatePendingSend || - _friendRequestState == TSThreadFriendRequestStateRequestSent || - _friendRequestState == TSThreadFriendRequestStateRequestReceived - ); + return self.friendRequestStatus == TSThreadFriendRequestStatusPendingSend || + self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || + self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; } - (BOOL)hasSentFriendRequest { - return ( - _friendRequestState == TSThreadFriendRequestStateRequestSent || - _friendRequestState == TSThreadFriendRequestStateRequestExpired - ); + return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || + self.friendRequestStatus == TSThreadFriendRequestStatusRequestExpired; } - (BOOL)hasReceivedFriendRequest { - return _friendRequestState == TSThreadFriendRequestStateRequestReceived; + return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; } @end