Skip to content

Commit 70fdf18

Browse files
authored
COASTAL-1076 Support PumpManagerUI pausing onboarding (#533)
* Prevent marking onboarding as finished when pausing * Update comment for clarity
1 parent fa49d3a commit 70fdf18

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

Loop/Managers/DeviceDataManager.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,10 @@ extension DeviceDataManager: PumpManagerOnboardingDelegate {
11371137
self.settingsManager.storeSettings()
11381138
}
11391139
}
1140+
1141+
func pumpManagerOnboarding(didPauseOnboarding pumpManager: PumpManagerUI) {
1142+
1143+
}
11401144
}
11411145

11421146
// MARK: - AlertStoreDelegate

Loop/Managers/OnboardingManager.swift

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// Copyright © 2021 LoopKit Authors. All rights reserved.
77
//
88

9+
import os.log
910
import HealthKit
1011
import LoopKit
1112
import LoopKitUI
@@ -19,6 +20,8 @@ class OnboardingManager {
1920
private weak var windowProvider: WindowProvider?
2021
private let userDefaults: UserDefaults
2122

23+
private let log = OSLog(category: "OnboardingManager")
24+
2225
@Published public private(set) var isSuspended: Bool {
2326
didSet { userDefaults.onboardingManagerIsSuspended = isSuspended }
2427
}
@@ -33,7 +36,7 @@ class OnboardingManager {
3336
didSet { userDefaults.onboardingManagerActiveOnboardingRawValue = activeOnboarding?.rawValue }
3437
}
3538

36-
private var completion: (() -> Void)?
39+
private var onboardingCompletion: (() -> Void)?
3740

3841
init(pluginManager: PluginManager, bluetoothProvider: BluetoothProvider, deviceDataManager: DeviceDataManager, servicesManager: ServicesManager, loopDataManager: LoopDataManager, windowProvider: WindowProvider?, userDefaults: UserDefaults = .standard) {
3942
self.pluginManager = pluginManager
@@ -60,17 +63,17 @@ class OnboardingManager {
6063

6164
func launch(_ completion: @escaping () -> Void) {
6265
dispatchPrecondition(condition: .onQueue(.main))
63-
precondition(self.completion == nil)
66+
precondition(self.onboardingCompletion == nil)
6467

65-
self.completion = completion
68+
self.onboardingCompletion = completion
6669
continueOnboarding()
6770
}
6871

6972
func resume() {
7073
dispatchPrecondition(condition: .onQueue(.main))
71-
precondition(self.completion == nil)
74+
precondition(self.onboardingCompletion == nil)
7275

73-
self.completion = {
76+
self.onboardingCompletion = {
7477
self.windowProvider?.window?.rootViewController?.dismiss(animated: true, completion: nil)
7578
}
7679
continueOnboarding(allowResume: true)
@@ -204,8 +207,8 @@ class OnboardingManager {
204207
private func complete() {
205208
dispatchPrecondition(condition: .onQueue(.main))
206209

207-
if let completion = completion {
208-
self.completion = nil
210+
if let completion = onboardingCompletion {
211+
self.onboardingCompletion = nil
209212
completion()
210213
}
211214
}
@@ -256,6 +259,7 @@ extension OnboardingManager: OnboardingDelegate {
256259
}
257260

258261
func onboardingDidSuspend(_ onboarding: OnboardingUI) {
262+
log.debug("OnboardingUI %@ did suspend", onboarding.onboardingIdentifier)
259263
guard onboarding.onboardingIdentifier == activeOnboarding?.onboardingIdentifier else { return }
260264
self.isSuspended = true
261265
}
@@ -266,7 +270,20 @@ extension OnboardingManager: OnboardingDelegate {
266270
extension OnboardingManager: CompletionDelegate {
267271
func completionNotifyingDidComplete(_ object: CompletionNotifying) {
268272
DispatchQueue.main.async {
269-
self.completeActiveOnboarding()
273+
guard let activeOnboarding = self.activeOnboarding else {
274+
return
275+
}
276+
277+
self.log.debug("completionNotifyingDidComplete during activeOnboarding", activeOnboarding.onboardingIdentifier)
278+
279+
// The `completionNotifyingDidComplete` callback can be called by an onboarding plugin to signal that the user is done with
280+
// the onboarding UI, like when pausing, so the onboarding UI can be dismissed. This doesn't necessarily mean that the
281+
// onboarding is finished/complete. So we check to see if onboarding is finished here before calling `completeActiveOnboarding`
282+
if activeOnboarding.isOnboarded {
283+
self.completeActiveOnboarding()
284+
}
285+
286+
self.complete()
270287
}
271288
}
272289
}

0 commit comments

Comments
 (0)