// // Copyright 2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. // import AVFoundation import UIKit class AppMediator: AppMediatorProtocol { let windowManager: WindowManagerProtocol let networkMonitor: NetworkMonitorProtocol init(windowManager: WindowManagerProtocol, networkMonitor: NetworkMonitorProtocol) { self.windowManager = windowManager self.networkMonitor = networkMonitor } // UIApplication.State won't update if we store this e.g. in the constructor private var application: UIApplication { UIApplication.shared } var appState: UIApplication.State { switch application.applicationState { case .active: windowManager.mainWindow.traitCollection.activeAppearance == .active ? .active : .inactive case .inactive: .inactive case .background: .background default: .inactive } } func beginBackgroundTask(expirationHandler handler: (() -> Void)?) -> UIBackgroundTaskIdentifier { application.beginBackgroundTask(expirationHandler: handler) } func endBackgroundTask(_ identifier: UIBackgroundTaskIdentifier) { application.endBackgroundTask(identifier) } func open(_ url: URL) { application.open(url, options: [:], completionHandler: nil) } func openAppSettings() { guard let url = URL(string: UIApplication.openSettingsURLString) else { return } open(url) } func setIdleTimerDisabled(_ disabled: Bool) { application.isIdleTimerDisabled = disabled } func requestAuthorizationIfNeeded() async -> Bool { let status = AVCaptureDevice.authorizationStatus(for: .video) // Determine if the user previously authorized camera access. if status == .authorized { return true } var isAuthorized = false // If the system hasn't determined the user's authorization status, // explicitly prompt them for approval. if status == .notDetermined { isAuthorized = await AVCaptureDevice.requestAccess(for: .video) } return isAuthorized } }