diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index e44e40ec5e..8d3b8701cd 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -11,7 +11,6 @@ import UIKit import Dispatch import BackgroundTasks import SwiftUI -import CallKit private var chatController: chat_ctrl? @@ -680,7 +679,7 @@ func processReceivedMsg(_ res: ChatResponse) { } withCall(contact) { call in m.callCommand = .end - CallController.shared.reportCallRemoteEnded(call: call) +// CallController.shared.reportCallRemoteEnded(call: call) } default: logger.debug("unsupported event: \(res.responseType)") diff --git a/apps/ios/Shared/Views/Call/ActiveCallView.swift b/apps/ios/Shared/Views/Call/ActiveCallView.swift index f61105997c..5c46356401 100644 --- a/apps/ios/Shared/Views/Call/ActiveCallView.swift +++ b/apps/ios/Shared/Views/Call/ActiveCallView.swift @@ -93,9 +93,9 @@ struct ActiveCallView: View { case let .connection(state): if let callStatus = WebRTCCallStatus.init(rawValue: state.connectionState), case .connected = callStatus { - if case .outgoing = call.direction { - CallController.shared.reportOutgoingCall(call: call, connectedAt: nil) - } +// if case .outgoing = call.direction { +// CallController.shared.reportOutgoingCall(call: call, connectedAt: nil) +// } call.callState = .connected // CallKit doesn't work well with WKWebView // This is a hack to enable microphone in WKWebView after CallKit takes over it diff --git a/apps/ios/Shared/Views/Call/CallController.swift b/apps/ios/Shared/Views/Call/CallController.swift index ff8339b9b2..3421d0d105 100644 --- a/apps/ios/Shared/Views/Call/CallController.swift +++ b/apps/ios/Shared/Views/Call/CallController.swift @@ -7,90 +7,91 @@ // import Foundation -import CallKit +//import CallKit import AVFoundation -class CallController: NSObject, CXProviderDelegate, ObservableObject { +//class CallController: NSObject, CXProviderDelegate, ObservableObject { +class CallController: NSObject, ObservableObject { static let useCallKit = false static let shared = CallController() - private let provider = CXProvider(configuration: CallController.configuration) - private let controller = CXCallController() +// private let provider = CXProvider(configuration: CallController.configuration) +// private let controller = CXCallController() private let callManager = CallManager() @Published var activeCallInvitation: CallInvitation? // PKPushRegistry will be used from notification service extension // let registry = PKPushRegistry(queue: nil) - static let configuration: CXProviderConfiguration = { - let configuration = CXProviderConfiguration() - configuration.supportsVideo = true - configuration.supportedHandleTypes = [.generic] - configuration.includesCallsInRecents = true // TODO disable or add option - configuration.maximumCallsPerCallGroup = 1 - return configuration - }() +// static let configuration: CXProviderConfiguration = { +// let configuration = CXProviderConfiguration() +// configuration.supportsVideo = true +// configuration.supportedHandleTypes = [.generic] +// configuration.includesCallsInRecents = true // TODO disable or add option +// configuration.maximumCallsPerCallGroup = 1 +// return configuration +// }() override init() { super.init() - self.provider.setDelegate(self, queue: nil) +// self.provider.setDelegate(self, queue: nil) // self.registry.delegate = self // self.registry.desiredPushTypes = [.voIP] } - func providerDidReset(_ provider: CXProvider) { - } +// func providerDidReset(_ provider: CXProvider) { +// } - func provider(_ provider: CXProvider, perform action: CXStartCallAction) { - logger.debug("CallController.provider CXStartCallAction") - if callManager.startOutgoingCall(callUUID: action.callUUID) { - action.fulfill() - provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil) - } else { - action.fail() - } - } - - func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { - logger.debug("CallController.provider CXAnswerCallAction") - if callManager.answerIncomingCall(callUUID: action.callUUID) { - action.fulfill() - } else { - action.fail() - } - } - - func provider(_ provider: CXProvider, perform action: CXEndCallAction) { - logger.debug("CallController.provider CXEndCallAction") - callManager.endCall(callUUID: action.callUUID) { ok in - if ok { - action.fulfill() - } else { - action.fail() - } - } - } - - func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { - print("timed out", #function) - action.fulfill() - } - - func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { - print("received", #function) -// do { -// try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: .mixWithOthers) -// logger.debug("audioSession category set") -// try audioSession.setActive(true) -// logger.debug("audioSession activated") -// } catch { -// print(error) -// logger.error("failed activating audio session") +// func provider(_ provider: CXProvider, perform action: CXStartCallAction) { +// logger.debug("CallController.provider CXStartCallAction") +// if callManager.startOutgoingCall(callUUID: action.callUUID) { +// action.fulfill() +// provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil) +// } else { +// action.fail() // } - } +// } - func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { - print("received", #function) - } +// func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { +// logger.debug("CallController.provider CXAnswerCallAction") +// if callManager.answerIncomingCall(callUUID: action.callUUID) { +// action.fulfill() +// } else { +// action.fail() +// } +// } + +// func provider(_ provider: CXProvider, perform action: CXEndCallAction) { +// logger.debug("CallController.provider CXEndCallAction") +// callManager.endCall(callUUID: action.callUUID) { ok in +// if ok { +// action.fulfill() +// } else { +// action.fail() +// } +// } +// } + +// func provider(_ provider: CXProvider, timedOutPerforming action: CXAction) { +// print("timed out", #function) +// action.fulfill() +// } + +// func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { +// print("received", #function) +//// do { +//// try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: .mixWithOthers) +//// logger.debug("audioSession category set") +//// try audioSession.setActive(true) +//// logger.debug("audioSession activated") +//// } catch { +//// print(error) +//// logger.error("failed activating audio session") +//// } +// } + +// func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { +// print("received", #function) +// } // func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) { // @@ -121,48 +122,49 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { func reportNewIncomingCall(invitation: CallInvitation, completion: @escaping (Error?) -> Void) { logger.debug("CallController.reportNewIncomingCall") if !UserDefaults.standard.bool(forKey: DEFAULT_EXPERIMENTAL_CALLS) { return } - if CallController.useCallKit, let uuid = invitation.callkitUUID { - let update = CXCallUpdate() - update.remoteHandle = CXHandle(type: .generic, value: invitation.contact.displayName) - update.hasVideo = invitation.peerMedia == .video - provider.reportNewIncomingCall(with: uuid, update: update, completion: completion) - } else { +// if CallController.useCallKit, let uuid = invitation.callkitUUID { +// let update = CXCallUpdate() +// update.remoteHandle = CXHandle(type: .generic, value: invitation.contact.displayName) +// update.hasVideo = invitation.peerMedia == .video +// provider.reportNewIncomingCall(with: uuid, update: update, completion: completion) +// } else { NtfManager.shared.notifyCallInvitation(invitation) if invitation.callTs.timeIntervalSinceNow >= -180 { activeCallInvitation = invitation } - } +// } } - func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) { - if CallController.useCallKit, let uuid = call.callkitUUID { - provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected) - } - } +// func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) { +// if CallController.useCallKit, let uuid = call.callkitUUID { +// provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected) +// } +// } func reportCallRemoteEnded(invitation: CallInvitation) { - if CallController.useCallKit, let uuid = invitation.callkitUUID { - provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) - } else if invitation.contact.id == activeCallInvitation?.contact.id { +// if CallController.useCallKit, let uuid = invitation.callkitUUID { +// provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) +// } else if invitation.contact.id == activeCallInvitation?.contact.id { activeCallInvitation = nil - } +// } } - func reportCallRemoteEnded(call: Call) { - if CallController.useCallKit, let uuid = call.callkitUUID { - provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) - } - } +// func reportCallRemoteEnded(call: Call) { +// if CallController.useCallKit, let uuid = call.callkitUUID { +// provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded) +// } +// } func startCall(_ contact: Contact, _ media: CallMediaType) { logger.debug("CallController.startCall") let uuid = callManager.newOutgoingCall(contact, media) - if CallController.useCallKit { - let handle = CXHandle(type: .generic, value: contact.displayName) - let action = CXStartCallAction(call: uuid, handle: handle) - action.isVideo = media == .video - requestTransaction(with: action) - } else if callManager.startOutgoingCall(callUUID: uuid) { +// if CallController.useCallKit { +// let handle = CXHandle(type: .generic, value: contact.displayName) +// let action = CXStartCallAction(call: uuid, handle: handle) +// action.isVideo = media == .video +// requestTransaction(with: action) +// } else if callManager.startOutgoingCall(callUUID: uuid) { + if callManager.startOutgoingCall(callUUID: uuid) { logger.debug("CallController.startCall: call started") } else { logger.error("CallController.startCall: no active call") @@ -177,9 +179,9 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { } func endCall(callUUID: UUID) { - if CallController.useCallKit { - requestTransaction(with: CXEndCallAction(call: callUUID)) - } else { +// if CallController.useCallKit { +// requestTransaction(with: CXEndCallAction(call: callUUID)) +// } else { callManager.endCall(callUUID: callUUID) { ok in if ok { logger.debug("CallController.endCall: call ended") @@ -187,7 +189,7 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { logger.error("CallController.endCall: no actove call pr call invitation to end") } } - } +// } } func endCall(invitation: CallInvitation) { @@ -204,15 +206,15 @@ class CallController: NSObject, CXProviderDelegate, ObservableObject { callManager.endCall(call: call, completed: completed) } - private func requestTransaction(with action: CXAction) { - let t = CXTransaction() - t.addAction(action) - controller.request(t) { error in - if let error = error { - logger.error("CallController.requestTransaction error requesting transaction: \(error.localizedDescription)") - } else { - logger.debug("CallController.requestTransaction requested transaction successfully") - } - } - } +// private func requestTransaction(with action: CXAction) { +// let t = CXTransaction() +// t.addAction(action) +// controller.request(t) { error in +// if let error = error { +// logger.error("CallController.requestTransaction error requesting transaction: \(error.localizedDescription)") +// } else { +// logger.debug("CallController.requestTransaction requested transaction successfully") +// } +// } +// } }