import CoreData import Foundation import SwiftUI import Swinject @main struct FreeAPSApp: App { @Environment(\.scenePhase) var scenePhase @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @StateObject var dataController = CoreDataStack.shared // Dependencies Assembler // contain all dependencies Assemblies // TODO: Remove static key after update "Use Dependencies" logic private static var assembler = Assembler([ StorageAssembly(), ServiceAssembly(), APSAssembly(), NetworkAssembly(), UIAssembly(), SecurityAssembly() ], parent: nil, defaultObjectScope: .container) var resolver: Resolver { FreeAPSApp.assembler.resolver } // Temp static var // Use to backward compatibility with old Dependencies logic on Logger // TODO: Remove var after update "Use Dependencies" logic in Logger static var resolver: Resolver { FreeAPSApp.assembler.resolver } private func loadServices() { resolver.resolve(AppearanceManager.self)!.setupGlobalAppearance() _ = resolver.resolve(DeviceDataManager.self)! _ = resolver.resolve(APSManager.self)! _ = resolver.resolve(FetchGlucoseManager.self)! _ = resolver.resolve(FetchTreatmentsManager.self)! _ = resolver.resolve(FetchAnnouncementsManager.self)! _ = resolver.resolve(CalendarManager.self)! _ = resolver.resolve(UserNotificationsManager.self)! _ = resolver.resolve(WatchManager.self)! _ = resolver.resolve(HealthKitManager.self)! _ = resolver.resolve(BluetoothStateManager.self)! } init() { debug( .default, "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)] [buildExpires: \(Bundle.main.profileExpiration)]" ) loadServices() } var body: some Scene { WindowGroup { Main.RootView(resolver: resolver) .environment(\.managedObjectContext, dataController.persistentContainer.viewContext) .environmentObject(Icons()) .onOpenURL(perform: handleURL) } .onChange(of: scenePhase) { newScenePhase in debug(.default, "APPLICATION PHASE: \(newScenePhase)") } } private func handleURL(_ url: URL) { let components = URLComponents(url: url, resolvingAgainstBaseURL: false) switch components?.host { case "device-select-resp": resolver.resolve(NotificationCenter.self)!.post(name: .openFromGarminConnect, object: url) default: break } } }