|  |  |  | // | 
					
						
							|  |  |  | //  Copyright (c) 2021 Open Whisper Systems. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Foundation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Creates an outbound call via WebRTC. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | @objc public class OutboundIndividualCallInitiator: NSObject { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @objc public override init() { | 
					
						
							|  |  |  |         super.init() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         SwiftSingletons.register(self) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * |address| is a SignalServiceAddress | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     @discardableResult | 
					
						
							|  |  |  |     @objc | 
					
						
							|  |  |  |     public func initiateCall(publicKey: String) -> Bool { | 
					
						
							|  |  |  |         return initiateCall(publicKey: publicKey, isVideo: false) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * |address| is a SignalServiceAddress. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     @discardableResult | 
					
						
							|  |  |  |     @objc | 
					
						
							|  |  |  |     public func initiateCall(publicKey: String, isVideo: Bool) -> Bool { | 
					
						
							|  |  |  |         guard let callUIAdapter = Self.callService.individualCallService.callUIAdapter else { | 
					
						
							|  |  |  |             owsFailDebug("missing callUIAdapter") | 
					
						
							|  |  |  |             return false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         guard let frontmostViewController = UIApplication.shared.frontmostViewController else { | 
					
						
							|  |  |  |             owsFailDebug("could not identify frontmostViewController") | 
					
						
							|  |  |  |             return false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         frontmostViewController.ows_ask(forMicrophonePermissions: { granted in | 
					
						
							|  |  |  |             guard granted == true else { | 
					
						
							|  |  |  |                 Logger.warn("aborting due to missing microphone permissions.") | 
					
						
							|  |  |  |                 frontmostViewController.ows_showNoMicrophonePermissionActionSheet() | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if isVideo { | 
					
						
							|  |  |  |                 frontmostViewController.ows_ask(forCameraPermissions: { granted in | 
					
						
							|  |  |  |                     guard granted else { | 
					
						
							|  |  |  |                         Logger.warn("aborting due to missing camera permissions.") | 
					
						
							|  |  |  |                         return | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     callUIAdapter.startAndShowOutgoingCall(publicKey: publicKey, hasLocalVideo: true) | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 callUIAdapter.startAndShowOutgoingCall(publicKey: publicKey, hasLocalVideo: false) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |