Jonas Björkert 3 lat temu
rodzic
commit
04e7098713

+ 19 - 4
LoopFollow/Controllers/Alarms.swift

@@ -496,9 +496,19 @@ extension MainViewController {
             }
         }
         
-        
-        
-        
+        if UserDefaultsRepository.alertBatteryActive.value {
+            let currentBatteryLevel = UserDefaultsRepository.deviceBatteryLevel.value
+            let alertAtBatteryLevel = Double(UserDefaultsRepository.alertBatteryLevel.value)
+            
+            if currentBatteryLevel <= alertAtBatteryLevel {
+                AlarmSound.whichAlarm = "Low Battery"
+
+                if UserDefaultsRepository.alertBatteryRepeat.value { numLoops = -1 }
+                triggerAlarm(sound: UserDefaultsRepository.alertBatterySound.value, snooozedBGReadingTime: nil, overrideVolume: UserDefaultsRepository.overrideSystemOutputVolume.value, numLoops: numLoops, snoozeTime: 1, snoozeIncrement: 1, audio: true)
+                return
+            }
+        }
+
         // still send persistent notification if no alarms trigger and persistent notification is on
         persistentNotification(bgTime: currentBGTime)
         
@@ -757,7 +767,12 @@ extension MainViewController {
 
         }
         
-        
+        if date > UserDefaultsRepository.alertBatterySnoozedTime.value ?? date {
+            UserDefaultsRepository.alertBatterySnoozedTime.setNil(key: "alertBatterySnoozedTime")
+            UserDefaultsRepository.alertBatteryIsSnoozed.value = false
+            alarms.reloadSnoozeTime(key: "alertBatterySnoozedTime", setNil: true)
+            alarms.reloadIsSnoozed(key: "alertBatteryIsSnoozed", value: false)
+        }
       }
     
     func checkQuietHours() {

+ 1 - 0
LoopFollow/Controllers/NightScout.swift

@@ -514,6 +514,7 @@ extension MainViewController {
                 if let uploader = lastDeviceStatus?["uploader"] as? [String:AnyObject] {
                     let upbat = uploader["battery"] as! Double
                     tableData[4].value = String(format:"%.0f", upbat) + "%"
+                    UserDefaultsRepository.deviceBatteryLevel.value = upbat
                 }
             }
         }

+ 52 - 1
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -339,7 +339,7 @@ class AlarmViewController: FormViewController {
         
         <<< SegmentedRow<String>("otherAlerts3"){ row in
                 row.title = ""
-                row.options = ["IOB", "COB"]
+                row.options = ["IOB", "COB", "Battery"]
                 if UserDefaultsRepository.url.value == "" {
                     row.hidden = true
                 }
@@ -389,6 +389,7 @@ class AlarmViewController: FormViewController {
         
         buildIOB()
         buildCOB()
+        buildBatteryAlarm()
         
         buildSnoozeAll()
         buildAlarmSettings()
@@ -3178,6 +3179,56 @@ class AlarmViewController: FormViewController {
         }
     }
 
+    func buildBatteryAlarm(){
+        form
+        +++ Section(header: "Battery Alarm", footer: "Activates a notification alert whenever the battery level drops below a user-defined threshold, allowing for proactive device charging and power management.") { row in
+            row.hidden = "$otherAlerts3 != 'Battery'"
+        }
+        <<< SwitchRow("alertBatteryActive"){ row in
+            row.title = "Active"
+            row.value = UserDefaultsRepository.alertBatteryActive.value
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+            UserDefaultsRepository.alertBatteryActive.value = value
+        }
+        <<< StepperRow("alertBatteryLevel") { row in
+            row.title = "Battery Level"
+            row.cell.stepper.stepValue = 5
+            row.cell.stepper.minimumValue = 0
+            row.cell.stepper.maximumValue = 100
+            row.value = Double(UserDefaultsRepository.alertBatteryLevel.value)
+            row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                return "\(Int(value))%"
+            }
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+            UserDefaultsRepository.alertBatteryLevel.value = Int(value)
+        }
+        <<< PickerInputRow<String>("alertBatterySound") { row in
+            row.title = "Sound"
+            row.options = soundFiles
+            row.value = UserDefaultsRepository.alertBatterySound.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.alertBatterySound.value = value
+            AlarmSound.setSoundFile(str: value)
+            AlarmSound.stop()
+            AlarmSound.playTest()
+        }
+        <<< SwitchRow("alertBatteryRepeat"){ row in
+            row.title = "Repeat Sound"
+            row.value = UserDefaultsRepository.alertBatteryRepeat.value
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+            UserDefaultsRepository.alertBatteryRepeat.value = value
+        }
+    }
+    
     func buildAlarmSettings() {
            form
             +++ Section(header: "Alarm Settings", footer: "")

+ 6 - 0
LoopFollow/ViewControllers/SnoozeViewController.swift

@@ -215,6 +215,12 @@ class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
         guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
         alarms.reloadIsSnoozed(key: "alertCOBIsSnoozed", value: true)
         alarms.reloadSnoozeTime(key: "alertCOBSnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60 * 60)))
+       } else if AlarmSound.whichAlarm == "Battery Alarm" {
+           UserDefaultsRepository.alertBatteryIsSnoozed.value = true
+           UserDefaultsRepository.alertBatterySnoozedTime.value = Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60))
+           guard let alarms = self.tabBarController!.viewControllers?[1] as? AlarmViewController else { return }
+           alarms.reloadIsSnoozed(key: "alertBatteryIsSnoozed", value: true)
+           alarms.reloadSnoozeTime(key: "alertBatterySnoozedTime", setNil: false, value: Date().addingTimeInterval(TimeInterval(snoozeForMinuteStepper.value * 60)))
        }
     }
     

