Ivan Valkou 5 лет назад
Родитель
Сommit
991ee54f76

+ 4 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -123,6 +123,7 @@
 		38B17BED25DD987B005CAE3D /* NightscoutUploadKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17B1A25DD6BBE005CAE3D /* NightscoutUploadKit.framework */; };
 		38B17BEE25DD987B005CAE3D /* NightscoutUploadKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17B1A25DD6BBE005CAE3D /* NightscoutUploadKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		38B4F3AF25E2979F00E76A18 /* IndexedCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B4F3AE25E2979F00E76A18 /* IndexedCollection.swift */; };
+		38B4F3C325E2A20B00E76A18 /* PumpSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B4F3C225E2A20B00E76A18 /* PumpSetupView.swift */; };
 		38FE826A25CC82DB001FF17A /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FE826925CC82DB001FF17A /* NetworkService.swift */; };
 		38FE826D25CC8461001FF17A /* NightscoutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FE826C25CC8461001FF17A /* NightscoutAPI.swift */; };
 		45252C95D220E796FDB3B022 /* ConfigEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8A87AA037BD079BA3528BA /* ConfigEditorDataFlow.swift */; };
@@ -589,6 +590,7 @@
 		38B17AF925DD6BBD005CAE3D /* RileyLink.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RileyLink.xcodeproj; path = rileylink_ios/RileyLink.xcodeproj; sourceTree = "<group>"; };
 		38B17B6225DD8B5B005CAE3D /* DeviceDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceDataManager.swift; sourceTree = "<group>"; };
 		38B4F3AE25E2979F00E76A18 /* IndexedCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexedCollection.swift; sourceTree = "<group>"; };
+		38B4F3C225E2A20B00E76A18 /* PumpSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PumpSetupView.swift; sourceTree = "<group>"; };
 		38FE826925CC82DB001FF17A /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = "<group>"; };
 		38FE826C25CC8461001FF17A /* NightscoutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutAPI.swift; sourceTree = "<group>"; };
 		3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigProvider.swift; sourceTree = "<group>"; };
@@ -1147,6 +1149,7 @@
 			isa = PBXGroup;
 			children = (
 				2AD22C985B79A2F0D2EA3D9D /* PumpConfigRootView.swift */,
+				38B4F3C225E2A20B00E76A18 /* PumpSetupView.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -1540,6 +1543,7 @@
 				3811DF0C25CAAABD00A708ED /* APSManager.swift in Sources */,
 				3811DEB225C9D88300A708ED /* KeychainItemAccessibility.swift in Sources */,
 				3811DE6B25C9D62600A708ED /* OnboardingProvider.swift in Sources */,
+				38B4F3C325E2A20B00E76A18 /* PumpSetupView.swift in Sources */,
 				3811DEC225C9D99900A708ED /* SecurityContainer.swift in Sources */,
 				3895E4C625B9E00D00214B37 /* Preferences.swift in Sources */,
 				3811DE6E25C9D62600A708ED /* OnboardingViewModel.swift in Sources */,

+ 1 - 0
FreeAPS/Sources/APS/APSManager.swift

