From 1e70f0097640990709ebf05b3b3d31fcc1093131 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO <> Date: Thu, 9 Jan 2025 14:19:18 +1100 Subject: [PATCH] Fix an issue that a call might be shown after handled in background with CallKit and then opening the app --- .../Errors/MessageReceiverError.swift | 2 ++ .../Message Handling/MessageReceiver+Calls.swift | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift b/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift index 3c5ed9054..31414c728 100644 --- a/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift +++ b/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift @@ -23,6 +23,7 @@ public enum MessageReceiverError: LocalizedError { case invalidConfigMessageHandling case requiredThreadNotInConfig case outdatedMessage + case duplicatedCall public var isRetryable: Bool { switch self { @@ -72,6 +73,7 @@ public enum MessageReceiverError: LocalizedError { case .invalidConfigMessageHandling: return "Invalid handling of a config message." case .requiredThreadNotInConfig: return "Required thread not in config." case .outdatedMessage: return "Message was sent before a config change which would have removed the message." + case .duplicatedCall: return "Duplicate call." } } } diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+Calls.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+Calls.swift index 8afbc8046..477907e04 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+Calls.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+Calls.swift @@ -270,12 +270,15 @@ extension MessageReceiver { state: CallMessage.MessageInfo.State? = nil, using dependencies: Dependencies ) throws -> Interaction? { - guard - (try? Interaction + guard ( + try? Interaction .filter(Interaction.Columns.variant == Interaction.Variant.infoCall) .filter(Interaction.Columns.messageUuid == message.uuid) - .isEmpty(db)) - .defaulting(to: false), + .isEmpty(db) + ).defaulting(to: false) + else { throw MessageReceiverError.duplicatedCall } + + guard let sender: String = message.sender, let thread: SessionThread = try SessionThread.fetchOne(db, id: sender), !thread.isMessageRequest(db)