Make friend request status updates more reliable

pull/15/head
Niels Andriesse 6 years ago
parent 9d3a9f9b78
commit cb1e876b7a

@ -115,14 +115,6 @@ NS_ASSUME_NONNULL_BEGIN
return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage; return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage;
} }
- (TSThreadFriendRequestStatus)friendRequestStatus {
return self.message.thread.friendRequestStatus;
}
- (BOOL)isFriendRequest {
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
}
- (BOOL)shouldHaveSendFailureBadge - (BOOL)shouldHaveSendFailureBadge
{ {
if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) { if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) {
@ -132,6 +124,18 @@ NS_ASSUME_NONNULL_BEGIN
return outgoingMessage.messageState == TSOutgoingMessageStateFailed; return outgoingMessage.messageState == TSOutgoingMessageStateFailed;
} }
- (TSThreadFriendRequestStatus)friendRequestStatus
{
return [self.message.thread getFriendRequestStatus];
}
- (BOOL)isFriendRequest
{
TSThreadFriendRequestStatus friendRequestStatus = self.friendRequestStatus;
return friendRequestStatus == TSThreadFriendRequestStatusPendingSend || friendRequestStatus == TSThreadFriendRequestStatusRequestSent
|| friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
}
#pragma mark - Load #pragma mark - Load
- (void)loadForDisplay - (void)loadForDisplay
@ -369,7 +373,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
if (self.isFriendRequest) { if (self.isFriendRequest) {
cellSize.height += [FriendRequestView calculateHeightWithMessage:(TSMessage *)self.viewItem.interaction conversationStyle:self.conversationStyle]; cellSize.height += [FriendRequestView calculateHeightWithMessage:self.message conversationStyle:self.conversationStyle];
} }
cellSize = CGSizeCeil(cellSize); cellSize = CGSizeCeil(cellSize);

