From 740291ccebe8d907630aea6e0f0b10b56c3c5dd0 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 20 May 2019 16:36:22 +1000 Subject: [PATCH] Implement message friend request status Untested --- Signal/src/Loki/FriendRequestView.swift | 31 +++++++++---------- .../translations/en.lproj/Localizable.strings | 1 + SignalServiceKit/src/Contacts/TSThread.h | 2 +- .../Utilities/FriendRequestExpireJob.swift | 2 +- .../src/Messages/Interactions/TSMessage.h | 24 +++++++++++--- .../src/Messages/Interactions/TSMessage.m | 13 +++----- .../src/Messages/OWSMessageManager.m | 5 +-- .../src/Messages/OWSMessageSender.m | 3 ++ 8 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Signal/src/Loki/FriendRequestView.swift b/Signal/src/Loki/FriendRequestView.swift index 2a629c361..fe3953927 100644 --- a/Signal/src/Loki/FriendRequestView.swift +++ b/Signal/src/Loki/FriendRequestView.swift @@ -4,15 +4,6 @@ @objc weak var delegate: FriendRequestViewDelegate? private let kind: Kind - private var didAcceptRequest: Bool { - return message.thread.friendRequestStatus == .friends - } - - private var didDeclineRequest: Bool { - guard let message = message as? TSIncomingMessage else { preconditionFailure() } - return message.thread.friendRequestStatus == .none - } - // MARK: Types enum Kind : String { case incoming, outgoing } @@ -83,20 +74,24 @@ switch kind { case .incoming: guard let message = message as? TSIncomingMessage else { preconditionFailure() } - buttonStackView.isHidden = didAcceptRequest || didDeclineRequest || message.isFriendRequestExpired + buttonStackView.isHidden = !(message.friendRequestStatus == .pending) let format: String = { - if didAcceptRequest { return NSLocalizedString("You've accepted %@'s friend request", comment: "") } - else if didDeclineRequest { return NSLocalizedString("You've declined %@'s friend request", comment: "") } - else if message.isFriendRequestExpired { return NSLocalizedString("%@'s friend request has expired", comment: "") } - else { return NSLocalizedString("%@ sent you a friend request", comment: "") } + switch (message.friendRequestStatus) { + case .accepted: return NSLocalizedString("You've accepted %@'s friend request", comment: "") + case .declined: return NSLocalizedString("You've declined %@'s friend request", comment: "") + case .expired: return NSLocalizedString("%@'s friend request has expired", comment: "") + default: return NSLocalizedString("%@ sent you a friend request", comment: "") + } }() label.text = String(format: format, message.authorId) case .outgoing: guard let message = message as? TSOutgoingMessage else { preconditionFailure() } let format: String = { - if didAcceptRequest { return NSLocalizedString("%@ accepted your friend request", comment: "") } - else if message.isFriendRequestExpired { return NSLocalizedString("Your friend request to %@ has expired", comment: "") } - else { return NSLocalizedString("You've sent %@ a friend request", comment: "") } + switch (message.friendRequestStatus) { + case .accepted: return NSLocalizedString("%@ accepted your friend request", comment: "") + case .expired: return NSLocalizedString("Your friend request to %@ has expired", comment: "") + default: return NSLocalizedString("You've sent %@ a friend request", comment: "") + } }() label.text = String(format: format, message.thread.contactIdentifier()!) } @@ -105,11 +100,13 @@ // MARK: Interaction @objc private func accept() { guard let message = message as? TSIncomingMessage else { preconditionFailure() } + message.saveFriendRequestStatus(.accepted, with: nil) delegate?.acceptFriendRequest(message) } @objc private func decline() { guard let message = message as? TSIncomingMessage else { preconditionFailure() } + message.saveFriendRequestStatus(.declined, with: nil) delegate?.declineFriendRequest(message) handleMessageChanged() // Update UI } diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 7b2cf4c82..dab2c54e4 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -2579,6 +2579,7 @@ "Secure session reset in progress" = "Secure session reset in progress"; "Secure session reset done" = "Secure session reset done"; "Session" = "Session"; +"You've sent %@ a friend request" = "You've sent %@ a friend request"; "You've declined %@'s friend request" = "You've declined %@'s friend request"; "You've accepted %@'s friend request" = "You've accepted %@'s friend request"; "%@ accepted your friend request" = "%@ accepted your friend request"; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 1af033db2..8361a3a07 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -29,7 +29,7 @@ extern ConversationColorName const ConversationColorNameSteel; extern ConversationColorName const kConversationColorName_Default; -// Loki: Friend request state +// Loki: Friend request status typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { /// New conversation, no messages sent or received TSThreadFriendRequestStatusNone, diff --git a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift b/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift index 8ef5b1937..e83d9c26d 100644 --- a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift +++ b/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift @@ -138,8 +138,8 @@ public final class FriendRequestExpireJob : NSObject { // Loki: Expire the friend request message message.thread.saveFriendRequestStatus(.requestExpired, with: transaction) + message.saveFriendRequestStatus(.expired, with: transaction) message.saveFriendRequestExpires(at: 0, with: transaction) - message.saveIsFriendRequestExpired(true, with: transaction) }, transaction: transaction) } }) diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index f143ada14..455cce3d2 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -17,6 +17,20 @@ NS_ASSUME_NONNULL_BEGIN @class TSQuotedMessage; @class YapDatabaseReadWriteTransaction; +// Loki: Friend request status +typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { + /// Not a friend request message. + TSMessageFriendRequestStatusNone, + /// A pending friend request. + TSMessageFriendRequestStatusPending, + /// A friend request that has been accepted. + TSMessageFriendRequestStatusAccepted, + /// A friend request that has been declined. + TSMessageFriendRequestStatusDeclined, + /// A friend request that has expired. + TSMessageFriendRequestStatusExpired +}; + @interface TSMessage : TSInteraction @property (nonatomic, readonly) NSMutableArray *attachmentIds; @@ -28,9 +42,12 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage; @property (nonatomic, readonly, nullable) OWSContact *contactShare; @property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; -@property (nonatomic) BOOL isFriendRequest; // Loki +// Loki friend request handling +// ======== +@property (nonatomic) TSMessageFriendRequestStatus friendRequestStatus; @property (nonatomic) uint64_t friendRequestExpiresAt; -@property (nonatomic) BOOL isFriendRequestExpired; +@property (nonatomic, readonly) BOOL isFriendRequest; +// ======== - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; @@ -73,9 +90,8 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Loki Friend Request Handling -- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; +- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; - (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; -- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 90dfc30c5..cff0efe8d 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -441,9 +441,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4; #pragma mark - Loki Friend Request Handling -- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { - self.isFriendRequest = isFriendRequest; + self.friendRequestStatus = friendRequestStatus; if (transaction == nil) { [self save]; } else { @@ -461,14 +461,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4; } } -- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +- (BOOL)isFriendRequest { - self.isFriendRequestExpired = isFriendRequestExpired; - if (transaction == nil) { - [self save]; - } else { - [self saveWithTransaction:transaction]; - } + return self.friendRequestStatus != TSMessageFriendRequestStatusNone; } @end diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 428db8b73..b0604bc3f 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1475,7 +1475,7 @@ 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]; // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; @@ -1486,12 +1486,13 @@ NS_ASSUME_NONNULL_BEGIN // request. Alice's thread's friend request status is reset to // TSThreadFriendRequestStatusRequestReceived. [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; - message.isFriendRequest = YES; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction: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]; } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index aaaea1a38..a44c22780 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1111,6 +1111,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; if (messageType == TSFriendRequestMessageType) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; } BOOL isPoWRequired = YES; // TODO: Base on message type [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired] @@ -1121,6 +1122,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; // Set the expiration date NSTimeInterval expirationInterval = 72 * kHourInterval; NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; @@ -1139,6 +1141,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // ======== if (messageType == TSFriendRequestMessageType) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; } // ======== // Handle the error