@@ -22,5 +22,6 @@ class RileyDisplayState: ObservableObject, Identifiable {
 
 protocol APSManager {
     var rileyDisplayStates: CurrentValueSubject<[RileyDisplayState], Never> { get }
+    var deviceProvider: RileyLinkDeviceProvider { get }
     func runTest()
 }

+ 4 - 0
FreeAPS/Sources/APS/BaseAPSManager.swift

@@ -11,6 +11,10 @@ final class BaseAPSManager: APSManager, Injectable {
 
     let rileyDisplayStates = CurrentValueSubject<[RileyDisplayState], Never>([])
 
+    var deviceProvider: RileyLinkDeviceProvider {
+        deviceDataManager.rileyLinkConnectionManager.deviceProvider
+    }
+
     private(set) var devices: [RileyLinkDevice] = [] {
         didSet {
             print("Devices: \(devices)")

+ 5 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigDataFlow.swift

@@ -2,6 +2,11 @@ import Combine
 
 enum PumpConfig {
     enum Config {}
+
+    enum PumpType: Equatable {
+        case minimed
+        case omnipod
+    }
 }
 
 protocol PumpConfigProvider: Provider {

+ 3 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigProvider.swift

@@ -1,9 +1,12 @@
 import Combine
+import RileyLinkBLEKit
 
 extension PumpConfig {
     final class Provider: BaseProvider, PumpConfigProvider {
         @Injected() var apsManager: APSManager!
 
+        var deviceProvider: RileyLinkDeviceProvider { apsManager.deviceProvider }
+
         func rileyDisplayStates() -> AnyPublisher<[RileyDisplayState], Never> {
             apsManager.rileyDisplayStates.eraseToAnyPublisher()
         }

+ 14 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigViewModel.swift

@@ -1,8 +1,11 @@
+import LoopKitUI
 import SwiftUI
 
 extension PumpConfig {
     class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: PumpConfigProvider {
         @Published var rileyDisplayStates: [RileyDisplayState] = []
+        @Published var setupPump = false
+        private(set) var setupPumpType: PumpType = .minimed
 
         override func subscribe() {
             provider.rileyDisplayStates()
@@ -10,5 +13,16 @@ extension PumpConfig {
                 .assign(to: \.rileyDisplayStates, on: self)
                 .store(in: &lifetime)
         }
+
+        func addPump(_ type: PumpType) {
+            setupPump = true
+            setupPumpType = type
+        }
+    }
+}
+
+extension PumpConfig.ViewModel: CompletionDelegate {
+    func completionNotifyingDidComplete(_: CompletionNotifying) {
+        setupPump = false
     }
 }

+ 10 - 2
FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift

@@ -19,13 +19,21 @@ extension PumpConfig {
                 }
 
                 Section(header: Text("Pump")) {
-                    Button("Add Medtronic") {}
-                    Button("Add Omnipod") {}
+                    Button("Add Medtronic") { viewModel.addPump(.minimed) }
+                    Button("Add Omnipod") { viewModel.addPump(.omnipod) }
                 }
             }
             .toolbar { ToolbarItem(placement: .principal) { Text("Pump Config") } }
             .navigationBarItems(leading: Button("Close", action: viewModel.hideModal))
             .navigationBarTitleDisplayMode(.inline)
+            .popover(isPresented: $viewModel.setupPump) {
+                PumpSetupView(
+                    pumpType: viewModel.setupPumpType,
+                    deviceProvider: viewModel.provider.deviceProvider,
+                    completionDelegate: viewModel,
+                    setupDelegate: nil
+                )
+            }
         }
     }
 }

+ 45 - 0
FreeAPS/Sources/Modules/PumpConfig/View/PumpSetupView.swift

@@ -0,0 +1,45 @@
+import LoopKit
+import LoopKitUI
+import MinimedKit
+import MinimedKitUI
+import OmniKitUI
+import RileyLinkBLEKit
+import RileyLinkKit
+import RileyLinkKitUI
+import SwiftUI
+import UIKit
+
+extension PumpConfig {
+    struct PumpSetupView: UIViewControllerRepresentable {
+        let pumpType: PumpType
+        let deviceProvider: RileyLinkDeviceProvider
+        weak var completionDelegate: CompletionDelegate?
+        weak var setupDelegate: PumpManagerSetupViewControllerDelegate?
+
+        func makeUIViewController(context _: UIViewControllerRepresentableContext<PumpSetupView>) -> UIViewController {
+            var setupViewController: PumpManagerSetupViewController & UIViewController & CompletionNotifying
+
+            switch pumpType {
+            case .minimed:
+                setupViewController = UIStoryboard(
+                    name: "MinimedPumpManager",
+                    bundle: Bundle(for: MinimedPumpManagerSetupViewController.self)
+                ).instantiateViewController(withIdentifier: "DevelopmentPumpSetup") as! MinimedPumpManagerSetupViewController
+            case .omnipod:
+                setupViewController = UIStoryboard(
+                    name: "OmnipodPumpManager",
+                    bundle: Bundle(for: OmnipodPumpManagerSetupViewController.self)
+                ).instantiateViewController(withIdentifier: "DevelopmentPumpSetup") as! OmnipodPumpManagerSetupViewController
+            }
+            if let rileyLinkManagerViewController = setupViewController as? RileyLinkManagerSetupViewController {
+                rileyLinkManagerViewController
+                    .rileyLinkPumpManager = RileyLinkPumpManager(rileyLinkDeviceProvider: deviceProvider)
+            }
+            setupViewController.setupDelegate = setupDelegate
+            setupViewController.completionDelegate = completionDelegate
+            return setupViewController
+        }
+
+        func updateUIViewController(_: UIViewController, context _: UIViewControllerRepresentableContext<PumpSetupView>) {}
+    }
+}