From d560aa022a20990045d050ff9d2dfb1e3a0e7a4f Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 27 Jan 2017 11:11:33 -0500 Subject: [PATCH 1/3] =?UTF-8?q?Reworked=20call=20view=E2=80=99s=20remote?= =?UTF-8?q?=20video=20mode.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Signal/src/call/CallAudioService.swift | 19 ++-- Signal/src/call/CallService.swift | 12 +-- Signal/src/call/NonCallKitCallUIAdaptee.swift | 4 +- Signal/src/call/SignalCall.swift | 8 +- .../call/Speakerbox/CallKitCallManager.swift | 2 +- .../Speakerbox/CallKitCallUIAdaptee.swift | 12 +-- .../call/UserInterface/CallUIAdapter.swift | 12 +-- .../view controllers/CallViewController.swift | 89 +++++++++++-------- 8 files changed, 91 insertions(+), 67 deletions(-) diff --git a/Signal/src/call/CallAudioService.swift b/Signal/src/call/CallAudioService.swift index 7949015bf..856c8c8bd 100644 --- a/Signal/src/call/CallAudioService.swift +++ b/Signal/src/call/CallAudioService.swift @@ -42,18 +42,25 @@ import Foundation internal func speakerphoneDidChange(call: SignalCall, isEnabled: Bool) { AssertIsOnMainThread() - if isEnabled { + + ensureIsEnabled(call: call) + } + + internal func hasLocalVideoDidChange(call: SignalCall, hasLocalVideo: Bool) { + AssertIsOnMainThread() + + ensureIsEnabled(call: call) + } + + private func ensureIsEnabled(call: SignalCall) { + // Auto-enable speakerphone when local video is enabled. + if call.isSpeakerphoneEnabled || call.hasLocalVideo { setAudioSession(category: AVAudioSessionCategoryPlayAndRecord, options: .defaultToSpeaker) } else { setAudioSession(category: AVAudioSessionCategoryPlayAndRecord) } } - internal func hasVideoDidChange(call: SignalCall, hasVideo: Bool) { - AssertIsOnMainThread() - // no-op - } - // MARK: - Service action handlers public func handleState(_ state: CallState) { diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index 09258b79d..9790626f1 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -770,7 +770,7 @@ protocol CallServiceObserver: class { * * Can be used for Incoming and Outgoing calls. */ - func setHasVideo(hasVideo: Bool) { + func setHasLocalVideo(hasLocalVideo: Bool) { assertOnSignalingQueue() guard let peerConnectionClient = self.peerConnectionClient else { @@ -783,13 +783,13 @@ protocol CallServiceObserver: class { return } - call.hasVideo = hasVideo + call.hasLocalVideo = hasLocalVideo peerConnectionClient.setLocalVideoEnabled(enabled: shouldHaveLocalVideoTrack()) } func handleCallKitStartVideo() { CallService.signalingQueue.async { - self.setHasVideo(hasVideo:true) + self.setHasLocalVideo(hasLocalVideo:true) } } @@ -1000,9 +1000,9 @@ protocol CallServiceObserver: class { self.updateIsVideoEnabled() } - internal func hasVideoDidChange(call: SignalCall, hasVideo: Bool) { + internal func hasLocalVideoDidChange(call: SignalCall, hasLocalVideo: Bool) { AssertIsOnMainThread() - Logger.info("\(self.TAG) \(#function): \(hasVideo)") + Logger.info("\(self.TAG) \(#function): \(hasLocalVideo)") self.updateIsVideoEnabled() } @@ -1027,7 +1027,7 @@ protocol CallServiceObserver: class { return (!Platform.isSimulator && call != nil && call!.state == .connected && - call!.hasVideo) + call!.hasLocalVideo) } private func updateIsVideoEnabled() { diff --git a/Signal/src/call/NonCallKitCallUIAdaptee.swift b/Signal/src/call/NonCallKitCallUIAdaptee.swift index c48db3a47..876c9d68c 100644 --- a/Signal/src/call/NonCallKitCallUIAdaptee.swift +++ b/Signal/src/call/NonCallKitCallUIAdaptee.swift @@ -146,14 +146,14 @@ class NonCallKitCallUIAdaptee: CallUIAdaptee { } } - func setHasVideo(call: SignalCall, hasVideo: Bool) { + func setHasLocalVideo(call: SignalCall, hasLocalVideo: Bool) { CallService.signalingQueue.async { guard call.localId == self.callService.call?.localId else { assertionFailure("\(self.TAG) in \(#function) localId does not match current call") return } - self.callService.setHasVideo(hasVideo: hasVideo) + self.callService.setHasLocalVideo(hasLocalVideo: hasLocalVideo) } } } diff --git a/Signal/src/call/SignalCall.swift b/Signal/src/call/SignalCall.swift index 9f73f65df..13f1bd4ff 100644 --- a/Signal/src/call/SignalCall.swift +++ b/Signal/src/call/SignalCall.swift @@ -20,7 +20,7 @@ enum CallState: String { // All Observer methods will be invoked from the main thread. protocol CallObserver: class { func stateDidChange(call: SignalCall, state: CallState) - func hasVideoDidChange(call: SignalCall, hasVideo: Bool) + func hasLocalVideoDidChange(call: SignalCall, hasLocalVideo: Bool) func muteDidChange(call: SignalCall, isMuted: Bool) func speakerphoneDidChange(call: SignalCall, isEnabled: Bool) } @@ -43,20 +43,20 @@ protocol CallObserver: class { // Distinguishes between calls locally, e.g. in CallKit let localId: UUID - var hasVideo = false { + var hasLocalVideo = false { didSet { // This should only occur on the signaling queue. objc_sync_enter(self) let observers = self.observers let call = self - let hasVideo = self.hasVideo + let hasLocalVideo = self.hasLocalVideo objc_sync_exit(self) DispatchQueue.main.async { for observer in observers { - observer.value?.hasVideoDidChange(call: call, hasVideo: hasVideo) + observer.value?.hasLocalVideoDidChange(call: call, hasLocalVideo: hasLocalVideo) } } } diff --git a/Signal/src/call/Speakerbox/CallKitCallManager.swift b/Signal/src/call/Speakerbox/CallKitCallManager.swift index 45f164bc8..fbd2b28f7 100644 --- a/Signal/src/call/Speakerbox/CallKitCallManager.swift +++ b/Signal/src/call/Speakerbox/CallKitCallManager.swift @@ -25,7 +25,7 @@ final class CallKitCallManager: NSObject { let handle = CXHandle(type: .phoneNumber, value: call.remotePhoneNumber) let startCallAction = CXStartCallAction(call: call.localId, handle: handle) - startCallAction.isVideo = call.hasVideo + startCallAction.isVideo = call.hasLocalVideo let transaction = CXTransaction() transaction.addAction(startCallAction) diff --git a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift index 112a6b0db..e4599a29e 100644 --- a/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift +++ b/Signal/src/call/Speakerbox/CallKitCallUIAdaptee.swift @@ -34,7 +34,7 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { providerConfiguration.supportsVideo = true providerConfiguration.maximumCallGroups = 1 - + providerConfiguration.maximumCallsPerCallGroup = 1 providerConfiguration.supportedHandleTypes = [.phoneNumber] @@ -82,12 +82,12 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { // Construct a CXCallUpdate describing the incoming call, including the caller. let update = CXCallUpdate() update.remoteHandle = CXHandle(type: .phoneNumber, value: call.remotePhoneNumber) - update.hasVideo = call.hasVideo + update.hasVideo = call.hasLocalVideo update.supportsHolding = false update.supportsGrouping = false update.supportsUngrouping = false update.supportsDTMF = false - + // Report the incoming call to the system provider.reportNewIncomingCall(with: call.localId, update: update) { error in /* @@ -136,16 +136,16 @@ final class CallKitCallUIAdaptee: NSObject, CallUIAdaptee, CXProviderDelegate { callManager.setIsMuted(call: call, isMuted: isMuted) } - func setHasVideo(call: SignalCall, hasVideo: Bool) { + func setHasLocalVideo(call: SignalCall, hasLocalVideo: Bool) { let update = CXCallUpdate() update.remoteHandle = CXHandle(type: .phoneNumber, value: call.remotePhoneNumber) - update.hasVideo = hasVideo + update.hasVideo = hasLocalVideo // Update the CallKit UI. provider.reportCall(with: call.localId, updated: update) CallService.signalingQueue.async { - self.callService.setHasVideo(hasVideo: hasVideo) + self.callService.setHasLocalVideo(hasLocalVideo: hasLocalVideo) } } diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index e14e5f321..b448dcd82 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -23,7 +23,7 @@ protocol CallUIAdaptee { func remoteDidHangupCall(_ call: SignalCall) func failCall(_ call: SignalCall, error: CallError) func setIsMuted(call: SignalCall, isMuted: Bool) - func setHasVideo(call: SignalCall, hasVideo: Bool) + func setHasLocalVideo(call: SignalCall, hasLocalVideo: Bool) func callBack(recipientId: String) } @@ -145,15 +145,17 @@ extension CallUIAdaptee { adaptee.setIsMuted(call: call, isMuted: isMuted) } - internal func setHasVideo(call: SignalCall, hasVideo: Bool) { - adaptee.setHasVideo(call: call, hasVideo: hasVideo) + internal func setHasLocalVideo(call: SignalCall, hasLocalVideo: Bool) { + adaptee.setHasLocalVideo(call: call, hasLocalVideo: hasLocalVideo) } - internal func toggleSpeakerphone(call: SignalCall, isEnabled: Bool) { + internal func setIsSpeakerphoneEnabled(call: SignalCall, isEnabled: Bool) { // Speakerphone is not handled by CallKit (e.g. there is no CXAction), so we handle it w/o going through the // adaptee, relying on the AudioService CallObserver to put the system in a state consistent with the call's // assigned property. - call.isSpeakerphoneEnabled = isEnabled + CallService.signalingQueue.async { + call.isSpeakerphoneEnabled = isEnabled + } } // CallKit handles ringing state on it's own. But for non-call kit we trigger ringing start/stop manually. diff --git a/Signal/src/view controllers/CallViewController.swift b/Signal/src/view controllers/CallViewController.swift index ffbec32f1..f060ada18 100644 --- a/Signal/src/view controllers/CallViewController.swift +++ b/Signal/src/view controllers/CallViewController.swift @@ -46,10 +46,15 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R var ongoingCallView: UIView! var hangUpButton: UIButton! - var muteButton: UIButton! var speakerPhoneButton: UIButton! - var textMessageButton: UIButton! - var videoButton: UIButton! + var audioMuteButton: UIButton! + var audioVideoButton: UIButton! + var videoMuteButton: UIButton! + var videoVideoButton: UIButton! + // TODO: Later, we'll re-enable the text message button + // so users can send and read messages during a + // call. +// var textMessageButton: UIButton! // MARK: Incoming Call Controls @@ -68,20 +73,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R var remoteVideoConstraints: [NSLayoutConstraint] = [] var localVideoConstraints: [NSLayoutConstraint] = [] - // MARK: Control Groups - - var allControls: [UIView] { - return incomingCallControls + ongoingCallControls - } - - var incomingCallControls: [UIView] { - return [ acceptIncomingButton, declineIncomingButton ] - } - - var ongoingCallControls: [UIView] { - return [ muteButton, speakerPhoneButton, textMessageButton, hangUpButton, videoButton ] - } - // MARK: Initializers required init?(coder aDecoder: NSCoder) { @@ -195,29 +186,38 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R func createOngoingCallControls() { - textMessageButton = createButton(imageName:"message-active-wide", - action:#selector(didPressTextMessage)) - muteButton = createButton(imageName:"mute-unselected-wide", - action:#selector(didPressMute)) - speakerPhoneButton = createButton(imageName:"speaker-active-wide", +// textMessageButton = createButton(imageName:"message-active-wide", +// action:#selector(didPressTextMessage)) + speakerPhoneButton = createButton(imageName:"speaker-inactive-wide", action:#selector(didPressSpeakerphone)) - videoButton = createButton(imageName:"video-inactive-wide", - action:#selector(didPressVideo)) hangUpButton = createButton(imageName:"hangup-active-wide", action:#selector(didPressHangup)) + audioMuteButton = createButton(imageName:"mute-unselected-wide", + action:#selector(didPressMute)) + videoMuteButton = createButton(imageName:"mute-unselected-wide", + action:#selector(didPressMute)) + audioVideoButton = createButton(imageName:"video-inactive-wide", + action:#selector(didPressVideo)) + videoVideoButton = createButton(imageName:"video-inactive-wide", + action:#selector(didPressVideo)) let muteSelectedImage = UIImage(named:"mute-selected-wide") assert(muteSelectedImage != nil) - muteButton.setImage(muteSelectedImage, for:.selected) + audioMuteButton.setImage(muteSelectedImage, for:.selected) + videoMuteButton.setImage(muteSelectedImage, for:.selected) let videoSelectedImage = UIImage(named:"video-active-wide") assert(videoSelectedImage != nil) - videoButton.setImage(videoSelectedImage, for:.selected) + audioVideoButton.setImage(videoSelectedImage, for:.selected) + videoVideoButton.setImage(videoSelectedImage, for:.selected) + + let speakerPhoneSelectedImage = UIImage(named:"speaker-active-wide") + assert(speakerPhoneSelectedImage != nil) + speakerPhoneButton.setImage(speakerPhoneSelectedImage, for:.selected) ongoingCallView = createContainerForCallControls(controlGroups : [ - [textMessageButton, videoButton], - [muteButton, speakerPhoneButton ], - [hangUpButton ] + [audioMuteButton, speakerPhoneButton, audioVideoButton ], + [videoMuteButton, hangUpButton, videoVideoButton ] ]) } @@ -244,7 +244,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R var prevRow: UIView? for row in rows { containerView.addSubview(row) - row.autoPinWidthToSuperview() + row.autoHCenterInSuperview() if prevRow != nil { row.autoPinEdge(.top, to:.bottom, of:prevRow!, withOffset:rowspacing) } @@ -310,7 +310,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R // If there's only one subview in this row, center it. let subview = subviews.first! row.addSubview(subview) - subview.autoCenterInSuperview() + subview.autoVCenterInSuperview() + subview.autoPinWidthToSuperview() } return row @@ -421,6 +422,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R } self.remoteVideoConstraints = constraints + updateCallUI(callState: call.state) } internal func updateLocalVideoLayout() { @@ -522,8 +524,11 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R assert(Thread.isMainThread) updateCallStatusLabel(callState: callState) - videoButton.isSelected = call.hasVideo - muteButton.isSelected = call.isMuted + audioMuteButton.isSelected = call.isMuted + videoMuteButton.isSelected = call.isMuted + audioVideoButton.isSelected = call.hasLocalVideo + videoVideoButton.isSelected = call.hasLocalVideo + speakerPhoneButton.isSelected = call.isSpeakerphoneEnabled // Show Incoming vs. Ongoing call controls let isRinging = callState == .localRinging @@ -532,6 +537,14 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R ongoingCallView.isHidden = isRinging ongoingCallView.isUserInteractionEnabled = !isRinging + // Hide the contact avatar and speakerphone button if remote video is available. + contactAvatarView.isHidden = !remoteVideoView.isHidden + speakerPhoneButton.isHidden = !remoteVideoView.isHidden + audioMuteButton.isHidden = !remoteVideoView.isHidden + videoMuteButton.isHidden = remoteVideoView.isHidden + audioVideoButton.isHidden = !remoteVideoView.isHidden + videoVideoButton.isHidden = remoteVideoView.isHidden + // Dismiss Handling switch callState { case .remoteHangup, .remoteBusy, .localFailure: @@ -595,7 +608,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R Logger.info("\(TAG) called \(#function)") speakerphoneButton.isSelected = !speakerphoneButton.isSelected if let call = self.call { - callUIAdapter.toggleSpeakerphone(call: call, isEnabled: speakerphoneButton.isSelected) + callUIAdapter.setIsSpeakerphoneEnabled(call: call, isEnabled: speakerphoneButton.isSelected) } else { Logger.warn("\(TAG) pressed mute, but call was unexpectedly nil") } @@ -624,9 +637,11 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R func didPressVideo(sender: UIButton) { Logger.info("\(TAG) called \(#function)") - videoButton.isSelected = !videoButton.isSelected + let hasLocalVideo = !sender.isSelected + audioVideoButton.isSelected = hasLocalVideo + videoVideoButton.isSelected = hasLocalVideo if let call = self.call { - callUIAdapter.setHasVideo(call: call, hasVideo: videoButton.isSelected) + callUIAdapter.setHasLocalVideo(call: call, hasLocalVideo: hasLocalVideo) } else { Logger.warn("\(TAG) pressed video, but call was unexpectedly nil") } @@ -655,7 +670,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R self.updateCallUI(callState: state) } - internal func hasVideoDidChange(call: SignalCall, hasVideo: Bool) { + internal func hasLocalVideoDidChange(call: SignalCall, hasLocalVideo: Bool) { AssertIsOnMainThread() self.updateCallUI(callState: call.state) } From 9c3ecbc77d7d9636949900c0d7ed6c1d1b42488d Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 27 Jan 2017 11:17:35 -0500 Subject: [PATCH 2/3] Clean up ahead of PR. // FREEBIE --- Signal/src/view controllers/CallViewController.swift | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Signal/src/view controllers/CallViewController.swift b/Signal/src/view controllers/CallViewController.swift index f060ada18..e6a87602e 100644 --- a/Signal/src/view controllers/CallViewController.swift +++ b/Signal/src/view controllers/CallViewController.swift @@ -444,14 +444,6 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R self.localVideoConstraints = constraints } - func traverseViewHierarchy(view: UIView!, visitor: (UIView) -> Void) { - visitor(view) - - for subview in view.subviews { - traverseViewHierarchy(view:subview, visitor:visitor) - } - } - // MARK: - Methods // objc accessible way to set our swift enum. @@ -537,7 +529,7 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R ongoingCallView.isHidden = isRinging ongoingCallView.isUserInteractionEnabled = !isRinging - // Hide the contact avatar and speakerphone button if remote video is available. + // Rework control state if remote video is available. contactAvatarView.isHidden = !remoteVideoView.isHidden speakerPhoneButton.isHidden = !remoteVideoView.isHidden audioMuteButton.isHidden = !remoteVideoView.isHidden From bc00b877837383cd38492a0f3a33c64f8ff328f4 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 27 Jan 2017 13:18:51 -0500 Subject: [PATCH 3/3] Reply to CR. // FREEBIE --- .../view controllers/CallViewController.swift | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Signal/src/view controllers/CallViewController.swift b/Signal/src/view controllers/CallViewController.swift index e6a87602e..016c27547 100644 --- a/Signal/src/view controllers/CallViewController.swift +++ b/Signal/src/view controllers/CallViewController.swift @@ -47,10 +47,10 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R var hangUpButton: UIButton! var speakerPhoneButton: UIButton! - var audioMuteButton: UIButton! - var audioVideoButton: UIButton! - var videoMuteButton: UIButton! - var videoVideoButton: UIButton! + var audioModeMuteButton: UIButton! + var audioModeVideoButton: UIButton! + var videoModeMuteButton: UIButton! + var videoModeVideoButton: UIButton! // TODO: Later, we'll re-enable the text message button // so users can send and read messages during a // call. @@ -192,32 +192,32 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R action:#selector(didPressSpeakerphone)) hangUpButton = createButton(imageName:"hangup-active-wide", action:#selector(didPressHangup)) - audioMuteButton = createButton(imageName:"mute-unselected-wide", + audioModeMuteButton = createButton(imageName:"mute-unselected-wide", action:#selector(didPressMute)) - videoMuteButton = createButton(imageName:"mute-unselected-wide", + videoModeMuteButton = createButton(imageName:"mute-unselected-wide", action:#selector(didPressMute)) - audioVideoButton = createButton(imageName:"video-inactive-wide", + audioModeVideoButton = createButton(imageName:"video-inactive-wide", action:#selector(didPressVideo)) - videoVideoButton = createButton(imageName:"video-inactive-wide", + videoModeVideoButton = createButton(imageName:"video-inactive-wide", action:#selector(didPressVideo)) let muteSelectedImage = UIImage(named:"mute-selected-wide") assert(muteSelectedImage != nil) - audioMuteButton.setImage(muteSelectedImage, for:.selected) - videoMuteButton.setImage(muteSelectedImage, for:.selected) + audioModeMuteButton.setImage(muteSelectedImage, for:.selected) + videoModeMuteButton.setImage(muteSelectedImage, for:.selected) let videoSelectedImage = UIImage(named:"video-active-wide") assert(videoSelectedImage != nil) - audioVideoButton.setImage(videoSelectedImage, for:.selected) - videoVideoButton.setImage(videoSelectedImage, for:.selected) + audioModeVideoButton.setImage(videoSelectedImage, for:.selected) + videoModeVideoButton.setImage(videoSelectedImage, for:.selected) let speakerPhoneSelectedImage = UIImage(named:"speaker-active-wide") assert(speakerPhoneSelectedImage != nil) speakerPhoneButton.setImage(speakerPhoneSelectedImage, for:.selected) ongoingCallView = createContainerForCallControls(controlGroups : [ - [audioMuteButton, speakerPhoneButton, audioVideoButton ], - [videoMuteButton, hangUpButton, videoVideoButton ] + [audioModeMuteButton, speakerPhoneButton, audioModeVideoButton ], + [videoModeMuteButton, hangUpButton, videoModeVideoButton ] ]) } @@ -516,10 +516,10 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R assert(Thread.isMainThread) updateCallStatusLabel(callState: callState) - audioMuteButton.isSelected = call.isMuted - videoMuteButton.isSelected = call.isMuted - audioVideoButton.isSelected = call.hasLocalVideo - videoVideoButton.isSelected = call.hasLocalVideo + audioModeMuteButton.isSelected = call.isMuted + videoModeMuteButton.isSelected = call.isMuted + audioModeVideoButton.isSelected = call.hasLocalVideo + videoModeVideoButton.isSelected = call.hasLocalVideo speakerPhoneButton.isSelected = call.isSpeakerphoneEnabled // Show Incoming vs. Ongoing call controls @@ -532,10 +532,10 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R // Rework control state if remote video is available. contactAvatarView.isHidden = !remoteVideoView.isHidden speakerPhoneButton.isHidden = !remoteVideoView.isHidden - audioMuteButton.isHidden = !remoteVideoView.isHidden - videoMuteButton.isHidden = remoteVideoView.isHidden - audioVideoButton.isHidden = !remoteVideoView.isHidden - videoVideoButton.isHidden = remoteVideoView.isHidden + audioModeMuteButton.isHidden = !remoteVideoView.isHidden + videoModeMuteButton.isHidden = remoteVideoView.isHidden + audioModeVideoButton.isHidden = !remoteVideoView.isHidden + videoModeVideoButton.isHidden = remoteVideoView.isHidden // Dismiss Handling switch callState { @@ -630,8 +630,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R func didPressVideo(sender: UIButton) { Logger.info("\(TAG) called \(#function)") let hasLocalVideo = !sender.isSelected - audioVideoButton.isSelected = hasLocalVideo - videoVideoButton.isSelected = hasLocalVideo + audioModeVideoButton.isSelected = hasLocalVideo + videoModeVideoButton.isSelected = hasLocalVideo if let call = self.call { callUIAdapter.setHasLocalVideo(call: call, hasLocalVideo: hasLocalVideo) } else {