瀏覽代碼

Updates include night time settings, variable settings by day/night, and mute all (in addition to the existing snooze all)

Mike Bash 5 年之前
父節點
當前提交
be9ec056b4
共有 3 個文件被更改,包括 549 次插入227 次删除
  1. 103 114
      LoopFollow/Controllers/Alarms.swift
  2. 383 96
      LoopFollow/ViewControllers/AlarmViewController.swift
  3. 63 17
      LoopFollow/repository/UserDefaults.swift

+ 103 - 114
LoopFollow/Controllers/Alarms.swift

@@ -54,6 +54,7 @@ extension MainViewController {
         let currentBGTime = bgs[bgs.count - 1].date
         var alarmTriggered = false
         var numLoops = 0
+        var playSound = true
         checkQuietHours()
         clearOldSnoozes()
         
@@ -98,15 +99,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Urgent Low Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertUrgentLowNightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertUrgentLowNightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertUrgentLowNightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertUrgentLowDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertUrgentLowDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertUrgentLowDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentLowSnooze.value)
+                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentLowSnooze.value, audio: playSound)
                     return
                 } else {
                     return
@@ -120,16 +119,16 @@ extension MainViewController {
   
                 //determine if it is day or night and what should happen
                 if UserDefaultsRepository.nightTime.value {
-                    if UserDefaultsRepository.alertLowNightTime.value {
-                        numLoops = -1
-                    }
+                    if UserDefaultsRepository.alertLowNightTime.value { numLoops = -1 }
+                    if !UserDefaultsRepository.alertLowNightTimeAudible.value { playSound = false }
+                    print ("It is NightTime and playSound = ", playSound)
                 } else {
-                    if UserDefaultsRepository.alertLowDayTime.value {
-                        numLoops = -1
-                    }
+                    if UserDefaultsRepository.alertLowDayTime.value { numLoops = -1 }
+                    if !UserDefaultsRepository.alertLowDayTimeAudible.value { playSound = false }
+                    //print ("It is DayTime and playSound = ", playSound)
                 }
                 
-                triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertLowSnooze.value)
+                triggerAlarm(sound: UserDefaultsRepository.alertLowSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertLowSnooze.value, audio: playSound)
                 return
             }
             
@@ -141,15 +140,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Urgent High Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertUrgentHighNightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertUrgentHighNightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertUrgentHighNightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertUrgentHighDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertUrgentHighDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertUrgentHighDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentHighSnooze.value)
+                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertUrgentHighSnooze.value, audio: playSound)
                     return
                 } else {
                     return
@@ -168,15 +165,15 @@ extension MainViewController {
                 AlarmSound.whichAlarm = "High Alert"
                 //determine if it is day or night and what should happen
                 if UserDefaultsRepository.nightTime.value {
-                    if UserDefaultsRepository.alertHighNightTime.value {
-                        numLoops = -1
-                    }
+                    if UserDefaultsRepository.alertHighNightTime.value { numLoops = -1 }
+                    if !UserDefaultsRepository.alertHighNightTimeAudible.value { playSound = false }
+                    print ("It is NightTime and playSound = ", playSound)
                 } else {
-                    if UserDefaultsRepository.alertHighDayTime.value {
-                        numLoops = -1
-                    }
+                    if UserDefaultsRepository.alertHighDayTime.value { numLoops = -1 }
+                    if !UserDefaultsRepository.alertHighDayTimeAudible.value { playSound = false }
+                    //print ("It is DayTime and playSound = ", playSound)
                 }
-                triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertHighSnooze.value)
+                triggerAlarm(sound: UserDefaultsRepository.alertHighSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertHighSnooze.value, audio: playSound)
                 return
             }
             
@@ -195,15 +192,13 @@ extension MainViewController {
                         AlarmSound.whichAlarm = "Fast Drop Alert"
                         //determine if it is day or night and what should happen
                         if UserDefaultsRepository.nightTime.value {
-                            if UserDefaultsRepository.alertFastDropNightTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertFastDropNightTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertFastDropNightTimeAudible.value { playSound = false }
                         } else {
-                            if UserDefaultsRepository.alertFastDropDayTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertFastDropDayTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertFastDropDayTimeAudible.value { playSound = false }
                         }
-                        triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastDropSnooze.value)
+                        triggerAlarm(sound: UserDefaultsRepository.alertFastDropSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastDropSnooze.value, audio: playSound)
                         return
                     }
                 }
@@ -222,15 +217,13 @@ extension MainViewController {
                         AlarmSound.whichAlarm = "Fast Rise Alert"
                         //determine if it is day or night and what should happen
                         if UserDefaultsRepository.nightTime.value {
-                            if UserDefaultsRepository.alertFastRiseNightTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertFastRiseNightTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertFastRiseNightTimeAudible.value { playSound = false }
                         } else {
-                            if UserDefaultsRepository.alertFastRiseDayTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertFastRiseDayTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertFastRiseDayTimeAudible.value { playSound = false }
                         }
-                        triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastRiseSnooze.value)
+                        triggerAlarm(sound: UserDefaultsRepository.alertFastRiseSound.value, snooozedBGReadingTime: currentBGTime, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertFastRiseSnooze.value, audio: playSound)
                         return
                     }
                 }
@@ -247,15 +240,13 @@ extension MainViewController {
             AlarmSound.whichAlarm = "Missed Reading Alert"
             //determine if it is day or night and what should happen
             if UserDefaultsRepository.nightTime.value {
-                if UserDefaultsRepository.alertMissedReadingNightTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertMissedReadingNightTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertMissedReadingNightTimeAudible.value { playSound = false }
             } else {
-                if UserDefaultsRepository.alertMissedReadingDayTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertMissedReadingDayTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertMissedReadingDayTimeAudible.value { playSound = false }
             }
-            triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedReadingSnooze.value)
+            triggerAlarm(sound: UserDefaultsRepository.alertMissedReadingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedReadingSnooze.value, audio: playSound)
             return
         }
         
