Просмотр исходного кода

Migrate general alarm settings

Jonas Björkert 1 год назад
Родитель
Сommit
73e2bfb411

+ 2 - 22
LoopFollow/Controllers/AlarmSound.swift

@@ -23,10 +23,6 @@ class AlarmSound {
     static var soundFile = "Indeed"
     static var soundFile = "Indeed"
     static var isTesting: Bool = false
     static var isTesting: Bool = false
 
 
-    // static let volumeChangeDetector = VolumeChangeDetector()
-
-    static let vibrate = UserDefaultsRepository.vibrate
-
     fileprivate static var systemOutputVolumeBeforeOverride: Float?
     fileprivate static var systemOutputVolumeBeforeOverride: Float?
 
 
     fileprivate static var playingTimer: Timer?
     fileprivate static var playingTimer: Timer?
@@ -70,11 +66,7 @@ class AlarmSound {
      * Sets the volume of the alarm back to the volume before it has been muted.
      * Sets the volume of the alarm back to the volume before it has been muted.
      */
      */
     static func unmuteVolume() {
     static func unmuteVolume() {
-        if UserDefaultsRepository.fadeInTimeInterval.value > 0 {
-            audioPlayer?.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
-        } else {
-            audioPlayer?.volume = 1.0
-        }
+        audioPlayer?.volume = 1.0
         muted = false
         muted = false
     }
     }
 
 
@@ -102,10 +94,6 @@ class AlarmSound {
 
 
             audioPlayer?.numberOfLoops = 0
             audioPlayer?.numberOfLoops = 0
 
 
-            // init volume before start playing (mute if fade-in)
-
-            // self.audioPlayer!.volume = (self.muted || (UserDefaultsRepository.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
-
             if !audioPlayer!.prepareToPlay() {
             if !audioPlayer!.prepareToPlay() {
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed preparing to play")
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed preparing to play")
             }
             }
@@ -145,9 +133,6 @@ class AlarmSound {
                 systemOutputVolumeBeforeOverride = AVAudioSession.sharedInstance().outputVolume
                 systemOutputVolumeBeforeOverride = AVAudioSession.sharedInstance().outputVolume
             }
             }
 
 
-            // init volume before start playing (mute if fade-in)
-            // self.audioPlayer!.volume = (self.muted || (UserDefaultsRepository.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
-
             if !audioPlayer!.prepareToPlay() {
             if !audioPlayer!.prepareToPlay() {
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed preparing to play")
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed preparing to play")
             }
             }
@@ -161,11 +146,6 @@ class AlarmSound {
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed to play")
                 LogManager.shared.log(category: .alarm, message: "AlarmSound - audio player failed to play")
             }
             }
 
 
-            // do fade-in
-            // if !self.muted && (UserDefaultsRepository.fadeInTimeInterval.value > 0) {
-            //    self.audioPlayer!.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
-            // }
-
             if Storage.shared.alarmConfiguration.value.overrideSystemOutputVolume {
             if Storage.shared.alarmConfiguration.value.overrideSystemOutputVolume {
                 MPVolumeView.setVolume(Storage.shared.alarmConfiguration.value.forcedOutputVolume)
                 MPVolumeView.setVolume(Storage.shared.alarmConfiguration.value.forcedOutputVolume)
             }
             }
@@ -215,7 +195,7 @@ class AlarmSound {
     }
     }
 
 
     fileprivate static func restoreSystemOutputVolume() {
     fileprivate static func restoreSystemOutputVolume() {
-        guard UserDefaultsRepository.overrideSystemOutputVolume.value else {
+        guard Storage.shared.alarmConfiguration.value.overrideSystemOutputVolume else {
             return
             return
         }
         }
 
 

+ 15 - 4
LoopFollow/Controllers/Nightscout/SAge.swift

@@ -46,10 +46,21 @@ extension MainViewController {
                                    .withColonSeparatorInTime]
                                    .withColonSeparatorInTime]
         UserDefaultsRepository.alertSageInsertTime.value = formatter.date(from: lastSageString)?.timeIntervalSince1970 as! TimeInterval
         UserDefaultsRepository.alertSageInsertTime.value = formatter.date(from: lastSageString)?.timeIntervalSince1970 as! TimeInterval
 
 
-        if UserDefaultsRepository.alertAutoSnoozeCGMStart.value, dateTimeUtils.getNowTimeIntervalUTC() - UserDefaultsRepository.alertSageInsertTime.value < 7200 {
-            let snoozeTime = Date(timeIntervalSince1970: UserDefaultsRepository.alertSageInsertTime.value + 7200)
-            UserDefaultsRepository.alertSnoozeAllTime.value = snoozeTime
-            UserDefaultsRepository.alertSnoozeAllIsSnoozed.value = true
+        // -- Auto-snooze CGM start ────────────────────────────────────────────────
+        let now = Date()
+
+        // 1.  Do we *want* the automatic global snooze?
+        if Storage.shared.alarmConfiguration.value.autoSnoozeCGMStart {
+            // 2.  When did the sensor start?
+            let insertTime = UserDefaultsRepository.alertSageInsertTime.value
+
+            // 3.  If the start is less than 2 h ago, snooze *all* alarms for the
+            //     remainder of that 2-hour window.
+            if now.timeIntervalSince1970 - insertTime < 7200 {
+                var cfg = Storage.shared.alarmConfiguration.value
+                cfg.snoozeUntil = Date(timeIntervalSince1970: insertTime + 7200)
+                Storage.shared.alarmConfiguration.value = cfg
+            }
         }
         }
 
 
         if let sageTime = formatter.date(from: (lastSageString as! String))?.timeIntervalSince1970 {
         if let sageTime = formatter.date(from: (lastSageString as! String))?.timeIntervalSince1970 {

+ 100 - 0
LoopFollow/Storage/Storage+Migrate.swift

@@ -182,5 +182,105 @@ extension Storage {
         move(UserDefaultsValue<String>(key: "calendarIdentifier", default: ""), into: calendarIdentifier)
         move(UserDefaultsValue<String>(key: "calendarIdentifier", default: ""), into: calendarIdentifier)
         move(UserDefaultsValue<String>(key: "watchLine1", default: "%BG% %DIRECTION% %DELTA% %MINAGO%"), into: watchLine1)
         move(UserDefaultsValue<String>(key: "watchLine1", default: "%BG% %DIRECTION% %DELTA% %MINAGO%"), into: watchLine1)
         move(UserDefaultsValue<String>(key: "watchLine2", default: "C:%COB% I:%IOB% B:%BASAL%"), into: watchLine2)
         move(UserDefaultsValue<String>(key: "watchLine2", default: "C:%COB% I:%IOB% B:%BASAL%"), into: watchLine2)
+
+        // Migration of generic alarm settings
+        // ── AlarmConfiguration migration ─────────────────────────────────────────
+        do {
+            // Work on a mutable copy, then write the whole thing back once.
+            var cfg = Storage.shared.alarmConfiguration.value
+            let cal = Calendar.current
+
+            /// Copy *one* legacy value → struct field → delete old key
+            func move<T: AnyConvertible & Equatable>(
+                _ legacy: @autoclosure () -> UserDefaultsValue<T>,
+                write: (inout AlarmConfiguration, T) -> Void
+            ) {
+                let item = legacy()
+                guard item.exists else { return }
+                write(&cfg, item.value)
+                item.setNil(key: item.key)
+            }
+
+            // 1.  Override-volume toggle
+            move(UserDefaultsValue<Bool>(key: "overrideSystemOutputVolume",
+                                         default: cfg.overrideSystemOutputVolume))
+            {
+                $0.overrideSystemOutputVolume = $1
+            }
+
+            // 2.  Forced output volume itself.
+            //     Prefer newer key (“forcedOutputVolume”); otherwise fall back.
+            if UserDefaultsValue<Float>(key: "forcedOutputVolume",
+                                        default: cfg.forcedOutputVolume).exists
+            {
+                move(UserDefaultsValue<Float>(key: "forcedOutputVolume",
+                                              default: cfg.forcedOutputVolume))
+                {
+                    $0.forcedOutputVolume = $1
+                }
+            } else {
+                move(UserDefaultsValue<Float>(key: "systemOutputVolume",
+                                              default: cfg.forcedOutputVolume))
+                {
+                    $0.forcedOutputVolume = $1
+                }
+            }
+
+            // 3.  Play audio during phone calls
+            move(UserDefaultsValue<Bool>(key: "alertAudioDuringPhone",
+                                         default: cfg.audioDuringCalls))
+            {
+                $0.audioDuringCalls = $1
+            }
+
+            // 4.  Auto-snooze CGM-start alarm
+            move(UserDefaultsValue<Bool>(key: "alertAutoSnoozeCGMStart",
+                                         default: cfg.autoSnoozeCGMStart))
+            {
+                $0.autoSnoozeCGMStart = $1
+            }
+
+            // 5.  Global “Snooze all”  →  snoozeUntil
+            move(UserDefaultsValue<Date?>(key: "alertSnoozeAllTime",
+                                          default: cfg.snoozeUntil))
+            {
+                $0.snoozeUntil = $1
+            }
+
+            // 6.  Global “Mute all”  →  muteUntil
+            move(UserDefaultsValue<Date?>(key: "alertMuteAllTime",
+                                          default: cfg.muteUntil))
+            {
+                $0.muteUntil = $1
+            }
+
+            // 7 & 8.  Legacy quiet-hours → day/night start
+            //         (only if both dates exist and are on the same “reference” day)
+            let qStart = UserDefaultsValue<Date?>(key: "quietHourStart", default: nil)
+            let qEnd = UserDefaultsValue<Date?>(key: "quietHourEnd", default: nil)
+            if let s = qStart.value, let e = qEnd.value {
+                let compsStart = cal.dateComponents([.hour, .minute], from: s)
+                let compsEnd = cal.dateComponents([.hour, .minute], from: e)
+
+                if let sh = compsStart.hour, let sm = compsStart.minute,
+                   let eh = compsEnd.hour, let em = compsEnd.minute
+                {
+                    cfg.nightStart = TimeOfDay(hour: sh, minute: sm)
+                    cfg.dayStart = TimeOfDay(hour: eh, minute: em)
+                    qStart.setNil(key: qStart.key)
+                    qEnd.setNil(key: qEnd.key)
+                }
+            }
+
+            // 9.  Legacy “ignore zero BG” flag  →  ignoreZeroBG
+            move(UserDefaultsValue<Bool>(key: "alertIgnoreZero",
+                                         default: cfg.ignoreZeroBG))
+            {
+                $0.ignoreZeroBG = $1
+            }
+
+            // finally persist the whole struct
+            Storage.shared.alarmConfiguration.value = cfg
+        }
     }
     }
 }
 }

