129 lines
4.7 KiB
Swift
129 lines
4.7 KiB
Swift
|
|
//
|
||
|
|
// RoomCommon.swift
|
||
|
|
// TUIRoomKit
|
||
|
|
//
|
||
|
|
// Created by janejntang on 2023/6/26.
|
||
|
|
//
|
||
|
|
|
||
|
|
import Foundation
|
||
|
|
import AVFoundation
|
||
|
|
import TUICore
|
||
|
|
|
||
|
|
var isRTL: Bool {
|
||
|
|
TUIGlobalization.getRTLOption()
|
||
|
|
}
|
||
|
|
|
||
|
|
var isLandscape: Bool {
|
||
|
|
if #available(iOS 13, *) {
|
||
|
|
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape == true
|
||
|
|
} else {
|
||
|
|
return UIApplication.shared.statusBarOrientation.isLandscape
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
class RoomCommon {
|
||
|
|
enum AuthorizationDeniedType {
|
||
|
|
case microphone
|
||
|
|
case camera
|
||
|
|
}
|
||
|
|
class func checkAuthorMicStatusIsDenied() -> Bool {
|
||
|
|
return AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
|
||
|
|
}
|
||
|
|
class func checkAuthorCamaraStatusIsDenied() -> Bool {
|
||
|
|
return AVCaptureDevice.authorizationStatus(for: .video) == .authorized
|
||
|
|
}
|
||
|
|
class func micStateActionWithPopCompletion(completion: @escaping (Bool) -> ()) {
|
||
|
|
if AVCaptureDevice.authorizationStatus(for: .audio) == .notDetermined {
|
||
|
|
AVCaptureDevice.requestAccess(for: .audio) { granted in
|
||
|
|
completion(granted)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
showAuthorizationAlert(deniedType: .microphone)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
class func cameraStateActionWithPopCompletion(completion: @escaping (Bool) -> () ) {
|
||
|
|
if AVCaptureDevice.authorizationStatus(for: .video) == .notDetermined {
|
||
|
|
AVCaptureDevice.requestAccess(for: .video) { granted in
|
||
|
|
completion(granted)
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
showAuthorizationAlert(deniedType: .camera)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private class func showAuthorizationAlert(deniedType: AuthorizationDeniedType) {
|
||
|
|
let laterMessage: String = .permissionLaterText
|
||
|
|
let openSettingMessage: String = .permissionEnableText
|
||
|
|
let title: String = deniedType == .microphone ? .microphonePermissionTitle : .cameraPermissionTitle
|
||
|
|
let message: String = deniedType == .microphone ? .microphonePermissionTipsText : .cameraPermissionTipsText
|
||
|
|
let alertVC = UIAlertController(title: title,
|
||
|
|
message: message,
|
||
|
|
preferredStyle: .alert)
|
||
|
|
let declineAction = UIAlertAction(title: laterMessage, style: .cancel) { _ in
|
||
|
|
|
||
|
|
}
|
||
|
|
let sureAction = UIAlertAction(title: openSettingMessage, style: .default) { _ in
|
||
|
|
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
|
||
|
|
if UIApplication.shared.canOpenURL(url) {
|
||
|
|
if #available(iOS 10.0, *) {
|
||
|
|
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
||
|
|
} else {
|
||
|
|
UIApplication.shared.openURL(url)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
alertVC.addAction(declineAction)
|
||
|
|
alertVC.addAction(sureAction)
|
||
|
|
DispatchQueue.main.async {
|
||
|
|
let vc = getCurrentWindowViewController()
|
||
|
|
vc?.present(alertVC, animated: true)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
class func getCurrentWindowViewController() -> UIViewController? {
|
||
|
|
var keyWindow: UIWindow?
|
||
|
|
for window in UIApplication.shared.windows {
|
||
|
|
if window.isMember(of: UIWindow.self), window.isKeyWindow {
|
||
|
|
keyWindow = window
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
guard let rootController = keyWindow?.rootViewController else {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
func findCurrentController(from vc: UIViewController?) -> UIViewController? {
|
||
|
|
if let nav = vc as? UINavigationController {
|
||
|
|
return findCurrentController(from: nav.topViewController)
|
||
|
|
} else if let tabBar = vc as? UITabBarController {
|
||
|
|
return findCurrentController(from: tabBar.selectedViewController)
|
||
|
|
} else if let presented = vc?.presentedViewController {
|
||
|
|
return findCurrentController(from: presented)
|
||
|
|
}
|
||
|
|
return vc
|
||
|
|
}
|
||
|
|
let viewController = findCurrentController(from: rootController)
|
||
|
|
return viewController
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private extension String {
|
||
|
|
static var microphonePermissionTitle: String {
|
||
|
|
localized("No access to microphone")
|
||
|
|
}
|
||
|
|
static var microphonePermissionTipsText: String {
|
||
|
|
localized("Unable to use audio function, click \"Authorize Now\" to open the microphone permission.")
|
||
|
|
}
|
||
|
|
static var cameraPermissionTitle: String {
|
||
|
|
localized("No access to camera")
|
||
|
|
}
|
||
|
|
static var cameraPermissionTipsText: String {
|
||
|
|
localized("Unable to use the video function, click \"Authorize Now\" to open the camera permission.")
|
||
|
|
}
|
||
|
|
static var permissionLaterText: String {
|
||
|
|
localized("Later")
|
||
|
|
}
|
||
|
|
static var permissionEnableText: String {
|
||
|
|
localized("Authorize Now")
|
||
|
|
}
|
||
|
|
}
|