import Foundation import ServiceManagement import Observation import OnyxCore import OSLog private let log = Logger(subsystem: "com.scarriffleservices.onyx", category: "Login") /// Ob Onyx beim Anmelden mitstartet. /// /// Über `SMAppService.mainApp` und nicht über den alten Weg mit einem /// versteckten Helferprogramm: macOS trägt die App dann selbst in die /// Systemeinstellungen ein, und der Nutzer sieht dort einen Eintrag, den er /// versteht. Der Preis ist, dass er ihn dort auch abschalten kann — und dann /// hilft kein `register()` mehr, sondern nur der Weg zurück dorthin. @MainActor @Observable final class LaunchAtLogin { private(set) var state: LoginItemState = .notRegistered init() { refresh() } func refresh() { state = LoginItemState(statusRawValue: SMAppService.mainApp.status.rawValue) } var isEnabled: Bool { state.isEnabled } var needsSystemSettings: Bool { state.needsSystemSettings } /// - Returns: ob es geklappt hat. Bei `false` steht der Grund in `state`. @discardableResult func set(_ enabled: Bool) -> Bool { do { if enabled { try SMAppService.mainApp.register() } else { try SMAppService.mainApp.unregister() } refresh() log.notice("Anmeldeobjekt \(enabled ? "eingetragen" : "entfernt", privacy: .public), Zustand \(String(describing: self.state), privacy: .public)") return isEnabled == enabled } catch { log.error("Anmeldeobjekt: \(error.localizedDescription, privacy: .public)") refresh() return false } } func openSystemSettings() { SMAppService.openSystemSettingsLoginItems() } }