Explorar el Código

Adjust Remote Control logic for new TT data structure

Deniz Cengiz hace 1 año
padre
commit
3d8abc8919

+ 8 - 8
FreeAPS.xcodeproj/project.pbxproj

@@ -1670,19 +1670,19 @@
 		3811DE9125C9D88200A708ED /* Services */ = {
 			isa = PBXGroup;
 			children = (
-				6B1A8D2C2B156EC100E76752 /* LiveActivity */,
+				3811DE9225C9D88200A708ED /* Appearance */,
 				CEB434E128B8F9BC00B70274 /* Bluetooth */,
-				F90692A8274B7A980037068D /* HealthKit */,
-				38E8754D275556E100975559 /* WatchManager */,
-				38E87406274F9AA500975559 /* UserNotifications */,
 				3862CC2C2743F9DC00BF832C /* Calendar */,
-				38AEE75025F021F10013F05B /* SettingsManager */,
-				38B4F3C425E5016800E76A18 /* Notifications */,
-				3811DE9225C9D88200A708ED /* Appearance */,
+				F90692A8274B7A980037068D /* HealthKit */,
+				6B1A8D2C2B156EC100E76752 /* LiveActivity */,
 				3811DE9425C9D88200A708ED /* Network */,
+				38B4F3C425E5016800E76A18 /* Notifications */,
+				DD9ECB662CA99EFE00AA7C45 /* RemoteControl */,
+				38AEE75025F021F10013F05B /* SettingsManager */,
 				3811DE9825C9D88300A708ED /* Storage */,
 				3811DEA525C9D88300A708ED /* UnlockManager */,
-				DD9ECB662CA99EFE00AA7C45 /* RemoteControl */,
+				38E87406274F9AA500975559 /* UserNotifications */,
+				38E8754D275556E100975559 /* WatchManager */,
 			);
 			path = Services;
 			sourceTree = "<group>";

+ 2 - 2
FreeAPS/Sources/Modules/Adjustments/AdjustmentsStateModel+Extensions/AdjustmentsStateModel+TempTargets.swift

@@ -289,7 +289,7 @@ extension Adjustments.StateModel {
                     }
                 }
 
-                // Disable all override except the one with overrideID
+                // Disable all temporary targets except the one with given id
                 for tempTargetToCancel in results {
                     if tempTargetToCancel.objectID != id {
                         tempTargetToCancel.enabled = false
@@ -305,7 +305,7 @@ extension Adjustments.StateModel {
                 }
             } catch {
                 debugPrint(
-                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to disable active Overrides with error: \(error.localizedDescription)"
+                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to disable active TempTargets with error: \(error.localizedDescription)"
                 )
             }
         }

+ 60 - 11
FreeAPS/Sources/Services/RemoteControl/TrioRemoteControl+TempTarget.swift

@@ -1,7 +1,8 @@
 import Foundation
+import CoreData
 
 extension TrioRemoteControl {
-    func handleTempTargetCommand(_ pushMessage: PushMessage) async {
+    @MainActor func handleTempTargetCommand(_ pushMessage: PushMessage) async {
         guard let targetValue = pushMessage.target,
               let durationValue = pushMessage.duration
         else {
@@ -25,29 +26,77 @@ extension TrioRemoteControl {
             halfBasalTarget: settings.preferences.halfBasalExerciseTarget
         )
 
-        // TODO: this should probably be try-catch'd ?
         await tempTargetsStorage.storeTempTarget(tempTarget: tempTarget)
-
+        tempTargetsStorage.saveTempTargetsToStorage([tempTarget])
+        
         debug(
             .remoteControl,
             "Remote command processed successfully. \(pushMessage.humanReadableDescription())"
         )
     }
 
-    func cancelTempTarget(_ pushMessage: PushMessage) async {
+    @MainActor func cancelTempTarget(_ pushMessage: PushMessage) async {
         debug(.remoteControl, "Cancelling temp target.")
 
-        guard tempTargetsStorage.current() != nil else {
-            await logError("Command rejected: no active temp target to cancel.")
-            return
-        }
-
-        let cancelEntry = TempTarget.cancel(at: Date())
-        await tempTargetsStorage.storeTempTarget(tempTarget: cancelEntry)
+        await disableAllActiveTempTargets()
 
         debug(
             .remoteControl,
             "Remote command processed successfully. \(pushMessage.humanReadableDescription())"
         )
     }
+    
+    @MainActor func disableAllActiveTempTargets() async {
+        let ids = await tempTargetsStorage.loadLatestTempTargetConfigurations(fetchLimit: 0)
+
+        let didPostNotification = await viewContext.perform { () -> Bool in
+            do {
+                let results = try ids.compactMap { id in
+                    try self.viewContext.existingObject(with: id) as? TempTargetStored
+                }
+
+                guard !results.isEmpty else {
+                    Task {
+                        await self.logError("Command rejected: no active temp target to cancel.")
+                    }
+                    return false
+                }
+
+                for canceledTempTarget in results where canceledTempTarget.enabled {
+                    let newTempTargetRunStored = TempTargetRunStored(context: self.viewContext)
+                    newTempTargetRunStored.id = UUID()
+                    newTempTargetRunStored.name = canceledTempTarget.name
+                    newTempTargetRunStored.startDate = canceledTempTarget.date ?? .distantPast
+                    newTempTargetRunStored.endDate = Date()
+                    newTempTargetRunStored
+                        .target = canceledTempTarget.target ?? 0
+                    newTempTargetRunStored.tempTarget = canceledTempTarget
+                    newTempTargetRunStored.isUploadedToNS = false
+                    
+                    canceledTempTarget.enabled = false
+                    canceledTempTarget.isUploadedToNS = false
+                }
+
+                if self.viewContext.hasChanges {
+                    try self.viewContext.save()
+                    Foundation.NotificationCenter.default.post(name: .willUpdateTempTargetConfiguration, object: nil)
+                    
+                    // Update the storage so oref can pick up cancellation
+                    self.tempTargetsStorage.saveTempTargetsToStorage([TempTarget.cancel(at: Date().addingTimeInterval(-1))])
+                    return true
+                } else {
+                    return false
+                }
+            } catch {
+                debugPrint(
+                    "\(DebuggingIdentifiers.failed) \(#file) \(#function) Failed to disable active TempTargets with error: \(error.localizedDescription)"
+                )
+                return false
+            }
+        }
+        
+        if didPostNotification {
+            await awaitNotification(.didUpdateTempTargetConfiguration)
+        }
+    }
 }