Quellcode durchsuchen

Changed Quiet Hours to Night Time and enabled repeat alert options to vary between daytime and nighttime

Mike Bash vor 5 Jahren
Ursprung
Commit
b15d79d893

+ 162 - 16
LoopFollow/Controllers/Alarms.swift

@@ -5,6 +5,12 @@
 //  Created by Jon Fawcett on 6/16/20.
 //  Copyright © 2020 Jon Fawcett. All rights reserved.
 //
+//
+//
+//
+//
+//
+
 
 import Foundation
 import AVFoundation
@@ -90,7 +96,16 @@ extension MainViewController {
                 // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low
                 if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
                     AlarmSound.whichAlarm = "Urgent Low Alert"
-                    if UserDefaultsRepository.alertUrgentLowRepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertUrgentLowNightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertUrgentLowDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentLowSnooze.value)
                     return
                 } else {
@@ -102,7 +117,18 @@ extension MainViewController {
             if UserDefaultsRepository.alertLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value &&
                 Float(currentBG) <= UserDefaultsRepository.alertLowBG.value && !UserDefaultsRepository.alertLowIsSnoozed.value {
                 AlarmSound.whichAlarm = "Low Alert"
-                if UserDefaultsRepository.alertLowRepeat.value { numLoops = -1 }
+  
+                //determine if it is day or night and what should happen
+                if UserDefaultsRepository.nightTime.value {
+                    if UserDefaultsRepository.alertLowNightTime.value {
+                        numLoops = -1
+                    }
+                } else {
+                    if UserDefaultsRepository.alertLowDayTime.value {
+                        numLoops = -1
+                    }
+                }
+                
                 triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertLowSnooze.value)
                 return
             }
@@ -113,7 +139,16 @@ extension MainViewController {
                 // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent high
                 if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
                     AlarmSound.whichAlarm = "Urgent High Alert"
-                    if UserDefaultsRepository.alertUrgentHighRepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertUrgentHighNightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertUrgentHighDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentHighSnooze.value)
                     return
                 } else {
@@ -131,7 +166,16 @@ extension MainViewController {
                 Float(persistentBG) >= UserDefaultsRepository.alertHighBG.value &&
                 !UserDefaultsRepository.alertHighIsSnoozed.value {
                 AlarmSound.whichAlarm = "High Alert"
-                if UserDefaultsRepository.alertHighRepeat.value { numLoops = -1 }
+                //determine if it is day or night and what should happen
+                if UserDefaultsRepository.nightTime.value {
+                    if UserDefaultsRepository.alertHighNightTime.value {
+                        numLoops = -1
+                    }
+                } else {
+                    if UserDefaultsRepository.alertHighDayTime.value {
+                        numLoops = -1
+                    }
+                }
                 triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertHighSnooze.value)
                 return
             }
@@ -149,7 +193,16 @@ extension MainViewController {
                         || (UserDefaultsRepository.alertFastDropReadings.value == 3 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare)
                         || (UserDefaultsRepository.alertFastDropReadings.value == 4 && Float(deltas[0]) <= compare && Float(deltas[1]) <= compare && Float(deltas[2]) <= compare) {
                         AlarmSound.whichAlarm = "Fast Drop Alert"
-                        if UserDefaultsRepository.alertFastDropRepeat.value { numLoops = -1 }
+                        //determine if it is day or night and what should happen
+                        if UserDefaultsRepository.nightTime.value {
+                            if UserDefaultsRepository.alertFastDropNightTime.value {
+                                numLoops = -1
+                            }
+                        } else {
+                            if UserDefaultsRepository.alertFastDropDayTime.value {
+                                numLoops = -1
+                            }
+                        }
                         triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastDropSnooze.value)
                         return
                     }
@@ -167,7 +220,16 @@ extension MainViewController {
                         || (UserDefaultsRepository.alertFastRiseReadings.value == 3 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare)
                         || (UserDefaultsRepository.alertFastRiseReadings.value == 4 && Float(deltas[0]) >= compare && Float(deltas[1]) >= compare && Float(deltas[2]) >= compare) {
                         AlarmSound.whichAlarm = "Fast Rise Alert"
-                        if UserDefaultsRepository.alertFastRiseRepeat.value { numLoops = -1 }
+                        //determine if it is day or night and what should happen
+                        if UserDefaultsRepository.nightTime.value {
+                            if UserDefaultsRepository.alertFastRiseNightTime.value {
+                                numLoops = -1
+                            }
+                        } else {
+                            if UserDefaultsRepository.alertFastRiseDayTime.value {
+                                numLoops = -1
+                            }
+                        }
                         triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastRiseSnooze.value)
                         return
                     }
@@ -183,12 +245,21 @@ extension MainViewController {
         //check for missed reading alert
         if UserDefaultsRepository.alertMissedReadingActive.value && !UserDefaultsRepository.alertMissedReadingIsSnoozed.value && (Double(now - currentBGTime) >= Double(UserDefaultsRepository.alertMissedReading.value * 60)) {
             AlarmSound.whichAlarm = "Missed Reading Alert"
-            if UserDefaultsRepository.alertMissedReadingRepeat.value { numLoops = -1 }
+            //determine if it is day or night and what should happen
+            if UserDefaultsRepository.nightTime.value {
+                if UserDefaultsRepository.alertMissedReadingNightTime.value {
+                    numLoops = -1
+                }
+            } else {
+                if UserDefaultsRepository.alertMissedReadingDayTime.value {
+                    numLoops = -1
+                }
+            }
             triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedReadingSnooze.value)
             return
         }
         
-        
+        //check for not looping alert
         if UserDefaultsRepository.url.value != "" {
             
             if UserDefaultsRepository.alertNotLoopingActive.value
@@ -206,7 +277,16 @@ extension MainViewController {
                     ) ||
                     !UserDefaultsRepository.alertNotLoopingUseLimits.value) {
                     AlarmSound.whichAlarm = "Not Looping Alert"
-                    if UserDefaultsRepository.alertNotLoopingRepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertNotLoopingNightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertNotLoopingDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertNotLoopingSnooze.value)
                     return
                 }
