mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
Swift
97 lines
3.4 KiB
Swift
import WebRTC
|
|
|
|
final class CallVCV2 : UIViewController {
|
|
let roomID = "37923672515" // NOTE: You need to change this every time to ensure the room isn't full
|
|
var room: RoomInfo?
|
|
var socket: WebSocket?
|
|
|
|
lazy var callManager: CallManager = {
|
|
let result = CallManager()
|
|
result.delegate = self
|
|
return result
|
|
}()
|
|
|
|
lazy var cameraManager: CameraManager = {
|
|
let result = CameraManager()
|
|
result.delegate = self
|
|
return result
|
|
}()
|
|
|
|
lazy var videoCapturer: RTCVideoCapturer = {
|
|
return RTCCameraVideoCapturer(delegate: callManager.localVideoSource)
|
|
}()
|
|
|
|
// MARK: Lifecycle
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
setUpViewHierarchy()
|
|
cameraManager.prepare()
|
|
touch(videoCapturer)
|
|
autoConnectToTestRoom()
|
|
}
|
|
|
|
func setUpViewHierarchy() {
|
|
// Remote video view
|
|
let remoteVideoView = RTCMTLVideoView()
|
|
remoteVideoView.contentMode = .scaleAspectFill
|
|
callManager.attachRemoteRenderer(remoteVideoView)
|
|
view.addSubview(remoteVideoView)
|
|
remoteVideoView.translatesAutoresizingMaskIntoConstraints = false
|
|
remoteVideoView.pin(to: view)
|
|
// Local video view
|
|
let localVideoView = RTCMTLVideoView()
|
|
localVideoView.contentMode = .scaleAspectFill
|
|
callManager.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)
|
|
}
|
|
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
cameraManager.start()
|
|
}
|
|
|
|
override func viewWillDisappear(_ animated: Bool) {
|
|
super.viewWillDisappear(animated)
|
|
cameraManager.stop()
|
|
}
|
|
|
|
// MARK: General
|
|
func autoConnectToTestRoom() {
|
|
// Connect to a random test room
|
|
TestCallServer.join(roomID: roomID).done2 { [weak self] room in
|
|
print("[Calls] Connected to test room.")
|
|
guard let self = self else { return }
|
|
self.room = room
|
|
if let messages = room.messages {
|
|
self.handle(messages)
|
|
}
|
|
let socket = WebSocket(url: URL(string: room.wssURL)!)
|
|
socket.delegate = self
|
|
socket.connect()
|
|
self.socket = socket
|
|
}.catch2 { error in
|
|
SNLog("Couldn't join room due to error: \(error).")
|
|
}
|
|
}
|
|
|
|
func handle(_ messages: [String]) {
|
|
print("[Calls] Handling messages:")
|
|
messages.forEach { print("[Calls] \($0)") }
|
|
messages.forEach { message in
|
|
let signalingMessage = SignalingMessage.from(message: message)
|
|
switch signalingMessage {
|
|
case .candidate(let candidate): callManager.handleCandidateMessage(candidate)
|
|
case .answer(let answer): callManager.handleRemoteDescription(answer)
|
|
case .offer(let offer): callManager.handleRemoteDescription(offer)
|
|
default: break
|
|
}
|
|
}
|
|
callManager.drainICECandidateQueue()
|
|
}
|
|
}
|