FreeAPSApp.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import ActivityKit
  2. import CoreData
  3. import Foundation
  4. import SwiftUI
  5. import Swinject
  6. @main struct FreeAPSApp: App {
  7. @Environment(\.scenePhase) var scenePhase
  8. @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
  9. let coreDataStack = CoreDataStack.shared
  10. // Dependencies Assembler
  11. // contain all dependencies Assemblies
  12. // TODO: Remove static key after update "Use Dependencies" logic
  13. private static var assembler = Assembler([
  14. StorageAssembly(),
  15. ServiceAssembly(),
  16. APSAssembly(),
  17. NetworkAssembly(),
  18. UIAssembly(),
  19. SecurityAssembly()
  20. ], parent: nil, defaultObjectScope: .container)
  21. var resolver: Resolver {
  22. FreeAPSApp.assembler.resolver
  23. }
  24. // Temp static var
  25. // Use to backward compatibility with old Dependencies logic on Logger
  26. // TODO: Remove var after update "Use Dependencies" logic in Logger
  27. static var resolver: Resolver {
  28. FreeAPSApp.assembler.resolver
  29. }
  30. private func loadServices() {
  31. resolver.resolve(AppearanceManager.self)!.setupGlobalAppearance()
  32. _ = resolver.resolve(DeviceDataManager.self)!
  33. _ = resolver.resolve(APSManager.self)!
  34. _ = resolver.resolve(FetchGlucoseManager.self)!
  35. _ = resolver.resolve(FetchTreatmentsManager.self)!
  36. _ = resolver.resolve(FetchAnnouncementsManager.self)!
  37. _ = resolver.resolve(CalendarManager.self)!
  38. _ = resolver.resolve(UserNotificationsManager.self)!
  39. _ = resolver.resolve(WatchManager.self)!
  40. _ = resolver.resolve(HealthKitManager.self)!
  41. _ = resolver.resolve(BluetoothStateManager.self)!
  42. if #available(iOS 16.2, *) {
  43. _ = resolver.resolve(LiveActivityBridge.self)!
  44. }
  45. }
  46. init() {
  47. debug(
  48. .default,
  49. "iAPS Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(Bundle.main.buildDate)] [buildExpires: \(Bundle.main.profileExpiration)]"
  50. )
  51. loadServices()
  52. // Clear the persistentHistory and the NSManagedObjects that are older than 90 days every time the app starts
  53. cleanupOldData()
  54. }
  55. var body: some Scene {
  56. WindowGroup {
  57. Main.RootView(resolver: resolver)
  58. .environment(\.managedObjectContext, CoreDataStack.shared.persistentContainer.viewContext)
  59. .environmentObject(Icons())
  60. .onOpenURL(perform: handleURL)
  61. }
  62. .onChange(of: scenePhase) { newScenePhase in
  63. debug(.default, "APPLICATION PHASE: \(newScenePhase)")
  64. }
  65. }
  66. private func cleanupOldData() {
  67. Task {
  68. await coreDataStack.cleanupPersistentHistoryTokens(before: Date.oneWeekAgo)
  69. try await purgeOldNSManagedObjects()
  70. }
  71. }
  72. private func purgeOldNSManagedObjects() async throws {
  73. try await coreDataStack.batchDeleteOlderThan(GlucoseStored.self, dateKey: "date", days: 90)
  74. try await coreDataStack.batchDeleteOlderThan(PumpEventStored.self, dateKey: "timestamp", days: 90)
  75. try await coreDataStack.batchDeleteOlderThan(OrefDetermination.self, dateKey: "deliverAt", days: 90)
  76. try await coreDataStack.batchDeleteOlderThan(OpenAPS_Battery.self, dateKey: "date", days: 90)
  77. try await coreDataStack.batchDeleteOlderThan(CarbEntryStored.self, dateKey: "date", days: 90)
  78. try await coreDataStack.batchDeleteOlderThan(Forecast.self, dateKey: "date", days: 90)
  79. // TODO: - Purge Data of other (future) entities as well
  80. }
  81. private func handleURL(_ url: URL) {
  82. let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
  83. switch components?.host {
  84. case "device-select-resp":
  85. resolver.resolve(NotificationCenter.self)!.post(name: .openFromGarminConnect, object: url)
  86. default: break
  87. }
  88. }
  89. }