@@ -232,7 +312,16 @@ extension MainViewController {
                     // There is a current carb but no boluses data at all
                     if bolusData.count < 1 {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
-                        if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
+                        //determine if it is day or night and what should happen
+                        if UserDefaultsRepository.nightTime.value {
+                            if UserDefaultsRepository.alertMissedBolusNightTime.value {
+                                numLoops = -1
+                            }
+                        } else {
+                            if UserDefaultsRepository.alertMissedBolusDayTime.value {
+                                numLoops = -1
+                            }
+                        }
                         triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
                         return
                     }
@@ -256,7 +345,16 @@ extension MainViewController {
                     // This will trigger is no boluses were set above
                     if (lastBolus == 0.0) {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
-                        if UserDefaultsRepository.alertMissedBolusRepeat.value { numLoops = -1 }
+                        //determine if it is day or night and what should happen
+                        if UserDefaultsRepository.nightTime.value {
+                            if UserDefaultsRepository.alertMissedBolusNightTime.value {
+                                numLoops = -1
+                            }
+                        } else {
+                            if UserDefaultsRepository.alertMissedBolusDayTime.value {
+                                numLoops = -1
+                            }
+                        }
                         triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
                         return
                     }
@@ -273,7 +371,16 @@ extension MainViewController {
                 let tenDays = 10 * 24 * 60 * 60
                 if Double(tenDays) - Double(delta) <= alertDistance {
                     AlarmSound.whichAlarm = "Sensor Change Alert"
-                    if UserDefaultsRepository.alertSAGERepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertSAGENightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertSAGEDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertSAGESnooze.value, snoozeIncrement: 1)
                     return
                 }
@@ -287,7 +394,16 @@ extension MainViewController {
                 let tenDays = 3 * 24 * 60 * 60
                 if Double(tenDays) - Double(delta) <= alertDistance {
                     AlarmSound.whichAlarm = "Pump Change Alert"
-                    if UserDefaultsRepository.alertCAGERepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertCAGENightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertCAGEDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertCAGESnooze.value, snoozeIncrement: 1)
                     return
                 }
@@ -298,7 +414,16 @@ extension MainViewController {
                 let alertAt = Double(UserDefaultsRepository.alertPumpAt.value)
                 if latestPumpVolume <= alertAt {
                     AlarmSound.whichAlarm = "Low Insulin Alert"
-                    if UserDefaultsRepository.alertPumpRepeat.value { numLoops = -1 }
+                    //determine if it is day or night and what should happen
+                    if UserDefaultsRepository.nightTime.value {
+                        if UserDefaultsRepository.alertPumpNightTime.value {
+                            numLoops = -1
+                        }
+                    } else {
+                        if UserDefaultsRepository.alertPumpDayTime.value {
+                            numLoops = -1
+                        }
+                    }
                     triggerAlarm(sound: UserDefaultsRepository.alertPumpSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertPumpSnoozeHours.value, snoozeIncrement: 1)
                     return
                 }
@@ -339,13 +464,31 @@ extension MainViewController {
         var numLoops = 0
         if UserDefaultsRepository.alertOverrideStart.value && !UserDefaultsRepository.alertOverrideStartIsSnoozed.value && triggerStart {
             AlarmSound.whichAlarm = overrideName + " Override Started"
-                if UserDefaultsRepository.alertOverrideStartRepeat.value { numLoops = -1 }
+            //determine if it is day or night and what should happen
+            if UserDefaultsRepository.nightTime.value {
+                if UserDefaultsRepository.alertOverrideStartNightTime.value {
+                    numLoops = -1
+                }
+            } else {
+                if UserDefaultsRepository.alertOverrideStartDayTime.value {
+                    numLoops = -1
+                }
+            }
                 triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideStartSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
                 lastOverrideStartTime = recentStart
                 lastOverrideAlarm = now
         } else if UserDefaultsRepository.alertOverrideEnd.value && !UserDefaultsRepository.alertOverrideEndIsSnoozed.value && triggerEnd {
                 AlarmSound.whichAlarm = overrideName + " Override Ended"
-                if UserDefaultsRepository.alertOverrideEndRepeat.value { numLoops = -1 }
+            //determine if it is day or night and what should happen
+            if UserDefaultsRepository.nightTime.value {
+                if UserDefaultsRepository.alertOverrideEndNightTime.value {
+                    numLoops = -1
+                }
+            } else {
+                if UserDefaultsRepository.alertOverrideEndDayTime.value {
+                    numLoops = -1
+                }
+            }
                 triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
                 lastOverrideEndTime = recentEnd
                 lastOverrideAlarm = now
@@ -557,6 +700,9 @@ extension MainViewController {
             
             guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
             snoozer.setQuietHours(snoozeTime: snoozeTime!)
+            UserDefaultsRepository.nightTime.value = true
+        } else {
+            UserDefaultsRepository.nightTime.value = false
         }
         
     }

+ 234 - 89
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -5,6 +5,13 @@
 //  Created by Jon Fawcett on 6/3/20.
 //  Copyright © 2020 Jon Fawcett. All rights reserved.
 //
+//
+//
+//
+//
+
+
+
 
 
 import UIKit
@@ -123,6 +130,31 @@ class AlarmViewController: FormViewController {
         "Wrong_Answer"
     ]
     
+    var alertRepeatOptions: [String] = [
+        "Do not repeat",
+        "Always repeat",
+        "Repeat at night",
+        "Repeat during the day"
+    ]
+    
+    func timeBasedSettings (pickerValue: String) -> (dayTime:Bool, nightTime:Bool) {
+        var dayTime = false
+        var nightTime = false
+        
+        if pickerValue.contains("Always") {
+            dayTime = true
+            nightTime = true
+        }else{
+            if pickerValue.contains("night"){
+                nightTime = true
+            }
+            if pickerValue.contains("day"){
+                dayTime = true
+            }
+        }
+        return (dayTime, nightTime)
+    }
+    
     func reloadSnoozeTime(key: String, setNil: Bool, value: Date = Date()) {
         
             if let row = form.rowBy(tag: key) as? DateTimeInlineRow {
@@ -405,7 +437,7 @@ class AlarmViewController: FormViewController {
                 AlarmSound.playTest()
         }
         <<< SwitchRow("alertTemporaryRepeat"){ row in
-        row.title = "Repeat Sound"
+        row.title = "Repeat Alert"
         row.value = UserDefaultsRepository.alertTemporaryBGRepeat.value
         }.onChange { [weak self] row in
                 guard let value = row.value else { return }
@@ -463,17 +495,25 @@ class AlarmViewController: FormViewController {
                 }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertUrgentLowSound.value = value
+                    UserDefaultsRepository.alertUrgentLowSound.value = value //changed
                 AlarmSound.setSoundFile(str: value)
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertUrgentLowRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertUrgentLowRepeat.value
+            <<< PickerInputRow<String>("alertUrgentLowRepeat") { row in
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertUrgentLowRepeat.value
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertUrgentLowRepeat.value = value
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertUrgentLowDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertUrgentLowNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertUrgentLowSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -575,12 +615,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertLowRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertLowRepeat.value
+            <<< PickerInputRow<String>("alertLowRepeat") { row in
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertLowRepeat.value
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertLowRepeat.value = value
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertLowDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertLowNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertLowSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -696,12 +744,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertHighRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertHighRepeat.value
+            <<< PickerInputRow<String>("alertHighRepeat") { row in
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertHighRepeat.value
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertHighRepeat.value = value
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertHighDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertHighNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertHighSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -801,12 +857,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertUrgentHighRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertUrgentHighRepeat.value
+            <<< PickerInputRow<String>("alertUrgentHighRepeat") { row in
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertUrgentHighRepeat.value
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertUrgentHighRepeat.value = value
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertUrgentHighDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertUrgentHighNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertUrgentHighSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -943,12 +1007,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertFastDropRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertFastDropRepeat.value
+            <<< PickerInputRow<String>("alertFastDropRepeat") { row in
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertFastDropRepeat.value
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertFastDropRepeat.value = value
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertFastDropDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertFastDropNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertFastDropSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1085,12 +1157,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertFastRiseRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertFastRiseRepeat.value
+            <<< PickerInputRow<String>("alertFastRiseRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertFastRiseRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertFastRiseRepeat.value = value
+                    UserDefaultsRepository.alertFastRiseRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertFastRiseDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertFastRiseNightTime.value = alertTimes.nightTime // <--
             }
         <<< DateTimeInlineRow("alertFastRiseSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1192,12 +1272,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertMissedReadingRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertMissedReadingRepeat.value
+            <<< PickerInputRow<String>("alertMissedReadingRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertMissedReadingRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertMissedReadingRepeat.value = value
+                    UserDefaultsRepository.alertMissedReadingRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertMissedReadingDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertMissedReadingNightTime.value = alertTimes.nightTime // <--
             }
         <<< DateTimeInlineRow("alertMissedReadingSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1335,12 +1423,20 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertNotLoopingRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertNotLoopingRepeat.value
+            <<< PickerInputRow<String>("alertNotLoopingRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertNotLoopingRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertNotLoopingRepeat.value = value
+                    UserDefaultsRepository.alertNotLoopingRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertNotLoopingDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertNotLoopingNightTime.value = alertTimes.nightTime // <--
             }
         <<< DateTimeInlineRow("alertNotLoopingSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1498,18 +1594,26 @@ class AlarmViewController: FormViewController {
                 AlarmSound.playTest()
             }
             <<< SwitchRow("alertMissedBolusQuiet"){ row in
-            row.title = "Use Quiet Hours"
+            row.title = "Mute at night"
             row.value = UserDefaultsRepository.alertMissedBolusQuiet.value
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertMissedBolusQuiet.value = value
             }
-            <<< SwitchRow("alertMissedBolusRepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertMissedBolusRepeat.value
+            <<< PickerInputRow<String>("alertMissedBolusRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertMissedBolusRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertMissedBolusRepeat.value = value
+                    UserDefaultsRepository.alertMissedBolusRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertMissedBolusDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertMissedBolusNightTime.value = alertTimes.nightTime // <--
             }
         <<< DateTimeInlineRow("alertMissedBolusSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1625,18 +1729,26 @@ class AlarmViewController: FormViewController {
                 AlarmSound.playTest()
             }
             <<< SwitchRow("alertSAGEQuiet"){ row in
-            row.title = "Use Quiet Hours"
+            row.title = "Mute at night"
             row.value = UserDefaultsRepository.alertSAGEQuiet.value
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertSAGEQuiet.value = value
             }
-            <<< SwitchRow("alertSAGERepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertSAGERepeat.value
+            <<< PickerInputRow<String>("alertSAGERepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertSAGERepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertSAGERepeat.value = value
+                    UserDefaultsRepository.alertSAGERepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertSAGEDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertSAGENightTime.value = alertTimes.nightTime // <--
             }
             <<< DateTimeInlineRow("alertSAGESnoozedTime") { row in
                 row.title = "Snoozed Until"
@@ -1738,18 +1850,26 @@ class AlarmViewController: FormViewController {
                 AlarmSound.playTest()
             }
             <<< SwitchRow("alertCAGEQuiet"){ row in
-            row.title = "Use Quiet Hours"
+            row.title = "Mute at night"
             row.value = UserDefaultsRepository.alertCAGEQuiet.value
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.alertCAGEQuiet.value = value
             }
-            <<< SwitchRow("alertCAGERepeat"){ row in
-            row.title = "Repeat Sound"
-            row.value = UserDefaultsRepository.alertCAGERepeat.value
+            <<< PickerInputRow<String>("alertCAGERepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertCAGERepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.alertCAGERepeat.value = value
+                    UserDefaultsRepository.alertCAGERepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertCAGEDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertCAGENightTime.value = alertTimes.nightTime // <--
             }
             <<< DateTimeInlineRow("alertCAGESnoozedTime") { row in
                 row.title = "Snoozed Until"
@@ -1822,20 +1942,29 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-        <<< SwitchRow("alertOverrideStartQuiet"){ row in
-        row.title = "Use Quiet Hours"
-        row.value = UserDefaultsRepository.alertOverrideStartQuiet.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertOverrideStartQuiet.value = value
-        }
-        <<< SwitchRow("alertOverrideStartRepeat"){ row in
-        row.title = "Repeat Sound"
-        row.value = UserDefaultsRepository.alertOverrideStartRepeat.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertOverrideStartRepeat.value = value
-        }
+            <<< SwitchRow("alertOverrideStartQuiet"){ row in
+            row.title = "Mute at night"
+            row.value = UserDefaultsRepository.alertOverrideStartQuiet.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertOverrideStartQuiet.value = value
+            }
+            <<< PickerInputRow<String>("alertOverrideStartRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertOverrideStartRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertOverrideStartRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertOverrideStartDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertOverrideStartNightTime.value = alertTimes.nightTime // <--
+
+            }
         <<< DateTimeInlineRow("alertOverrideStartSnoozedTime") { row in
                 row.title = "Snoozed Until"
                 if (UserDefaultsRepository.alertOverrideStartSnoozedTime.value != nil) {
@@ -1908,20 +2037,28 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-        <<< SwitchRow("alertOverrideEndQuiet"){ row in
-        row.title = "Use Quiet Hours"
-        row.value = UserDefaultsRepository.alertOverrideEndQuiet.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertOverrideEndQuiet.value = value
-        }
-        <<< SwitchRow("alertOverrideEndRepeat"){ row in
-        row.title = "Repeat Sound"
-        row.value = UserDefaultsRepository.alertOverrideEndRepeat.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertOverrideEndRepeat.value = value
-        }
+            <<< SwitchRow("alertOverrideEndQuiet"){ row in
+            row.title = "Mute at night"
+            row.value = UserDefaultsRepository.alertOverrideEndQuiet.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertOverrideEndQuiet.value = value
+            }
+            <<< PickerInputRow<String>("alertOverrideEndRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertOverrideEndRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertOverrideEndRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertOverrideEndDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertOverrideEndNightTime.value = alertTimes.nightTime // <--
+            }
         <<< DateTimeInlineRow("alertOverrideEndSnoozedTime") { row in
                 row.title = "Snoozed Until"
                 if (UserDefaultsRepository.alertOverrideEndSnoozedTime.value != nil) {
@@ -2023,20 +2160,28 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-        <<< SwitchRow("alertPumpQuiet"){ row in
-        row.title = "Use Quiet Hours"
-        row.value = UserDefaultsRepository.alertPumpQuiet.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertPumpQuiet.value = value
-        }
-        <<< SwitchRow("alertPumpRepeat"){ row in
-        row.title = "Repeat Sound"
-        row.value = UserDefaultsRepository.alertPumpRepeat.value
-        }.onChange { [weak self] row in
-                guard let value = row.value else { return }
-                UserDefaultsRepository.alertPumpRepeat.value = value
-        }
+            <<< SwitchRow("alertPumpQuiet"){ row in
+            row.title = "Mute at night"
+            row.value = UserDefaultsRepository.alertPumpQuiet.value
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertPumpQuiet.value = value
+            }
+            <<< PickerInputRow<String>("alertPumpRepeat") { row in // <--
+                row.title = "Repeat Alert"
+                row.options = alertRepeatOptions
+                row.value = UserDefaultsRepository.alertPumpRepeat.value // <--
+                row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                    return "\(String(value.replacingOccurrences(of: "_", with: " ")))"
+                }
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertPumpRepeat.value = value // <--
+                    let alertTimes = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertPumpDayTime.value = alertTimes.dayTime // <--
+                    UserDefaultsRepository.alertPumpNightTime.value = alertTimes.nightTime // <--
+            }
 
             <<< DateTimeInlineRow("alertPumpSnoozedTime") { row in
                 row.title = "Snoozed Until"
@@ -2108,11 +2253,11 @@ class AlarmViewController: FormViewController {
                       UserDefaultsRepository.forcedOutputVolume.value = Float(value)
               }
             
-             +++ Section(header: "Quiet Hour Settings", footer: "Quiet hours can be used to automatically snooze non-critical alerts that you do not wish to be awakened for such as a sensor change pre-alert that may happen during the night.")  { row in
+             +++ Section(header: "Night Time Settings", footer: "Defining night time hours can be used to differ how alerts are managed during the day and at night.  For instance, automatically snooze, at night time, non-critical alerts that you do not wish to be awakened for such as a sensor change pre-alert.")  { row in
                 row.tag = "quietHourSection"
                         }
             <<< TimeInlineRow("quietHourStart") { row in
-                row.title = "Quiet Hours Start Today"
+                row.title = "Night Time Starts Today"
                 row.value = UserDefaultsRepository.quietHourStart.value
                 
         }.onChange { [weak self] row in
@@ -2120,7 +2265,7 @@ class AlarmViewController: FormViewController {
                 UserDefaultsRepository.quietHourStart.value = value
         }
         <<< TimeInlineRow("quietHourEnd") { row in
-                row.title = "Quiet Hours End Tomorrow"
+                row.title = "Night Time Ends Tomorrow"
                 row.value = UserDefaultsRepository.quietHourEnd.value
                 
         }.onChange { [weak self] row in

+ 51 - 16
LoopFollow/repository/UserDefaults.swift

@@ -5,6 +5,12 @@
 //  Created by Jon Fawcett on 6/4/20.
 //  Copyright © 2020 Jon Fawcett. All rights reserved.
 //
+//
+//
+//
+//
+
+
 
 import Foundation
 import UIKit
@@ -106,8 +112,9 @@ class UserDefaultsRepository {
     
     // Alerts
     
-    static let quietHourStart = UserDefaultsValue<Date?>(key: "quietHourStart", default: nil)
-    static let quietHourEnd = UserDefaultsValue<Date?>(key: "quietHourEnd", default: nil)
+    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)
     
@@ -122,7 +129,9 @@ class UserDefaultsRepository {
     static let alertUrgentLowSnooze = UserDefaultsValue<Int>(key: "alertUrgentLowSnooze", default: 5)
     static let alertUrgentLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentLowSnoozedTime", default: nil)
     static let alertUrgentLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentLowIsSnoozed", default: false)
-    static let alertUrgentLowRepeat = UserDefaultsValue<Bool>(key: "alertUrgentLowRepeat", default: true)
+    static let alertUrgentLowRepeat = UserDefaultsValue<String>(key: "alertUrgentLowRepeat", default: "Do not repeat")
+    static let alertUrgentLowDayTime = UserDefaultsValue<Bool>(key: "alertUrgentLowDayTime", default: false)
+    static let alertUrgentLowNightTime = UserDefaultsValue<Bool>(key: "alertUrgentLowNightTime", default: false)
     static let alertUrgentLowSound = UserDefaultsValue<String>(key: "alertUrgentLowSound", default: "Emergency_Alarm_Siren")
     
     static let alertLowActive = UserDefaultsValue<Bool>(key: "alertLowActive", default: false)
@@ -130,7 +139,9 @@ class UserDefaultsRepository {
     static let alertLowSnooze = UserDefaultsValue<Int>(key: "alertLowSnooze", default: 5)
     static let alertLowSnoozedTime = UserDefaultsValue<Date?>(key: "alertLowSnoozedTime", default: nil)
     static let alertLowIsSnoozed = UserDefaultsValue<Bool>(key: "alertLowIsSnoozed", default: false)
-    static let alertLowRepeat = UserDefaultsValue<Bool>(key: "alertLowRepeat", default: true)
+    static let alertLowRepeat = UserDefaultsValue<String>(key: "alertLowRepeat", default: "Do not repeat")
+    static let alertLowDayTime = UserDefaultsValue<Bool>(key: "alertLowDayTime", default: false)
+    static let alertLowNightTime = UserDefaultsValue<Bool>(key: "alertLowNightTime", default: false)
     static let alertLowSound = UserDefaultsValue<String>(key: "alertLowSound", default: "Indeed")
     
     static let alertHighActive = UserDefaultsValue<Bool>(key: "alertHighActive", default: false)
@@ -139,7 +150,9 @@ class UserDefaultsRepository {
     static let alertHighSnooze = UserDefaultsValue<Int>(key: "alertHighSnooze", default: 60)
     static let alertHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertHighSnoozedTime", default: nil)
     static let alertHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertHighIsSnoozed", default: false)
-    static let alertHighRepeat = UserDefaultsValue<Bool>(key: "alertHighRepeat", default: true)
+    static let alertHighRepeat = UserDefaultsValue<String>(key: "alertHighRepeat", default: "Do not repeat")
+    static let alertHighDayTime = UserDefaultsValue<Bool>(key: "alertHighDayTime", default: false)
+    static let alertHighNightTime = UserDefaultsValue<Bool>(key: "alertHighNightTime", default: false)
     static let alertHighSound = UserDefaultsValue<String>(key: "alertHighSound", default: "Time_Has_Come")
     
     static let alertUrgentHighActive = UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false)
@@ -147,7 +160,9 @@ class UserDefaultsRepository {
     static let alertUrgentHighSnooze = UserDefaultsValue<Int>(key: "alertUrgentHighSnooze", default: 30)
     static let alertUrgentHighSnoozedTime = UserDefaultsValue<Date?>(key: "alertUrgentHighSnoozedTime", default: nil)
     static let alertUrgentHighIsSnoozed = UserDefaultsValue<Bool>(key: "alertUrgentHighIsSnoozed", default: false)
-    static let alertUrgentHighRepeat = UserDefaultsValue<Bool>(key: "alertUrgentHighRepeat", default: true)
+    static let alertUrgentHighRepeat = UserDefaultsValue<String>(key: "alertUrgentHighRepeat", default: "Do not repeat")
+    static let alertUrgentHighDayTime = UserDefaultsValue<Bool>(key: "alertUrgentHighDayTime", default: false)
+    static let alertUrgentHighNightTime = UserDefaultsValue<Bool>(key: "alertUrgentHighNightTime", default: false)
     static let alertUrgentHighSound = UserDefaultsValue<String>(key: "alertUrgentHighSound", default: "Pager_Beeps")
 
     
@@ -159,7 +174,9 @@ class UserDefaultsRepository {
     static let alertFastDropBelowBG = UserDefaultsValue<Float>(key: "alertFastDropBelowBG", default: 120.0)
     static let alertFastDropSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastDropSnoozedTime", default: nil)
     static let alertFastDropIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastDropIsSnoozed", default: false)
-    static let alertFastDropRepeat = UserDefaultsValue<Bool>(key: "alertFastDropRepeat", default: true)
+    static let alertFastDropRepeat = UserDefaultsValue<String>(key: "alertFastDropRepeat", default: "Do not repeat")
+    static let alertFastDropDayTime = UserDefaultsValue<Bool>(key: "alertFastDropDayTime", default: false)
+    static let alertFastDropNightTime = UserDefaultsValue<Bool>(key: "alertFastDropNightTime", default: false)
     static let alertFastDropSound = UserDefaultsValue<String>(key: "alertFastDropSound", default: "Big_Clock_Ticking")
     
     static let alertFastRiseActive = UserDefaultsValue<Bool>(key: "alertFastRiseDeltaActive", default: false)
@@ -170,7 +187,9 @@ class UserDefaultsRepository {
     static let alertFastRiseAboveBG = UserDefaultsValue<Float>(key: "alertFastRiseAboveBG", default: 200.0)
     static let alertFastRiseSnoozedTime = UserDefaultsValue<Date?>(key: "alertFastRiseSnoozedTime", default: nil)
     static let alertFastRiseIsSnoozed = UserDefaultsValue<Bool>(key: "alertFastRiseIsSnoozed", default: false)
-    static let alertFastRiseRepeat = UserDefaultsValue<Bool>(key: "alertFastRiseRepeat", default: true)
+    static let alertFastRiseRepeat = UserDefaultsValue<String>(key: "alertFastRiseRepeat", default: "Do not repeat")
+    static let alertFastRiseDayTime = UserDefaultsValue<Bool>(key: "alertFastRiseDayTime", default: false)
+    static let alertFastRiseNightTime = UserDefaultsValue<Bool>(key: "alertFastRiseNightTime", default: false)
     static let alertFastRiseSound = UserDefaultsValue<String>(key: "alertFastRiseSound", default: "Cartoon_Fail_Strings_Trumpet")
     
     
@@ -179,7 +198,9 @@ class UserDefaultsRepository {
     static let alertMissedReadingSnooze = UserDefaultsValue<Int>(key: "alertMissedReadingSnooze", default: 30)
     static let alertMissedReadingSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedReadingSnoozedTime", default: nil)
     static let alertMissedReadingIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedReadingIsSnoozed", default: false)
-    static let alertMissedReadingRepeat = UserDefaultsValue<Bool>(key: "alertMissedReadingRepeat", default: true)
+    static let alertMissedReadingRepeat = UserDefaultsValue<String>(key: "alertMissedReadingRepeat", default: "Do not repeat")
+    static let alertMissedReadingDayTime = UserDefaultsValue<Bool>(key: "alertMissedReadingDayTime", default: false)
+    static let alertMissedReadingNightTime = UserDefaultsValue<Bool>(key: "alertMissedReadingNightTime", default: false)
     static let alertMissedReadingSound = UserDefaultsValue<String>(key: "alertMissedReadingSound", default: "Cartoon_Tip_Toe_Sneaky_Walk")
     
     
@@ -191,7 +212,9 @@ class UserDefaultsRepository {
     static let alertNotLoopingUpperLimit = UserDefaultsValue<Float>(key: "alertNotLoopingAboveBG", default: 160.0)
     static let alertNotLoopingSnoozedTime = UserDefaultsValue<Date?>(key: "alertNotLoopingSnoozedTime", default: nil)
     static let alertNotLoopingIsSnoozed = UserDefaultsValue<Bool>(key: "alertNotLoopingIsSnoozed", default: false)
-    static let alertNotLoopingRepeat = UserDefaultsValue<Bool>(key: "alertNotLoopingRepeat", default: true)
+    static let alertNotLoopingRepeat = UserDefaultsValue<String>(key: "alertNotLoopingRepeat", default: "Do not repeat")
+    static let alertNotLoopingDayTime = UserDefaultsValue<Bool>(key: "alertNotLoopingDayTime", default: false)
+    static let alertNotLoopingNightTime = UserDefaultsValue<Bool>(key: "alertNotLoopingNightTime", default: false)
     static let alertNotLoopingSound = UserDefaultsValue<String>(key: "alertNotLoopingSound", default: "Sci-Fi_Engine_Shut_Down")
     static let alertLastLoopTime = UserDefaultsValue<TimeInterval>(key: "alertLastLoopTime", default: 0)
     
@@ -205,13 +228,17 @@ class UserDefaultsRepository {
     static let alertMissedBolusSnoozedTime = UserDefaultsValue<Date?>(key: "alertMissedBolusSnoozedTime", default: nil)
     static let alertMissedBolusIsSnoozed = UserDefaultsValue<Bool>(key: "alertMissedBolusIsSnoozed", default: false)
     static let alertMissedBolusQuiet = UserDefaultsValue<Bool>(key: "alertMissedBolusQuiet", default: false)
-    static let alertMissedBolusRepeat = UserDefaultsValue<Bool>(key: "alertMissedBolusRepeat", default: false)
+    static let alertMissedBolusRepeat = UserDefaultsValue<String>(key: "alertMissedBolusRepeat", default: "Do not repeat")
+    static let alertMissedBolusDayTime = UserDefaultsValue<Bool>(key: "alertMissedBolusDayTime", default: false)
+    static let alertMissedBolusNightTime = UserDefaultsValue<Bool>(key: "alertMissedBolusNightTime", default: false)
     static let alertMissedBolusSound = UserDefaultsValue<String>(key: "alertMissedBolusSound", default: "Dhol_Shuffleloop")
     
     static let alertSAGEActive = UserDefaultsValue<Bool>(key: "alertSAGEActive", default: false)
     static let alertSAGE = UserDefaultsValue<Int>(key: "alertSAGE", default: 8) //Hours
     static let alertSAGEQuiet = UserDefaultsValue<Bool>(key: "alertSAGEQuiet", default: false)
-    static let alertSAGERepeat = UserDefaultsValue<Bool>(key: "alertSAGERepeat", default: false)
+    static let alertSAGERepeat = UserDefaultsValue<String>(key: "alertSAGERepeat", default: "Do not repeat")
+    static let alertSAGEDayTime = UserDefaultsValue<Bool>(key: "alertSAGEDayTime", default: false)
+    static let alertSAGENightTime = UserDefaultsValue<Bool>(key: "alertSAGENightTime", default: false)
     static let alertSAGESnooze = UserDefaultsValue<Int>(key: "alertSAGESnooze", default: 2) //Hours
     static let alertSAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertSAGESnoozedTime", default: nil)
     static let alertSAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertSAGEIsSnoozed", default: false)
@@ -220,7 +247,9 @@ class UserDefaultsRepository {
     static let alertCAGEActive = UserDefaultsValue<Bool>(key: "alertCAGEActive", default: false)
     static let alertCAGE = UserDefaultsValue<Int>(key: "alertCAGE", default: 4) //Hours
     static let alertCAGEQuiet = UserDefaultsValue<Bool>(key: "alertCAGEQuiet", default: false)
-    static let alertCAGERepeat = UserDefaultsValue<Bool>(key: "alertCAGERepeat", default: false)
+    static let alertCAGERepeat = UserDefaultsValue<String>(key: "alertCAGERepeat", default: "Do not repeat")
+    static let alertCAGEDayTime = UserDefaultsValue<Bool>(key: "alertCAGEDayTime", default: false)
+    static let alertCAGENightTime = UserDefaultsValue<Bool>(key: "alertCAGENightTime", default: false)
     static let alertCAGESnooze = UserDefaultsValue<Int>(key: "alertCAGESnooze", default: 2) //Hours
     static let alertCAGESnoozedTime = UserDefaultsValue<Date?>(key: "alertCAGESnoozedTime", default: nil)
     static let alertCAGEIsSnoozed = UserDefaultsValue<Bool>(key: "alertCAGEIsSnoozed", default: false)
@@ -236,14 +265,18 @@ class UserDefaultsRepository {
     
     static let alertOverrideStart = UserDefaultsValue<Bool>(key: "alertOverrideStart", default: false)
     static let alertOverrideStartQuiet = UserDefaultsValue<Bool>(key: "alertOverrideStartQuiet", default: false)
-    static let alertOverrideStartRepeat = UserDefaultsValue<Bool>(key: "alertOverrideStartRepeat", default: false)
+    static let alertOverrideStartRepeat = UserDefaultsValue<String>(key: "alertOverrideStartRepeat", default: "Do not repeat")
+    static let alertOverrideStartDayTime = UserDefaultsValue<Bool>(key: "alertOverrideStartDayTime", default: false)
+    static let alertOverrideStartNightTime = UserDefaultsValue<Bool>(key: "alertOverrideStartNightTime", default: false)
     static let alertOverrideStartSound = UserDefaultsValue<String>(key: "alertOverrideStartSound", default: "Ending_Reached")
     static let alertOverrideStartSnoozedTime = UserDefaultsValue<Date?>(key: "alertOverrideStartSnoozedTime", default: nil)
     static let alertOverrideStartIsSnoozed = UserDefaultsValue<Bool>(key: "alertOverrideStartIsSnoozed", default: false)
     
     static let alertOverrideEnd = UserDefaultsValue<Bool>(key: "alertOverrideEnd", default: false)
     static let alertOverrideEndQuiet = UserDefaultsValue<Bool>(key: "alertOverrideEndQuiet", default: false)
-    static let alertOverrideEndRepeat = UserDefaultsValue<Bool>(key: "alertOverrideEndRepeat", default: false)
+    static let alertOverrideEndRepeat = UserDefaultsValue<String>(key: "alertOverrideEndRepeat", default: "Do not repeat")
+    static let alertOverrideEndDayTime = UserDefaultsValue<Bool>(key: "alertOverrideEndDayTime", default: false)
+    static let alertOverrideEndNightTime = UserDefaultsValue<Bool>(key: "alertOverrideEndNightTime", default: false)
     static let alertOverrideEndSound = UserDefaultsValue<String>(key: "alertOverrideEndSound", default: "Alert_Tone_Busy")
     static let alertOverrideEndSnoozedTime = UserDefaultsValue<Date?>(key: "alertOverrideEndSnoozedTime", default: nil)
     static let alertOverrideEndIsSnoozed = UserDefaultsValue<Bool>(key: "alertOverrideEndIsSnoozed", default: false)
@@ -251,7 +284,9 @@ class UserDefaultsRepository {
     static let alertPump = UserDefaultsValue<Bool>(key: "alertPump", default: false)
     static let alertPumpAt = UserDefaultsValue<Int>(key: "alertPumpAt", default: 10) //Units
     static let alertPumpQuiet = UserDefaultsValue<Bool>(key: "alertPumpQuiet", default: false)
-    static let alertPumpRepeat = UserDefaultsValue<Bool>(key: "alertPumpRepeat", default: false)
+    static let alertPumpRepeat = UserDefaultsValue<String>(key: "alertPumpRepeat", default: "Do not repeat")
+    static let alertPumpDayTime = UserDefaultsValue<Bool>(key: "alertPumpDayTime", default: false)
+    static let alertPumpNightTime = UserDefaultsValue<Bool>(key: "alertPumpNightTime", default: false)
     static let alertPumpSound = UserDefaultsValue<String>(key: "alertPumpSound", default: "Marimba_Descend")
     static let alertPumpSnoozeHours = UserDefaultsValue<Int>(key: "alertPumpSnoozeHours", default: 5) //Hours
     static let alertPumpIsSnoozed = UserDefaultsValue<Bool>(key: "alertPumpIsSnoozed", default: false)