GeneralSettingsViewController.swift 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //
  2. // GeneralSetingsViewController.swift
  3. // LoopFollow
  4. //
  5. // Created by Jose Paredes on 7/16/20.
  6. // Copyright © 2020 Jon Fawcett. All rights reserved.
  7. //
  8. import Foundation
  9. import Eureka
  10. import EventKit
  11. import EventKitUI
  12. class GeneralSettingsViewController: FormViewController {
  13. var appStateController: AppStateController?
  14. override func viewDidLoad() {
  15. super.viewDidLoad()
  16. if UserDefaultsRepository.forceDarkMode.value {
  17. overrideUserInterfaceStyle = .dark
  18. }
  19. buildGeneralSettings()
  20. // Register the GeneralSettingsViewController as an observer for the UIApplication.willEnterForegroundNotification, which will be triggered when the app enters the foreground. This helps ensure that the "Speak BG" switch in the General Settings is updated according to the current setting.
  21. NotificationCenter.default.addObserver(self, selector: #selector(handleAppWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
  22. }
  23. private func buildGeneralSettings() {
  24. form
  25. +++ Section("App Settings")
  26. <<< SwitchRow("appBadge"){ row in
  27. row.title = "Display App Badge"
  28. row.tag = "appBadge"
  29. row.value = UserDefaultsRepository.appBadge.value
  30. }.onChange { [weak self] row in
  31. guard let value = row.value else { return }
  32. UserDefaultsRepository.appBadge.value = value
  33. // Force main screen update
  34. //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  35. //mainScreen.nightscoutLoader(forceLoad: true)
  36. // set the appstate to indicate settings change and flags
  37. if let appState = self!.appStateController {
  38. appState.generalSettingsChanged = true
  39. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.appBadgeChange.rawValue
  40. }
  41. }
  42. <<< SwitchRow("backgroundRefresh"){ row in
  43. row.title = "Background Refresh"
  44. row.tag = "backgroundRefresh"
  45. row.value = UserDefaultsRepository.backgroundRefresh.value
  46. }.onChange { [weak self] row in
  47. guard let value = row.value else { return }
  48. UserDefaultsRepository.backgroundRefresh.value = value
  49. }
  50. <<< SwitchRow("persistentNotification") { row in
  51. row.title = "Persistent Notification"
  52. row.value = UserDefaultsRepository.persistentNotification.value
  53. }.onChange { [weak self] row in
  54. guard let value = row.value else { return }
  55. UserDefaultsRepository.persistentNotification.value = value
  56. }
  57. +++ Section("Display Settings")
  58. <<< SwitchRow("forceDarkMode") { row in
  59. row.title = "Force Dark Mode (Restart App)"
  60. row.value = UserDefaultsRepository.forceDarkMode.value
  61. }.onChange { [weak self] row in
  62. guard let value = row.value else { return }
  63. UserDefaultsRepository.forceDarkMode.value = value
  64. }
  65. <<< SwitchRow("showStats") { row in
  66. row.title = "Display Stats"
  67. row.value = UserDefaultsRepository.showStats.value
  68. }.onChange { [weak self] row in
  69. guard let value = row.value else { return }
  70. UserDefaultsRepository.showStats.value = value
  71. // set the appstate to indicate settings change and flags
  72. if let appState = self!.appStateController {
  73. appState.generalSettingsChanged = true
  74. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showStatsChange.rawValue
  75. }
  76. }
  77. <<< SwitchRow("useIFCC") { row in
  78. row.title = "Use IFCC A1C"
  79. row.value = UserDefaultsRepository.useIFCC.value
  80. }.onChange { [weak self] row in
  81. guard let value = row.value else { return }
  82. UserDefaultsRepository.useIFCC.value = value
  83. // set the appstate to indicate settings change and flags
  84. if let appState = self!.appStateController {
  85. appState.generalSettingsChanged = true
  86. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.useIFCCChange.rawValue
  87. }
  88. }
  89. <<< SwitchRow("showSmallGraph") { row in
  90. row.title = "Display Small Graph"
  91. row.value = UserDefaultsRepository.showSmallGraph.value
  92. }.onChange { [weak self] row in
  93. guard let value = row.value else { return }
  94. UserDefaultsRepository.showSmallGraph.value = value
  95. // set the appstate to indicate settings change and flags
  96. if let appState = self!.appStateController {
  97. appState.generalSettingsChanged = true
  98. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showSmallGraphChange.rawValue
  99. }
  100. }
  101. <<< SwitchRow("colorBGText") { row in
  102. row.title = "Color Main BG Text"
  103. row.value = UserDefaultsRepository.colorBGText.value
  104. }.onChange { [weak self] row in
  105. guard let value = row.value else { return }
  106. UserDefaultsRepository.colorBGText.value = value
  107. // Force main screen update
  108. //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
  109. //mainScreen.setBGTextColor()
  110. // set the appstate to indicate settings change and flags
  111. if let appState = self!.appStateController {
  112. appState.generalSettingsChanged = true
  113. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.colorBGTextChange.rawValue
  114. }
  115. }
  116. <<< SwitchRow("screenlockSwitchState") { row in
  117. row.title = "Keep Screen Active"
  118. row.value = UserDefaultsRepository.screenlockSwitchState.value
  119. }.onChange { [weak self] row in
  120. guard let value = row.value else { return }
  121. UserDefaultsRepository.screenlockSwitchState.value = value
  122. }
  123. <<< SwitchRow("speakBG"){ row in
  124. row.title = "Speak BG"
  125. row.value = UserDefaultsRepository.speakBG.value
  126. }.onChange { [weak self] row in
  127. guard let value = row.value else { return }
  128. UserDefaultsRepository.speakBG.value = value
  129. // Post a "toggleSpeakBG" notification whenever the "Speak BG" switch value changes in the General Settings. This allows the SceneDelegate to update the Home Screen Quick Action appearance and ensures consistency between the switch and the Quick Action.
  130. NotificationCenter.default.post(name: Notification.Name("toggleSpeakBG"), object: nil)
  131. }
  132. <<< SwitchRow("showDisplayName") { row in
  133. row.title = "Show Display Name"
  134. row.value = UserDefaultsRepository.showDisplayName.value
  135. }.onChange { [weak self] row in
  136. guard let value = row.value else { return }
  137. UserDefaultsRepository.showDisplayName.value = value
  138. if let appState = self!.appStateController {
  139. appState.generalSettingsChanged = true
  140. appState.generalSettingsChanges |= GeneralSettingsChangeEnum.showDisplayNameChange.rawValue
  141. }
  142. }
  143. +++ ButtonRow() {
  144. $0.title = "DONE"
  145. }.onCellSelection { (row, arg) in
  146. self.dismiss(animated:true, completion: nil)
  147. }
  148. }
  149. // Update the "Speak BG" SwitchRow value in the General Settings when the app enters the foreground. This ensures that the switch reflects the current setting in UserDefaultsRepository, even if it was changed using the Home Screen Quick Action while the app was in the background.
  150. @objc func handleAppWillEnterForeground() {
  151. if let row = self.form.rowBy(tag: "speakBG") as? SwitchRow {
  152. row.value = UserDefaultsRepository.speakBG.value
  153. row.updateCell()
  154. }
  155. }
  156. deinit {
  157. NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
  158. }
  159. }