Skip to content

Commit 1fceff3

Browse files
author
Rick Pasetto
authored
New Settings: action sheets for adding new devices (#215)
* checkpoint * Remove SettingsUICoordinator (not ready yet) * Also change lookup * More refactoring to handle a pump-as-a-CGM * minor tweaks * minor tweaks * minor tweaks * PR Feedback * Move functions out of extension they don't belong in * Proposal addressing PR feedback with idea of using a shim
1 parent fd7ec7c commit 1fceff3

File tree

6 files changed

+183
-128
lines changed

6 files changed

+183
-128
lines changed

Loop/Extensions/UIAlertController.swift

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ extension UIAlertController {
4848
/// Initializes an action sheet-styled controller for selecting a PumpManager
4949
///
5050
/// - Parameters:
51-
/// - cgmManagers: An array of PumpManagers
51+
/// - pumpManagers: An array of available PumpManagers
5252
/// - selectionHandler: A closure to execute when a manager is selected
53-
/// - manager: The selected manager
53+
/// - identifier: Identifier of the selected PumpManager
5454
internal convenience init(pumpManagers: [AvailableDevice], selectionHandler: @escaping (_ identifier: String) -> Void) {
5555
self.init(
5656
title: NSLocalizedString("Add Pump", comment: "Action sheet title selecting Pump"),
@@ -72,34 +72,22 @@ extension UIAlertController {
7272
/// Initializes an action sheet-styled controller for selecting a CGMManager
7373
///
7474
/// - Parameters:
75-
/// - cgmManagers: An array of CGMManagers
76-
/// - pumpManager: A PumpManager/CGMManager combo instance
75+
/// - cgmManagers: An array of available CGMManagers
7776
/// - selectionHandler: A closure to execute when either a new CGMManager or the current PumpManager is selected
78-
/// - cgmManager: The selected CGMManager
79-
/// - pumpManager: The selected PumpManager
80-
internal convenience init(cgmManagers: [AvailableDevice], pumpManager: CGMManager?, selectionHandler: @escaping (_ identifier: String?, _ pumpManager: CGMManager?) -> Void) {
77+
/// - identifier: Identifier of the selected CGMManager
78+
internal convenience init(cgmManagers: [AvailableDevice], selectionHandler: @escaping (_ identifier: String) -> Void) {
8179
self.init(
8280
title: NSLocalizedString("Add CGM", comment: "Action sheet title selecting CGM"),
8381
message: nil,
8482
preferredStyle: .actionSheet
8583
)
8684

87-
if let pumpManager = pumpManager {
88-
addAction(UIAlertAction(
89-
title: pumpManager.localizedTitle,
90-
style: .default,
91-
handler: { (_) in
92-
selectionHandler(nil, pumpManager)
93-
}
94-
))
95-
}
96-
9785
for manager in cgmManagers {
9886
addAction(UIAlertAction(
9987
title: manager.localizedTitle,
10088
style: .default,
10189
handler: { (_) in
102-
selectionHandler(manager.identifier, nil)
90+
selectionHandler(manager.identifier)
10391
}
10492
))
10593
}

Loop/Managers/DeviceDataManager.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,29 @@ final class DeviceDataManager {
322322

323323

324324
var availableCGMManagers: [AvailableDevice] {
325-
return pluginManager.availableCGMManagers + availableStaticCGMManagers
325+
var availableCGMManagers = pluginManager.availableCGMManagers + availableStaticCGMManagers
326+
if let pumpManagerAsCGMManager = pumpManager as? CGMManager {
327+
availableCGMManagers.append(AvailableDevice(identifier: pumpManagerAsCGMManager.managerIdentifier, localizedTitle: pumpManagerAsCGMManager.localizedTitle))
328+
}
329+
return availableCGMManagers
326330
}
327331

328332
public func cgmManagerTypeByIdentifier(_ identifier: String) -> CGMManagerUI.Type? {
329333
return pluginManager.getCGMManagerTypeByIdentifier(identifier) ?? staticCGMManagersByIdentifier[identifier] as? CGMManagerUI.Type
330334
}
331-
335+
336+
public typealias SetupCGMCompletion = (CGMManager?) -> Void
337+
public func maybeSetupCGMManager(_ identifier: String, setupClosure: (CGMManagerUI.Type, @escaping SetupCGMCompletion) -> Void) {
338+
if identifier == pumpManager?.managerIdentifier, let cgmManager = pumpManager as? CGMManager {
339+
// We have a pump that is a CGM!
340+
self.cgmManager = cgmManager
341+
} else if let cgmManagerType = cgmManagerTypeByIdentifier(identifier) {
342+
setupClosure(cgmManagerType) {
343+
self.cgmManager = $0
344+
}
345+
}
346+
}
347+
332348
private func cgmManagerTypeFromRawValue(_ rawValue: [String: Any]) -> CGMManager.Type? {
333349
guard let managerIdentifier = rawValue["managerIdentifier"] as? String else {
334350
return nil

Loop/View Controllers/SettingsTableViewController.swift

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -671,19 +671,12 @@ final class SettingsTableViewController: UITableViewController, IdentifiableClas
671671

672672
switch pumpManagers.count {
673673
case 1:
674-
if let pumpManager = pumpManagers.first, let PumpManagerType = dataManager.pumpManagerTypeByIdentifier(pumpManager.identifier) {
675-
676-
let setupViewController = configuredSetupViewController(for: PumpManagerType)
677-
present(setupViewController, animated: true, completion: nil)
678-
}
674+
setupPumpManager(identifier: pumpManagers.first!.identifier)
679675
completion?()
680676
case let x where x > 1:
681677
let alert = UIAlertController(pumpManagers: pumpManagers) { [weak self] (identifier) in
682-
if let self = self, let manager = self.dataManager.pumpManagerTypeByIdentifier(identifier) {
683-
let setupViewController = self.configuredSetupViewController(for: manager)
684-
self.present(setupViewController, animated: true, completion: nil)
685-
completion?()
686-
}
678+
self?.setupPumpManager(identifier: identifier)
679+
completion?()
687680
}
688681

689682
alert.addCancelAction { (_) in
@@ -697,6 +690,13 @@ final class SettingsTableViewController: UITableViewController, IdentifiableClas
697690
}
698691
}
699692

693+
private func setupPumpManager(identifier: String) {
694+
if let manager = self.dataManager.pumpManagerTypeByIdentifier(identifier) {
695+
let setupViewController = self.configuredSetupViewController(for: manager)
696+
self.present(setupViewController, animated: true, completion: nil)
697+
}
698+
}
699+
700700
private func didSelectCGM(completion: (() -> Void)? = nil) {
701701
if let cgmManager = dataManager.cgmManager as? CGMManagerUI {
702702
if let unit = dataManager.glucoseStore.preferredUnit {
@@ -722,23 +722,11 @@ final class SettingsTableViewController: UITableViewController, IdentifiableClas
722722

723723
switch cgmManagers.count {
724724
case 1:
725-
if let cgmManager = cgmManagers.first, let CGMManagerType = dataManager.cgmManagerTypeByIdentifier(cgmManager.identifier) {
726-
setupCGMManager(CGMManagerType)
727-
}
728-
725+
setupCGMManager(identifier: cgmManagers.first!.identifier)
729726
completion?()
730727
case let x where x > 1:
731-
let alert = UIAlertController(cgmManagers: cgmManagers, pumpManager: dataManager.pumpManager as? CGMManager) { [weak self] (identifier, pumpManager) in
732-
if let self = self {
733-
if let cgmManagerIdentifier = identifier, let cgmManagerType = self.dataManager.cgmManagerTypeByIdentifier(cgmManagerIdentifier) {
734-
self.setupCGMManager(cgmManagerType)
735-
} else if let pumpManager = pumpManager {
736-
self.completeCGMManagerSetup(pumpManager)
737-
} else {
738-
fatalError("Could not set up CGM")
739-
}
740-
}
741-
728+
let alert = UIAlertController(cgmManagers: cgmManagers) { [weak self] (identifier) in
729+
self?.setupCGMManager(identifier: identifier)
742730
completion?()
743731
}
744732

@@ -752,7 +740,7 @@ final class SettingsTableViewController: UITableViewController, IdentifiableClas
752740
}
753741
}
754742
}
755-
743+
756744
private func presentAlertPermissionsSettings(_ tableView: UITableView, _ indexPath: IndexPath) {
757745
let hostingController = DismissibleHostingController(
758746
rootView: NotificationsCriticalAlertPermissionsView(backButtonText: NSLocalizedString("Settings", comment: "Settings return button"),
@@ -766,20 +754,31 @@ final class SettingsTableViewController: UITableViewController, IdentifiableClas
766754

767755
private func presentTemporaryNewSettings(_ tableView: UITableView, _ indexPath: IndexPath) {
768756
let pumpViewModel = DeviceViewModel(
769-
deviceManagerUI: dataManager.pumpManager,
757+
image: dataManager.pumpManager?.smallImage,
758+
name: dataManager.pumpManager?.localizedTitle ?? "",
770759
isSetUp: dataManager.pumpManager != nil,
760+
availableDevices: dataManager.availablePumpManagers,
771761
deleteData: (dataManager.pumpManager is TestingPumpManager) ? { [weak self] in self?.dataManager.deleteTestingPumpData()
772762
} : nil,
773763
onTapped: { [weak self] in
774-
self?.didSelectPump()
764+
self?.didSelectPump()
765+
},
766+
didTapAddDevice: { [weak self] in
767+
self?.setupPumpManager(identifier: $0.identifier)
775768
})
769+
776770
let cgmViewModel = DeviceViewModel(
777-
deviceManagerUI: dataManager.cgmManager as? DeviceManagerUI,
771+
image: (dataManager.cgmManager as? DeviceManagerUI)?.smallImage,
772+
name: dataManager.cgmManager?.localizedTitle ?? "",
778773
isSetUp: dataManager.cgmManager != nil,
774+
availableDevices: dataManager.availableCGMManagers,
779775
deleteData: (dataManager.cgmManager is TestingCGMManager) ? { [weak self] in self?.dataManager.deleteTestingCGMData()
780776
} : nil,
781777
onTapped: { [weak self] in
782-
self?.didSelectCGM()
778+
self?.didSelectCGM()
779+
},
780+
didTapAddDevice: { [weak self] in
781+
self?.setupCGMManager(identifier: $0.identifier)
783782
})
784783
let pumpSupportedIncrements = dataManager.pumpManager.map {
785784
PumpSupportedIncrements(basalRates: $0.supportedBasalRates,
@@ -967,26 +966,36 @@ extension SettingsTableViewController: PumpManagerSetupViewControllerDelegate {
967966
}
968967
}
969968

969+
private class DelegateShim: CGMManagerSetupViewControllerDelegate {
970+
let completion: (CGMManager?) -> Void
971+
init(completion: @escaping (CGMManager?) -> Void) {
972+
self.completion = completion
973+
}
974+
func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController, didSetUpCGMManager cgmManager: CGMManagerUI) {
975+
self.completion(cgmManager)
976+
}
977+
}
970978

971979
extension SettingsTableViewController: CGMManagerSetupViewControllerDelegate {
972-
fileprivate func setupCGMManager(_ CGMManagerType: CGMManagerUI.Type) {
973-
if var setupViewController = CGMManagerType.setupViewController(glucoseTintColor: .glucoseTintColor, guidanceColors: .default) {
974-
setupViewController.setupDelegate = self
975-
setupViewController.completionDelegate = self
976-
present(setupViewController, animated: true, completion: nil)
977-
} else {
978-
completeCGMManagerSetup(CGMManagerType.init(rawState: [:]))
980+
fileprivate func setupCGMManager(identifier: String) {
981+
dataManager.maybeSetupCGMManager(identifier) { cgmManagerType, setupCompletion in
982+
if var setupViewController = cgmManagerType.setupViewController(glucoseTintColor: .glucoseTintColor, guidanceColors: .default) {
983+
let shim = DelegateShim {
984+
setupCompletion($0)
985+
self.updateSelectedDeviceManagerRows()
986+
}
987+
setupViewController.setupDelegate = shim
988+
setupViewController.completionDelegate = self
989+
present(setupViewController, animated: true, completion: nil)
990+
} else {
991+
setupCompletion(cgmManagerType.init(rawState: [:]))
992+
}
979993
}
980-
}
981-
982-
fileprivate func completeCGMManagerSetup(_ cgmManager: CGMManager?) {
983-
dataManager.cgmManager = cgmManager
984-
985994
updateSelectedDeviceManagerRows()
986995
}
987996

988997
func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController, didSetUpCGMManager cgmManager: CGMManagerUI) {
989-
completeCGMManagerSetup(cgmManager)
998+
updateSelectedDeviceManagerRows()
990999
}
9911000
}
9921001

Loop/View Controllers/StatusTableViewController.swift

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,22 +1332,10 @@ final class StatusTableViewController: LoopChartsTableViewController {
13321332

13331333
switch cgmManagers.count {
13341334
case 1:
1335-
if let cgmManager = cgmManagers.first,
1336-
let cgmManagerType = deviceManager.cgmManagerTypeByIdentifier(cgmManager.identifier)
1337-
{
1338-
setupCGMManager(for: cgmManagerType)
1339-
}
1335+
setupCGMManager(cgmManagers.first!.identifier)
13401336
default:
1341-
let alert = UIAlertController(cgmManagers: cgmManagers, pumpManager: deviceManager.pumpManager as? CGMManager) { [weak self] (identifier, pumpManager) in
1342-
if let strongSelf = self {
1343-
if let cgmManagerIdentifier = identifier,
1344-
let cgmManagerType = strongSelf.deviceManager.cgmManagerTypeByIdentifier(cgmManagerIdentifier)
1345-
{
1346-
strongSelf.setupCGMManager(for: cgmManagerType)
1347-
} else if let pumpManager = pumpManager {
1348-
strongSelf.deviceManager.cgmManager = pumpManager
1349-
}
1350-
}
1337+
let alert = UIAlertController(cgmManagers: cgmManagers) { [weak self] identifier in
1338+
self?.setupCGMManager(identifier)
13511339
}
13521340
alert.addCancelAction { _ in }
13531341
present(alert, animated: true, completion: nil)
@@ -1585,17 +1573,6 @@ extension StatusTableViewController: AddEditOverrideTableViewControllerDelegate
15851573
}
15861574

15871575
extension StatusTableViewController: CGMManagerSetupViewControllerDelegate {
1588-
fileprivate func setupCGMManager(for cgmManagerType: CGMManagerUI.Type) {
1589-
if var setupViewController = cgmManagerType.setupViewController(glucoseTintColor: .glucoseTintColor, guidanceColors: .default) {
1590-
setupViewController.setupDelegate = self
1591-
setupViewController.completionDelegate = self
1592-
present(setupViewController, animated: true, completion: nil)
1593-
} else {
1594-
// adds the CGM simulator
1595-
deviceManager.cgmManager = cgmManagerType.init(rawState: [:])
1596-
}
1597-
}
1598-
15991576
func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController,
16001577
didSetUpCGMManager cgmManager: CGMManagerUI)
16011578
{
@@ -1642,6 +1619,33 @@ extension StatusTableViewController: BluetoothStateManagerObserver {
16421619
}
16431620
}
16441621

1622+
private class DelegateShim: CGMManagerSetupViewControllerDelegate {
1623+
let completion: (CGMManager?) -> Void
1624+
init(completion: @escaping (CGMManager?) -> Void) {
1625+
self.completion = completion
1626+
}
1627+
func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController, didSetUpCGMManager cgmManager: CGMManagerUI) {
1628+
self.completion(cgmManager)
1629+
}
1630+
}
1631+
1632+
extension StatusTableViewController {
1633+
fileprivate func setupCGMManager(_ identifier: String) {
1634+
deviceManager.maybeSetupCGMManager(identifier) { cgmManagerType, setupCompletion in
1635+
if var setupViewController = cgmManagerType.setupViewController(glucoseTintColor: .glucoseTintColor, guidanceColors: .default) {
1636+
let shim = DelegateShim {
1637+
setupCompletion($0)
1638+
}
1639+
setupViewController.setupDelegate = shim
1640+
setupViewController.completionDelegate = self
1641+
present(setupViewController, animated: true, completion: nil)
1642+
} else {
1643+
setupCompletion(cgmManagerType.init(rawState: [:]))
1644+
}
1645+
}
1646+
}
1647+
}
1648+
16451649
fileprivate extension UIViewController {
16461650
/// Argumentless wrapper around `dismiss(animated:)` in order to pass as a selector
16471651
@objc func dismissWithAnimation() {

0 commit comments

Comments
 (0)