+ 0 - 26
LoopFollow/Storage/UserDefaults.swift

@@ -81,7 +81,6 @@ class UserDefaultsRepository {
 
 
     // Graph Settings
     // Graph Settings
     static let chartScaleX = UserDefaultsValue<Float>(key: "chartScaleX", default: 18.0)
     static let chartScaleX = UserDefaultsValue<Float>(key: "chartScaleX", default: 18.0)
-    static let hoursToLoad = UserDefaultsValue<Int>(key: "hoursToLoad", default: 24)
 
 
     // Deprecated, used to detect if backgroundRefresh was set to off. TODO: Remove in the beginning of 2026
     // Deprecated, used to detect if backgroundRefresh was set to off. TODO: Remove in the beginning of 2026
     static let backgroundRefresh = UserDefaultsValue<Bool>(key: "backgroundRefresh", default: true)
     static let backgroundRefresh = UserDefaultsValue<Bool>(key: "backgroundRefresh", default: true)
@@ -95,34 +94,9 @@ class UserDefaultsRepository {
     static let graphCarbs = UserDefaultsValue<Bool>(key: "graphCarbs", default: true)
     static let graphCarbs = UserDefaultsValue<Bool>(key: "graphCarbs", default: true)
     static let bgUpdateDelay = UserDefaultsValue<Int>(key: "bgUpdateDelay", default: 10)
     static let bgUpdateDelay = UserDefaultsValue<Int>(key: "bgUpdateDelay", default: 10)
 
 
-    // Alarm Settings
-    static let systemOutputVolume = UserDefaultsValue<Float>(key: "systemOutputVolume", default: 0.5)
-    static let fadeInTimeInterval = UserDefaultsValue<TimeInterval>(key: "fadeInTimeInterval", default: 0)
-    static let vibrate = UserDefaultsValue<Bool>(key: "vibrate", default: true)
-    static let overrideSystemOutputVolume = UserDefaultsValue<Bool>(key: "overrideSystemOutputVolume", default: true)
-    static let forcedOutputVolume = UserDefaultsValue<Float>(key: "forcedOutputVolume", default: 0.5)
-
-    // Alerts
-
-    let components = DateComponents(hour: 20, minute: 0)
-    static let quietHourStart = UserDefaultsValue<Date?>(key: "quietHourStart", default: nil) // eventually need to adjust this to night time instead of quiet hour to clean up
-    static let quietHourEnd = UserDefaultsValue<Date?>(key: "quietHourEnd", default: nil) // eventually need to adjust this to night time instead of quiet hour to clean up
-    static let nightTime = UserDefaultsValue<Bool>(key: "nightTime", default: false)
-
-    static let snoozedBGReadingTime = UserDefaultsValue<TimeInterval?>(key: "snoozedBGReadingTime", default: 0)
-
-    static let alertIgnoreZero = UserDefaultsValue<Bool>(key: "alertIgnoreZero", default: true)
-    static let alertAudioDuringPhone = UserDefaultsValue<Bool>(key: "alertAudioDuringPhone", default: true)
-    static let alertAutoSnoozeCGMStart = UserDefaultsValue<Bool>(key: "alertAutoSnoozeCGMStart", default: false)
-
     static let alertCageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertCageInsertTime", default: 0)
     static let alertCageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertCageInsertTime", default: 0)
     static let alertSageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertSageInsertTime", default: 0)
     static let alertSageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertSageInsertTime", default: 0)
 
 
-    static let alertSnoozeAllTime = UserDefaultsValue<Date?>(key: "alertSnoozeAllTime", default: nil)
-    static let alertSnoozeAllIsSnoozed = UserDefaultsValue<Bool>(key: "alertSnoozeAllIsSnoozed", default: false)
-    static let alertMuteAllTime = UserDefaultsValue<Date?>(key: "alertMuteAllTime", default: nil)
-    static let alertMuteAllIsMuted = UserDefaultsValue<Bool>(key: "alertMuteAllIsMuted", default: false)
-
     static let alertUrgentLowActive = UserDefaultsValue<Bool>(key: "alertUrgentLowActive", default: false)
     static let alertUrgentLowActive = UserDefaultsValue<Bool>(key: "alertUrgentLowActive", default: false)
     static let alertUrgentLowBG = UserDefaultsValue<Float>(key: "alertUrgentLowBG", default: 55.0)
     static let alertUrgentLowBG = UserDefaultsValue<Float>(key: "alertUrgentLowBG", default: 55.0)
     static let alertUrgentLowPredictiveMinutes = UserDefaultsValue<Int>(key: "alertUrgentLowPredictiveMinutes", default: 0)
     static let alertUrgentLowPredictiveMinutes = UserDefaultsValue<Int>(key: "alertUrgentLowPredictiveMinutes", default: 0)