diff --git a/Classes/CallManager.swift b/Classes/CallManager.swift index 6552dab3f..540cfa98a 100644 --- a/Classes/CallManager.swift +++ b/Classes/CallManager.swift @@ -374,6 +374,7 @@ import AVFoundation providerDelegate.uuids.updateValue(uuid, forKey: callId) let callInfo = CallInfo.newIncomingCallInfo(callId: callId) callInfo.declined = true + callInfo.reason = Reason.Busy providerDelegate.callInfos.updateValue(callInfo, forKey: uuid) } else { // end call @@ -425,8 +426,7 @@ class CoreManagerDelegate: CoreDelegate { CallManager.instance().providerDelegate.updateCall(uuid: uuid!, handle: address, hasVideo: video) let callInfo = CallManager.instance().providerDelegate.callInfos[uuid!] if (callInfo?.declined ?? false) { - // The call is already declined. - try? call.decline(reason: Reason.Unknown) + DispatchQueue.main.asyncAfter(deadline: .now()) {try? call.decline(reason: callInfo!.reason)} } else if (callInfo?.accepted ?? false) { // The call is already answered. CallManager.instance().acceptCall(call: call, hasVideo: video) diff --git a/Classes/ProviderDelegate.swift b/Classes/ProviderDelegate.swift index 0d75f13c4..a3b40216d 100644 --- a/Classes/ProviderDelegate.swift +++ b/Classes/ProviderDelegate.swift @@ -32,8 +32,8 @@ import os var sasEnabled = false var declined = false var connected = false - - + var reason: Reason = Reason.None + static func newIncomingCallInfo(callId: String) -> CallInfo { let callInfo = CallInfo() callInfo.callId = callId @@ -92,17 +92,18 @@ class ProviderDelegate: NSObject { CallManager.instance().providerDelegate.endCallNotExist(uuid: uuid, timeout: .now() + 20) } else { Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: cannot complete incoming call with call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)] from [\(handle)] caused by [\(error!.localizedDescription)]") - if (call == nil) { - callInfo?.declined = true - self.callInfos.updateValue(callInfo!, forKey: uuid) - return - } let code = (error as NSError?)?.code - if code == CXErrorCodeIncomingCallError.filteredByBlockList.rawValue || code == CXErrorCodeIncomingCallError.filteredByDoNotDisturb.rawValue { - try? call?.decline(reason: Reason.Busy) - } else { - try? call?.decline(reason: Reason.Unknown) + switch code { + case CXErrorCodeIncomingCallError.filteredByDoNotDisturb.rawValue: + callInfo?.reason = Reason.DoNotDisturb + case CXErrorCodeIncomingCallError.filteredByBlockList.rawValue: + callInfo?.reason = Reason.DoNotDisturb + default: + callInfo?.reason = Reason.Unknown } + callInfo?.declined = true + self.callInfos.updateValue(callInfo!, forKey: uuid) + try? call?.decline(reason: callInfo!.reason) } } }