diff --git a/Session/Calls/Call Management/SessionCall.swift b/Session/Calls/Call Management/SessionCall.swift index fd089fe76..a9b80ab88 100644 --- a/Session/Calls/Call Management/SessionCall.swift +++ b/Session/Calls/Call Management/SessionCall.swift @@ -161,6 +161,7 @@ public final class SessionCall: NSObject, WebRTCSessionDelegate { } func didReceiveRemoteSDP(sdp: RTCSessionDescription) { + print("[Calls] Did receive remote sdp.") remoteSDP = sdp if hasStartedConnecting { webRTCSession.handleRemoteSDP(sdp, from: sessionID) // This sends an answer message internally diff --git a/Session/Meta/AppDelegate.swift b/Session/Meta/AppDelegate.swift index e7a7dd2f1..588823759 100644 --- a/Session/Meta/AppDelegate.swift +++ b/Session/Meta/AppDelegate.swift @@ -22,17 +22,24 @@ extension AppDelegate { @objc func setUpCallHandling() { // Pre offer messages - MessageReceiver.handlePreOfferCallMessage = { (message, transaction) in + MessageReceiver.handleNewCallOfferMessageIfNeeded = { (message, transaction) in guard CurrentAppContext().isMainApp else { return } let callManager = AppEnvironment.shared.callManager + // Ignore pre offer message afte the same call instance has been generated + if let currentCall = callManager.currentCall, currentCall.uuid == message.uuid! { return } guard callManager.currentCall == nil && SSKPreferences.areCallsEnabled else { callManager.handleIncomingCallOfferInBusyOrUnenabledState(offerMessage: message, using: transaction) return } - DispatchQueue.main.async { - if let caller = message.sender, let uuid = message.uuid { - let call = SessionCall(for: caller, uuid: uuid, mode: .answer) - call.callMessageTimestamp = message.sentTimestamp + // Create incoming call message + let thread = TSContactThread.getOrCreateThread(withContactSessionID: message.sender!, transaction: transaction) + let tsMessage = TSIncomingMessage.from(message, associatedWith: thread) + tsMessage.save(with: transaction) + // Handle UI + if let caller = message.sender, let uuid = message.uuid { + let call = SessionCall(for: caller, uuid: uuid, mode: .answer) + call.callMessageTimestamp = message.sentTimestamp + DispatchQueue.main.async { if CurrentAppContext().isMainAppAndActive { guard let presentingVC = CurrentAppContext().frontmostViewController() else { preconditionFailure() } // TODO: Handle more gracefully if let conversationVC = presentingVC as? ConversationVC, let contactThread = conversationVC.thread as? TSContactThread, contactThread.contactSessionID() == caller { @@ -51,7 +58,6 @@ extension AppDelegate { } } } - } } // Offer messages diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift index 4db78aa44..5c2e84feb 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift @@ -268,21 +268,11 @@ extension MessageReceiver { case .preOffer: print("[Calls] Received pre-offer message.") let transaction = transaction as! YapDatabaseReadWriteTransaction - if SSKPreferences.areCallsEnabled { - let storage = SNMessagingKitConfiguration.shared.storage - if let threadID = storage.getOrCreateThread(for: message.sender!, groupPublicKey: message.groupPublicKey, openGroupID: nil, using: transaction), - let thread = TSThread.fetch(uniqueId: threadID, transaction: transaction) { - let tsMessage = TSIncomingMessage.from(message, associatedWith: thread) - tsMessage.save(with: transaction) - } - } - handlePreOfferCallMessage?(message, transaction) + handleNewCallOfferMessageIfNeeded?(message, transaction) case .offer: print("[Calls] Received offer message.") - if WebRTCSession.current?.uuid != message.uuid! { - // TODO: Call in progress, put the new call on hold/reject - return - } + let transaction = transaction as! YapDatabaseReadWriteTransaction + handleNewCallOfferMessageIfNeeded?(message, transaction) handleOfferCallMessage?(message) case .answer: print("[Calls] Received answer message.") diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 31bb772e3..b64ca4452 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -2,7 +2,7 @@ import SessionUtilitiesKit public enum MessageReceiver { private static var lastEncryptionKeyPairRequest: [String:Date] = [:] - public static var handlePreOfferCallMessage: ((CallMessage, YapDatabaseReadWriteTransaction) -> Void)? + public static var handleNewCallOfferMessageIfNeeded: ((CallMessage, YapDatabaseReadWriteTransaction) -> Void)? public static var handleOfferCallMessage: ((CallMessage) -> Void)? public static var handleAnswerCallMessage: ((CallMessage) -> Void)? public static var handleEndCallMessage: ((CallMessage) -> Void)?