@@ -279,15 +270,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Not Looping Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertNotLoopingNightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertNotLoopingNightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertNotLoopingNightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertNotLoopingDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertNotLoopingDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertNotLoopingDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertNotLoopingSnooze.value)
+                    triggerAlarm(sound: UserDefaultsRepository.alertNotLoopingSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertNotLoopingSnooze.value, audio: playSound)
                     return
                 }
             }
@@ -314,15 +303,13 @@ extension MainViewController {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
                         //determine if it is day or night and what should happen
                         if UserDefaultsRepository.nightTime.value {
-                            if UserDefaultsRepository.alertMissedBolusNightTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertMissedBolusNightTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertMissedBolusNightTimeAudible.value { playSound = false }
                         } else {
-                            if UserDefaultsRepository.alertMissedBolusDayTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertMissedBolusDayTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertMissedBolusDayTimeAudible.value { playSound = false }
                         }
-                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
+                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value, audio: playSound)
                         return
                     }
                     
@@ -347,15 +334,13 @@ extension MainViewController {
                         AlarmSound.whichAlarm = "Missed Bolus Alert"
                         //determine if it is day or night and what should happen
                         if UserDefaultsRepository.nightTime.value {
-                            if UserDefaultsRepository.alertMissedBolusNightTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertMissedBolusNightTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertMissedBolusNightTimeAudible.value { playSound = false }
                         } else {
-                            if UserDefaultsRepository.alertMissedBolusDayTime.value {
-                                numLoops = -1
-                            }
+                            if UserDefaultsRepository.alertMissedBolusDayTime.value { numLoops = -1 }
+                            if !UserDefaultsRepository.alertMissedBolusDayTimeAudible.value { playSound = false }
                         }
-                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value)
+                        triggerAlarm(sound: UserDefaultsRepository.alertMissedBolusSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertMissedBolusSnooze.value, audio: playSound)
                         return
                     }
                     
@@ -373,15 +358,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Sensor Change Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertSAGENightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertSAGENightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertSAGENightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertSAGEDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertSAGEDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertSAGEDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertSAGESnooze.value, snoozeIncrement: 1)
+                    triggerAlarm(sound: UserDefaultsRepository.alertSAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertSAGESnooze.value, snoozeIncrement: 1, audio: playSound)
                     return
                 }
             }
@@ -396,15 +379,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Pump Change Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertCAGENightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertCAGENightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertCAGENightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertCAGEDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertCAGEDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertCAGEDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertCAGESnooze.value, snoozeIncrement: 1)
+                    triggerAlarm(sound: UserDefaultsRepository.alertCAGESound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertCAGESnooze.value, snoozeIncrement: 1, audio: playSound)
                     return
                 }
             }
@@ -416,15 +397,13 @@ extension MainViewController {
                     AlarmSound.whichAlarm = "Low Insulin Alert"
                     //determine if it is day or night and what should happen
                     if UserDefaultsRepository.nightTime.value {
-                        if UserDefaultsRepository.alertPumpNightTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertPumpNightTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertPumpNightTimeAudible.value { playSound = false }
                     } else {
-                        if UserDefaultsRepository.alertPumpDayTime.value {
-                            numLoops = -1
-                        }
+                        if UserDefaultsRepository.alertPumpDayTime.value { numLoops = -1 }
+                        if !UserDefaultsRepository.alertPumpDayTimeAudible.value { playSound = false }
                     }
-                    triggerAlarm(sound: UserDefaultsRepository.alertPumpSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertPumpSnoozeHours.value, snoozeIncrement: 1)
+                    triggerAlarm(sound: UserDefaultsRepository.alertPumpSound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: UserDefaultsRepository.alertPumpSnoozeHours.value, snoozeIncrement: 1, audio: playSound)
                     return
                 }
             }
@@ -462,49 +441,48 @@ extension MainViewController {
         let overrideName = recentOverride?.reason as! String
        
         var numLoops = 0
+        var playSound = true
         if UserDefaultsRepository.alertOverrideStart.value && !UserDefaultsRepository.alertOverrideStartIsSnoozed.value && triggerStart {
             AlarmSound.whichAlarm = overrideName + " Override Started"
             //determine if it is day or night and what should happen
             if UserDefaultsRepository.nightTime.value {
-                if UserDefaultsRepository.alertOverrideStartNightTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertOverrideStartNightTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertOverrideStartNightTimeAudible.value { playSound = false }
             } else {
-                if UserDefaultsRepository.alertOverrideStartDayTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertOverrideStartDayTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertOverrideStartDayTimeAudible.value { playSound = false }
             }
-                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideStartSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+            triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideStartSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, audio: playSound)
                 lastOverrideStartTime = recentStart
                 lastOverrideAlarm = now
         } else if UserDefaultsRepository.alertOverrideEnd.value && !UserDefaultsRepository.alertOverrideEndIsSnoozed.value && triggerEnd {
                 AlarmSound.whichAlarm = overrideName + " Override Ended"
             //determine if it is day or night and what should happen
             if UserDefaultsRepository.nightTime.value {
-                if UserDefaultsRepository.alertOverrideEndNightTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertOverrideEndNightTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertOverrideEndNightTimeAudible.value { playSound = false }
             } else {
-                if UserDefaultsRepository.alertOverrideEndDayTime.value {
-                    numLoops = -1
-                }
+                if UserDefaultsRepository.alertOverrideEndDayTime.value { numLoops = -1 }
+                if !UserDefaultsRepository.alertOverrideEndDayTimeAudible.value { playSound = false }
             }
-                triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops)
+            triggerOneTimeAlarm(sound: UserDefaultsRepository.alertOverrideEndSound.value, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, audio: playSound)
                 lastOverrideEndTime = recentEnd
                 lastOverrideAlarm = now
         }
     }
     
