////
////  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
////
//
//import UIKit
//import CallKit
//import SessionServiceKit
//
///**
// * Requests actions from CallKit
// *
// * @Discussion:
// *   Based on SpeakerboxCallManager, from the Apple CallKit Example app. Though, it's responsibilities are mostly 
// *   mirrored (and delegated from) CallKitCallUIAdaptee.
// *   TODO: Would it simplify things to merge this into CallKitCallUIAdaptee?
// */
//@available(iOS 10.0, *)
//final class CallKitCallManager: NSObject {
//
//    let callController = CXCallController()
//    let showNamesOnCallScreen: Bool
//
//    @objc
//    static let kAnonymousCallHandlePrefix = "Signal:"
//
//    required init(showNamesOnCallScreen: Bool) {
//        AssertIsOnMainThread()
//
//        self.showNamesOnCallScreen = showNamesOnCallScreen
//        super.init()
//
//        // We cannot assert singleton here, because this class gets rebuilt when the user changes relevant call settings
//    }
//
//    // MARK: Actions
//
//    func startCall(_ call: SignalCall) {
//        var handle: CXHandle
//
//        if showNamesOnCallScreen {
//            handle = CXHandle(type: .phoneNumber, value: call.remotePhoneNumber)
//        } else {
//            let callKitId = CallKitCallManager.kAnonymousCallHandlePrefix + call.localId.uuidString
//            handle = CXHandle(type: .generic, value: callKitId)
//            OWSPrimaryStorage.shared().setPhoneNumber(call.remotePhoneNumber, forCallKitId: callKitId)
//        }
//
//        let startCallAction = CXStartCallAction(call: call.localId, handle: handle)
//
//        startCallAction.isVideo = call.hasLocalVideo
//
//        let transaction = CXTransaction()
//        transaction.addAction(startCallAction)
//
//        requestTransaction(transaction)
//    }
//
//    func localHangup(call: SignalCall) {
//        let endCallAction = CXEndCallAction(call: call.localId)
//        let transaction = CXTransaction()
//        transaction.addAction(endCallAction)
//
//        requestTransaction(transaction)
//    }
//
//    func setHeld(call: SignalCall, onHold: Bool) {
//        let setHeldCallAction = CXSetHeldCallAction(call: call.localId, onHold: onHold)
//        let transaction = CXTransaction()
//        transaction.addAction(setHeldCallAction)
//
//        requestTransaction(transaction)
//    }
//
//    func setIsMuted(call: SignalCall, isMuted: Bool) {
//        let muteCallAction = CXSetMutedCallAction(call: call.localId, muted: isMuted)
//        let transaction = CXTransaction()
//        transaction.addAction(muteCallAction)
//
//        requestTransaction(transaction)
//    }
//
//    func answer(call: SignalCall) {
//        let answerCallAction = CXAnswerCallAction(call: call.localId)
//        let transaction = CXTransaction()
//        transaction.addAction(answerCallAction)
//
//        requestTransaction(transaction)
//    }
//
//    private func requestTransaction(_ transaction: CXTransaction) {
//        callController.request(transaction) { error in
//            if let error = error {
//                Logger.error("Error requesting transaction: \(error)")
//            } else {
//                Logger.debug("Requested transaction successfully")
//            }
//        }
//    }
//
//    // MARK: Call Management
//
//    private(set) var calls = [SignalCall]()
//
//    func callWithLocalId(_ localId: UUID) -> SignalCall? {
//        guard let index = calls.firstIndex(where: { $0.localId == localId }) else {
//            return nil
//        }
//        return calls[index]
//    }
//
//    func addCall(_ call: SignalCall) {
//        calls.append(call)
//    }
//
//    func removeCall(_ call: SignalCall) {
//        calls.removeFirst(where: { $0 === call })
//    }
//
//    func removeAllCalls() {
//        calls.removeAll()
//    }
//}
//
//fileprivate extension Array {
//
//    mutating func removeFirst(where predicate: (Element) throws -> Bool) rethrows {
//        guard let index = try firstIndex(where: predicate) else {
//            return
//        }
//
//        remove(at: index)
//    }
//}
