diff --git a/swift/CallTutorial/CallTutorial/CallExample.swift b/swift/CallTutorial/CallTutorial/CallExample.swift index d91e040..330f245 100644 --- a/swift/CallTutorial/CallTutorial/CallExample.swift +++ b/swift/CallTutorial/CallTutorial/CallExample.swift @@ -37,7 +37,10 @@ class CallExampleContext : ObservableObject @Published var passwd : String = "peche5" @Published var loggedIn: Bool = false - var providerDelegate : CallKitProviderDelegate! + var mProviderDelegate : CallKitProviderDelegate! + let outgoingCallName = "Outgoing call example" + let incomingCallName = "Incoming call example" + @Published var enableCallKit = false; init() @@ -67,7 +70,7 @@ class CallExampleContext : ObservableObject mCore.addDelegate(delegate: mCallStateTracer) mCore.addDelegate(delegate: mRegistrationDelegate) - providerDelegate = CallKitProviderDelegate(context : self) + mProviderDelegate = CallKitProviderDelegate(context : self) } func registrationExample() @@ -95,19 +98,25 @@ class CallExampleContext : ObservableObject } } + + func createCallParams() throws -> CallParams + { + let callParams = try mCore.createCallParams(call: nil) + callParams.videoEnabled = videoEnabled; + callParams.audioEnabled = audioEnabled; + + return callParams + } + // Initiate a call func outgoingCallExample() { do { - let callParams = try mCore.createCallParams(call: nil) - callParams.videoEnabled = videoEnabled; - callParams.audioEnabled = audioEnabled; - if (!callRunning) { let callDest = try Factory.Instance.createAddress(addr: dest) // Place an outgoing call - mCall = mCore.inviteAddressWithParams(addr: callDest, params: callParams) + mCall = mCore.inviteAddressWithParams(addr: callDest, params: try createCallParams()) if (mCall == nil) { print("Could not place call to \(dest)\n") @@ -117,7 +126,7 @@ class CallExampleContext : ObservableObject } else { - try mCall.update(params: callParams) + try mCall.update(params: createCallParams()) } } catch { print(error) @@ -125,12 +134,6 @@ class CallExampleContext : ObservableObject } - // Initiate a call - func outgoingCallKitCallExample() - { - providerDelegate.outgoingCall(uuid: UUID()) - } - // Terminate a call func stopCall() { @@ -139,7 +142,14 @@ class CallExampleContext : ObservableObject // terminate the call print("Terminating the call...\n") do { - try mCall.terminate() + if (enableCallKit) + { + mProviderDelegate.stopCall() + } + else + { + try mCall.terminate() + } } catch { print(error) } @@ -220,15 +230,14 @@ class CallStateDelegate: CoreDelegate { if (cstate == .IncomingReceived) { tutorialContext.mCall = call tutorialContext.isCallIncoming = true - if (tutorialContext.enableCallKit) - { - tutorialContext.providerDelegate.reportIncomingCall(call: call, uuid: UUID(), handle: "Incoming Test Call", hasVideo: false) - } + if (tutorialContext.enableCallKit) { tutorialContext.mProviderDelegate.incomingCall() } + } else if (cstate == .OutgoingRinging) { tutorialContext.callRunning = true } else if (cstate == .End) { tutorialContext.callRunning = false tutorialContext.isCallIncoming = false; + if (tutorialContext.enableCallKit) { tutorialContext.mProviderDelegate.stopCall() } } } } diff --git a/swift/CallTutorial/CallTutorial/CallKitProviderDelegate.swift b/swift/CallTutorial/CallTutorial/CallKitProviderDelegate.swift index 877e815..ae2bb3c 100644 --- a/swift/CallTutorial/CallTutorial/CallKitProviderDelegate.swift +++ b/swift/CallTutorial/CallTutorial/CallKitProviderDelegate.swift @@ -17,6 +17,9 @@ class CallKitProviderDelegate : NSObject private let provider: CXProvider let mCallController = CXCallController() var tutorialContext : CallExampleContext! + + var incomingCallUUID : UUID! + var outgoingCallUUID : UUID! init(context : CallExampleContext) { @@ -34,27 +37,32 @@ class CallKitProviderDelegate : NSObject } - func reportIncomingCall(call:Call?, uuid: UUID, handle: String, hasVideo: Bool) { + func incomingCall() { + incomingCallUUID = UUID() let update = CXCallUpdate() - update.remoteHandle = CXHandle(type:.generic, value: handle) - update.hasVideo = hasVideo + update.remoteHandle = CXHandle(type:.generic, value: tutorialContext.incomingCallName) + update.hasVideo = tutorialContext.videoEnabled - provider.reportNewIncomingCall(with: uuid, update: update) { error in - - } + provider.reportNewIncomingCall(with: incomingCallUUID, update: update, completion: { error in }) } - func outgoingCall(uuid : UUID) + func outgoingCall() { - let handle = CXHandle(type: .generic, value: "Outgoing Call") - let startCallAction = CXStartCallAction(call: uuid, handle: handle) + outgoingCallUUID = UUID() + let handle = CXHandle(type: .generic, value: tutorialContext.outgoingCallName) + let startCallAction = CXStartCallAction(call: outgoingCallUUID, handle: handle) let transaction = CXTransaction(action: startCallAction) - mCallController.request(transaction, completion: { error in - print("lalalalala") - }) + mCallController.request(transaction, completion: { error in }) } + func stopCall() + { + let endCallAction = CXEndCallAction(call: incomingCallUUID) + let transaction = CXTransaction(action: endCallAction) + + mCallController.request(transaction, completion: { error in }) + } } @@ -62,7 +70,10 @@ class CallKitProviderDelegate : NSObject extension CallKitProviderDelegate: CXProviderDelegate { func provider(_ provider: CXProvider, perform action: CXEndCallAction) { - tutorialContext.stopCall() + if (tutorialContext.mCall.state != Call.State.End) + { + try? tutorialContext.mCall.terminate() + } action.fulfill() } diff --git a/swift/CallTutorial/CallTutorial/ContentView.swift b/swift/CallTutorial/CallTutorial/ContentView.swift index e96d347..0badbdb 100644 --- a/swift/CallTutorial/CallTutorial/ContentView.swift +++ b/swift/CallTutorial/CallTutorial/ContentView.swift @@ -143,7 +143,7 @@ struct ContentView: View { } VStack(alignment: .leading) { - Button(action: tutorialContext.outgoingCallKitCallExample) { + Button(action: tutorialContext.mProviderDelegate.outgoingCall) { Text("CallKit Call") .font(.largeTitle) .foregroundColor(Color.white)