@@ -9,6 +9,7 @@ import ServiceManagement
99import ServiceUpdateMigration
1010import SwiftUI
1111import UpdateChecker
12+ import UserDefaultsObserver
1213import UserNotifications
1314
1415let bundleIdentifierBase = Bundle . main
@@ -18,7 +19,11 @@ let serviceIdentifier = bundleIdentifierBase + ".ExtensionService"
1819@main
1920class AppDelegate : NSObject , NSApplicationDelegate , NSWindowDelegate {
2021 let scheduledCleaner = ScheduledCleaner ( )
21- private let userDefaultsObserver = UserDefaultsObserver ( )
22+ private let userDefaultsObserver = UserDefaultsObserver (
23+ object: UserDefaults . shared,
24+ forKeyPaths: [ UserDefaultPreferenceKeys ( ) . realtimeSuggestionToggle. key] ,
25+ context: nil
26+ )
2227 private var statusBarItem : NSStatusItem !
2328 private var xpcListener : ( NSXPCListener , ServiceDelegate ) ?
2429 private let updateChecker =
@@ -78,7 +83,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
7883 action: #selector( checkForUpdate) ,
7984 keyEquivalent: " "
8085 )
81-
86+
8287 let openCopilotForXcode = NSMenuItem (
8388 title: " Open Copilot for Xcode " ,
8489 action: #selector( openCopilotForXcode) ,
@@ -110,21 +115,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
110115 statusBarMenu. addItem ( . separator( ) )
111116 statusBarMenu. addItem ( quitItem)
112117
113- userDefaultsObserver. onChange = { key in
114- switch key {
115- case UserDefaultPreferenceKeys ( ) . realtimeSuggestionToggle. key:
116- toggleRealtimeSuggestions. state = UserDefaults . shared
117- . value ( for: \. realtimeSuggestionToggle) ? . on : . off
118- default :
119- break
120- }
118+ userDefaultsObserver. onChange = {
119+ toggleRealtimeSuggestions. state = UserDefaults . shared
120+ . value ( for: \. realtimeSuggestionToggle) ? . on : . off
121121 }
122122 }
123123
124124 @objc func quit( ) {
125125 exit ( 0 )
126126 }
127-
127+
128128 @objc func openCopilotForXcode( ) {
129129 let task = Process ( )
130130 if let appPath = locateHostBundleURL ( url: Bundle . main. bundleURL) ? . absoluteString {
@@ -234,32 +234,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
234234 }
235235}
236236
237- private class UserDefaultsObserver : NSObject {
238- var onChange : ( ( String ? ) -> Void ) ?
239-
240- override func observeValue(
241- forKeyPath keyPath: String ? ,
242- of object: Any ? ,
243- change: [ NSKeyValueChangeKey : Any ] ? ,
244- context: UnsafeMutableRawPointer ?
245- ) {
246- onChange ? ( keyPath)
247- }
248-
249- deinit {
250- removeObserver ( self , forKeyPath: UserDefaultPreferenceKeys ( ) . realtimeSuggestionToggle. key)
251- }
252-
253- override init ( ) {
254- super. init ( )
255- observe ( keyPath: UserDefaultPreferenceKeys ( ) . realtimeSuggestionToggle. key)
256- }
257-
258- private func observe( keyPath: String ) {
259- UserDefaults . shared. addObserver ( self , forKeyPath: keyPath, options: . new, context: nil )
260- }
261- }
262-
263237extension NSRunningApplication {
264238 var isUserOfService : Bool {
265239 [
0 commit comments