|
|
@ -19,8 +19,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
|
|
|
|
|
|
|
|
// MARK: Properties
|
|
|
|
// MARK: Properties
|
|
|
|
|
|
|
|
|
|
|
|
var thread: TSContactThread!
|
|
|
|
let thread: TSContactThread
|
|
|
|
var call: SignalCall!
|
|
|
|
let call: SignalCall
|
|
|
|
var hasDismissed = false
|
|
|
|
var hasDismissed = false
|
|
|
|
|
|
|
|
|
|
|
|
// MARK: Views
|
|
|
|
// MARK: Views
|
|
|
@ -121,18 +121,23 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
|
|
|
|
|
|
|
|
// MARK: Initializers
|
|
|
|
// MARK: Initializers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@available(*, unavailable, message: "use init(call:) constructor instead.")
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
|
|
contactsManager = Environment.getCurrent().contactsManager
|
|
|
|
contactsManager = Environment.getCurrent().contactsManager
|
|
|
|
callUIAdapter = Environment.getCurrent().callUIAdapter
|
|
|
|
callUIAdapter = Environment.getCurrent().callUIAdapter
|
|
|
|
allAudioSources = Set(callUIAdapter.audioService.availableInputs)
|
|
|
|
allAudioSources = Set(callUIAdapter.audioService.availableInputs)
|
|
|
|
|
|
|
|
self.call = SignalCall.outgoingCall(localId: UUID(), remotePhoneNumber: "+1234567890")
|
|
|
|
|
|
|
|
self.thread = TSContactThread.getOrCreateThread(contactId: call.remotePhoneNumber)
|
|
|
|
super.init(coder: aDecoder)
|
|
|
|
super.init(coder: aDecoder)
|
|
|
|
observeNotifications()
|
|
|
|
observeNotifications()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
required init() {
|
|
|
|
required init(call: SignalCall) {
|
|
|
|
contactsManager = Environment.getCurrent().contactsManager
|
|
|
|
contactsManager = Environment.getCurrent().contactsManager
|
|
|
|
callUIAdapter = Environment.getCurrent().callUIAdapter
|
|
|
|
callUIAdapter = Environment.getCurrent().callUIAdapter
|
|
|
|
allAudioSources = Set(callUIAdapter.audioService.availableInputs)
|
|
|
|
allAudioSources = Set(callUIAdapter.audioService.availableInputs)
|
|
|
|
|
|
|
|
self.call = call
|
|
|
|
|
|
|
|
self.thread = TSContactThread.getOrCreateThread(contactId: call.remotePhoneNumber)
|
|
|
|
super.init(nibName: nil, bundle: nil)
|
|
|
|
super.init(nibName: nil, bundle: nil)
|
|
|
|
observeNotifications()
|
|
|
|
observeNotifications()
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -146,7 +151,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
NotificationCenter.default.addObserver(forName: CallAudioServiceSessionChanged, object: nil, queue: nil) { [weak self] _ in
|
|
|
|
NotificationCenter.default.addObserver(forName: CallAudioServiceSessionChanged, object: nil, queue: nil) { [weak self] _ in
|
|
|
|
self?.didChangeAudioSession()
|
|
|
|
self?.didChangeAudioSession()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
deinit {
|
|
|
|
deinit {
|
|
|
@ -177,12 +181,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
override func viewDidLoad() {
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
super.viewDidLoad()
|
|
|
|
|
|
|
|
|
|
|
|
guard let thread = self.thread else {
|
|
|
|
|
|
|
|
Logger.error("\(TAG) tried to show call call without specifying thread.")
|
|
|
|
|
|
|
|
showCallFailed(error: OWSErrorMakeAssertionError())
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
createViews()
|
|
|
|
createViews()
|
|
|
|
|
|
|
|
|
|
|
|
contactNameLabel.text = contactsManager.displayName(forPhoneIdentifier: thread.contactIdentifier())
|
|
|
|
contactNameLabel.text = contactsManager.displayName(forPhoneIdentifier: thread.contactIdentifier())
|
|
|
@ -193,7 +191,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
strongSelf.updateAvatarImage()
|
|
|
|
strongSelf.updateAvatarImage()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
assert(call != nil)
|
|
|
|
|
|
|
|
// Subscribe for future call updates
|
|
|
|
// Subscribe for future call updates
|
|
|
|
call.addObserverAndSyncState(observer: self)
|
|
|
|
call.addObserverAndSyncState(observer: self)
|
|
|
|
|
|
|
|
|
|
|
@ -669,7 +666,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
case .answering:
|
|
|
|
case .answering:
|
|
|
|
return NSLocalizedString("IN_CALL_SECURING", comment: "Call setup status label")
|
|
|
|
return NSLocalizedString("IN_CALL_SECURING", comment: "Call setup status label")
|
|
|
|
case .connected:
|
|
|
|
case .connected:
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
let callDuration = call.connectionDuration()
|
|
|
|
let callDuration = call.connectionDuration()
|
|
|
|
let callDurationDate = Date(timeIntervalSinceReferenceDate:callDuration)
|
|
|
|
let callDurationDate = Date(timeIntervalSinceReferenceDate:callDuration)
|
|
|
|
if dateFormatter == nil {
|
|
|
|
if dateFormatter == nil {
|
|
|
@ -690,9 +686,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return formattedDate
|
|
|
|
return formattedDate
|
|
|
|
} else {
|
|
|
|
|
|
|
|
return NSLocalizedString("IN_CALL_TALKING", comment: "Call setup status label")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
case .remoteBusy:
|
|
|
|
case .remoteBusy:
|
|
|
|
return NSLocalizedString("END_CALL_RESPONDER_IS_BUSY", comment: "Call setup status label")
|
|
|
|
return NSLocalizedString("END_CALL_RESPONDER_IS_BUSY", comment: "Call setup status label")
|
|
|
|
case .localFailure:
|
|
|
|
case .localFailure:
|
|
|
@ -830,11 +823,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
func didPressHangup(sender: UIButton) {
|
|
|
|
func didPressHangup(sender: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
callUIAdapter.localHangupCall(call)
|
|
|
|
callUIAdapter.localHangupCall(call)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Logger.warn("\(TAG) hung up, but call was unexpectedly nil")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dismissIfPossible(shouldDelay:false)
|
|
|
|
dismissIfPossible(shouldDelay:false)
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -842,11 +832,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
func didPressMute(sender muteButton: UIButton) {
|
|
|
|
func didPressMute(sender muteButton: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
muteButton.isSelected = !muteButton.isSelected
|
|
|
|
muteButton.isSelected = !muteButton.isSelected
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
callUIAdapter.setIsMuted(call: call, isMuted: muteButton.isSelected)
|
|
|
|
callUIAdapter.setIsMuted(call: call, isMuted: muteButton.isSelected)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Logger.warn("\(TAG) pressed mute, but call was unexpectedly nil")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func didPressAudioSource(sender button: UIButton) {
|
|
|
|
func didPressAudioSource(sender button: UIButton) {
|
|
|
@ -862,16 +849,12 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
func didPressSpeakerphone(sender button: UIButton) {
|
|
|
|
func didPressSpeakerphone(sender button: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
button.isSelected = !button.isSelected
|
|
|
|
button.isSelected = !button.isSelected
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
if button.isSelected {
|
|
|
|
if button.isSelected {
|
|
|
|
callUIAdapter.setAudioSource(call: call, audioSource: AudioSource.builtInSpeaker)
|
|
|
|
callUIAdapter.setAudioSource(call: call, audioSource: AudioSource.builtInSpeaker)
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
// use default audio source
|
|
|
|
// use default audio source
|
|
|
|
callUIAdapter.setAudioSource(call: call, audioSource: nil)
|
|
|
|
callUIAdapter.setAudioSource(call: call, audioSource: nil)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Logger.warn("\(TAG) pressed mute, but call was unexpectedly nil")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func didPressTextMessage(sender button: UIButton) {
|
|
|
|
func didPressTextMessage(sender button: UIButton) {
|
|
|
@ -883,28 +866,14 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
func didPressAnswerCall(sender: UIButton) {
|
|
|
|
func didPressAnswerCall(sender: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
|
|
|
|
|
|
|
|
guard let call = self.call else {
|
|
|
|
|
|
|
|
Logger.error("\(TAG) call was unexpectedly nil. Terminating call.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let text = String(format: CallStrings.callStatusFormat,
|
|
|
|
|
|
|
|
NSLocalizedString("END_CALL_UNCATEGORIZED_FAILURE", comment: "Call setup status label"))
|
|
|
|
|
|
|
|
self.callStatusLabel.text = text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dismissIfPossible(shouldDelay:true)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
callUIAdapter.answerCall(call)
|
|
|
|
callUIAdapter.answerCall(call)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func didPressVideo(sender: UIButton) {
|
|
|
|
func didPressVideo(sender: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
let hasLocalVideo = !sender.isSelected
|
|
|
|
let hasLocalVideo = !sender.isSelected
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
callUIAdapter.setHasLocalVideo(call: call, hasLocalVideo: hasLocalVideo)
|
|
|
|
callUIAdapter.setHasLocalVideo(call: call, hasLocalVideo: hasLocalVideo)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Logger.warn("\(TAG) pressed video, but call was unexpectedly nil")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -913,11 +882,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R
|
|
|
|
func didPressDeclineCall(sender: UIButton) {
|
|
|
|
func didPressDeclineCall(sender: UIButton) {
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
Logger.info("\(TAG) called \(#function)")
|
|
|
|
|
|
|
|
|
|
|
|
if let call = self.call {
|
|
|
|
|
|
|
|
callUIAdapter.declineCall(call)
|
|
|
|
callUIAdapter.declineCall(call)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Logger.warn("\(TAG) denied call, but call was unexpectedly nil")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dismissIfPossible(shouldDelay:false)
|
|
|
|
dismissIfPossible(shouldDelay:false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|