From 8013cdacffa7d38e3be8b32d08e60921d7566647 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 8 Sep 2021 14:55:52 +1000 Subject: [PATCH] add operations for video call --- Session/Calls/CallVC.swift | 90 ++++++++++++++++-- Session/Calls/CameraManager.swift | 30 +++++- .../Session/AudioOff.imageset/AudioOff.pdf | Bin 0 -> 5362 bytes .../Session/AudioOff.imageset/Contents.json | 12 +++ .../Session/AudioOn.imageset/Contents.json | 12 +++ .../Session/AudioOn.imageset/Shape.pdf | Bin 0 -> 4881 bytes .../Session/EndCall.imageset/Contents.json | 12 +++ .../Session/EndCall.imageset/Path.pdf | Bin 0 -> 4673 bytes .../SwitchCamera.imageset/Contents.json | 12 +++ .../SwitchCamera.imageset/SwtichCamera.pdf | Bin 0 -> 5773 bytes SessionMessagingKit/Calls/WebRTCSession.swift | 8 ++ 11 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 Session/Meta/Images.xcassets/Session/AudioOff.imageset/AudioOff.pdf create mode 100644 Session/Meta/Images.xcassets/Session/AudioOff.imageset/Contents.json create mode 100644 Session/Meta/Images.xcassets/Session/AudioOn.imageset/Contents.json create mode 100644 Session/Meta/Images.xcassets/Session/AudioOn.imageset/Shape.pdf create mode 100644 Session/Meta/Images.xcassets/Session/EndCall.imageset/Contents.json create mode 100644 Session/Meta/Images.xcassets/Session/EndCall.imageset/Path.pdf create mode 100644 Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/Contents.json create mode 100644 Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/SwtichCamera.pdf diff --git a/Session/Calls/CallVC.swift b/Session/Calls/CallVC.swift index 9fb2d20f1..c9a630690 100644 --- a/Session/Calls/CallVC.swift +++ b/Session/Calls/CallVC.swift @@ -7,6 +7,7 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { let sessionID: String let mode: Mode let webRTCSession: WebRTCSession + var isMuted = false lazy var cameraManager: CameraManager = { let result = CameraManager() @@ -19,6 +20,14 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { }() // MARK: UI Components + private lazy var localVideoView: RTCMTLVideoView = { + let result = RTCMTLVideoView() + result.contentMode = .scaleAspectFill + result.set(.width, to: 80) + result.set(.height, to: 173) + return result + }() + private lazy var remoteVideoView: RTCMTLVideoView = { let result = RTCMTLVideoView() result.contentMode = .scaleAspectFill @@ -48,6 +57,42 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { return result }() + private lazy var hangUpButton: UIButton = { + let result = UIButton(type: .custom) + let image = UIImage(named: "EndCall")!.withTint(.white) + result.setImage(image, for: UIControl.State.normal) + result.set(.width, to: 60) + result.set(.height, to: 60) + result.backgroundColor = Colors.destructive + result.layer.cornerRadius = 30 + result.addTarget(self, action: #selector(close), for: UIControl.Event.touchUpInside) + return result + }() + + private lazy var switchCameraButton: UIButton = { + let result = UIButton(type: .custom) + let image = UIImage(named: "SwitchCamera")!.withTint(.white) + result.setImage(image, for: UIControl.State.normal) + result.set(.width, to: 60) + result.set(.height, to: 60) + result.backgroundColor = UIColor(hex: 0x1F1F1F) + result.layer.cornerRadius = 30 + result.addTarget(self, action: #selector(switchCamera), for: UIControl.Event.touchUpInside) + return result + }() + + private lazy var switchAudioButton: UIButton = { + let result = UIButton(type: .custom) + let image = UIImage(named: "AudioOn")!.withTint(.white) + result.setImage(image, for: UIControl.State.normal) + result.set(.width, to: 60) + result.set(.height, to: 60) + result.backgroundColor = UIColor(hex: 0x1F1F1F) + result.layer.cornerRadius = 30 + result.addTarget(self, action: #selector(switchAudio), for: UIControl.Event.touchUpInside) + return result + }() + private lazy var titleLabel: UILabel = { let result = UILabel() result.textColor = .white @@ -115,15 +160,11 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { remoteVideoView.translatesAutoresizingMaskIntoConstraints = false remoteVideoView.pin(to: view) // Local video view - let localVideoView = RTCMTLVideoView() - localVideoView.contentMode = .scaleAspectFill webRTCSession.attachLocalRenderer(localVideoView) - localVideoView.set(.width, to: 80) - localVideoView.set(.height, to: 173) view.addSubview(localVideoView) - localVideoView.pin(.right, to: .right, of: view, withInset: -Values.largeSpacing) - let bottomMargin = UIApplication.shared.keyWindow!.safeAreaInsets.bottom + Values.largeSpacing - localVideoView.pin(.bottom, to: .bottom, of: view, withInset: -bottomMargin) + localVideoView.pin(.right, to: .right, of: view, withInset: -Values.smallSpacing) + let topMargin = UIApplication.shared.keyWindow!.safeAreaInsets.top + Values.veryLargeSpacing + localVideoView.pin(.top, to: .top, of: view, withInset: topMargin) // Fade view view.addSubview(fadeView) fadeView.translatesAutoresizingMaskIntoConstraints = false @@ -138,6 +179,21 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { titleLabel.translatesAutoresizingMaskIntoConstraints = false titleLabel.center(.vertical, in: closeButton) titleLabel.center(.horizontal, in: view) + // End call button + view.addSubview(hangUpButton) + hangUpButton.translatesAutoresizingMaskIntoConstraints = false + hangUpButton.center(.horizontal, in: view) + hangUpButton.pin(.bottom, to: .bottom, of: view, withInset: -Values.newConversationButtonBottomOffset) + // Switch camera button + view.addSubview(switchCameraButton) + switchCameraButton.translatesAutoresizingMaskIntoConstraints = false + switchCameraButton.center(.vertical, in: hangUpButton) + switchCameraButton.pin(.right, to: .left, of: hangUpButton, withInset: -Values.veryLargeSpacing) + // Switch audio button + view.addSubview(switchAudioButton) + switchAudioButton.translatesAutoresizingMaskIntoConstraints = false + switchAudioButton.center(.vertical, in: hangUpButton) + switchAudioButton.pin(.left, to: .right, of: hangUpButton, withInset: Values.veryLargeSpacing) } override func viewDidAppear(_ animated: Bool) { @@ -174,4 +230,24 @@ final class CallVC : UIViewController, WebRTCSessionDelegate { } presentingViewController?.dismiss(animated: true, completion: nil) } + + @objc private func switchCamera() { + cameraManager.switchCamera() + } + + @objc private func switchAudio() { + if isMuted { + switchAudioButton.backgroundColor = UIColor(hex: 0x1F1F1F) + let image = UIImage(named: "AudioOn")!.withTint(.white) + switchAudioButton.setImage(image, for: UIControl.State.normal) + isMuted = false + webRTCSession.unmute() + } else { + switchAudioButton.backgroundColor = Colors.destructive + let image = UIImage(named: "AudioOff")!.withTint(.white) + switchAudioButton.setImage(image, for: UIControl.State.normal) + isMuted = true + webRTCSession.mute() + } + } } diff --git a/Session/Calls/CameraManager.swift b/Session/Calls/CameraManager.swift index 069841268..f7e92346d 100644 --- a/Session/Calls/CameraManager.swift +++ b/Session/Calls/CameraManager.swift @@ -17,15 +17,20 @@ final class CameraManager : NSObject { private var isCapturing = false weak var delegate: CameraManagerDelegate? - private lazy var videoCaptureDevice: AVCaptureDevice? = { - return AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) - }() + private var videoCaptureDevice: AVCaptureDevice? + private var videoInput: AVCaptureDeviceInput? func prepare() { print("[Calls] Preparing camera.") - if let videoCaptureDevice = videoCaptureDevice, + addNewVideoIO(position: .front) + } + + private func addNewVideoIO(position: AVCaptureDevice.Position) { + if let videoCaptureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: position), let videoInput = try? AVCaptureDeviceInput(device: videoCaptureDevice), captureSession.canAddInput(videoInput) { captureSession.addInput(videoInput) + self.videoCaptureDevice = videoCaptureDevice + self.videoInput = videoInput } if captureSession.canAddOutput(videoDataOutput) { captureSession.addOutput(videoDataOutput) @@ -34,7 +39,7 @@ final class CameraManager : NSObject { guard let connection = videoDataOutput.connection(with: AVMediaType.video) else { return } connection.videoOrientation = .portrait connection.automaticallyAdjustsVideoMirroring = false - connection.isVideoMirrored = true + connection.isVideoMirrored = (position == .front) } else { SNLog("Couldn't add video data output to capture session.") } @@ -53,6 +58,21 @@ final class CameraManager : NSObject { isCapturing = false captureSession.stopRunning() } + + func switchCamera() { + guard let videoCaptureDevice = videoCaptureDevice, let videoInput = videoInput else { return } + stop() + if videoCaptureDevice.position == .front { + captureSession.removeInput(videoInput) + captureSession.removeOutput(videoDataOutput) + addNewVideoIO(position: .back) + } else { + captureSession.removeInput(videoInput) + captureSession.removeOutput(videoDataOutput) + addNewVideoIO(position: .front) + } + start() + } } extension CameraManager : AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate { diff --git a/Session/Meta/Images.xcassets/Session/AudioOff.imageset/AudioOff.pdf b/Session/Meta/Images.xcassets/Session/AudioOff.imageset/AudioOff.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93a3af9457845f16bb335274c93957b83fc36e17 GIT binary patch literal 5362 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 M4#3Z^s-p(@A9n?i;s5{u literal 0 HcmV?d00001 diff --git a/Session/Meta/Images.xcassets/Session/AudioOff.imageset/Contents.json b/Session/Meta/Images.xcassets/Session/AudioOff.imageset/Contents.json new file mode 100644 index 000000000..710e3736b --- /dev/null +++ b/Session/Meta/Images.xcassets/Session/AudioOff.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "AudioOff.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Session/Meta/Images.xcassets/Session/AudioOn.imageset/Contents.json b/Session/Meta/Images.xcassets/Session/AudioOn.imageset/Contents.json new file mode 100644 index 000000000..516caa513 --- /dev/null +++ b/Session/Meta/Images.xcassets/Session/AudioOn.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Shape.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Session/Meta/Images.xcassets/Session/AudioOn.imageset/Shape.pdf b/Session/Meta/Images.xcassets/Session/AudioOn.imageset/Shape.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb0df35b958edac355af6666deca27144b2af1e5 GIT binary patch literal 4881 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 Bwu=A& literal 0 HcmV?d00001 diff --git a/Session/Meta/Images.xcassets/Session/EndCall.imageset/Contents.json b/Session/Meta/Images.xcassets/Session/EndCall.imageset/Contents.json new file mode 100644 index 000000000..fcb04f0ba --- /dev/null +++ b/Session/Meta/Images.xcassets/Session/EndCall.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Path.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Session/Meta/Images.xcassets/Session/EndCall.imageset/Path.pdf b/Session/Meta/Images.xcassets/Session/EndCall.imageset/Path.pdf new file mode 100644 index 0000000000000000000000000000000000000000..94caff67593fb74cc81b6692595fd2c45503c909 GIT binary patch literal 4673 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 literal 0 HcmV?d00001 diff --git a/Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/Contents.json b/Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/Contents.json new file mode 100644 index 000000000..e7636afdf --- /dev/null +++ b/Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "SwtichCamera.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/SwtichCamera.pdf b/Session/Meta/Images.xcassets/Session/SwitchCamera.imageset/SwtichCamera.pdf new file mode 100644 index 0000000000000000000000000000000000000000..604019ae2ea3be197b31da7ab21cb15a546f991a GIT binary patch literal 5773 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 Gz<&WJ#YaK_ literal 0 HcmV?d00001 diff --git a/SessionMessagingKit/Calls/WebRTCSession.swift b/SessionMessagingKit/Calls/WebRTCSession.swift index 770b5249b..04c0281ff 100644 --- a/SessionMessagingKit/Calls/WebRTCSession.swift +++ b/SessionMessagingKit/Calls/WebRTCSession.swift @@ -204,6 +204,14 @@ public final class WebRTCSession : NSObject, RTCPeerConnectionDelegate { peerConnection.close() } + public func mute() { + audioTrack.isEnabled = false + } + + public func unmute() { + audioTrack.isEnabled = true + } + // MARK: Delegate public func peerConnection(_ peerConnection: RTCPeerConnection, didChange state: RTCSignalingState) { print("[Calls] Signaling state changed to: \(state).")