فهرست منبع

Fix for settings view controllers
Added AppState infrastructure

Jose Paredes 6 سال پیش
والد
کامیت
1bee26334f

+ 4 - 0
LoopFollow.xcodeproj/project.pbxproj

@@ -15,6 +15,7 @@
 		DDCF979824C1489C002C9752 /* GraphSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */; };
 		DDCF979A24C14DB4002C9752 /* WatchSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */; };
 		DDCF979C24C14EFB002C9752 /* DebugSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */; };
+		DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCF979D24C2382A002C9752 /* AppStateController.swift */; };
 		FC16A97A24996673003D6245 /* NightScout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97924996673003D6245 /* NightScout.swift */; };
 		FC16A97B249966A3003D6245 /* AlarmSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */; };
 		FC16A97D24996747003D6245 /* Alarms.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC16A97C24996747003D6245 /* Alarms.swift */; };
@@ -176,6 +177,7 @@
 		DDCF979724C1489C002C9752 /* GraphSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979924C14DB4002C9752 /* WatchSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSettingsViewController.swift; sourceTree = "<group>"; };
 		DDCF979B24C14EFB002C9752 /* DebugSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugSettingsViewController.swift; sourceTree = "<group>"; };
+		DDCF979D24C2382A002C9752 /* AppStateController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateController.swift; sourceTree = "<group>"; };
 		ECA3EFB4037410B4973BB632 /* Pods-LoopFollow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LoopFollow.debug.xcconfig"; path = "Target Support Files/Pods-LoopFollow/Pods-LoopFollow.debug.xcconfig"; sourceTree = "<group>"; };
 		FC16A97924996673003D6245 /* NightScout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightScout.swift; sourceTree = "<group>"; };
 		FC16A97C24996747003D6245 /* Alarms.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alarms.swift; sourceTree = "<group>"; };
@@ -387,6 +389,7 @@
 		FC16A9782499657E003D6245 /* Controllers */ = {
 			isa = PBXGroup;
 			children = (
+				DDCF979D24C2382A002C9752 /* AppStateController.swift */,
 				FC7CE589248ABEA3001F83B8 /* AlarmSound.swift */,
 				FC16A97924996673003D6245 /* NightScout.swift */,
 				FC16A97C24996747003D6245 /* Alarms.swift */,
@@ -853,6 +856,7 @@
 				FCC68850248935D800A0279D /* AlarmViewController.swift in Sources */,
 				FC7CE59F248D8D23001F83B8 /* SnoozeViewController.swift in Sources */,
 				FCC6886724898F8000A0279D /* UserDefaultsValue.swift in Sources */,
+				DDCF979E24C2382A002C9752 /* AppStateController.swift in Sources */,
 				FC97881E2485969B00A7906C /* NightScoutViewController.swift in Sources */,
 				DDCF979824C1489C002C9752 /* GraphSettingsViewController.swift in Sources */,
 				FC3AE7B5249E8E0E00AAE1E0 /* LoopFollow.xcdatamodeld in Sources */,

+ 8 - 7
LoopFollow/Application/AppDelegate.swift

@@ -16,7 +16,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
 
     var window: UIWindow?
     let notificationCenter = UNUserNotificationCenter.current()
-
+   
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
         // Override point for customization after application launch.
         
@@ -30,12 +30,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         }
         let store = EKEventStore()
         store.requestAccess(to: .event) {(granted, error) in
-        if !granted { return }
-            }
-         
-        return true
-    }
-    
+           if !granted { return }
+        }
+        
+         return true
+      }
+        
+   
     func applicationWillTerminate(_ application: UIApplication) {
         if UserDefaultsRepository.alertAppInactive.value {
             AlarmSound.setSoundFile(str: "Alarm_Buzzer")

+ 32 - 1
LoopFollow/Application/SceneDelegate.swift

@@ -12,12 +12,43 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 
     var window: UIWindow?
 
-
+    let appStateController = AppStateController()
+    
     func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
         // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
         // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
         // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
         guard let _ = (scene as? UIWindowScene) else { return }
+         
+        // get the tabBar
+        guard let tabBarController = window?.rootViewController as? UITabBarController,
+           let viewControllers = tabBarController.viewControllers
+        else {
+           return
+         }
+                  
+         // set the main controllers' connection to the app sate
+         // other controllers that need to know app state are setup programatically
+         for i in 0..<viewControllers.count {
+            if let vc = viewControllers[i] as? MainViewController {
+               vc.appStateController = appStateController
+            }
+            if let vc = viewControllers[i] as? NightscoutViewController {
+               vc.appStateController = appStateController
+            }
+            if let vc = viewControllers[i] as? SettingsViewController {
+               vc.appStateController = appStateController
+            }
+            if let vc = viewControllers[i] as? AlarmViewController {
+               vc.appStateController = appStateController
+            }
+            if let vc = viewControllers[i] as? SnoozeViewController {
+               vc.appStateController = appStateController
+            }
+            if let vc = viewControllers[i] as? debugViewController {
+               vc.appStateController = appStateController
+            }
+         }
     }
 
     func sceneDidDisconnect(_ scene: UIScene) {

+ 61 - 0
LoopFollow/Controllers/AppStateController.swift

@@ -0,0 +1,61 @@
+//
+//  AppStateController.swift
+//  LoopFollow
+//
+//  Created by Jose Paredes on 7/17/20.
+//  Copyright © 2020 Jon Fawcett. All rights reserved.
+//
+
+import Foundation
+
+// App Sate used used to changes to the app view controllers (Settings, for example)
+// Recommended way of utilizing is when viewVillAppear(..) is called,
+// look in the app state to see if further action must be t
+
+// Setup App States to comminicate between views
+
+// Graph Setup Flags
+enum ChartSettingsChangeEnum: Int {
+  case chartScaleXChanged = 1
+  case showDotsChanged = 2
+  case showLinesChanged = 4
+  case offsetCarbsBolusChanged = 8
+  case hoursToLoadChanged = 16
+  case predictionToLoadChanged = 32
+  case minBasalScaleChanged = 64
+  case minBGScaleChanged = 128
+  case minBGValueChanged = 256
+  case overrideDisplayLocationChanged = 512
+  case lowLineChanged = 1024
+  case highLineChanged = 2048
+}
+
+// General Settings Flags
+enum GeneralSettingsChangeEnum: Int { 
+   case colorBGTextChange = 1
+   case speakBGChange = 2
+   case backgroundRefreshFrequencyChange = 4
+   case backgroundRefreshChange = 8
+   case appBadgeChange = 16
+   case dimScreenWhenIdleChange = 32
+   case forceDarkModeChang = 64
+   case persistentNotificationChange = 128
+   case persistentNotificationLastBGTimeChange = 256
+   case screenlockSwitchStateChange = 512
+}
+
+class AppStateController {
+   
+   // add app states & methods here
+
+   // General Settings States
+   var generalSettingsChanged : Bool = false
+   var generalSettingsChanges : Int = 0
+
+   // Chart Settings State
+   var chartSettingsChanged : Bool = false // settings change has ocurred
+   var chartSettingsChanges: Int = 0      // what settings have changed
+   
+   // Info Data Settings State; no need for flags
+   var infoDataSettingsChanged: Bool = false
+}

+ 1 - 0
LoopFollow/ViewControllers/AlarmViewController.swift

@@ -11,6 +11,7 @@ import UIKit
 import Eureka
 
 class AlarmViewController: FormViewController {
+    var appStateController: AppStateController?
     
     var soundFiles: [String] = [
         "Alarm_Buzzer",

+ 13 - 0
LoopFollow/ViewControllers/AppStateViewController.swift

@@ -0,0 +1,13 @@
+//
+//  AppStateViewController.swift
+//  LoopFollow
+//
+//  Created by Jose Paredes on 7/17/20.
+//  Copyright © 2020 Jon Fawcett. All rights reserved.
+//
+
+import Foundation
+
+class AppStateViewController {
+   var appStateController: AppStateController?
+}

+ 3 - 0
LoopFollow/ViewControllers/DebugSettingsViewController.swift

@@ -12,6 +12,9 @@ import EventKit
 import EventKitUI
 
 class DebugSettingsViewController: FormViewController {
+
+   var appStateController: AppStateController?
+   
    override func viewDidLoad()  {
       super.viewDidLoad()
       if UserDefaultsRepository.forceDarkMode.value {

+ 2 - 0
LoopFollow/ViewControllers/DebugViewController.swift

@@ -14,6 +14,8 @@ class debugViewController: UIViewController {
     @IBOutlet weak var debugLogTextView: UITextView!
     @IBOutlet weak var clearButton: UIButton!
     
+    var appStateController: AppStateController?
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         debugLogTextView.isEditable = false

+ 22 - 6
LoopFollow/ViewControllers/GeneralSettingsViewController.swift

@@ -13,6 +13,8 @@ import EventKitUI
 
 class GeneralSettingsViewController: FormViewController {
    
+   var appStateController: AppStateController?
+   
    override func viewDidLoad()  {
       super.viewDidLoad()
       
@@ -30,17 +32,24 @@ class GeneralSettingsViewController: FormViewController {
         row.value = UserDefaultsRepository.colorBGText.value
         }.onChange { [weak self] row in
             guard let value = row.value else { return }
-                UserDefaultsRepository.colorBGText.value = value
+            UserDefaultsRepository.colorBGText.value = value
             // Force main screen update
-            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-            mainScreen.setBGTextColor()
+            //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            //mainScreen.setBGTextColor()
+            
+            // set the appstate to indicate settings change and flags
+            if let appState = self!.appStateController {
+              appState.generalSettingsChanged = true
+              appState.generalSettingsChanges |= GeneralSettingsChangeEnum.colorBGTextChange.rawValue
+           }
         }
         <<< SwitchRow("forceDarkMode") { row in
         row.title = "Force Dark Mode (Restart App)"
         row.value = UserDefaultsRepository.forceDarkMode.value
         }.onChange { [weak self] row in
             guard let value = row.value else { return }
-                UserDefaultsRepository.forceDarkMode.value = value
+            UserDefaultsRepository.forceDarkMode.value = value
+             
         }
         <<< SwitchRow("persistentNotification") { row in
         row.title = "Persistent Notification"
@@ -89,8 +98,15 @@ class GeneralSettingsViewController: FormViewController {
                     guard let value = row.value else { return }
                     UserDefaultsRepository.appBadge.value = value
                     // Force main screen update
-                    guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-                    mainScreen.nightscoutLoader(forceLoad: true)
+                    //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+                    //mainScreen.nightscoutLoader(forceLoad: true)
+                    
+           // set the appstate to indicate settings change and flags
+           if let appState = self!.appStateController {
+              appState.generalSettingsChanged = true
+              appState.generalSettingsChanges |= GeneralSettingsChangeEnum.appBadgeChange.rawValue
+           }
+           
         }
         <<< SwitchRow("speakBG"){ row in
             row.title = "Speak BG"

+ 47 - 11
LoopFollow/ViewControllers/GraphSettingsViewController.swift

@@ -12,13 +12,18 @@ import EventKit
 import EventKitUI
 
 class GraphSettingsViewController: FormViewController {
+
+   var appStateController: AppStateController?
+   
    override func viewDidLoad()  {
       super.viewDidLoad()
       if UserDefaultsRepository.forceDarkMode.value {
          overrideUserInterfaceStyle = .dark
       }
+ 
       buildGraphSettings()
    }
+   
     private func buildGraphSettings() {
         form
             +++ Section("Graph Settings")
@@ -30,8 +35,14 @@ class GraphSettingsViewController: FormViewController {
                     guard let value = row.value else { return }
                     UserDefaultsRepository.showDots.value = value
                 // Force main screen update
-                guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-                mainScreen.updateBGGraphSettings()
+                // guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+                // mainScreen.updateBGGraphSettings()
+                
+                // tell main screen that grap needs updating
+                if let appState = self!.appStateController {
+                   appState.chartSettingsChanged = true
+                   appState.chartSettingsChanges |= ChartSettingsChangeEnum.showDotsChanged.rawValue
+                }
             }
         <<< SwitchRow("switchRowLines"){ row in
             row.title = "Display Lines"
@@ -40,9 +51,14 @@ class GraphSettingsViewController: FormViewController {
                     guard let value = row.value else { return }
                     UserDefaultsRepository.showLines.value = value
             // Force main screen update
-            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-            mainScreen.updateBGGraphSettings()
-                    
+            //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            //mainScreen.updateBGGraphSettings()
+           
+            if let appState = self!.appStateController {
+               appState.chartSettingsChanged = true
+               appState.chartSettingsChanges |= ChartSettingsChangeEnum.showLinesChanged.rawValue
+             }
+               
         }
             <<< SwitchRow("offsetCarbsBolus"){ row in
                 row.title = "Offset Carb/Bolus Dots"
@@ -71,10 +87,12 @@ class GraphSettingsViewController: FormViewController {
             row.displayValueFor = { value in
                 guard let value = value else { return nil }
                 return bgUnits.toDisplayUnits(String(value))
+                
             }
         }.onChange { [weak self] row in
                 guard let value = row.value else { return }
                 UserDefaultsRepository.minBGScale.value = Float(value)
+                
             }
             <<< StepperRow("minBGValue") { row in
                 row.title = "Min BG Display"
@@ -90,8 +108,14 @@ class GraphSettingsViewController: FormViewController {
                 guard let value = row.value else { return }
                 UserDefaultsRepository.minBGValue.value = Float(value)
                 // Force main screen update
-                guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-                mainScreen.updateBGGraphSettings()
+                //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+                //mainScreen.updateBGGraphSettings()
+              
+                if let appState = self!.appStateController {
+                  appState.chartSettingsChanged = true
+                  appState.chartSettingsChanges |= ChartSettingsChangeEnum.minBGValueChanged.rawValue
+               }
+                
             }
         <<< StepperRow("minBasalScale") { row in
             row.title = "Min Basal Scale"
@@ -117,8 +141,14 @@ class GraphSettingsViewController: FormViewController {
                 guard let value = row.value else { return }
                 UserDefaultsRepository.lowLine.value = Float(value)
             // Force main screen update
-            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-            mainScreen.updateBGGraphSettings()
+            //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            //mainScreen.updateBGGraphSettings()
+            
+            // tell main screen to update
+            if let appState = self!.appStateController {
+               appState.chartSettingsChanged = true
+               appState.chartSettingsChanges |= ChartSettingsChangeEnum.lowLineChanged.rawValue
+             }
         }
         <<< StepperRow("highLine") { row in
             row.title = "High BG Display Value"
@@ -134,8 +164,14 @@ class GraphSettingsViewController: FormViewController {
                 guard let value = row.value else { return }
                 UserDefaultsRepository.highLine.value = Float(value)
             // Force main screen update
-            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
-            mainScreen.updateBGGraphSettings()
+            //guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            //mainScreen.updateBGGraphSettings()
+            
+            // let app state know of the change
+            if let appState = self!.appStateController {
+               appState.chartSettingsChanged = true
+               appState.chartSettingsChanges |= ChartSettingsChangeEnum.highLineChanged.rawValue
+             }
         }
         <<< StepperRow("overrideDisplayLocation") { row in
             row.title = "Override BG Location"

+ 14 - 8
LoopFollow/ViewControllers/InfoDisplaySettingsViewController.swift

@@ -12,7 +12,8 @@ import EventKit
 import EventKitUI
 
 class InfoDisplaySettingsViewController: FormViewController {
-
+    var appStateController: AppStateController?
+    
     var infoNames:   [String] = []
     var infoSort:    [Int]    = []
     var infoVisible: [Bool]   = []
@@ -88,6 +89,7 @@ class InfoDisplaySettingsViewController: FormViewController {
                  } else {
                     row.title = "\u{2001}\t\(self.infoNames[self.infoSort[i]])"
                  }
+                 self.appStateController!.infoDataSettingsChanged = true
               }
            }
        }
@@ -105,14 +107,18 @@ class InfoDisplaySettingsViewController: FormViewController {
         let destIndex = destinationIndexPath.row
         
         // new sort
-        let tmpVal = self.infoSort[sourceIndex]
-        self.infoSort.remove(at:sourceIndex)
-        self.infoSort.insert(tmpVal, at:destIndex)
+        if(destIndex != sourceIndex ) {
+           self.appStateController!.infoDataSettingsChanged = true
+           
+           let tmpVal = self.infoSort[sourceIndex]
+           self.infoSort.remove(at:sourceIndex)
+           self.infoSort.insert(tmpVal, at:destIndex)
        
-        // save to defaults
-        UserDefaults.standard.set(self.infoSort, forKey:InfoSort)
+           // save to defaults
+           UserDefaults.standard.set(self.infoSort, forKey:InfoSort)
+        }
         
-        print("Source Row: \(sourceIndexPath.row); Source Section: \(sourceIndexPath.section)")
-        print("Destination Row: \(destinationIndexPath.row); Destination Section: \(destinationIndexPath.section)")
+        //print("Source Row: \(sourceIndexPath.row); Source Section: \(sourceIndexPath.section)")
+        //print("Destination Row: \(destinationIndexPath.row); Destination Section: \(destinationIndexPath.section)")
     }
  }

+ 51 - 9
LoopFollow/ViewControllers/MainViewController.swift

@@ -58,6 +58,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             self.value = value
         }
     }
+    
+    var appStateController: AppStateController?
 
     // Variables for BG Charts
     public var numPoints: Int = 13
@@ -147,7 +149,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         infoTable.bounces = false
         infoTable.addBorder(toSide: .Left, withColor: UIColor.darkGray.cgColor, andThickness: 2)
       
-        // get the info table
+        // get the info table setup
         let userDefaults = UserDefaults.standard
 
         // names
@@ -162,8 +164,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         for i in 0..<self.infoNames.count {
             self.tableData.append(infoData(name:self.infoNames[i], value:""))
         }
+        createDerivedData()
       
-        // TODO: look for username and password in the UserDefaultsRepo ?
         // TODO: need non-us server ?
         let shareUserName = UserDefaultsRepository.shareUserName.value
         let sharePassword = UserDefaultsRepository.sharePassword.value
@@ -202,8 +204,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         let notificationCenter = NotificationCenter.default
             notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
             notificationCenter.addObserver(self, selector: #selector(appCameToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
-    
-        
+         
         // Setup the Graph
         if firstGraphLoad {
             createGraph()
@@ -223,9 +224,51 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         // set screen lock
         UIApplication.shared.isIdleTimerDisabled = UserDefaultsRepository.screenlockSwitchState.value;
         
-        // get the info table
+        // check the app state
+        // TODO: move to a function ?
+        if let appState = self.appStateController {
+        
+           if appState.chartSettingsChanged {
+              
+              // can look at settings flags to be more fine tuned
+              self.updateBGGraphSettings()
+              
+              // reset the app state
+              appState.chartSettingsChanged = false
+              appState.chartSettingsChanges = 0
+           }
+           if appState.generalSettingsChanged {
+           
+              // settings for appBadge changed
+              if appState.generalSettingsChanges & GeneralSettingsChangeEnum.appBadgeChange.rawValue != 0 {
+                 self.nightscoutLoader(forceLoad: true)
+              }
+              
+              // settings for textcolor changed
+              if appState.generalSettingsChanges & GeneralSettingsChangeEnum.colorBGTextChange.rawValue != 0 {
+                 self.setBGTextColor()
+              }
+              
+              // reset the app state
+              appState.generalSettingsChanged = false
+              appState.generalSettingsChanges = 0
+           }
+           if appState.infoDataSettingsChanged {
+              createDerivedData()
+              self.infoTable.reloadData()
+              
+              // reset
+              appState.infoDataSettingsChanged = false
+           }
+           
+           // add more processing of the app state
+        }
+    }
+    
+    private func createDerivedData() {
+      // get the info table
         let userDefaults = UserDefaults.standard
-
+         
         // sort
         self.infoSort = userDefaults.array(forKey:InfoSort) as? [Int] ?? [Int]()
         if(self.infoSort.count != self.infoNames.count) {
@@ -251,9 +294,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
                 self.derivedTableData.append(self.tableData[self.infoSort[i]])
             }
         }
-        infoTable.reloadData()
-    }
-    
+   }
+   
     // Info Table Functions
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         //return tableData.count

+ 1 - 0
LoopFollow/ViewControllers/NightScoutViewController.swift

@@ -15,6 +15,7 @@ class NightscoutViewController: UIViewController {
 
     @IBOutlet weak var webView: WKWebView!
     
+    var appStateController: AppStateController?
     
     override func viewDidLoad() {
         super.viewDidLoad()

+ 8 - 8
LoopFollow/ViewControllers/SettingsViewController.swift

@@ -13,7 +13,9 @@ import EventKitUI
 
 class SettingsViewController: FormViewController {
 
-    override func viewDidLoad() {
+   var appStateController: AppStateController?
+   
+   override func viewDidLoad() {
         super.viewDidLoad()
         if UserDefaultsRepository.forceDarkMode.value {
             overrideUserInterfaceStyle = .dark
@@ -97,36 +99,32 @@ class SettingsViewController: FormViewController {
         }
         
         +++ Section("App Settings")
-      
-        // +++ Section("General Settings")
         <<< ButtonRow() {
            $0.title = "General Settings"
            $0.presentationMode = .show(
                controllerProvider: .callback(builder: {
                   let controller = GeneralSettingsViewController()
+                  controller.appStateController = self.appStateController
                   return controller
                }
            ), onDismiss: nil)
-
-            
         }
-
-        // +++ Section("Graph Settings")
         <<< ButtonRow() {
            $0.title = "Graph Settings"
            $0.presentationMode = .show(
                controllerProvider: .callback(builder: {
                   let controller = GraphSettingsViewController()
+                  controller.appStateController = self.appStateController
                   return controller
                }
            ), onDismiss: nil)
         }
-          // +++ Section("Information Display Settings")
         <<< ButtonRow() {
            $0.title = "Information Display Settings"
            $0.presentationMode = .show(
                controllerProvider: .callback(builder: {
                   let controller = InfoDisplaySettingsViewController()
+                  controller.appStateController = self.appStateController
                   return controller
                }
            ), onDismiss: nil)
@@ -139,6 +137,7 @@ class SettingsViewController: FormViewController {
            $0.presentationMode = .show(
                controllerProvider: .callback(builder: {
                   let controller = WatchSettingsViewController()
+                  controller.appStateController = self.appStateController
                   return controller
                }
            ), onDismiss: nil)
@@ -151,6 +150,7 @@ class SettingsViewController: FormViewController {
            $0.presentationMode = .show(
                controllerProvider: .callback(builder: {
                   let controller = DebugSettingsViewController()
+                  controller.appStateController = self.appStateController
                   return controller
                }
            ), onDismiss: nil)

+ 1 - 1
LoopFollow/ViewControllers/SnoozeViewController.swift

@@ -11,7 +11,7 @@ import UserNotifications
 
 
 class SnoozeViewController: UIViewController, UNUserNotificationCenterDelegate {
-
+    var appStateController: AppStateController?
     var snoozeTabItem: UITabBarItem = UITabBarItem()
     var mainTabItem: UITabBarItem = UITabBarItem()
     

+ 3 - 0
LoopFollow/ViewControllers/WatchSettingsViewController.swift

@@ -12,6 +12,9 @@ import EventKit
 import EventKitUI
 
 class WatchSettingsViewController: FormViewController {
+
+   var appStateController: AppStateController?
+   
    override func viewDidLoad()  {
       super.viewDidLoad()
       if UserDefaultsRepository.forceDarkMode.value {

+ 2 - 2
LoopFollow/repository/UserDefaults.swift

@@ -14,12 +14,12 @@ class UserDefaultsRepository {
     // DisplayValues total
     static let infoDataTotal = UserDefaultsValue<Int>(key: "infoDataTotal", default: 0)
     
-    //Nightscout Settings
+    // Nightscout Settings
     static let url = UserDefaultsValue<String>(key: "url", default: "")
     static let token = UserDefaultsValue<String>(key: "token", default: "")
     static let units = UserDefaultsValue<String>(key: "units", default: "mg/dL")
     
-    //Dexcom Share Settings
+    // Dexcom Share Settings
     static let shareUserName = UserDefaultsValue<String>(key: "shareUserName", default: "")
     static let sharePassword = UserDefaultsValue<String>(key: "sharePassword", default: "")
     static let shareServer = UserDefaultsValue<String>(key: "shareServer", default: "US")