-    func triggerOneTimeAlarm(sound: String, overrideVolume: Bool, numLoops: Int)
+    func triggerOneTimeAlarm(sound: String, overrideVolume: Bool, numLoops: Int, audio: Bool = true)
     {
         guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
         snoozer.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
-        AlarmSound.setSoundFile(str: sound)
-        AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
-        startAlarmPlayingTimer()
+        if audio && !UserDefaultsRepository.alertMuteAllIsMuted.value {
+            AlarmSound.setSoundFile(str: sound)
+            AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
+            startAlarmPlayingTimer()
+        }
     }
     
-    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?, overrideVolume: Bool, numLoops: Int, snoozeTime: Int = 0, snoozeIncrement: Int = 5)
+    func triggerAlarm(sound: String, snooozedBGReadingTime: TimeInterval?, overrideVolume: Bool, numLoops: Int, snoozeTime: Int = 0, snoozeIncrement: Int = 5, audio: Bool = true)
     {
         guard let snoozer = self.tabBarController!.viewControllers?[2] as? SnoozeViewController else { return }
         snoozer.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
@@ -524,9 +502,10 @@ extension MainViewController {
         if snooozedBGReadingTime != nil {
             UserDefaultsRepository.snoozedBGReadingTime.value = snooozedBGReadingTime
         }
-        AlarmSound.setSoundFile(str: sound)
-        AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
-        
+        if audio && !UserDefaultsRepository.alertMuteAllIsMuted.value {
+            AlarmSound.setSoundFile(str: sound)
+            AlarmSound.play(overrideVolume: overrideVolume, numLoops: numLoops)
+        }
         let bgSeconds = bgData.last!.date
         let now = Date().timeIntervalSince1970
         let secondsAgo = now - bgSeconds
@@ -542,7 +521,9 @@ extension MainViewController {
         snoozer.updateDisplayWhenTriggered(bgVal: bgUnits.toDisplayUnits(String(bgData[bgData.count - 1].sgv)), directionVal: latestDirectionString ?? "", deltaVal: bgUnits.toDisplayUnits(latestDeltaString) ?? "", minAgoVal: latestMinAgoString ?? "", alertLabelVal: AlarmSound.whichAlarm)
         snoozer.SnoozeButton.isHidden = true
         snoozer.AlertLabel.isHidden = true
-        AlarmSound.stop()
+        if AlarmSound.isPlaying {
+            AlarmSound.stop()
+        }
     }
     
     func clearOldSnoozes(){
@@ -559,6 +540,14 @@ extension MainViewController {
             
           }
           
+        if date > UserDefaultsRepository.alertMuteAllTime.value ?? date {
+            UserDefaultsRepository.alertMuteAllTime.setNil(key: "alertMuteAllTime")
+            UserDefaultsRepository.alertMuteAllIsMuted.value = false
+            alarms.reloadMuteTime(key: "alertMuteAllTime", setNil: true)
+            alarms.reloadIsMuted(key: "alertMuteAllIsMuted", value: false)
+          
+        }
+        
           if date > UserDefaultsRepository.alertUrgentLowSnoozedTime.value ?? date {
               UserDefaultsRepository.alertUrgentLowSnoozedTime.setNil(key: "alertUrgentLowSnoozedTime")
               UserDefaultsRepository.alertUrgentLowIsSnoozed.value = false

+ 383 - 96
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -131,12 +131,20 @@ class AlarmViewController: FormViewController {
     ]
     
     var alertRepeatOptions: [String] = [
-        "Do not repeat",
-        "Always repeat",
-        "Repeat at night",
-        "Repeat during the day"
+        "Never",
+        "Always",
+        "At night",
+        "During the day"
     ]
     
+    var alertPlaySoundOptions: [String] = [
+        "Always",
+        "At night",
+        "During the day",
+        "Never"
+    ]
+
+    
     func timeBasedSettings (pickerValue: String) -> (dayTime:Bool, nightTime:Bool) {
         var dayTime = false
         var nightTime = false
@@ -177,7 +185,27 @@ class AlarmViewController: FormViewController {
             }
     }
     
+    func reloadMuteTime(key: String, setNil: Bool, value: Date = Date()) {
+        
+            if let row = form.rowBy(tag: key) as? DateTimeInlineRow {
+                if setNil {
+                    row.value = nil
+                } else {
+                   row.value = value
+                }
+                
+                row.reload()
+            }
+               
+    }
     
+    func reloadIsMuted(key: String, value: Bool) {
+        
+            if let row = form.rowBy(tag: key) as? SwitchRow {
+            row.value = value
+            row.reload()
+            }
+    }
     
    // static let shared = AlarmViewController()
 
@@ -340,7 +368,7 @@ class AlarmViewController: FormViewController {
 
     func buildSnoozeAll(){
         form
-            +++ Section(header: "Snooze All", footer: "Snooze All Alerts")
+            +++ Section(header: "Snooze & Mute Options", footer: "Snooze and Mute All Sounds: Snooze All turns everything off, Mute All turns off phone sounds but leaves vibration and iOS notifications on")
         <<< DateTimeInlineRow("alertSnoozeAllTime") { row in
             row.title = "Snooze All Until"
             
@@ -384,8 +412,51 @@ class AlarmViewController: FormViewController {
                    otherRow.reload()
                 }
         }
+        
+            <<< DateTimeInlineRow("alertMuteAllTime") { row in
+                row.title = "Mute All Until"
+                
+                if (UserDefaultsRepository.alertMuteAllTime.value != nil) {
+                    row.value = UserDefaultsRepository.alertMuteAllTime.value
+                }
+                row.minuteInterval = 5
+                row.noValueDisplayText = "Not Muted"
+                }
+                .onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMuteAllTime.value = value
+                    UserDefaultsRepository.alertMuteAllIsMuted.value = true
+                    let otherRow = self?.form.rowBy(tag: "alertMuteAllIsMuted") as! SwitchRow
+                    otherRow.value = true
+                    otherRow.reload()
+                }
+                .onExpandInlineRow { [weak self] cell, row, inlineRow in
+                    inlineRow.cellUpdate() { cell, row in
+                        cell.datePicker.datePickerMode = .dateAndTime
+                        cell.datePicker.preferredDatePickerStyle = .wheels
+                    }
+                    let color = cell.detailTextLabel?.textColor
+                    row.onCollapseInlineRow { cell, _, _ in
+                        cell.detailTextLabel?.textColor = color
+                    }
+                    cell.detailTextLabel?.textColor = cell.tintColor
+            }
+            <<< SwitchRow("alertMuteAllIsMuted"){ row in
+                row.title = "All Sounds Muted"
+                row.value = UserDefaultsRepository.alertMuteAllIsMuted.value
+                row.hidden = "$alertMuteAllTime == nil"
+            }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.alertMuteAllIsMuted.value = value
+                    if !value {
+                        UserDefaultsRepository.alertMuteAllTime.setNil(key: "alertMuteAllTime")
+                        let otherRow = self?.form.rowBy(tag: "alertMuteAllTime") as! DateTimeInlineRow
+                       otherRow.value = nil
+                       otherRow.reload()
+                    }
+            }
     }
-    
+
     func buildTemporaryAlert(){
         form
             
@@ -437,7 +508,7 @@ class AlarmViewController: FormViewController {
                 AlarmSound.playTest()
         }
         <<< SwitchRow("alertTemporaryRepeat"){ row in
-        row.title = "Repeat Alert"
+        row.title = "Repeat Sound"
         row.value = UserDefaultsRepository.alertTemporaryBGRepeat.value
         }.onChange { [weak self] row in
                 guard let value = row.value else { return }
@@ -500,8 +571,24 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
+            
+            <<< PickerInputRow<String>("alertUrgentLowPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertUrgentLowAudible.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.alertUrgentLowAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertUrgentLowDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertUrgentLowNightTimeAudible.value = alertVol.nightTime
+            }
             <<< PickerInputRow<String>("alertUrgentLowRepeat") { row in
-                row.title = "Repeat Alert"
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
                 row.value = UserDefaultsRepository.alertUrgentLowRepeat.value
                 row.displayValueFor = { value in
@@ -615,8 +702,23 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
+            <<< PickerInputRow<String>("alertPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertLowAudible.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.alertLowAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertLowDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertLowNightTimeAudible.value = alertVol.nightTime
+            }
             <<< PickerInputRow<String>("alertLowRepeat") { row in
-                row.title = "Repeat Alert"
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
                 row.value = UserDefaultsRepository.alertLowRepeat.value
                 row.displayValueFor = { value in
@@ -630,6 +732,7 @@ class AlarmViewController: FormViewController {
                     UserDefaultsRepository.alertLowDayTime.value = alertTimes.dayTime
                     UserDefaultsRepository.alertLowNightTime.value = alertTimes.nightTime
             }
+           
         <<< DateTimeInlineRow("alertLowSnoozedTime") { row in
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertLowSnoozedTime.value != nil) {
@@ -744,8 +847,23 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
+            <<< PickerInputRow<String>("alertHighPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertHighAudible.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.alertHighAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertHighDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertHighNightTimeAudible.value = alertVol.nightTime
+            }
             <<< PickerInputRow<String>("alertHighRepeat") { row in
-                row.title = "Repeat Alert"
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
                 row.value = UserDefaultsRepository.alertHighRepeat.value
                 row.displayValueFor = { value in
@@ -759,6 +877,7 @@ class AlarmViewController: FormViewController {
                     UserDefaultsRepository.alertHighDayTime.value = alertTimes.dayTime
                     UserDefaultsRepository.alertHighNightTime.value = alertTimes.nightTime
             }
+            
         <<< DateTimeInlineRow("alertHighSnoozedTime") { row in
             row.title = "Snoozed Until"
             if (UserDefaultsRepository.alertHighSnoozedTime.value != nil) {
@@ -857,8 +976,23 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
+            <<< PickerInputRow<String>("alertUrgentHighPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertUrgentHighAudible.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.alertUrgentHighAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertUrgentHighDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertUrgentHighNightTimeAudible.value = alertVol.nightTime
+            }
             <<< PickerInputRow<String>("alertUrgentHighRepeat") { row in
-                row.title = "Repeat Alert"
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
                 row.value = UserDefaultsRepository.alertUrgentHighRepeat.value
                 row.displayValueFor = { value in
@@ -872,6 +1006,7 @@ class AlarmViewController: FormViewController {
                     UserDefaultsRepository.alertUrgentHighDayTime.value = alertTimes.dayTime
                     UserDefaultsRepository.alertUrgentHighNightTime.value = alertTimes.nightTime
             }
+            
         <<< DateTimeInlineRow("alertUrgentHighSnoozedTime") { row in
             row.title = "Snoozed Until"
             if (UserDefaultsRepository.alertUrgentHighSnoozedTime.value != nil) {
@@ -1007,8 +1142,23 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
+            <<< PickerInputRow<String>("alertFastDropPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertFastDropAudible.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.alertFastDropAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertFastDropDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertFastDropNightTimeAudible.value = alertVol.nightTime
+            }
             <<< PickerInputRow<String>("alertFastDropRepeat") { row in
-                row.title = "Repeat Alert"
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
                 row.value = UserDefaultsRepository.alertFastDropRepeat.value
                 row.displayValueFor = { value in
@@ -1022,6 +1172,7 @@ class AlarmViewController: FormViewController {
                     UserDefaultsRepository.alertFastDropDayTime.value = alertTimes.dayTime
                     UserDefaultsRepository.alertFastDropNightTime.value = alertTimes.nightTime
             }
+            
         <<< DateTimeInlineRow("alertFastDropSnoozedTime") { row in
             row.title = "Snoozed Until"
            if (UserDefaultsRepository.alertFastDropSnoozedTime.value != nil) {
@@ -1157,20 +1308,35 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< PickerInputRow<String>("alertFastRiseRepeat") { row in // <--
-                row.title = "Repeat Alert"
+            <<< PickerInputRow<String>("alertFastRisePlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertFastRiseAudible.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.alertFastRiseAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertFastRiseDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertFastRiseNightTimeAudible.value = alertVol.nightTime
+            }
+            <<< PickerInputRow<String>("alertFastRiseRepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertFastRiseRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertFastRiseDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertFastRiseNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertFastRiseSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1272,20 +1438,35 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< PickerInputRow<String>("alertMissedReadingRepeat") { row in // <--
-                row.title = "Repeat Alert"
+            <<< PickerInputRow<String>("alertMissedReadingPlaySound") { row in
+                row.title = "PlaySound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertMissedReadingAudible.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.alertMissedReadingAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertMissedReadingDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertMissedReadingNightTimeAudible.value = alertVol.nightTime
+            }
+            <<< PickerInputRow<String>("alertMissedReadingRepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertMissedReadingRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertMissedReadingDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertMissedReadingNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertMissedReadingSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1423,20 +1604,35 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< PickerInputRow<String>("alertNotLoopingRepeat") { row in // <--
-                row.title = "Repeat Alert"
+            <<< PickerInputRow<String>("alertNotLoopingPlaySound") { row in
+                row.title = "PlaySound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertNotLoopingAudible.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.alertNotLoopingAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertNotLoopingDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertNotLoopingNightTimeAudible.value = alertVol.nightTime
+            }
+            <<< PickerInputRow<String>("alertNotLoopingRepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertNotLoopingRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertNotLoopingDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertNotLoopingNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertNotLoopingSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1593,27 +1789,42 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertMissedBolusQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertMissedBolusQuiet.value
+            <<< PickerInputRow<String>("alertMissedBolusPlaySound") { row in
+                row.title = "PlaySound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertMissedBolusAudible.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.alertMissedBolusQuiet.value = value
-            }
-            <<< PickerInputRow<String>("alertMissedBolusRepeat") { row in // <--
-                row.title = "Repeat Alert"
+                    UserDefaultsRepository.alertMissedBolusAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertMissedBolusDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertMissedBolusNightTimeAudible.value = alertVol.nightTime
+            }
+            //<<< SwitchRow("alertMissedBolusQuiet"){ row in
+            //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
+            //}
+            <<< PickerInputRow<String>("alertMissedBolusRepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertMissedBolusRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertMissedBolusDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertMissedBolusNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertMissedBolusSnoozedTime") { row in
             row.title = "Snoozed Until"
@@ -1728,28 +1939,44 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertSAGEQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertSAGEQuiet.value
+            //<<< SwitchRow("alertSAGEQuiet"){ row in
+            //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
+            //}
+            <<< PickerInputRow<String>("alertSAGEPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertSAGEAudible.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.alertSAGEQuiet.value = value
+                    UserDefaultsRepository.alertSAGEAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertSAGEDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertSAGENightTimeAudible.value = alertVol.nightTime
             }
-            <<< PickerInputRow<String>("alertSAGERepeat") { row in // <--
-                row.title = "Repeat Alert"
+            <<< PickerInputRow<String>("alertSAGERepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertSAGERepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertSAGEDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertSAGENightTime.value = alertTimes.nightTime
             }
+            
             <<< DateTimeInlineRow("alertSAGESnoozedTime") { row in
                 row.title = "Snoozed Until"
                 if (UserDefaultsRepository.alertSAGESnoozedTime.value != nil) {
@@ -1849,27 +2076,42 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
             }
-            <<< SwitchRow("alertCAGEQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertCAGEQuiet.value
+            <<< PickerInputRow<String>("alertCAGEPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertCAGEAudible.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.alertCAGEQuiet.value = value
-            }
-            <<< PickerInputRow<String>("alertCAGERepeat") { row in // <--
-                row.title = "Repeat Alert"
+                    UserDefaultsRepository.alertCAGEAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertCAGEDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertCAGENightTimeAudible.value = alertVol.nightTime
+            }
+            //<<< SwitchRow("alertCAGEQuiet"){ row in
+            //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
+            //}
+            <<< PickerInputRow<String>("alertCAGERepeat") { row in
+                row.title = "Repeat Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertCAGERepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertCAGEDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertCAGENightTime.value = alertTimes.nightTime
             }
             <<< DateTimeInlineRow("alertCAGESnoozedTime") { row in
                 row.title = "Snoozed Until"
@@ -1942,27 +2184,42 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-            <<< SwitchRow("alertOverrideStartQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertOverrideStartQuiet.value
+            <<< PickerInputRow<String>("alertOverrideStartPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertOverrideStartAudible.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.alertOverrideStartQuiet.value = value
-            }
-            <<< PickerInputRow<String>("alertOverrideStartRepeat") { row in // <--
-                row.title = "Repeat Alert"
+                    UserDefaultsRepository.alertOverrideStartAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertOverrideStartDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertOverrideStartNightTimeAudible.value = alertVol.nightTime
+            }
+            //<<< 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 Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertOverrideStartRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertOverrideStartRepeat.value = value
                     let alertTimes = self!.timeBasedSettings(pickerValue: value)
-                    UserDefaultsRepository.alertOverrideStartDayTime.value = alertTimes.dayTime // <--
-                    UserDefaultsRepository.alertOverrideStartNightTime.value = alertTimes.nightTime // <--
+                    UserDefaultsRepository.alertOverrideStartDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertOverrideStartNightTime.value = alertTimes.nightTime
 
             }
         <<< DateTimeInlineRow("alertOverrideStartSnoozedTime") { row in
@@ -2037,27 +2294,42 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-            <<< SwitchRow("alertOverrideEndQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertOverrideEndQuiet.value
+            <<< PickerInputRow<String>("alertOverrideEndPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertOverrideEndAudible.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.alertOverrideEndQuiet.value = value
-            }
-            <<< PickerInputRow<String>("alertOverrideEndRepeat") { row in // <--
-                row.title = "Repeat Alert"
+                    UserDefaultsRepository.alertOverrideEndAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertOverrideEndDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertOverrideEndNightTimeAudible.value = alertVol.nightTime
+            }
+            //<<< 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 Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertOverrideEndRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertOverrideEndRepeat.value = value
                     let alertTimes = self!.timeBasedSettings(pickerValue: value)
-                    UserDefaultsRepository.alertOverrideEndDayTime.value = alertTimes.dayTime // <--
-                    UserDefaultsRepository.alertOverrideEndNightTime.value = alertTimes.nightTime // <--
+                    UserDefaultsRepository.alertOverrideEndDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertOverrideEndNightTime.value = alertTimes.nightTime
             }
         <<< DateTimeInlineRow("alertOverrideEndSnoozedTime") { row in
                 row.title = "Snoozed Until"
@@ -2160,27 +2432,42 @@ class AlarmViewController: FormViewController {
                 AlarmSound.stop()
                 AlarmSound.playTest()
         }
-            <<< SwitchRow("alertPumpQuiet"){ row in
-            row.title = "Mute at night"
-            row.value = UserDefaultsRepository.alertPumpQuiet.value
+            <<< PickerInputRow<String>("alertPumpPlaySound") { row in
+                row.title = "Play Sound"
+                row.options = alertPlaySoundOptions
+                row.value = UserDefaultsRepository.alertPumpAudible.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.alertPumpQuiet.value = value
-            }
-            <<< PickerInputRow<String>("alertPumpRepeat") { row in // <--
-                row.title = "Repeat Alert"
+                    UserDefaultsRepository.alertPumpAudible.value = value
+                    let alertVol = self!.timeBasedSettings(pickerValue: value)
+                    UserDefaultsRepository.alertPumpDayTimeAudible.value = alertVol.dayTime
+                    UserDefaultsRepository.alertPumpNightTimeAudible.value = alertVol.nightTime
+            }
+            //<<< 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 Sound"
                 row.options = alertRepeatOptions
-                row.value = UserDefaultsRepository.alertPumpRepeat.value // <--
+                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 // <--
+                    UserDefaultsRepository.alertPumpRepeat.value = value
                     let alertTimes = self!.timeBasedSettings(pickerValue: value)
-                    UserDefaultsRepository.alertPumpDayTime.value = alertTimes.dayTime // <--
-                    UserDefaultsRepository.alertPumpNightTime.value = alertTimes.nightTime // <--
+                    UserDefaultsRepository.alertPumpDayTime.value = alertTimes.dayTime
+                    UserDefaultsRepository.alertPumpNightTime.value = alertTimes.nightTime
             }
 
             <<< DateTimeInlineRow("alertPumpSnoozedTime") { row in
@@ -2253,7 +2540,7 @@ class AlarmViewController: FormViewController {
                       UserDefaultsRepository.forcedOutputVolume.value = Float(value)
               }
             
-             +++ 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
+             +++ Section(header: "Night Time Settings", footer: "Night time hours are 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

+ 63 - 17
LoopFollow/repository/UserDefaults.swift

@@ -112,6 +112,7 @@ class UserDefaultsRepository {
     
     // 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)
@@ -123,26 +124,34 @@ class UserDefaultsRepository {
     
     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 alertUrgentLowBG = UserDefaultsValue<Float>(key: "alertUrgentLowBG", default: 55.0)
     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<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 alertUrgentLowRepeat = UserDefaultsValue<String>(key: "alertUrgentLowRepeat", default: "Never")
+    static let alertUrgentLowDayTime = UserDefaultsValue<Bool>(key: "alertUrgentLowDayTime", default: false) // need to change all DayTime to DayTimeRepeat
+    static let alertUrgentLowNightTime = UserDefaultsValue<Bool>(key: "alertUrgentLowNightTime", default: false) // need to change all NightTime to NightTimeRepeat
     static let alertUrgentLowSound = UserDefaultsValue<String>(key: "alertUrgentLowSound", default: "Emergency_Alarm_Siren")
+    static let alertUrgentLowAudible = UserDefaultsValue<String>(key: "alertUrgentLowAudible", default: "Always")
+    static let alertUrgentLowDayTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentLowDayTimeAudible", default: true)
+    static let alertUrgentLowNightTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentLowNightTimeAudible", default: true)
     
     static let alertLowActive = UserDefaultsValue<Bool>(key: "alertLowActive", default: false)
     static let alertLowBG = UserDefaultsValue<Float>(key: "alertLowBG", default: 70.0)
     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<String>(key: "alertLowRepeat", default: "Do not repeat")
+    static let alertLowRepeat = UserDefaultsValue<String>(key: "alertLowRepeat", default: "Never")
     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 alertLowAudible = UserDefaultsValue<String>(key: "alertLowAudible", default: "Always")
+    static let alertLowDayTimeAudible = UserDefaultsValue<Bool>(key: "alertLowDayTimeAudible", default: true)
+    static let alertLowNightTimeAudible = UserDefaultsValue<Bool>(key: "alertLowNightTimeAudible", default: true)
     
     static let alertHighActive = UserDefaultsValue<Bool>(key: "alertHighActive", default: false)
     static let alertHighBG = UserDefaultsValue<Float>(key: "alertHighBG", default: 180.0)
@@ -150,20 +159,26 @@ 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<String>(key: "alertHighRepeat", default: "Do not repeat")
+    static let alertHighRepeat = UserDefaultsValue<String>(key: "alertHighRepeat", default: "Never")
     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 alertHighAudible = UserDefaultsValue<String>(key: "alertHighAudible", default: "Always")
+    static let alertHighDayTimeAudible = UserDefaultsValue<Bool>(key: "alertHighDayTimeAudible", default: true)
+    static let alertHighNightTimeAudible = UserDefaultsValue<Bool>(key: "alertHighNightTimeAudible", default: true)
     
     static let alertUrgentHighActive = UserDefaultsValue<Bool>(key: "alertUrgentHighActive", default: false)
     static let alertUrgentHighBG = UserDefaultsValue<Float>(key: "alertUrgentHighBG", default: 250.0)
     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<String>(key: "alertUrgentHighRepeat", default: "Do not repeat")
+    static let alertUrgentHighRepeat = UserDefaultsValue<String>(key: "alertUrgentHighRepeat", default: "Never")
     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")
+    static let alertUrgentHighAudible = UserDefaultsValue<String>(key: "alertUrgentHighAudible", default: "Always")
+    static let alertUrgentHighDayTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentHighDayTimeAudible", default: true)
+    static let alertUrgentHighNightTimeAudible = UserDefaultsValue<Bool>(key: "alertUrgentHighNightTimeAudible", default: true)
 
     
     static let alertFastDropActive = UserDefaultsValue<Bool>(key: "alertFastDropDeltaActive", default: false)
@@ -174,10 +189,13 @@ 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<String>(key: "alertFastDropRepeat", default: "Do not repeat")
+    static let alertFastDropRepeat = UserDefaultsValue<String>(key: "alertFastDropRepeat", default: "Never")
     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 alertFastDropAudible = UserDefaultsValue<String>(key: "alertFastDropAudible", default: "Always")
+    static let alertFastDropDayTimeAudible = UserDefaultsValue<Bool>(key: "alertFastDropDayTimeAudible", default: true)
+    static let alertFastDropNightTimeAudible = UserDefaultsValue<Bool>(key: "alertFastDropNightTimeAudible", default: true)
     
     static let alertFastRiseActive = UserDefaultsValue<Bool>(key: "alertFastRiseDeltaActive", default: false)
     static let alertFastRiseSnooze = UserDefaultsValue<Int>(key: "alertFastRiseDeltaSnooze", default: 10)
@@ -187,10 +205,13 @@ 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<String>(key: "alertFastRiseRepeat", default: "Do not repeat")
+    static let alertFastRiseRepeat = UserDefaultsValue<String>(key: "alertFastRiseRepeat", default: "Never")
     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")
+    static let alertFastRiseAudible = UserDefaultsValue<String>(key: "alertFastRiseAudible", default: "Always")
+    static let alertFastRiseDayTimeAudible = UserDefaultsValue<Bool>(key: "alertFastRiseDayTimeAudible", default: true)
+    static let alertFastRiseNightTimeAudible = UserDefaultsValue<Bool>(key: "alertFastRiseNightTimeAudible", default: true)
     
     
     static let alertMissedReadingActive = UserDefaultsValue<Bool>(key: "alertMissedReadingActive", default: false)
@@ -198,10 +219,13 @@ 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<String>(key: "alertMissedReadingRepeat", default: "Do not repeat")
+    static let alertMissedReadingRepeat = UserDefaultsValue<String>(key: "alertMissedReadingRepeat", default: "Never")
     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")
+    static let alertMissedReadingAudible = UserDefaultsValue<String>(key: "alertMissedReadingAudible", default: "Always")
+    static let alertMissedReadingDayTimeAudible = UserDefaultsValue<Bool>(key: "alertMissedReadingDayTimeAudible", default: true)
+    static let alertMissedReadingNightTimeAudible = UserDefaultsValue<Bool>(key: "alertMissedReadingNightTimeAudible", default: true)
     
     
     static let alertNotLoopingActive = UserDefaultsValue<Bool>(key: "alertNotLoopingActive", default: false)
@@ -212,11 +236,14 @@ 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<String>(key: "alertNotLoopingRepeat", default: "Do not repeat")
+    static let alertNotLoopingRepeat = UserDefaultsValue<String>(key: "alertNotLoopingRepeat", default: "Never")
     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)
+    static let alertNotLoopingAudible = UserDefaultsValue<String>(key: "alertNotLoopingAudible", default: "Always")
+    static let alertNotLoopingDayTimeAudible = UserDefaultsValue<Bool>(key: "alertNotLoopingDayTimeAudible", default: true)
+    static let alertNotLoopingNightTimeAudible = UserDefaultsValue<Bool>(key: "alertNotLoopingNightTimeAudible", default: true)
     
     static let alertMissedBolusActive = UserDefaultsValue<Bool>(key: "alertMissedBolusActive", default: false)
     static let alertMissedBolus = UserDefaultsValue<Int>(key: "alertMissedBolus", default: 10)
@@ -228,17 +255,23 @@ 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<String>(key: "alertMissedBolusRepeat", default: "Do not repeat")
+    static let alertMissedBolusRepeat = UserDefaultsValue<String>(key: "alertMissedBolusRepeat", default: "Never")
     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 alertMissedBolusAudible = UserDefaultsValue<String>(key: "alertMissedBolusAudible", default: "Always")
+    static let alertMissedBolusDayTimeAudible = UserDefaultsValue<Bool>(key: "alertMissedBolusDayTimeAudible", default: true)
+    static let alertMissedBolusNightTimeAudible = UserDefaultsValue<Bool>(key: "alertMissedBolusNightTimeAudible", default: true)
     
     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<String>(key: "alertSAGERepeat", default: "Do not repeat")
+    static let alertSAGERepeat = UserDefaultsValue<String>(key: "alertSAGERepeat", default: "Never")
     static let alertSAGEDayTime = UserDefaultsValue<Bool>(key: "alertSAGEDayTime", default: false)
     static let alertSAGENightTime = UserDefaultsValue<Bool>(key: "alertSAGENightTime", default: false)
+    static let alertSAGEAudible = UserDefaultsValue<String>(key: "alertSAGEAudible", default: "Always")
+    static let alertSAGEDayTimeAudible = UserDefaultsValue<Bool>(key: "alertSAGEDayTimeAudible", default: true)
+    static let alertSAGENightTimeAudible = UserDefaultsValue<Bool>(key: "alertSAGENightTimeAudible", default: true)
     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)
@@ -247,9 +280,12 @@ 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<String>(key: "alertCAGERepeat", default: "Do not repeat")
+    static let alertCAGERepeat = UserDefaultsValue<String>(key: "alertCAGERepeat", default: "Never")
     static let alertCAGEDayTime = UserDefaultsValue<Bool>(key: "alertCAGEDayTime", default: false)
     static let alertCAGENightTime = UserDefaultsValue<Bool>(key: "alertCAGENightTime", default: false)
+    static let alertCAGEAudible = UserDefaultsValue<String>(key: "alertCAGEAudible", default: "Always")
+    static let alertCAGEDayTimeAudible = UserDefaultsValue<Bool>(key: "alertCAGEDayTimeAudible", default: true)
+    static let alertCAGENightTimeAudible = UserDefaultsValue<Bool>(key: "alertCAGENightTimeAudible", default: true)
     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)
@@ -260,23 +296,30 @@ class UserDefaultsRepository {
     static let alertTemporaryActive = UserDefaultsValue<Bool>(key: "alertTemporaryActive", default: false)
     static let alertTemporaryBelow = UserDefaultsValue<Bool>(key: "alertTemporaryBelow", default: true)
     static let alertTemporaryBG = UserDefaultsValue<Float>(key: "alertTemporaryBG", default: 90.0)
-    static let alertTemporaryBGRepeat = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeat", default: true)
+    static let alertTemporaryBGRepeat = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeat", default: false)
+    static let alertTemporaryBGAudible = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeatAudible", default: true)
     static let alertTemporarySound = UserDefaultsValue<String>(key: "alertTemporarySound", default: "Indeed")
     
     static let alertOverrideStart = UserDefaultsValue<Bool>(key: "alertOverrideStart", default: false)
     static let alertOverrideStartQuiet = UserDefaultsValue<Bool>(key: "alertOverrideStartQuiet", default: false)
-    static let alertOverrideStartRepeat = UserDefaultsValue<String>(key: "alertOverrideStartRepeat", default: "Do not repeat")
+    static let alertOverrideStartRepeat = UserDefaultsValue<String>(key: "alertOverrideStartRepeat", default: "Never")
     static let alertOverrideStartDayTime = UserDefaultsValue<Bool>(key: "alertOverrideStartDayTime", default: false)
     static let alertOverrideStartNightTime = UserDefaultsValue<Bool>(key: "alertOverrideStartNightTime", default: false)
+    static let alertOverrideStartAudible = UserDefaultsValue<String>(key: "alertOverrideStartRepeatAudible", default: "Always")
+    static let alertOverrideStartDayTimeAudible = UserDefaultsValue<Bool>(key: "alertOverrideStartDayTimeAudible", default: true)
+    static let alertOverrideStartNightTimeAudible = UserDefaultsValue<Bool>(key: "alertOverrideStartNightTimeAudible", default: true)
     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<String>(key: "alertOverrideEndRepeat", default: "Do not repeat")
+    static let alertOverrideEndRepeat = UserDefaultsValue<String>(key: "alertOverrideEndRepeat", default: "Never")
     static let alertOverrideEndDayTime = UserDefaultsValue<Bool>(key: "alertOverrideEndDayTime", default: false)
     static let alertOverrideEndNightTime = UserDefaultsValue<Bool>(key: "alertOverrideEndNightTime", default: false)
+    static let alertOverrideEndAudible = UserDefaultsValue<String>(key: "alertOverrideEndRepeatAudible", default: "Always")
+    static let alertOverrideEndDayTimeAudible = UserDefaultsValue<Bool>(key: "alertOverrideEndDayTimeAudible", default: true)
+    static let alertOverrideEndNightTimeAudible = UserDefaultsValue<Bool>(key: "alertOverrideEndNightTimeAudible", default: true)
     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)
@@ -284,9 +327,12 @@ 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<String>(key: "alertPumpRepeat", default: "Do not repeat")
+    static let alertPumpRepeat = UserDefaultsValue<String>(key: "alertPumpRepeat", default: "Never")
     static let alertPumpDayTime = UserDefaultsValue<Bool>(key: "alertPumpDayTime", default: false)
     static let alertPumpNightTime = UserDefaultsValue<Bool>(key: "alertPumpNightTime", default: false)
+    static let alertPumpAudible = UserDefaultsValue<String>(key: "alertPumpAudible", default: "Always")
+    static let alertPumpDayTimeAudible = UserDefaultsValue<Bool>(key: "alertPumpDayTimeAudible", default: true)
+    static let alertPumpNightTimeAudible = UserDefaultsValue<Bool>(key: "alertPumpNightTimeAudible", default: true)
     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)