AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/SwiftUI/Setup/SetupViewComponent/PreviewAreaViewModel.swift (68 lines of code) (raw):
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
import Foundation
import Combine
import UIKit
class PreviewAreaViewModel: ObservableObject {
private var cameraPermission: AppPermission.Status = .unknown
private var audioPermission: AppPermission.Status = .unknown
@Published var isPermissionsDenied = false
var goToSettingsButtonViewModel: PrimaryButtonViewModel!
let localVideoViewModel: LocalVideoViewModel!
private let localizationProvider: LocalizationProviderProtocol
init(compositeViewModelFactory: CompositeViewModelFactoryProtocol,
dispatchAction: @escaping ActionDispatch,
localizationProvider: LocalizationProviderProtocol) {
localVideoViewModel = compositeViewModelFactory.makeLocalVideoViewModel(dispatchAction: dispatchAction)
self.localizationProvider = localizationProvider
goToSettingsButtonViewModel = compositeViewModelFactory.makePrimaryButtonViewModel(
buttonStyle: .primaryOutline,
buttonLabel: self.localizationProvider
.getLocalizedString(.goToSettings)) { [weak self] in
guard let self = self else {
return
}
self.goToSettingsButtonTapped()
}
goToSettingsButtonViewModel.update(
accessibilityLabel: self.localizationProvider.getLocalizedString(.goToSettings))
}
func getPermissionWarningIcon() -> CompositeIcon {
let displayIcon: CompositeIcon
if self.audioPermission == .granted {
displayIcon = .videoOff
} else if self.cameraPermission == .denied {
displayIcon = .warning
} else {
displayIcon = .micOff
}
return displayIcon
}
func getPermissionWarningText() -> String {
let displayText: String
if self.audioPermission == .granted {
displayText = localizationProvider.getLocalizedString(.cameraDisabled)
} else if self.cameraPermission == .denied {
displayText = localizationProvider.getLocalizedString(.audioAndCameraDisabled)
} else {
displayText = localizationProvider.getLocalizedString(.audioDisabled)
}
return displayText
}
func update(localUserState: LocalUserState, permissionState: PermissionState, visibilityState: VisibilityState) {
self.cameraPermission = permissionState.cameraPermission
self.audioPermission = permissionState.audioPermission
updatePermissionsState()
localVideoViewModel.update(localUserState: localUserState, visibilityState: visibilityState)
}
private func updatePermissionsState() {
let isPermissionDenied = cameraPermission == .denied || audioPermission == .denied
if isPermissionDenied != self.isPermissionsDenied {
self.isPermissionsDenied = isPermissionDenied
}
}
private func goToSettingsButtonTapped() {
guard let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) else {
return
}
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}