mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
3.5 KiB
Swift
82 lines
3.5 KiB
Swift
//
|
|
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/**
|
|
* Creates an outbound call via WebRTC.
|
|
*/
|
|
@objc class OutboundCallInitiator: NSObject {
|
|
let TAG = "[OutboundCallInitiator]"
|
|
|
|
let contactsManager: OWSContactsManager
|
|
let contactsUpdater: ContactsUpdater
|
|
|
|
init(contactsManager: OWSContactsManager, contactsUpdater: ContactsUpdater) {
|
|
self.contactsManager = contactsManager
|
|
self.contactsUpdater = contactsUpdater
|
|
|
|
super.init()
|
|
}
|
|
|
|
/**
|
|
* |handle| is a user formatted phone number, e.g. from a system contacts entry
|
|
*/
|
|
public func initiateCall(handle: String) -> Bool {
|
|
Logger.info("\(TAG) in \(#function) with handle: \(handle)")
|
|
|
|
guard let recipientId = PhoneNumber(fromUserSpecifiedText: handle)?.toE164() else {
|
|
Logger.warn("\(TAG) unable to parse signalId from phone number: \(handle)")
|
|
return false
|
|
}
|
|
|
|
return initiateCall(recipientId: recipientId)
|
|
}
|
|
|
|
/**
|
|
* |recipientId| is a e164 formatted phone number.
|
|
*/
|
|
public func initiateCall(recipientId: String) -> Bool {
|
|
// Rather than an init-assigned dependency property, we access `callUIAdapter` via Environment
|
|
// because it can change after app launch due to user settings
|
|
guard let callUIAdapter = Environment.getCurrent().callUIAdapter else {
|
|
assertionFailure()
|
|
Logger.error("\(TAG) can't initiate call because callUIAdapter is nil")
|
|
return false
|
|
}
|
|
|
|
// Check for microphone permissions
|
|
// Alternative way without prompting for permissions:
|
|
// if AVAudioSession.sharedInstance().recordPermission() == .denied {
|
|
AVAudioSession.sharedInstance().requestRecordPermission { isGranted in
|
|
DispatchQueue.main.async {
|
|
// Here the permissions are either granted or denied
|
|
guard isGranted == true else {
|
|
Logger.warn("\(self.TAG) aborting due to missing microphone permissions.")
|
|
self.showNoMicrophonePermissionAlert()
|
|
return
|
|
}
|
|
callUIAdapter.startAndShowOutgoingCall(recipientId: recipientId)
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
/// Cleanup and present alert for no permissions
|
|
private func showNoMicrophonePermissionAlert() {
|
|
let alertTitle = NSLocalizedString("CALL_AUDIO_PERMISSION_TITLE", comment:"Alert title when calling and permissions for microphone are missing")
|
|
let alertMessage = NSLocalizedString("CALL_AUDIO_PERMISSION_MESSAGE", comment:"Alert message when calling and permissions for microphone are missing")
|
|
let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
|
|
let dismiss = NSLocalizedString("DISMISS_BUTTON_TEXT", comment: "Generic short text for button to dismiss a dialog")
|
|
let dismissAction = UIAlertAction(title: dismiss, style: .cancel)
|
|
let settingsString = NSLocalizedString("OPEN_SETTINGS_BUTTON", comment: "Button text which opens the settings app")
|
|
let settingsAction = UIAlertAction(title: settingsString, style: .default) { _ in
|
|
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
|
|
}
|
|
alertController.addAction(dismissAction)
|
|
alertController.addAction(settingsAction)
|
|
UIApplication.shared.frontmostViewController?.present(alertController, animated: true, completion: nil)
|
|
}
|
|
}
|