Przeglądaj źródła

Merge pull request #396 from bjorkert/expire-date-in-profile

Build expire date in Nightscout profile
Deniz Cengiz 1 rok temu
rodzic
commit
8a1ddef564

+ 2 - 2
Trio/Sources/APS/APSManager.swift

@@ -945,11 +945,11 @@ final class BaseAPSManager: APSManager, Injectable {
             }
             }
             let af = pref.adjustmentFactor
             let af = pref.adjustmentFactor
             let insulin_type = pref.curve
             let insulin_type = pref.curve
-            let buildDate = BuildDetails.default.buildDate()
+            let buildDate = BuildDetails.shared.buildDate()
             let version = Bundle.main.releaseVersionNumber
             let version = Bundle.main.releaseVersionNumber
             let build = Bundle.main.buildVersionNumber
             let build = Bundle.main.buildVersionNumber
 
 
-            var branch = BuildDetails.default.branchAndSha
+            var branch = BuildDetails.shared.branchAndSha
 
 
             let copyrightNotice_ = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? ""
             let copyrightNotice_ = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? ""
             let pump_ = pumpManager?.localizedTitle ?? ""
             let pump_ = pumpManager?.localizedTitle ?? ""

+ 10 - 2
Trio/Sources/Application/TrioApp.swift

@@ -80,13 +80,13 @@ extension Notification.Name {
     }
     }
 
 
     init() {
     init() {
-        let submodulesInfo = BuildDetails.default.submodules.map { key, value in
+        let submodulesInfo = BuildDetails.shared.submodules.map { key, value in
             "\(key): \(value.branch) \(value.commitSHA)"
             "\(key): \(value.branch) \(value.commitSHA)"
         }.joined(separator: ", ")
         }.joined(separator: ", ")
 
 
         debug(
         debug(
             .default,
             .default,
-            "Trio Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(String(describing: BuildDetails.default.buildDate()))] [buildExpires: \(String(describing: BuildDetails.default.calculateExpirationDate()))] [submodules: \(submodulesInfo)]"
+            "Trio Started: v\(Bundle.main.releaseVersionNumber ?? "")(\(Bundle.main.buildVersionNumber ?? "")) [buildDate: \(String(describing: BuildDetails.shared.buildDate()))] [buildExpires: \(String(describing: BuildDetails.shared.calculateExpirationDate()))] [submodules: \(submodulesInfo)]"
         )
         )
 
 
         // Fix bug in iOS 18 related to the translucent tab bar
         // Fix bug in iOS 18 related to the translucent tab bar
@@ -127,6 +127,14 @@ extension Notification.Name {
                 }
                 }
             }
             }
         }
         }
+
+        Task {
+            do {
+                try await BuildDetails.shared.handleExpireDateChange()
+            } catch {
+                debug(.default, "Failed to handle expire date change: \(error)")
+            }
+        }
     }
     }
 
 
     /// Attempts to initialize the CoreDataStack again after a previous failure.
     /// Attempts to initialize the CoreDataStack again after a previous failure.

+ 30 - 2
Trio/Sources/Helpers/BuildDetails.swift

@@ -1,9 +1,12 @@
 import Foundation
 import Foundation
+import Swinject
 
 
-class BuildDetails {
-    static var `default` = BuildDetails()
+class BuildDetails: Injectable {
+    static var shared = BuildDetails()
+    @Injected() internal var nightscoutManager: NightscoutManager!
 
 
     let dict: [String: Any]
     let dict: [String: Any]
+    let previousExpireDateKey = "previousExpireDate"
 
 
     init() {
     init() {
         guard let url = Bundle.main.url(forResource: "BuildDetails", withExtension: "plist"),
         guard let url = Bundle.main.url(forResource: "BuildDetails", withExtension: "plist"),
@@ -89,4 +92,29 @@ class BuildDetails {
             return String(localized: "App Expires")
             return String(localized: "App Expires")
         }
         }
     }
     }
+
+    // Upload new profile if expire date has changed
+    func handleExpireDateChange() async throws
+    {
+        if nightscoutManager == nil {
+            await injectServices(TrioApp.resolver)
+        }
+
+        let previousExpireDate = UserDefaults.standard.object(forKey: previousExpireDateKey) as? Date
+        let expireDate = calculateExpirationDate()
+
+        if previousExpireDate != expireDate {
+            debug(.nightscout, "New build expire date detected, uploading profile")
+            try await nightscoutManager.uploadProfiles()
+        }
+    }
+
+    // Store the uploaded expire date
+    func recordUploadedExpireDate(expireDate: Date?) {
+        if let expireDate = expireDate {
+            UserDefaults.standard.set(expireDate, forKey: previousExpireDateKey)
+        } else {
+            UserDefaults.standard.removeObject(forKey: previousExpireDateKey)
+        }
+    }
 }
 }