+ 12 - 3
LoopFollow/repository/UserDefaults.swift

@@ -16,7 +16,7 @@ import Foundation
 import UIKit
 
 class UserDefaultsRepository {
-
+    
     // DisplayValues total
     static let infoDataTotal = UserDefaultsValue<Int>(key: "infoDataTotal", default: 0)
     static let infoNames = UserDefaultsValue<[String]>(key: "infoNames", default: [
@@ -84,7 +84,7 @@ class UserDefaultsRepository {
         default: UIApplication.shared.isIdleTimerDisabled,
         onChange: { screenlock in
             UIApplication.shared.isIdleTimerDisabled = screenlock
-    })
+        })
     
     // Advanced Settings
     //static let onlyDownloadBG = UserDefaultsValue<Bool>(key: "onlyDownloadBG", default: false)
@@ -98,7 +98,7 @@ class UserDefaultsRepository {
     static let alwaysDownloadAllBG = UserDefaultsValue<Bool>(key: "alwaysDownloadAllBG", default: true)
     static let bgUpdateDelay = UserDefaultsValue<Int>(key: "bgUpdateDelay", default: 10)
     static let downloadDays = UserDefaultsValue<Int>(key: "downloadDays", default: 1)
-
+    
     
     // Watch Calendar Settings
     static let calendarIdentifier = UserDefaultsValue<String>(key: "calendarIdentifier", default: "")
@@ -429,4 +429,13 @@ class UserDefaultsRepository {
     static let alertCOBAutosnooze = UserDefaultsValue<String>(key: "alertCOBAutosnooze", default: "Never")
     static let alertCOBAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertCOBAutosnoozeDay", default: false)
     static let alertCOBAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertCOBAutosnoozeNight", default: false)
+    
+    static let alertBatteryActive = UserDefaultsValue<Bool>(key: "alertBatteryActive", default: false)
+    static let alertBatteryLevel = UserDefaultsValue<Int>(key: "alertBatteryLevel", default: 20)
+    static let alertBatterySound = UserDefaultsValue<String>(key: "alertBatterySound", default: "Machine_Charge")
+    static let alertBatteryRepeat = UserDefaultsValue<Bool>(key: "alertBatteryRepeat", default: false)    
+    static let alertBatteryIsSnoozed = UserDefaultsValue<Bool>(key: "alertBatteryIsSnoozed", default: false)
+    static let alertBatterySnoozedTime = UserDefaultsValue<Date?>(key: "alertBatterySnoozedTime", default: nil)
+    static let alertBatterySnoozeHours = UserDefaultsValue<Int>(key: "alertBatterySnoozeHours", default: 1)
+    static var deviceBatteryLevel: UserDefaultsValue<Double> = UserDefaultsValue(key: "deviceBatteryLevel", default: 100.0)
 }