@ -1587,7 +1587,9 @@ typedef enum : NSUInteger {
- (void)updateIsInputToolbarInteractionEnabled { - (void)updateIsInputToolbarInteractionEnabled {
// TODO: Listen to friend request updates and call this accordingly // TODO: Listen to friend request updates and call this accordingly
/* TODO: Disabled temporarily
[self.inputToolbar setUserInteractionEnabled:!self.thread.isPendingFriendRequest]; [self.inputToolbar setUserInteractionEnabled:!self.thread.isPendingFriendRequest];
*/
} }
#pragma mark - Identity #pragma mark - Identity

@ -186,7 +186,9 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess
// Loki: If we're not friends then always set the message to a friend request message // 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 pre-key bundle // If we're friends then the assumption is that we have the other user's pre-key bundle
NSString *messageClassAsString = thread.isFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; TSThreadFriendRequestStatus friendRequestStatus = [thread getFriendRequestStatusWithTransaction:transaction];
BOOL isFriend = friendRequestStatus == TSThreadFriendRequestStatusFriends;
NSString *messageClassAsString = isFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage";
Class messageClass = NSClassFromString(messageClassAsString); Class messageClass = NSClassFromString(messageClassAsString);
TSOutgoingMessage *message = TSOutgoingMessage *message =

@ -53,7 +53,6 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
@property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic) BOOL shouldThreadBeVisible;
@property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) NSDate *creationDate;
@property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting;
@property (atomic, readonly) TSThreadFriendRequestStatus friendRequestStatus; // Loki
/** /**
* Whether the object is a group thread or not. * Whether the object is a group thread or not.
@ -187,19 +186,11 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
- (void)updateWithMutedUntilDate:(NSDate *)mutedUntilDate transaction:(YapDatabaseReadWriteTransaction *)transaction; - (void)updateWithMutedUntilDate:(NSDate *)mutedUntilDate transaction:(YapDatabaseReadWriteTransaction *)transaction;
#pragma mark - Loki Friend Request #pragma mark - Loki Friend Request Handling
/// Check if this thread is a friend - (TSThreadFriendRequestStatus)getFriendRequestStatus;
- (BOOL)isFriend;
/// Check if a friend request is pending - (TSThreadFriendRequestStatus)getFriendRequestStatusWithTransaction:(YapDatabaseReadTransaction *)transaction;
- (BOOL)isPendingFriendRequest;
/// Check if a friend request has been sent to this thread
- (BOOL)hasSentFriendRequest;
/// Check if a friend request has been received from this thread
- (BOOL)hasReceivedFriendRequest;
@end @end

@ -155,8 +155,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
{ {
[super saveWithTransaction:transaction]; [super saveWithTransaction:transaction];
[self updateFriendRequestStatusWithTransaction:transaction];
[SSKPreferences setHasSavedThreadWithValue:YES transaction:transaction]; [SSKPreferences setHasSavedThreadWithValue:YES transaction:transaction];
} }
@ -698,43 +696,24 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
# pragma mark - Loki Friend Request Handling # pragma mark - Loki Friend Request Handling
- (void)updateFriendRequestStatusWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (TSThreadFriendRequestStatus)getFriendRequestStatus
{ {
OWSLogInfo(@"[Loki] updateFriendRequestStatus"); __block TSThreadFriendRequestStatus friendRequestStatus;
YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName]; [self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
NSUInteger interactionCount = [interactions numberOfItemsInGroup:self.uniqueId]; friendRequestStatus = [self getFriendRequestStatusWithTransaction:transaction];
if (interactionCount == 0) { }];
_friendRequestStatus = TSThreadFriendRequestStatusNone; return friendRequestStatus;
} else if (interactionCount == 1) {
TSInteraction *interaction = [interactions firstObjectInGroup:self.uniqueId];
BOOL isIncomingMessage = interaction.interactionType == OWSInteractionType_IncomingMessage;
_friendRequestStatus = isIncomingMessage ? TSThreadFriendRequestStatusRequestReceived : TSThreadFriendRequestStatusRequestSent;
} else {
_friendRequestStatus = TSThreadFriendRequestStatusFriends;
}
}
- (BOOL)isFriend
{
return self.friendRequestStatus == TSThreadFriendRequestStatusFriends;
}
- (BOOL)isPendingFriendRequest
{
return self.friendRequestStatus == TSThreadFriendRequestStatusPendingSend ||
self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent ||
self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
}
- (BOOL)hasSentFriendRequest
{
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent ||
self.friendRequestStatus == TSThreadFriendRequestStatusRequestExpired;
} }
- (BOOL)hasReceivedFriendRequest - (TSThreadFriendRequestStatus)getFriendRequestStatusWithTransaction:(YapDatabaseReadTransaction *)transaction
{ {
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName];
NSUInteger interactionCount = [interactions numberOfItemsInGroup:self.uniqueId];
if (interactionCount == 0) { return TSThreadFriendRequestStatusNone; }
if (interactionCount >= 2) { return TSThreadFriendRequestStatusFriends; }
TSInteraction *interaction = [interactions firstObjectInGroup:self.uniqueId];
BOOL isIncomingMessage = interaction.interactionType == OWSInteractionType_IncomingMessage;
return isIncomingMessage ? TSThreadFriendRequestStatusRequestReceived : TSThreadFriendRequestStatusRequestSent;
} }
@end @end

@ -43,7 +43,7 @@
@try { @try {
return [self throws_loadPreKey:preKeyId]; return [self throws_loadPreKey:preKeyId];
} @catch (NSException *exception) { } @catch (NSException *exception) {
OWSLogWarn(@"[Loki] New prekey had to be generated for %@", pubKey); OWSLogWarn(@"[Loki] New prekey had to be generated for %@.", pubKey);
return [self generateAndStorePreKeyForContact:pubKey]; return [self generateAndStorePreKeyForContact:pubKey];
} }
} }

@ -18,7 +18,7 @@
return builder return builder
} }
@objc public func preKeyBundle(withTransaction transaction: YapDatabaseReadWriteTransaction) -> PreKeyBundle? { @objc public func createPreKeyBundle(withTransaction transaction: YapDatabaseReadWriteTransaction) -> PreKeyBundle? {
let registrationId = accountManager.getOrGenerateRegistrationId(transaction) let registrationId = accountManager.getOrGenerateRegistrationId(transaction)
return PreKeyBundle(registrationId: Int32(registrationId), return PreKeyBundle(registrationId: Int32(registrationId),
deviceId: Int32(deviceID), deviceId: Int32(deviceID),

@ -416,7 +416,7 @@ NS_ASSUME_NONNULL_BEGIN
// Loki: Handle PreKeyBundle message // Loki: Handle PreKeyBundle message
if (contentProto.prekeyBundleMessage) { if (contentProto.prekeyBundleMessage) {
OWSLogInfo(@"Received a prekey bundle message from: %@", envelope.source); OWSLogInfo(@"Received a prekey bundle message from: %@", envelope.source);
PreKeyBundle *_Nullable bundle = [contentProto.prekeyBundleMessage preKeyBundleWithTransaction:transaction]; PreKeyBundle *_Nullable bundle = [contentProto.prekeyBundleMessage createPreKeyBundleWithTransaction:transaction];
if (!bundle) { if (!bundle) {
OWSFailDebug(@"Failed to create PreKeyBundle from message"); OWSFailDebug(@"Failed to create PreKeyBundle from message");
} }

Loading…
Cancel
Save