6
6
// Copyright © 2021 LoopKit Authors. All rights reserved.
7
7
//
8
8
9
+ import os. log
9
10
import HealthKit
10
11
import LoopKit
11
12
import LoopKitUI
@@ -19,6 +20,8 @@ class OnboardingManager {
19
20
private weak var windowProvider : WindowProvider ?
20
21
private let userDefaults : UserDefaults
21
22
23
+ private let log = OSLog ( category: " OnboardingManager " )
24
+
22
25
@Published public private( set) var isSuspended : Bool {
23
26
didSet { userDefaults. onboardingManagerIsSuspended = isSuspended }
24
27
}
@@ -33,7 +36,7 @@ class OnboardingManager {
33
36
didSet { userDefaults. onboardingManagerActiveOnboardingRawValue = activeOnboarding? . rawValue }
34
37
}
35
38
36
- private var completion : ( ( ) -> Void ) ?
39
+ private var onboardingCompletion : ( ( ) -> Void ) ?
37
40
38
41
init ( pluginManager: PluginManager , bluetoothProvider: BluetoothProvider , deviceDataManager: DeviceDataManager , servicesManager: ServicesManager , loopDataManager: LoopDataManager , windowProvider: WindowProvider ? , userDefaults: UserDefaults = . standard) {
39
42
self . pluginManager = pluginManager
@@ -60,17 +63,17 @@ class OnboardingManager {
60
63
61
64
func launch( _ completion: @escaping ( ) -> Void ) {
62
65
dispatchPrecondition ( condition: . onQueue( . main) )
63
- precondition ( self . completion == nil )
66
+ precondition ( self . onboardingCompletion == nil )
64
67
65
- self . completion = completion
68
+ self . onboardingCompletion = completion
66
69
continueOnboarding ( )
67
70
}
68
71
69
72
func resume( ) {
70
73
dispatchPrecondition ( condition: . onQueue( . main) )
71
- precondition ( self . completion == nil )
74
+ precondition ( self . onboardingCompletion == nil )
72
75
73
- self . completion = {
76
+ self . onboardingCompletion = {
74
77
self . windowProvider? . window? . rootViewController? . dismiss ( animated: true , completion: nil )
75
78
}
76
79
continueOnboarding ( allowResume: true )
@@ -204,8 +207,8 @@ class OnboardingManager {
204
207
private func complete( ) {
205
208
dispatchPrecondition ( condition: . onQueue( . main) )
206
209
207
- if let completion = completion {
208
- self . completion = nil
210
+ if let completion = onboardingCompletion {
211
+ self . onboardingCompletion = nil
209
212
completion ( )
210
213
}
211
214
}
@@ -256,6 +259,7 @@ extension OnboardingManager: OnboardingDelegate {
256
259
}
257
260
258
261
func onboardingDidSuspend( _ onboarding: OnboardingUI ) {
262
+ log. debug ( " OnboardingUI %@ did suspend " , onboarding. onboardingIdentifier)
259
263
guard onboarding. onboardingIdentifier == activeOnboarding? . onboardingIdentifier else { return }
260
264
self . isSuspended = true
261
265
}
@@ -266,7 +270,20 @@ extension OnboardingManager: OnboardingDelegate {
266
270
extension OnboardingManager : CompletionDelegate {
267
271
func completionNotifyingDidComplete( _ object: CompletionNotifying ) {
268
272
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 ( )
270
287
}
271
288
}
272
289
}
0 commit comments