// LoopFollow // UserDefaults.swift // Created by Jon Fawcett on 2020-06-05. import Foundation import HealthKit import UIKit /* Legacy storage, we are moving away from this */ class UserDefaultsRepository { static let infoSort = UserDefaultsValue<[Int]>(key: "infoSort", default: InfoType.allCases.map { $0.sortOrder }) static let infoVisible = UserDefaultsValue<[Bool]>(key: "infoVisible", default: InfoType.allCases.map { $0.defaultVisible }) static func synchronizeInfoTypes() { var sortArray = infoSort.value var visibleArray = infoVisible.value // Current valid indices based on InfoType let currentValidIndices = InfoType.allCases.map { $0.rawValue } // Add missing indices to sortArray for index in currentValidIndices { if !sortArray.contains(index) { sortArray.append(index) // print("Added missing index \(index) to sortArray") } } // Remove deprecated indices sortArray = sortArray.filter { currentValidIndices.contains($0) } // Ensure visibleArray is updated with new entries if visibleArray.count < currentValidIndices.count { for i in visibleArray.count ..< currentValidIndices.count { visibleArray.append(InfoType(rawValue: i)?.defaultVisible ?? false) // print("Added default visibility for new index \(i)") } } // Trim excess elements if there are more than needed if visibleArray.count > currentValidIndices.count { visibleArray = Array(visibleArray.prefix(currentValidIndices.count)) // print("Trimmed visibleArray to match current valid indices") } infoSort.value = sortArray infoVisible.value = visibleArray } static let hideInfoTable = UserDefaultsValue(key: "hideInfoTable", default: false) // Nightscout Settings static let token = UserDefaultsValue(key: "token", default: "") static let units = UserDefaultsValue(key: "units", default: "mg/dL") static func getPreferredUnit() -> HKUnit { let unitString = units.value switch unitString { case "mmol/L": return .millimolesPerLiter default: return .milligramsPerDeciliter } } static func setPreferredUnit(_ unit: HKUnit) { var unitString = "mg/dL" if unit == .millimolesPerLiter { unitString = "mmol/L" } units.value = unitString } // Dexcom Share Settings static let shareUserName = UserDefaultsValue(key: "shareUserName", default: "") static let sharePassword = UserDefaultsValue(key: "sharePassword", default: "") static let shareServer = UserDefaultsValue(key: "shareServer", default: "US") // Graph Settings static let chartScaleX = UserDefaultsValue(key: "chartScaleX", default: 18.0) // Deprecated, used to detect if backgroundRefresh was set to off. TODO: Remove in the beginning of 2026 static let backgroundRefresh = UserDefaultsValue(key: "backgroundRefresh", default: true) // Advanced Settings static let downloadTreatments = UserDefaultsValue(key: "downloadTreatments", default: true) static let downloadPrediction = UserDefaultsValue(key: "downloadPrediction", default: true) static let graphOtherTreatments = UserDefaultsValue(key: "graphOtherTreatments", default: true) static let graphBasal = UserDefaultsValue(key: "graphBasal", default: true) static let graphBolus = UserDefaultsValue(key: "graphBolus", default: true) static let graphCarbs = UserDefaultsValue(key: "graphCarbs", default: true) static let bgUpdateDelay = UserDefaultsValue(key: "bgUpdateDelay", default: 10) static let alertCageInsertTime = UserDefaultsValue(key: "alertCageInsertTime", default: 0) static let alertSageInsertTime = UserDefaultsValue(key: "alertSageInsertTime", default: 0) static let alertTemporaryActive = UserDefaultsValue(key: "alertTemporaryActive", default: false) static let alertTemporaryBelow = UserDefaultsValue(key: "alertTemporaryBelow", default: true) static let alertTemporaryBG = UserDefaultsValue(key: "alertTemporaryBG", default: 90.0) static let alertTemporaryBGRepeat = UserDefaultsValue(key: "alertTemporaryBGRepeat", default: false) static let alertTemporaryBGAudible = UserDefaultsValue(key: "alertTemporaryBGRepeatAudible", default: true) static let alertTemporarySound = UserDefaultsValue(key: "alertTemporarySound", default: "Indeed") static let alertPump = UserDefaultsValue(key: "alertPump", default: false) static let alertPumpAt = UserDefaultsValue(key: "alertPumpAt", default: 10) // Units static let alertPumpQuiet = UserDefaultsValue(key: "alertPumpQuiet", default: false) static let alertPumpRepeat = UserDefaultsValue(key: "alertPumpRepeat", default: "Never") static let alertPumpDayTime = UserDefaultsValue(key: "alertPumpDayTime", default: false) static let alertPumpNightTime = UserDefaultsValue(key: "alertPumpNightTime", default: false) static let alertPumpAudible = UserDefaultsValue(key: "alertPumpAudible", default: "Always") static let alertPumpDayTimeAudible = UserDefaultsValue(key: "alertPumpDayTimeAudible", default: true) static let alertPumpNightTimeAudible = UserDefaultsValue(key: "alertPumpNightTimeAudible", default: true) static let alertPumpSound = UserDefaultsValue(key: "alertPumpSound", default: "Marimba_Descend") static let alertPumpSnoozeHours = UserDefaultsValue(key: "alertPumpSnoozeHours", default: 5) // Hours static let alertPumpIsSnoozed = UserDefaultsValue(key: "alertPumpIsSnoozed", default: false) static let alertPumpSnoozedTime = UserDefaultsValue(key: "alertPumpSnoozedTime", default: nil) static let alertPumpAutosnooze = UserDefaultsValue(key: "alertPumpAutosnooze", default: "Never") static let alertPumpAutosnoozeDay = UserDefaultsValue(key: "alertPumpAutosnoozeDay", default: false) static let alertPumpAutosnoozeNight = UserDefaultsValue(key: "alertPumpAutosnoozeNight", default: false) static let alertIOB = UserDefaultsValue(key: "alertIOB", default: false) static let alertIOBAt = UserDefaultsValue(key: "alertIOBAt", default: 1.5) // Units static let alertIOBNumber = UserDefaultsValue(key: "alertIOBNumber", default: 3) // Number static let alertIOBBolusesWithin = UserDefaultsValue(key: "alertIOBBolusesWithin", default: 60) // Minutes static let alertIOBMaxBoluses = UserDefaultsValue(key: "alertIOBMaxBoluses", default: 10) // Units static let alertIOBQuiet = UserDefaultsValue(key: "alertIOBQuiet", default: false) static let alertIOBRepeat = UserDefaultsValue(key: "alertIOBRepeat", default: "Always") static let alertIOBDayTime = UserDefaultsValue(key: "alertIOBDayTime", default: true) static let alertIOBNightTime = UserDefaultsValue(key: "alertIOBNightTime", default: true) static let alertIOBAudible = UserDefaultsValue(key: "alertIOBAudible", default: "Always") static let alertIOBDayTimeAudible = UserDefaultsValue(key: "alertIOBDayTimeAudible", default: true) static let alertIOBNightTimeAudible = UserDefaultsValue(key: "alertIOBNightTimeAudible", default: true) static let alertIOBSound = UserDefaultsValue(key: "alertIOBSound", default: "Alert_Tone_Ringtone_1") static let alertIOBSnoozeHours = UserDefaultsValue(key: "alertIOBSnoozeHours", default: 1) // Hours static let alertIOBIsSnoozed = UserDefaultsValue(key: "alertIOBIsSnoozed", default: false) static let alertIOBSnoozedTime = UserDefaultsValue(key: "alertIOBSnoozedTime", default: nil) static let alertIOBAutosnooze = UserDefaultsValue(key: "alertIOBAutosnooze", default: "Never") static let alertIOBAutosnoozeDay = UserDefaultsValue(key: "alertIOBAutosnoozeDay", default: false) static let alertIOBAutosnoozeNight = UserDefaultsValue(key: "alertIOBAutosnoozeNight", default: false) static let alertCOB = UserDefaultsValue(key: "alertCOB", default: false) static let alertCOBAt = UserDefaultsValue(key: "alertCOBAt", default: 50) // Units static let alertCOBQuiet = UserDefaultsValue(key: "alertCOBQuiet", default: false) static let alertCOBRepeat = UserDefaultsValue(key: "alertCOBRepeat", default: "Always") static let alertCOBDayTime = UserDefaultsValue(key: "alertCOBDayTime", default: true) static let alertCOBNightTime = UserDefaultsValue(key: "alertCOBNightTime", default: true) static let alertCOBAudible = UserDefaultsValue(key: "alertCOBAudible", default: "Always") static let alertCOBDayTimeAudible = UserDefaultsValue(key: "alertCOBDayTimeAudible", default: true) static let alertCOBNightTimeAudible = UserDefaultsValue(key: "alertCOBNightTimeAudible", default: true) static let alertCOBSound = UserDefaultsValue(key: "alertCOBSound", default: "Alert_Tone_Ringtone_2") static let alertCOBSnoozeHours = UserDefaultsValue(key: "alertCOBSnoozeHours", default: 1) // Hours static let alertCOBIsSnoozed = UserDefaultsValue(key: "alertCOBIsSnoozed", default: false) static let alertCOBSnoozedTime = UserDefaultsValue(key: "alertCOBSnoozedTime", default: nil) static let alertCOBAutosnooze = UserDefaultsValue(key: "alertCOBAutosnooze", default: "Never") static let alertCOBAutosnoozeDay = UserDefaultsValue(key: "alertCOBAutosnoozeDay", default: false) static let alertCOBAutosnoozeNight = UserDefaultsValue(key: "alertCOBAutosnoozeNight", default: false) static let alertBatteryActive = UserDefaultsValue(key: "alertBatteryActive", default: false) static let alertBatteryLevel = UserDefaultsValue(key: "alertBatteryLevel", default: 25) static let alertBatterySound = UserDefaultsValue(key: "alertBatterySound", default: "Machine_Charge") static let alertBatteryRepeat = UserDefaultsValue(key: "alertBatteryRepeat", default: true) static let alertBatteryIsSnoozed = UserDefaultsValue(key: "alertBatteryIsSnoozed", default: false) static let alertBatterySnoozedTime = UserDefaultsValue(key: "alertBatterySnoozedTime", default: nil) static let alertBatterySnoozeHours = UserDefaultsValue(key: "alertBatterySnoozeHours", default: 1) static var deviceBatteryLevel: UserDefaultsValue = UserDefaultsValue(key: "deviceBatteryLevel", default: 100.0) static let alertBatteryDropActive = UserDefaultsValue(key: "alertBatteryDropActive", default: false) static let alertBatteryDropPercentage = UserDefaultsValue(key: "alertBatteryDropPercentage", default: 5) static let alertBatteryDropPeriod = UserDefaultsValue(key: "alertBatteryDropPeriod", default: 15) static let alertBatteryDropSound = UserDefaultsValue(key: "alertBatteryDropSound", default: "Machine_Charge") static let alertBatteryDropRepeat = UserDefaultsValue(key: "alertBatteryDropRepeat", default: true) static let alertBatteryDropIsSnoozed = UserDefaultsValue(key: "alertBatteryDropIsSnoozed", default: false) static let alertBatteryDropSnoozedTime = UserDefaultsValue(key: "alertBatteryDropSnoozedTime", default: nil) static let alertBatteryDropSnoozeHours = UserDefaultsValue(key: "alertBatteryDropSnoozeHours", default: 1) static let alertRecBolusActive = UserDefaultsValue(key: "alertRecBolusActive", default: false) static let alertRecBolusLevel = UserDefaultsValue(key: "alertRecBolusLevel", default: 1) // Unit[s] static let alertRecBolusSound = UserDefaultsValue(key: "alertRecBolusSound", default: "Dhol_Shuffleloop") static let alertRecBolusRepeat = UserDefaultsValue(key: "alertRecBolusRepeat", default: false) static let alertRecBolusIsSnoozed = UserDefaultsValue(key: "alertRecBolusIsSnoozed", default: false) static let alertRecBolusSnooze = UserDefaultsValue(key: "alertRecBolusSnooze", default: 5) static let alertRecBolusSnoozedTime = UserDefaultsValue(key: "alertRecBolusSnoozedTime", default: nil) static var deviceRecBolus: UserDefaultsValue = UserDefaultsValue(key: "deviceRecBolus", default: 0.0) // What version is the cache valid for static let cachedForVersion = UserDefaultsValue(key: "cachedForVersion", default: nil) // Caching of latest version static let latestVersion = UserDefaultsValue(key: "latestVersion", default: nil) static let latestVersionChecked = UserDefaultsValue(key: "latestVersionChecked", default: nil) // Caching of blacklisted version static let currentVersionBlackListed = UserDefaultsValue(key: "currentVersionBlackListed", default: false) // Tracking notifications to manage frequency static let lastBlacklistNotificationShown = UserDefaultsValue(key: "lastBlacklistNotificationShown", default: nil) static let lastVersionUpdateNotificationShown = UserDefaultsValue(key: "lastVersionUpdateNotificationShown", default: nil) // Tracking the last time the expiration notification was shown static let lastExpirationNotificationShown = UserDefaultsValue(key: "lastExpirationNotificationShown", default: nil) }