remove files
parent
c8e5a7eeef
commit
dcac240ae4
@ -1,446 +0,0 @@
|
||||
//
|
||||
// ViewController.swift
|
||||
// Lets-Build-OTPublisher
|
||||
//
|
||||
// Created by Roberto Perez Cubero on 11/08/16.
|
||||
// Copyright © 2016 tokbox. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import OpenTok
|
||||
|
||||
// The converted code is limited to 2 KB.
|
||||
// Refill your credit or upgrade your plan to remove this limitation.
|
||||
//
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
//
|
||||
// ClingoVideoCallViewController.m
|
||||
// Runner
|
||||
//
|
||||
// Created by Mohammad Aljammal & Elham on 23/6/20.
|
||||
// Copyright © 2020 The Chromium Authors. All rights reserved.
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
||||
import AVFoundation
|
||||
|
||||
var dateFormatter: DateFormatter?
|
||||
|
||||
|
||||
class ClingoVideoCallViewController : UIViewController, OTSessionDelegate, OTSubscriberDelegate, OTPublisherDelegate{
|
||||
|
||||
var kApiKey: String?
|
||||
var kSessionId: String?
|
||||
var kToken: String?
|
||||
var session: OTSession?
|
||||
var publisher: OTPublisher?
|
||||
var subscriber: OTSubscriber?
|
||||
var callDuration: String?
|
||||
var warningDuration: String?
|
||||
var appLang: String?
|
||||
|
||||
|
||||
|
||||
@IBOutlet weak var localVideo: UIView!
|
||||
@IBOutlet weak var remoteVideo: UIView!
|
||||
@IBOutlet weak var controlButtons: UIView!
|
||||
@IBOutlet weak var remoteVideoMutedIndicator: UIImageView!
|
||||
@IBOutlet weak var localVideoMutedBg: UIImageView!
|
||||
@IBOutlet weak var localVideoMutedIndicator: UIImageView!
|
||||
@IBOutlet weak var remainingTimeLBL: UILabel!
|
||||
@IBOutlet weak var pgView: UIProgressView!
|
||||
var timer: Timer?
|
||||
|
||||
|
||||
|
||||
|
||||
func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
dateFormatter = DateFormatter()
|
||||
|
||||
setupButtons()
|
||||
askForMicrophonePermission()
|
||||
requestCameraPermissionsIfNeeded()
|
||||
hideVideoMuted()
|
||||
setupSession()
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
func viewDidDisappear(_ animated: Bool) {
|
||||
sessionDisconnect()
|
||||
timer.invalidate()
|
||||
timer = nil
|
||||
PgView.hidden = true
|
||||
remainingTimeLBL.hidden = true
|
||||
}
|
||||
|
||||
// MARK: -Microphone Camera and Permission Request
|
||||
func askForMicrophonePermission() {
|
||||
switch AVAudioSession.sharedInstance().recordPermission {
|
||||
case AVAudioSessionRecordPermissionGranted:
|
||||
break
|
||||
case AVAudioSessionRecordPermissionDenied:
|
||||
break
|
||||
case AVAudioSessionRecordPermissionUndetermined:
|
||||
// This is the initial state before a user has made any choice
|
||||
// You can use this spot to request permission here if you want
|
||||
AVAudioSession.sharedInstance().requestRecordPermission({ granted in
|
||||
// Check for granted
|
||||
})
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func requestCameraPermissionsIfNeeded() {
|
||||
|
||||
// check camera authorization status
|
||||
let authStatus: AVAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
|
||||
switch authStatus {
|
||||
case .authorized: break
|
||||
// camera authorized
|
||||
// do camera intensive stuff
|
||||
case .notDetermined:
|
||||
// request authorization
|
||||
|
||||
AVCaptureDevice.requestAccess(for: .video, completionHandler: { granted in
|
||||
DispatchQueue.main.async(execute: {
|
||||
|
||||
if granted {
|
||||
// do camera intensive stuff
|
||||
} else {
|
||||
self.notifyUserOfCameraAccessDenial()
|
||||
}
|
||||
})
|
||||
})
|
||||
case .restricted, .denied:
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.notifyUserOfCameraAccessDenial()
|
||||
})
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func notifyUserOfCameraAccessDenial() {
|
||||
// display a useful message asking the user to grant permissions from within Settings > Privacy > Camera
|
||||
}
|
||||
|
||||
// MARK: - OpenTok methods
|
||||
func showAlert(_ string: String?) {
|
||||
// show alertview on main UI
|
||||
DispatchQueue.main.async(execute: {
|
||||
let alertVC = UIAlertController(
|
||||
title: "OTError",
|
||||
message: string,
|
||||
preferredStyle: .alert)
|
||||
self.present(alertVC, animated: true)
|
||||
})
|
||||
}
|
||||
|
||||
// MARK: - OpenTok methods
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
/// Asynchronously begins the session connect process. Some time later, we will
|
||||
/// expect a delegate method to call us back with the results of this action.
|
||||
func setupSession() {
|
||||
//setup one time session
|
||||
if session {
|
||||
session = nil
|
||||
}
|
||||
session = OTSession(
|
||||
apiKey: kApiKey,
|
||||
sessionId: kSessionId,
|
||||
delegate: self)
|
||||
do {
|
||||
try session.connect(withToken: kToken)
|
||||
} catch {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Sets up an instance of OTPublisher to use with this session. OTPubilsher
|
||||
/// binds to the device camera and microphone, and will provide A/V streams
|
||||
/// to the OpenTok session.
|
||||
func setupPublisher() {
|
||||
let settings = OTPublisherSettings()
|
||||
settings.name = UIDevice.current.name
|
||||
publisher = OTPublisher(delegate: self, settings: settings)
|
||||
|
||||
var error: OTError? = nil
|
||||
session.publish(publisher, error: &error)
|
||||
if error != nil {
|
||||
showAlert(error?.localizedDescription())
|
||||
}
|
||||
localVideo.addSubview(publisher.view)
|
||||
publisher.view.frame = CGRect(x: localVideo.bounds.origin.x, y: localVideo.bounds.origin.y, width: localVideo.bounds.size.width, height: localVideo.bounds.size.height)
|
||||
|
||||
}
|
||||
|
||||
/// Cleans up the publisher and its view. At this point, the publisher should not
|
||||
/// be attached to the session any more.
|
||||
func cleanupPublisher() {
|
||||
publisher?.view.removeFromSuperview()
|
||||
publisher = nil
|
||||
// this is a good place to notify the end-user that publishing has stopped.
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
/// Instantiates a subscriber for the given stream and asynchronously begins the
|
||||
/// process to begin receiving A/V content for this stream. Unlike doPublish,
|
||||
/// this method does not add the subscriber to the view hierarchy. Instead, we
|
||||
/// add the subscriber only after it has connected and begins receiving data.
|
||||
func setupSubscribe(_ stream: OTStream?) {
|
||||
subscriber = OTSubscriber(stream: stream, delegate: self)
|
||||
|
||||
var error: OTError? = nil
|
||||
session.subscribe(subscriber, error: &error)
|
||||
if error != nil {
|
||||
showAlert(error?.localizedDescription())
|
||||
}
|
||||
}
|
||||
|
||||
/// Cleans the subscriber from the view hierarchy, if any.
|
||||
/// NB: You do *not* have to call unsubscribe in your controller in response to
|
||||
/// a streamDestroyed event. Any subscribers (or the publisher) for a stream will
|
||||
/// be automatically removed from the session during cleanup of the stream.
|
||||
func cleanupSubscriber() {
|
||||
subscriber.view.removeFromSuperview()
|
||||
subscriber = nil
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
// MARK: - OTSession delegate callbacks
|
||||
func sessionDidConnect(_ session: OTSession?) {
|
||||
if let sessionId = session?.sessionId {
|
||||
print("sessionDidConnect (\(sessionId))")
|
||||
}
|
||||
|
||||
// Step 2: We have successfully connected, now instantiate a publisher and
|
||||
// begin pushing A/V streams into OpenTok.
|
||||
setupPublisher()
|
||||
}
|
||||
|
||||
func sessionDidDisconnect(_ session: OTSession?) {
|
||||
var alertMessage: String? = nil
|
||||
if let sessionId = session?.sessionId {
|
||||
alertMessage = "Session disconnected: (\(sessionId))"
|
||||
}
|
||||
print("sessionDidDisconnect (\(alertMessage ?? ""))")
|
||||
}
|
||||
|
||||
func session(
|
||||
_ mySession: OTSession?,
|
||||
streamCreated stream: OTStream?
|
||||
) {
|
||||
if let streamId = stream?.streamId {
|
||||
print("session streamCreated (\(streamId))")
|
||||
}
|
||||
|
||||
if nil == subscriber {
|
||||
setupSubscribe(stream)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
streamDestroyed stream: OTStream?
|
||||
) {
|
||||
if let streamId = stream?.streamId {
|
||||
print("session streamDestroyed (\(streamId))")
|
||||
}
|
||||
|
||||
if subscriber.stream.streamId == stream?.streamId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
}
|
||||
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
connectionCreated connection: OTConnection?
|
||||
) {
|
||||
startTimer(callDuration, warningDuration)
|
||||
if let connectionId = connection?.connectionId {
|
||||
print("session connectionCreated (\(connectionId))")
|
||||
}
|
||||
}
|
||||
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
connectionDestroyed connection: OTConnection?
|
||||
) {
|
||||
if let connectionId = connection?.connectionId {
|
||||
print("session connectionDestroyed (\(connectionId))")
|
||||
}
|
||||
if subscriber.stream.connection.connectionId == connection?.connectionId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
sessionDisconnect()
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func session(
|
||||
_ session: ARSession,
|
||||
didFailWithError error: Error
|
||||
) {
|
||||
print("didFailWithError: (\(error))")
|
||||
}
|
||||
|
||||
func session(_ session: OTSession, receivedSignalType type: String?, from connection: OTConnection?, with string: String?) {
|
||||
print("\(session)")
|
||||
}
|
||||
|
||||
func sessionDisconnect() {
|
||||
if session && session.sessionConnectionStatus == OTSessionConnectionStatusConnected {
|
||||
print("disconnecting....")
|
||||
session.disconnect(nil)
|
||||
dismiss(animated: true)
|
||||
return
|
||||
}
|
||||
dismiss(animated: true)
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
//do {
|
||||
// print(
|
||||
// "subscriberDidConnectToStream (\(subscriber.stream.connection.connectionId))")
|
||||
// assert(subscriber == subscriber)
|
||||
// remoteVideo.addSubview(subscriber.view)
|
||||
// subscriber.view.frame = remoteVideo.bounds
|
||||
// // self.remoteVideo=_publisher.view;
|
||||
//}
|
||||
|
||||
-
|
||||
do {
|
||||
print(
|
||||
"subscriber \(subscriber.stream.streamId) didFailWithError \(error)")
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
// MARK: - OTPublisher delegate callbacks
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
streamCreated stream: OTStream?
|
||||
) {
|
||||
print("Publishing")
|
||||
}
|
||||
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
streamDestroyed stream: OTStream?
|
||||
) {
|
||||
if subscriber.stream.streamId == stream?.streamId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
|
||||
cleanupPublisher()
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
didFailWithError error: OTError?
|
||||
) {
|
||||
if let error = error {
|
||||
print("publisher didFailWithError \(error)")
|
||||
}
|
||||
cleanupPublisher()
|
||||
}
|
||||
|
||||
// MARK: - Ui Handel
|
||||
func hideVideoMuted() {
|
||||
remoteVideoMutedIndicator.hidden = true
|
||||
localVideoMutedBg.hidden = true
|
||||
localVideoMutedIndicator.hidden = true
|
||||
}
|
||||
|
||||
func setupButtons() {
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(remoteVideoTapped(_:)))
|
||||
view.addGestureRecognizer(tapGestureRecognizer)
|
||||
view.isUserInteractionEnabled = true
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@objc func hideControlButtons() {
|
||||
controlButtons.hidden = true
|
||||
}
|
||||
|
||||
func remoteVideoTapped(_ recognizer: UITapGestureRecognizer?) {
|
||||
if controlButtons.hidden {
|
||||
controlButtons.hidden = false
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
}
|
||||
}
|
||||
|
||||
func resetHideButtonsTimer() {
|
||||
ClingoVideoCallViewController.cancelPreviousPerformRequests(withTarget: self)
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@IBAction func didClickMuteButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
publisher.publishAudio = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func didClickSpeakerButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
subscriber.subscribeToAudio = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func didClickVideoMuteButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
if publisher.publishVideo {
|
||||
publisher.publishVideo = false
|
||||
} else {
|
||||
publisher.publishVideo = true
|
||||
}
|
||||
localVideo.hidden = sender.isSelected
|
||||
localVideoMutedBg.hidden = !sender.isSelected
|
||||
localVideoMutedIndicator.hidden = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@IBAction func didClickSwitchCameraButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
if sender.isSelected {
|
||||
publisher.cameraPosition = RPCameraPosition(rawValue: AVCaptureDevice.Position.back.rawValue)
|
||||
} else {
|
||||
publisher.cameraPosition = RPCameraPosition(rawValue: AVCaptureDevice.Position.front.rawValue)
|
||||
}
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func hangUp(_ sender: UIButton) {
|
||||
sessionDisconnect()
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func startTimer(_ callDuration: String?, _ warningTime: String?) {
|
||||
}
|
||||
|
||||
func -currentTime as? Date!
|
||||
do {
|
||||
let startCallTime = Date()
|
||||
dateFormatter.dateFormat = "yyyyMMddHHmmss"
|
||||
let resultString = dateFormatter.string(from: startCallTime)
|
||||
let date = dateFormatter.date(from: resultString)
|
||||
return date
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue