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;
}
- (TSThreadFriendRequestStatus)friendRequestStatus {
return self.message.thread.friendRequestStatus;
}
- (BOOL)isFriendRequest {
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
}
- (BOOL)shouldHaveSendFailureBadge
{
if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) {
@ -132,6 +124,18 @@ NS_ASSUME_NONNULL_BEGIN
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
- (void)loadForDisplay
@ -369,7 +373,7 @@ NS_ASSUME_NONNULL_BEGIN
}
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);

@ -1587,7 +1587,9 @@ typedef enum : NSUInteger {
- (void)updateIsInputToolbarInteractionEnabled {
// TODO: Listen to friend request updates and call this accordingly
/* TODO: Disabled temporarily
[self.inputToolbar setUserInteractionEnabled:!self.thread.isPendingFriendRequest];
*/
}
#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
// 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);
TSOutgoingMessage *message =

@ -53,7 +53,6 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
@property (nonatomic) BOOL shouldThreadBeVisible;
@property (nonatomic, readonly) NSDate *creationDate;
@property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting;
@property (atomic, readonly) TSThreadFriendRequestStatus friendRequestStatus; // Loki
/**
* 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;
#pragma mark - Loki Friend Request
#pragma mark - Loki Friend Request Handling
/// Check if this thread is a friend
- (BOOL)isFriend;
- (TSThreadFriendRequestStatus)getFriendRequestStatus;
/// Check if a friend request is pending
- (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;
- (TSThreadFriendRequestStatus)getFriendRequestStatusWithTransaction:(YapDatabaseReadTransaction *)transaction;
@end

@ -155,8 +155,6 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
{
[super saveWithTransaction:transaction];
[self updateFriendRequestStatusWithTransaction:transaction];
[SSKPreferences setHasSavedThreadWithValue:YES transaction:transaction];
}
@ -698,43 +696,24 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
# pragma mark - Loki Friend Request Handling
- (void)updateFriendRequestStatusWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
- (TSThreadFriendRequestStatus)getFriendRequestStatus
{
OWSLogInfo(@"[Loki] updateFriendRequestStatus");
YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName];
NSUInteger interactionCount = [interactions numberOfItemsInGroup:self.uniqueId];
if (interactionCount == 0) {
_friendRequestStatus = TSThreadFriendRequestStatusNone;
} 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;
__block TSThreadFriendRequestStatus friendRequestStatus;
[self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
friendRequestStatus = [self getFriendRequestStatusWithTransaction:transaction];
}];
return friendRequestStatus;
}
- (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

@ -43,7 +43,7 @@
@try {
return [self throws_loadPreKey:preKeyId];
} @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];
}
}

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

@ -416,7 +416,7 @@ NS_ASSUME_NONNULL_BEGIN
// Loki: Handle PreKeyBundle message
if (contentProto.prekeyBundleMessage) {
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) {
OWSFailDebug(@"Failed to create PreKeyBundle from message");
}

Loading…
Cancel
Save