+ 1 - 0
Trio/Sources/Models/NightscoutStatus.swift

@@ -58,6 +58,7 @@ struct NightscoutProfileStore: JSON {
     let isAPNSProduction: Bool
     let isAPNSProduction: Bool
     let overridePresets: [NightscoutPresetOverride]?
     let overridePresets: [NightscoutPresetOverride]?
     let teamID: String
     let teamID: String
+    let expirationDate: Date?
 }
 }
 
 
 struct NightscoutPresetOverride: JSON {
 struct NightscoutPresetOverride: JSON {

+ 1 - 1
Trio/Sources/Modules/Settings/SettingsStateModel.swift

@@ -33,7 +33,7 @@ extension Settings {
 
 
             versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
             versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
 
 
-            branch = BuildDetails.default.branchAndSha
+            branch = BuildDetails.shared.branchAndSha
 
 
             copyrightNotice = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? ""
             copyrightNotice = Bundle.main.infoDictionary?["NSHumanReadableCopyright"] as? String ?? ""
 
 

+ 1 - 1
Trio/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -72,7 +72,7 @@ extension Settings {
         var body: some View {
         var body: some View {
             List {
             List {
                 if searchText.isEmpty {
                 if searchText.isEmpty {
-                    let buildDetails = BuildDetails.default
+                    let buildDetails = BuildDetails.shared
 
 
                     Section(
                     Section(
                         header: Text("BRANCH: \(buildDetails.branchAndSha)").textCase(nil),
                         header: Text("BRANCH: \(buildDetails.branchAndSha)").textCase(nil),

+ 6 - 1
Trio/Sources/Services/Network/Nightscout/NightscoutManager.swift

@@ -786,6 +786,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
                 let isAPNSProduction = UserDefaults.standard.bool(forKey: "isAPNSProduction")
                 let isAPNSProduction = UserDefaults.standard.bool(forKey: "isAPNSProduction")
                 let presetOverrides = try await overridesStorage.getPresetOverridesForNightscout()
                 let presetOverrides = try await overridesStorage.getPresetOverridesForNightscout()
                 let teamID = Bundle.main.object(forInfoDictionaryKey: "TeamID") as? String ?? ""
                 let teamID = Bundle.main.object(forInfoDictionaryKey: "TeamID") as? String ?? ""
+                let expireDate = BuildDetails.shared.calculateExpirationDate()
 
 
                 let profileStore = NightscoutProfileStore(
                 let profileStore = NightscoutProfileStore(
                     defaultProfile: defaultProfile,
                     defaultProfile: defaultProfile,
@@ -798,7 +799,8 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
                     deviceToken: deviceToken,
                     deviceToken: deviceToken,
                     isAPNSProduction: isAPNSProduction,
                     isAPNSProduction: isAPNSProduction,
                     overridePresets: presetOverrides,
                     overridePresets: presetOverrides,
-                    teamID: teamID
+                    teamID: teamID,
+                    expirationDate: expireDate
                 )
                 )
 
 
                 guard let nightscout = nightscoutAPI, isNetworkReachable else {
                 guard let nightscout = nightscoutAPI, isNetworkReachable else {
@@ -810,6 +812,9 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
                 }
                 }
 
 
                 try await nightscout.uploadProfile(profileStore)
                 try await nightscout.uploadProfile(profileStore)
+
+                BuildDetails.shared.recordUploadedExpireDate(expireDate: expireDate)
+
                 debug(.nightscout, "Profile uploaded")
                 debug(.nightscout, "Profile uploaded")
             } catch {
             } catch {
                 debug(.nightscout, "NightscoutManager uploadProfile: \(error.localizedDescription)")
                 debug(.nightscout, "NightscoutManager uploadProfile: \(error.localizedDescription)")

+ 1 - 1
Trio/Sources/Services/RemoteControl/TrioRemoteControl+APNS.swift

@@ -28,6 +28,6 @@ extension TrioRemoteControl {
     }
     }
 
 
     private func isRunningInAPNSProductionEnvironment() -> Bool {
     private func isRunningInAPNSProductionEnvironment() -> Bool {
-        BuildDetails.default.isTestFlightBuild()
+        BuildDetails.shared.isTestFlightBuild()
     }
     }
 }
 }