@@ -32,6 +32,10 @@ public extension AlertPresenter {
3232 func dismiss( animated: Bool ) { dismiss ( animated: animated, completion: nil ) }
3333}
3434
35+ protocol WindowProvider : AnyObject {
36+ var window : UIWindow ? { get }
37+ }
38+
3539class LoopAppManager : NSObject {
3640 private enum State : Int {
3741 case initialize
@@ -43,8 +47,8 @@ class LoopAppManager: NSObject {
4347 var next : State { State ( rawValue: rawValue + 1 ) ?? . launchComplete }
4448 }
4549
50+ private weak var windowProvider : WindowProvider ?
4651 private var launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ?
47- private var window : UIWindow ?
4852
4953 private var pluginManager : PluginManager !
5054 private var bluetoothStateManager : BluetoothStateManager !
@@ -60,18 +64,19 @@ class LoopAppManager: NSObject {
6064
6165 // MARK: - Initialization
6266
63- func initialize( with launchOptions: [ UIApplication . LaunchOptionsKey : Any ] ? ) {
67+ func initialize( windowProvider : WindowProvider , launchOptions: [ UIApplication . LaunchOptionsKey : Any ] ? ) {
6468 dispatchPrecondition ( condition: . onQueue( . main) )
6569 precondition ( state == . initialize)
6670
71+ self . windowProvider = windowProvider
6772 self . launchOptions = launchOptions
6873
6974 registerBackgroundTasks ( )
7075
7176 self . state = state. next
7277 }
7378
74- func launch( into window : UIWindow ? ) {
79+ func launch( ) {
7580 dispatchPrecondition ( condition: . onQueue( . main) )
7681 precondition ( !isLaunchComplete)
7782 precondition ( state != . initialize)
@@ -81,9 +86,7 @@ class LoopAppManager: NSObject {
8186 return
8287 }
8388
84- self . window = window
85-
86- window? . tintColor = . loopAccent
89+ windowProvider? . window? . tintColor = . loopAccent
8790 OrientationLock . deviceOrientationController = self
8891 UNUserNotificationCenter . current ( ) . delegate = self
8992
@@ -128,7 +131,7 @@ class LoopAppManager: NSObject {
128131 deviceDataManager: deviceDataManager,
129132 servicesManager: deviceDataManager. servicesManager,
130133 loopDataManager: deviceDataManager. loopManager,
131- window : window ,
134+ windowProvider : windowProvider ,
132135 userDefaults: UserDefaults . appGroup!)
133136
134137 deviceDataManager. analyticsServicesManager. application ( didFinishLaunchingWithOptions: launchOptions)
@@ -259,20 +262,20 @@ class LoopAppManager: NSObject {
259262 }
260263
261264 private var rootViewController : UIViewController ? {
262- get { window? . rootViewController }
263- set { window? . rootViewController = newValue }
265+ get { windowProvider ? . window? . rootViewController }
266+ set { windowProvider ? . window? . rootViewController = newValue }
264267 }
265268}
266269
267270// MARK: - AlertPresenter
268271
269272extension LoopAppManager : AlertPresenter {
270273 func present( _ viewControllerToPresent: UIViewController , animated: Bool , completion: ( ( ) -> Void ) ? ) {
271- rootViewController? . present ( viewControllerToPresent, animated: animated, completion: completion)
274+ rootViewController? . topmostViewController . present ( viewControllerToPresent, animated: animated, completion: completion)
272275 }
273276
274277 func dismiss( animated: Bool , completion: ( ( ) -> Void ) ? ) {
275- rootViewController? . dismiss ( animated: animated, completion: completion)
278+ rootViewController? . topmostViewController . dismiss ( animated: animated, completion: completion)
276279 }
277280}
278281
0 commit comments