diff --git a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift index c8b13fa72..970a7b974 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift @@ -111,11 +111,6 @@ public final class MultiDeviceProtocol : NSObject { thread.isForceHidden = isSlaveDeviceThread // TODO: Could we make this computed? thread.save(with: transaction) - // FIXME: I don't think this should be here, the function itself should just return a message - let friendRequestStatus = storage.getFriendRequestStatus(forContact: hexEncodedPublicKey, transaction: transaction) - if friendRequestStatus == .none || friendRequestStatus == .requestExpired { - storage.setFriendRequestStatus(.requestSent, forContact: hexEncodedPublicKey, transaction: transaction) - } let result = FriendRequestMessage(outgoingMessageWithTimestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageBody: "Please accept to enable messages to be synced across devices", attachmentIds: [], expiresInSeconds: 0, expireStartedAt: 0, isVoiceMessage: false, @@ -135,11 +130,31 @@ public final class MultiDeviceProtocol : NSObject { if let senderCertificate = senderCertificate { recipientUDAccess = udManager.udAccess(forRecipientId: hexEncodedPublicKey, requireSyncAccess: true) } + + let friendRequestStatus = storage.getFriendRequestStatus(forContact: hexEncodedPublicKey, transaction: transaction) + if (friendRequestStatus == .none || friendRequestStatus == .requestExpired) { + storage.setFriendRequestStatus(.requestSending, forContact: hexEncodedPublicKey, transaction: transaction) + } + return OWSMessageSend(message: message, thread: thread, recipient: recipient, senderCertificate: senderCertificate, udAccess: recipientUDAccess, localNumber: getUserHexEncodedPublicKey(), success: { - + DispatchQueue.main.async { + storage.dbReadWriteConnection.readWrite { transaction in + let friendRequestStatus = storage.getFriendRequestStatus(forContact: hexEncodedPublicKey, transaction: transaction) + if (friendRequestStatus != .friends || friendRequestStatus != .requestReceived || friendRequestStatus != .requestSent) { + storage.setFriendRequestStatus(.requestSent, forContact: hexEncodedPublicKey, transaction: transaction) + } + } + } }, failure: { _ in - + DispatchQueue.main.async { + storage.dbReadWriteConnection.readWrite { transaction in + let friendRequestStatus = storage.getFriendRequestStatus(forContact: hexEncodedPublicKey, transaction: transaction) + if (friendRequestStatus != .friends || friendRequestStatus != .requestReceived || friendRequestStatus != .requestSent) { + storage.setFriendRequestStatus(.none, forContact: hexEncodedPublicKey, transaction: transaction) + } + } + } }) } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index a23bbf3c4..4c2100480 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -170,11 +170,16 @@ public final class SyncMessagesProtocol : NSObject { let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) let friendRequestStatus = storage.getFriendRequestStatus(forContact: hexEncodedPublicKey, transaction: transaction) switch friendRequestStatus { - case .none: + case .none, .requestExpired: let messageSender = SSKEnvironment.shared.messageSender + // TODO: Does the function below need to handle multi device?? + // We need to send a FR message here directly to the user. Multi device doesn't come into play. let autoGeneratedFRMessage = MultiDeviceProtocol.getAutoGeneratedMultiDeviceFRMessage(for: hexEncodedPublicKey, in: transaction) thread.isForceHidden = true thread.save(with: transaction) + + storage.setFriendRequestStatus(.requestSending, forContact: hexEncodedPublicKey, transaction: transaction) + // This takes into account multi device messageSender.send(autoGeneratedFRMessage, success: { DispatchQueue.main.async { @@ -182,11 +187,13 @@ public final class SyncMessagesProtocol : NSObject { autoGeneratedFRMessage.remove(with: transaction) thread.isForceHidden = false thread.save(with: transaction) + storage.setFriendRequestStatus(.requestSent, forContact: hexEncodedPublicKey, transaction: transaction) } } }, failure: { error in DispatchQueue.main.async { storage.dbReadWriteConnection.readWrite { transaction in + storage.setFriendRequestStatus(friendRequestStatus, forContact: hexEncodedPublicKey, transaction: transaction) autoGeneratedFRMessage.remove(with: transaction) thread.isForceHidden = false thread.save(with: transaction)