SettingsViewController.swift 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //
  2. // SettingsViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jon Fawcett on 6/3/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import UIKit
  9. import Eureka
  10. import EventKit
  11. import EventKitUI
  12. class SettingsViewController: FormViewController {
  13. struct cal {
  14. var title: String
  15. var identifier: String
  16. }
  17. override func viewDidLoad() {
  18. super.viewDidLoad()
  19. if UserDefaultsRepository.forceDarkMode.value {
  20. overrideUserInterfaceStyle = .dark
  21. }
  22. //array of calendars
  23. let store = EKEventStore()
  24. let ekCalendars = store.calendars(for: EKEntityType.event)
  25. var calendars: [cal] = []
  26. for i in 0..<ekCalendars.count{
  27. let item = cal(title: ekCalendars[i].title, identifier: ekCalendars[i].calendarIdentifier)
  28. calendars.append(item)
  29. }
  30. form +++ Section("Nightscout Settings")
  31. <<< TextRow(){ row in
  32. row.title = "URL"
  33. row.placeholder = "https://mycgm.herokuapp.com"
  34. row.value = UserDefaultsRepository.url.value
  35. }.onChange { row in
  36. guard let value = row.value else { return }
  37. UserDefaultsRepository.url.value = value.lowercased()
  38. }
  39. +++ Section("General Settings")
  40. <<< SwitchRow("forceDarkMode") { row in
  41. row.title = "Always Use Dark Mode (Restart App)"
  42. row.value = UserDefaultsRepository.forceDarkMode.value
  43. }.onChange { [weak self] row in
  44. guard let value = row.value else { return }
  45. if value {
  46. UserDefaultsRepository.forceDarkMode.value = value
  47. }
  48. }
  49. <<< SwitchRow("screenlockSwitchState") { row in
  50. row.title = "Keep Screen Active"
  51. row.value = UserDefaultsRepository.screenlockSwitchState.value
  52. }.onChange { [weak self] row in
  53. guard let value = row.value else { return }
  54. if value {
  55. UserDefaultsRepository.screenlockSwitchState.value = value
  56. }
  57. }
  58. <<< SwitchRow("backgroundRefresh"){ row in
  59. row.title = "Background Refresh"
  60. row.tag = "backgroundRefresh"
  61. row.value = UserDefaultsRepository.backgroundRefresh.value
  62. }.onChange { [weak self] row in
  63. guard let value = row.value else { return }
  64. UserDefaultsRepository.backgroundRefresh.value = value
  65. }
  66. <<< SliderRow() { row in
  67. row.title = "Refresh Minutes"
  68. row.tag = "backgroundRefreshFrequency"
  69. row.steps = 19
  70. row.value = Float(UserDefaultsRepository.backgroundRefreshFrequency.value)
  71. row.hidden = "$backgroundRefresh == false"
  72. }.cellSetup { cell, row in
  73. cell.slider.minimumValue = 0.5
  74. cell.slider.maximumValue = 10
  75. }
  76. <<< SwitchRow("appBadge"){ row in
  77. row.title = "Display App Badge"
  78. row.tag = "appBadge"
  79. row.value = UserDefaultsRepository.appBadge.value
  80. }.onChange { [weak self] row in
  81. guard let value = row.value else { return }
  82. UserDefaultsRepository.appBadge.value = value
  83. }
  84. +++ Section("Alarm Settings")
  85. <<< SwitchRow("overrideSystemOutputVolume"){ row in
  86. row.title = "Override System Volume"
  87. row.value = UserDefaultsRepository.overrideSystemOutputVolume.value
  88. }.onChange { [weak self] row in
  89. guard let value = row.value else { return }
  90. UserDefaultsRepository.overrideSystemOutputVolume.value = value
  91. }
  92. <<< StepperRow("forcedOutputVolume") { row in
  93. row.title = "Volume Level"
  94. row.cell.stepper.stepValue = 0.05
  95. row.cell.stepper.minimumValue = 0
  96. row.cell.stepper.maximumValue = 1
  97. row.value = Double(UserDefaultsRepository.forcedOutputVolume.value)
  98. row.hidden = "$overrideSystemOutputVolume == false"
  99. row.displayValueFor = { value in
  100. guard let value = value else { return nil }
  101. return "\(Int(value*100))%"
  102. }
  103. }.onChange { [weak self] row in
  104. guard let value = row.value else { return }
  105. UserDefaultsRepository.forcedOutputVolume.value = Float(value)
  106. }
  107. /* <<< StepperRow("fadeInTimeInterval") { row in
  108. row.title = "Fade-in Seconds"
  109. row.cell.stepper.stepValue = 5
  110. row.cell.stepper.minimumValue = 0
  111. row.cell.stepper.maximumValue = 60
  112. row.value = Double(UserDefaultsRepository.fadeInTimeInterval.value)
  113. row.displayValueFor = { value in
  114. guard let value = value else { return nil }
  115. return "\(Int(value))"
  116. }
  117. }.onChange { [weak self] row in
  118. guard let value = row.value else { return }
  119. UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value)
  120. }*/
  121. +++ Section("Graph Settings")
  122. <<< SwitchRow("switchRowDots"){ row in
  123. row.title = "Display Dots"
  124. row.value = UserDefaultsRepository.showDots.value
  125. }.onChange { [weak self] row in
  126. guard let value = row.value else { return }
  127. UserDefaultsRepository.showDots.value = value
  128. }
  129. <<< SwitchRow("switchRowLines"){ row in
  130. row.title = "Display Lines"
  131. row.value = UserDefaultsRepository.showLines.value
  132. }.onChange { [weak self] row in
  133. guard let value = row.value else { return }
  134. UserDefaultsRepository.showLines.value = value
  135. }
  136. <<< StepperRow("lowLine") { row in
  137. row.title = "Low BG Display Value"
  138. row.cell.stepper.stepValue = 1
  139. row.cell.stepper.minimumValue = 150
  140. row.cell.stepper.maximumValue = 400
  141. row.value = Double(UserDefaultsRepository.lowLine.value)
  142. row.displayValueFor = { value in
  143. guard let value = value else { return nil }
  144. return "\(Int(value))"
  145. }
  146. }.onChange { [weak self] row in
  147. guard let value = row.value else { return }
  148. UserDefaultsRepository.lowLine.value = Int(value)
  149. }
  150. <<< StepperRow("highLine") { row in
  151. row.title = "High BG Display Value"
  152. row.cell.stepper.stepValue = 1
  153. row.cell.stepper.minimumValue = 150
  154. row.cell.stepper.maximumValue = 400
  155. row.value = Double(UserDefaultsRepository.highLine.value)
  156. row.displayValueFor = { value in
  157. guard let value = value else { return nil }
  158. return "\(Int(value))"
  159. }
  160. }.onChange { [weak self] row in
  161. guard let value = row.value else { return }
  162. UserDefaultsRepository.highLine.value = Int(value)
  163. }
  164. +++ Section(header: "Watch Settings", footer: "Add the Apple calendar complication to your watch face for BG, Trend, Delta, COB, and IOB updated every 5 minutes. It is recommended to create a new calendar called 'Loop' and modify the calendar settings in the iPhone Watch App to only display the Loop calendar on your watch")
  165. <<< SwitchRow("writeCalendarEvent"){ row in
  166. row.title = "BG to Calendar"
  167. row.value = UserDefaultsRepository.writeCalendarEvent.value
  168. }.onChange { [weak self] row in
  169. guard let value = row.value else { return }
  170. UserDefaultsRepository.writeCalendarEvent.value = value
  171. }
  172. <<< PickerInputRow<String>("calendarIdentifier") { row in
  173. row.title = "Calendar"
  174. row.options = calendars.map { $0.identifier }
  175. row.hidden = "$writeCalendarEvent == false"
  176. row.value = UserDefaultsRepository.calendarIdentifier.value
  177. row.displayValueFor = { value in
  178. guard let value = value else { return nil }
  179. let matching = calendars
  180. .flatMap { $0 }
  181. .filter { $0.identifier.range(of: value) != nil || $0.title.range(of: value) != nil }
  182. if matching.count > 0 {
  183. return "\(String(matching[0].title))"
  184. } else {
  185. return " - "
  186. }
  187. }
  188. }.onChange { [weak self] row in
  189. guard let value = row.value else { return }
  190. UserDefaultsRepository.calendarIdentifier.value = value
  191. }
  192. }
  193. }