UserDefaults.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // LoopFollow
  2. // UserDefaults.swift
  3. // Created by Jon Fawcett on 2020-06-05.
  4. import Foundation
  5. import HealthKit
  6. import UIKit
  7. /*
  8. Legacy storage, we are moving away from this
  9. */
  10. class UserDefaultsRepository {
  11. static let infoSort = UserDefaultsValue<[Int]>(key: "infoSort", default: InfoType.allCases.map { $0.sortOrder })
  12. static let infoVisible = UserDefaultsValue<[Bool]>(key: "infoVisible", default: InfoType.allCases.map { $0.defaultVisible })
  13. static func synchronizeInfoTypes() {
  14. var sortArray = infoSort.value
  15. var visibleArray = infoVisible.value
  16. // Current valid indices based on InfoType
  17. let currentValidIndices = InfoType.allCases.map { $0.rawValue }
  18. // Add missing indices to sortArray
  19. for index in currentValidIndices {
  20. if !sortArray.contains(index) {
  21. sortArray.append(index)
  22. // print("Added missing index \(index) to sortArray")
  23. }
  24. }
  25. // Remove deprecated indices
  26. sortArray = sortArray.filter { currentValidIndices.contains($0) }
  27. // Ensure visibleArray is updated with new entries
  28. if visibleArray.count < currentValidIndices.count {
  29. for i in visibleArray.count ..< currentValidIndices.count {
  30. visibleArray.append(InfoType(rawValue: i)?.defaultVisible ?? false)
  31. // print("Added default visibility for new index \(i)")
  32. }
  33. }
  34. // Trim excess elements if there are more than needed
  35. if visibleArray.count > currentValidIndices.count {
  36. visibleArray = Array(visibleArray.prefix(currentValidIndices.count))
  37. // print("Trimmed visibleArray to match current valid indices")
  38. }
  39. infoSort.value = sortArray
  40. infoVisible.value = visibleArray
  41. }
  42. static let hideInfoTable = UserDefaultsValue<Bool>(key: "hideInfoTable", default: false)
  43. // Nightscout Settings
  44. static let token = UserDefaultsValue<String>(key: "token", default: "")
  45. static let units = UserDefaultsValue<String>(key: "units", default: "mg/dL")
  46. static func getPreferredUnit() -> HKUnit {
  47. let unitString = units.value
  48. switch unitString {
  49. case "mmol/L":
  50. return .millimolesPerLiter
  51. default:
  52. return .milligramsPerDeciliter
  53. }
  54. }
  55. static func setPreferredUnit(_ unit: HKUnit) {
  56. var unitString = "mg/dL"
  57. if unit == .millimolesPerLiter {
  58. unitString = "mmol/L"
  59. }
  60. units.value = unitString
  61. }
  62. // Dexcom Share Settings
  63. static let shareUserName = UserDefaultsValue<String>(key: "shareUserName", default: "")
  64. static let sharePassword = UserDefaultsValue<String>(key: "sharePassword", default: "")
  65. static let shareServer = UserDefaultsValue<String>(key: "shareServer", default: "US")
  66. // Graph Settings
  67. static let chartScaleX = UserDefaultsValue<Float>(key: "chartScaleX", default: 18.0)
  68. // Deprecated, used to detect if backgroundRefresh was set to off. TODO: Remove in the beginning of 2026
  69. static let backgroundRefresh = UserDefaultsValue<Bool>(key: "backgroundRefresh", default: true)
  70. // Advanced Settings
  71. static let downloadTreatments = UserDefaultsValue<Bool>(key: "downloadTreatments", default: true)
  72. static let downloadPrediction = UserDefaultsValue<Bool>(key: "downloadPrediction", default: true)
  73. static let graphOtherTreatments = UserDefaultsValue<Bool>(key: "graphOtherTreatments", default: true)
  74. static let graphBasal = UserDefaultsValue<Bool>(key: "graphBasal", default: true)
  75. static let graphBolus = UserDefaultsValue<Bool>(key: "graphBolus", default: true)
  76. static let graphCarbs = UserDefaultsValue<Bool>(key: "graphCarbs", default: true)
  77. static let bgUpdateDelay = UserDefaultsValue<Int>(key: "bgUpdateDelay", default: 10)
  78. static let alertCageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertCageInsertTime", default: 0)
  79. static let alertSageInsertTime = UserDefaultsValue<TimeInterval>(key: "alertSageInsertTime", default: 0)
  80. static let alertAppInactive = UserDefaultsValue<Bool>(key: "alertAppInactive", default: false)
  81. static let alertTemporaryActive = UserDefaultsValue<Bool>(key: "alertTemporaryActive", default: false)
  82. static let alertTemporaryBelow = UserDefaultsValue<Bool>(key: "alertTemporaryBelow", default: true)
  83. static let alertTemporaryBG = UserDefaultsValue<Float>(key: "alertTemporaryBG", default: 90.0)
  84. static let alertTemporaryBGRepeat = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeat", default: false)
  85. static let alertTemporaryBGAudible = UserDefaultsValue<Bool>(key: "alertTemporaryBGRepeatAudible", default: true)
  86. static let alertTemporarySound = UserDefaultsValue<String>(key: "alertTemporarySound", default: "Indeed")
  87. static let alertPump = UserDefaultsValue<Bool>(key: "alertPump", default: false)
  88. static let alertPumpAt = UserDefaultsValue<Int>(key: "alertPumpAt", default: 10) // Units
  89. static let alertPumpQuiet = UserDefaultsValue<Bool>(key: "alertPumpQuiet", default: false)
  90. static let alertPumpRepeat = UserDefaultsValue<String>(key: "alertPumpRepeat", default: "Never")
  91. static let alertPumpDayTime = UserDefaultsValue<Bool>(key: "alertPumpDayTime", default: false)
  92. static let alertPumpNightTime = UserDefaultsValue<Bool>(key: "alertPumpNightTime", default: false)
  93. static let alertPumpAudible = UserDefaultsValue<String>(key: "alertPumpAudible", default: "Always")
  94. static let alertPumpDayTimeAudible = UserDefaultsValue<Bool>(key: "alertPumpDayTimeAudible", default: true)
  95. static let alertPumpNightTimeAudible = UserDefaultsValue<Bool>(key: "alertPumpNightTimeAudible", default: true)
  96. static let alertPumpSound = UserDefaultsValue<String>(key: "alertPumpSound", default: "Marimba_Descend")
  97. static let alertPumpSnoozeHours = UserDefaultsValue<Int>(key: "alertPumpSnoozeHours", default: 5) // Hours
  98. static let alertPumpIsSnoozed = UserDefaultsValue<Bool>(key: "alertPumpIsSnoozed", default: false)
  99. static let alertPumpSnoozedTime = UserDefaultsValue<Date?>(key: "alertPumpSnoozedTime", default: nil)
  100. static let alertPumpAutosnooze = UserDefaultsValue<String>(key: "alertPumpAutosnooze", default: "Never")
  101. static let alertPumpAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertPumpAutosnoozeDay", default: false)
  102. static let alertPumpAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertPumpAutosnoozeNight", default: false)
  103. static let alertIOB = UserDefaultsValue<Bool>(key: "alertIOB", default: false)
  104. static let alertIOBAt = UserDefaultsValue<Double>(key: "alertIOBAt", default: 1.5) // Units
  105. static let alertIOBNumber = UserDefaultsValue<Int>(key: "alertIOBNumber", default: 3) // Number
  106. static let alertIOBBolusesWithin = UserDefaultsValue<Int>(key: "alertIOBBolusesWithin", default: 60) // Minutes
  107. static let alertIOBMaxBoluses = UserDefaultsValue<Int>(key: "alertIOBMaxBoluses", default: 10) // Units
  108. static let alertIOBQuiet = UserDefaultsValue<Bool>(key: "alertIOBQuiet", default: false)
  109. static let alertIOBRepeat = UserDefaultsValue<String>(key: "alertIOBRepeat", default: "Always")
  110. static let alertIOBDayTime = UserDefaultsValue<Bool>(key: "alertIOBDayTime", default: true)
  111. static let alertIOBNightTime = UserDefaultsValue<Bool>(key: "alertIOBNightTime", default: true)
  112. static let alertIOBAudible = UserDefaultsValue<String>(key: "alertIOBAudible", default: "Always")
  113. static let alertIOBDayTimeAudible = UserDefaultsValue<Bool>(key: "alertIOBDayTimeAudible", default: true)
  114. static let alertIOBNightTimeAudible = UserDefaultsValue<Bool>(key: "alertIOBNightTimeAudible", default: true)
  115. static let alertIOBSound = UserDefaultsValue<String>(key: "alertIOBSound", default: "Alert_Tone_Ringtone_1")
  116. static let alertIOBSnoozeHours = UserDefaultsValue<Int>(key: "alertIOBSnoozeHours", default: 1) // Hours
  117. static let alertIOBIsSnoozed = UserDefaultsValue<Bool>(key: "alertIOBIsSnoozed", default: false)
  118. static let alertIOBSnoozedTime = UserDefaultsValue<Date?>(key: "alertIOBSnoozedTime", default: nil)
  119. static let alertIOBAutosnooze = UserDefaultsValue<String>(key: "alertIOBAutosnooze", default: "Never")
  120. static let alertIOBAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertIOBAutosnoozeDay", default: false)
  121. static let alertIOBAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertIOBAutosnoozeNight", default: false)
  122. static let alertCOB = UserDefaultsValue<Bool>(key: "alertCOB", default: false)
  123. static let alertCOBAt = UserDefaultsValue<Int>(key: "alertCOBAt", default: 50) // Units
  124. static let alertCOBQuiet = UserDefaultsValue<Bool>(key: "alertCOBQuiet", default: false)
  125. static let alertCOBRepeat = UserDefaultsValue<String>(key: "alertCOBRepeat", default: "Always")
  126. static let alertCOBDayTime = UserDefaultsValue<Bool>(key: "alertCOBDayTime", default: true)
  127. static let alertCOBNightTime = UserDefaultsValue<Bool>(key: "alertCOBNightTime", default: true)
  128. static let alertCOBAudible = UserDefaultsValue<String>(key: "alertCOBAudible", default: "Always")
  129. static let alertCOBDayTimeAudible = UserDefaultsValue<Bool>(key: "alertCOBDayTimeAudible", default: true)
  130. static let alertCOBNightTimeAudible = UserDefaultsValue<Bool>(key: "alertCOBNightTimeAudible", default: true)
  131. static let alertCOBSound = UserDefaultsValue<String>(key: "alertCOBSound", default: "Alert_Tone_Ringtone_2")
  132. static let alertCOBSnoozeHours = UserDefaultsValue<Int>(key: "alertCOBSnoozeHours", default: 1) // Hours
  133. static let alertCOBIsSnoozed = UserDefaultsValue<Bool>(key: "alertCOBIsSnoozed", default: false)
  134. static let alertCOBSnoozedTime = UserDefaultsValue<Date?>(key: "alertCOBSnoozedTime", default: nil)
  135. static let alertCOBAutosnooze = UserDefaultsValue<String>(key: "alertCOBAutosnooze", default: "Never")
  136. static let alertCOBAutosnoozeDay = UserDefaultsValue<Bool>(key: "alertCOBAutosnoozeDay", default: false)
  137. static let alertCOBAutosnoozeNight = UserDefaultsValue<Bool>(key: "alertCOBAutosnoozeNight", default: false)
  138. static let alertBatteryActive = UserDefaultsValue<Bool>(key: "alertBatteryActive", default: false)
  139. static let alertBatteryLevel = UserDefaultsValue<Int>(key: "alertBatteryLevel", default: 25)
  140. static let alertBatterySound = UserDefaultsValue<String>(key: "alertBatterySound", default: "Machine_Charge")
  141. static let alertBatteryRepeat = UserDefaultsValue<Bool>(key: "alertBatteryRepeat", default: true)
  142. static let alertBatteryIsSnoozed = UserDefaultsValue<Bool>(key: "alertBatteryIsSnoozed", default: false)
  143. static let alertBatterySnoozedTime = UserDefaultsValue<Date?>(key: "alertBatterySnoozedTime", default: nil)
  144. static let alertBatterySnoozeHours = UserDefaultsValue<Int>(key: "alertBatterySnoozeHours", default: 1)
  145. static var deviceBatteryLevel: UserDefaultsValue<Double> = UserDefaultsValue(key: "deviceBatteryLevel", default: 100.0)
  146. static let alertBatteryDropActive = UserDefaultsValue<Bool>(key: "alertBatteryDropActive", default: false)
  147. static let alertBatteryDropPercentage = UserDefaultsValue<Int>(key: "alertBatteryDropPercentage", default: 5)
  148. static let alertBatteryDropPeriod = UserDefaultsValue<Int>(key: "alertBatteryDropPeriod", default: 15)
  149. static let alertBatteryDropSound = UserDefaultsValue<String>(key: "alertBatteryDropSound", default: "Machine_Charge")
  150. static let alertBatteryDropRepeat = UserDefaultsValue<Bool>(key: "alertBatteryDropRepeat", default: true)
  151. static let alertBatteryDropIsSnoozed = UserDefaultsValue<Bool>(key: "alertBatteryDropIsSnoozed", default: false)
  152. static let alertBatteryDropSnoozedTime = UserDefaultsValue<Date?>(key: "alertBatteryDropSnoozedTime", default: nil)
  153. static let alertBatteryDropSnoozeHours = UserDefaultsValue<Int>(key: "alertBatteryDropSnoozeHours", default: 1)
  154. static let alertRecBolusActive = UserDefaultsValue<Bool>(key: "alertRecBolusActive", default: false)
  155. static let alertRecBolusLevel = UserDefaultsValue<Double>(key: "alertRecBolusLevel", default: 1) // Unit[s]
  156. static let alertRecBolusSound = UserDefaultsValue<String>(key: "alertRecBolusSound", default: "Dhol_Shuffleloop")
  157. static let alertRecBolusRepeat = UserDefaultsValue<Bool>(key: "alertRecBolusRepeat", default: false)
  158. static let alertRecBolusIsSnoozed = UserDefaultsValue<Bool>(key: "alertRecBolusIsSnoozed", default: false)
  159. static let alertRecBolusSnooze = UserDefaultsValue<Int>(key: "alertRecBolusSnooze", default: 5)
  160. static let alertRecBolusSnoozedTime = UserDefaultsValue<Date?>(key: "alertRecBolusSnoozedTime", default: nil)
  161. static var deviceRecBolus: UserDefaultsValue<Double> = UserDefaultsValue(key: "deviceRecBolus", default: 0.0)
  162. // What version is the cache valid for
  163. static let cachedForVersion = UserDefaultsValue<String?>(key: "cachedForVersion", default: nil)
  164. // Caching of latest version
  165. static let latestVersion = UserDefaultsValue<String?>(key: "latestVersion", default: nil)
  166. static let latestVersionChecked = UserDefaultsValue<Date?>(key: "latestVersionChecked", default: nil)
  167. // Caching of blacklisted version
  168. static let currentVersionBlackListed = UserDefaultsValue<Bool>(key: "currentVersionBlackListed", default: false)
  169. // Tracking notifications to manage frequency
  170. static let lastBlacklistNotificationShown = UserDefaultsValue<Date?>(key: "lastBlacklistNotificationShown", default: nil)
  171. static let lastVersionUpdateNotificationShown = UserDefaultsValue<Date?>(key: "lastVersionUpdateNotificationShown", default: nil)
  172. // Tracking the last time the expiration notification was shown
  173. static let lastExpirationNotificationShown = UserDefaultsValue<Date?>(key: "lastExpirationNotificationShown", default: nil)
  174. }