From eab8a76a55885961d361c4c1cd07b00352b0ab4c Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sat, 31 Jan 2026 16:21:57 -0500 Subject: [PATCH] fix: getting enforce working --- Gaze/Services/EnforceModeService.swift | 16 +++++++++ .../Settings/CameraAccessService.swift | 33 ++++++++++++++++++- .../Components/EnforceModeSetupContent.swift | 4 +-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Gaze/Services/EnforceModeService.swift b/Gaze/Services/EnforceModeService.swift index f992e49..0964d19 100644 --- a/Gaze/Services/EnforceModeService.swift +++ b/Gaze/Services/EnforceModeService.swift @@ -75,6 +75,22 @@ class EnforceModeService: ObservableObject { } } .store(in: &cancellables) + + settingsManager._settingsSubject + .receive(on: RunLoop.main) + .sink { [weak self] _ in + self?.refreshEnforceModeState() + } + .store(in: &cancellables) + } + + private func refreshEnforceModeState() { + let cameraService = CameraAccessService.shared + let enabled = isEnforcementEnabled && cameraService.isCameraAuthorized + if isEnforceModeEnabled != enabled { + isEnforceModeEnabled = enabled + logDebug("🔄 Enforce mode state refreshed: \(enabled)") + } } // MARK: - Enable/Disable diff --git a/Gaze/Services/Settings/CameraAccessService.swift b/Gaze/Services/Settings/CameraAccessService.swift index 6f8023f..c5a05ba 100644 --- a/Gaze/Services/Settings/CameraAccessService.swift +++ b/Gaze/Services/Settings/CameraAccessService.swift @@ -5,6 +5,7 @@ // Created by Mike Freno on 1/13/26. // +import AppKit import AVFoundation import Combine @@ -33,11 +34,20 @@ class CameraAccessService: ObservableObject { return } + let currentStatus = AVCaptureDevice.authorizationStatus(for: .video) + if currentStatus == .denied || currentStatus == .restricted { + checkCameraAuthorizationStatus() + openSystemSettings() + throw CameraAccessError.accessDenied + } + print("🎥 Calling AVCaptureDevice.requestAccess...") let status = await AVCaptureDevice.requestAccess(for: .video) print("🎥 Permission result: \(status)") if !status { + checkCameraAuthorizationStatus() + openSystemSettings() throw CameraAccessError.accessDenied } @@ -69,6 +79,27 @@ class CameraAccessService: ObservableObject { } } + func openSystemSettings() { + let possibleUrls = [ + "x-apple.systempreferences:com.apple.preference.security?Privacy_Camera", + "x-apple.systempreferences:Privacy?Camera", + "x-apple.systempreferences:com.apple.preference.security", + "x-apple.systempreferences:Privacy", + "x-apple.systempreferences:com.apple.preferences.security", + ] + + for urlString in possibleUrls { + if let url = URL(string: urlString), + NSWorkspace.shared.open(url) + { + print("Successfully opened: \(urlString)") + return + } + } + + print("⚠️ Failed to open System Settings") + } + func checkCameraHardware() { let devices = AVCaptureDevice.DiscoverySession( deviceTypes: [.builtInWideAngleCamera], @@ -97,7 +128,7 @@ enum CameraAccessError: Error, LocalizedError { switch self { case .accessDenied: return - "Camera access was denied. Please enable camera permissions in System Preferences." + "Camera access was denied. Please enable camera permissions in System Settings." case .unsupportedOS: return "This feature requires macOS 12 or later." case .unknown: diff --git a/Gaze/Views/Components/EnforceModeSetupContent.swift b/Gaze/Views/Components/EnforceModeSetupContent.swift index a9e1bee..e7cb79c 100644 --- a/Gaze/Views/Components/EnforceModeSetupContent.swift +++ b/Gaze/Views/Components/EnforceModeSetupContent.swift @@ -339,9 +339,7 @@ struct EnforceModeSetupContent: View { "", isOn: Binding( get: { - settingsManager.isTimerEnabled(for: .lookAway) - || settingsManager.isTimerEnabled(for: .blink) - || settingsManager.isTimerEnabled(for: .posture) + enforceModeService.isEnforceModeEnabled }, set: { newValue in guard !isProcessingToggle else { return }