Implement camera direction toggle

// FREEBIE
pull/1/head
Michael Kirk 7 years ago
parent 6a4aff0b9c
commit e5b535ccf1

@ -856,10 +856,13 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver,
}
func didPressFlipCamera(sender: UIButton) {
let wantsRearFacingCamera = sender.isSelected
Logger.info("\(TAG) in \(#function) with wantsRearFacingCamera: \(wantsRearFacingCamera)")
// toggle value
sender.isSelected = !sender.isSelected
// callUIAdapter.updateCamera(call: call, wantsRearFacingCamera: wantsRearFacingCamera)
let useBackCamera = sender.isSelected
Logger.info("\(TAG) in \(#function) with useBackCamera: \(useBackCamera)")
callUIAdapter.setCameraSource(call: call, useBackCamera: useBackCamera)
}
/**

@ -1164,6 +1164,22 @@ protocol CallServiceObserver: class {
self.setHasLocalVideo(hasLocalVideo: true)
}
func setCameraSource(call: SignalCall, useBackCamera: Bool) {
SwiftAssertIsOnMainThread(#function)
guard call == self.call else {
owsFail("\(logTag) in \(#function) for non-current call.")
return
}
guard let peerConnectionClient = self.peerConnectionClient else {
owsFail("\(logTag) in \(#function) peerConnectionClient was unexpectedly nil")
return
}
peerConnectionClient.setCameraSource(useBackCamera: useBackCamera)
}
/**
* Local client received a message on the WebRTC data channel.
*

@ -120,6 +120,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD
private var videoCaptureSession: AVCaptureSession?
private var videoSender: RTCRtpSender?
private var localVideoTrack: RTCVideoTrack?
private var localVideoSource: RTCAVFoundationVideoSource?
// RTCVideoTrack is fragile and prone to throwing exceptions and/or
// causing deadlock in its destructor. Therefore we take great care
// with this property.
@ -203,6 +205,8 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD
// TODO: Revisit the cameraConstraints.
let videoSource = factory.avFoundationVideoSource(with: cameraConstraints)
self.localVideoSource = videoSource
self.videoCaptureSession = videoSource.captureSession
videoSource.useBackCamera = false
@ -220,6 +224,21 @@ class PeerConnectionClient: NSObject, RTCPeerConnectionDelegate, RTCDataChannelD
self.videoSender = videoSender
}
public func setCameraSource(useBackCamera: Bool) {
guard let localVideoSource = self.localVideoSource else {
owsFail("\(logTag) in \(#function) localVideoSource was unexpectedly nil")
return
}
// certain devices, e.g. 16GB iPod touch don't have a back camera
guard localVideoSource.canUseBackCamera else {
owsFail("\(logTag) in \(#function) canUseBackCamera was unexpectedly false")
return
}
localVideoSource.useBackCamera = useBackCamera
}
public func setLocalVideoEnabled(enabled: Bool) {
SwiftAssertIsOnMainThread(#function)

@ -87,11 +87,14 @@ extension CallUIAdaptee {
private let adaptee: CallUIAdaptee
private let contactsManager: OWSContactsManager
internal let audioService: CallAudioService
internal let callService: CallService
required init(callService: CallService, contactsManager: OWSContactsManager, notificationsAdapter: CallNotificationsAdapter) {
SwiftAssertIsOnMainThread(#function)
self.contactsManager = contactsManager
self.callService = callService
if Platform.isSimulator {
// CallKit doesn't seem entirely supported in simulator.
// e.g. you can't receive calls in the call screen.
@ -247,6 +250,12 @@ extension CallUIAdaptee {
call.audioSource = audioSource
}
internal func setCameraSource(call: SignalCall, useBackCamera: Bool) {
SwiftAssertIsOnMainThread(#function)
callService.setCameraSource(call: call, useBackCamera: useBackCamera)
}
// CallKit handles ringing state on it's own. But for non-call kit we trigger ringing start/stop manually.
internal var hasManualRinger: Bool {
SwiftAssertIsOnMainThread(#function)

Loading…
Cancel
Save