Skip to content

Commit

Permalink
Improve AppCoordinator preprocessing of connection options and session
Browse files Browse the repository at this point in the history
  • Loading branch information
mvasilak committed Jul 5, 2023
1 parent a108047 commit 76c0980
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions Zotero/Scenes/AppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ final class AppCoordinator: NSObject {
guard let window = self.window else { return }

let viewController: UIViewController
var urlContext: UIOpenURLContext?
var data: RestoredStateData?
if !isLogged {
let controller = OnboardingViewController(size: window.frame.size, htmlConverter: self.controllers.htmlAttributedStringConverter)
controller.coordinatorDelegate = self
Expand All @@ -107,7 +109,7 @@ final class AppCoordinator: NSObject {
self.conflictAlertQueueController = nil
self.controllers.userControllers?.syncScheduler.syncController.set(coordinator: nil)
} else {
preprocess(connectionOptions: connectionOptions, session: session)
(urlContext, data) = preprocess(connectionOptions: connectionOptions, session: session)
let controller = MainViewController(controllers: self.controllers)
viewController = controller

Expand All @@ -118,20 +120,24 @@ final class AppCoordinator: NSObject {

DDLogInfo("AppCoordinator: show main screen logged \(isLogged ? "in" : "out"); animated=\(animated)")
self.show(viewController: viewController, in: window, animated: animated)
guard let options = connectionOptions, let session = session else { return }
self.process(connectionOptions: options, session: session)
process(urlContext: urlContext, data: data)
}

private func preprocess(connectionOptions: UIScene.ConnectionOptions?, session: UISceneSession?) {
guard let userActivity = connectionOptions?.userActivities.first ?? session?.stateRestorationActivity, let data = userActivity.restoredStateData else { return }
// If scene had state stored, check if defaults need to be updated first
DDLogInfo("AppCoordinator: Preprocessing restored state - \(data)")
Defaults.shared.selectedLibrary = data.libraryId
Defaults.shared.selectedCollectionId = data.collectionId
private func preprocess(connectionOptions: UIScene.ConnectionOptions?, session: UISceneSession?) -> (UIOpenURLContext?, RestoredStateData?) {
let urlContext = connectionOptions?.urlContexts.first
let userActivity = connectionOptions?.userActivities.first ?? session?.stateRestorationActivity
let data = userActivity?.restoredStateData
if let data {
// If scene had state stored, check if defaults need to be updated first
DDLogInfo("AppCoordinator: Preprocessing restored state - \(data)")
Defaults.shared.selectedLibrary = data.libraryId
Defaults.shared.selectedCollectionId = data.collectionId
}
return (urlContext, data)
}

private func process(connectionOptions: UIScene.ConnectionOptions, session: UISceneSession) {
if let urlContext = connectionOptions.urlContexts.first, let urlController = self.controllers.userControllers?.customUrlController {
private func process(urlContext: UIOpenURLContext?, data: RestoredStateData?) {
if let urlContext, let urlController = self.controllers.userControllers?.customUrlController {
// If scene was started from custom URL
let sourceApp = urlContext.options.sourceApplication ?? "unknown"
DDLogInfo("AppCoordinator: App launched by \(urlContext.url.absoluteString) from \(sourceApp)")
Expand All @@ -142,7 +148,7 @@ final class AppCoordinator: NSObject {
}
}

if let userActivity = connectionOptions.userActivities.first ?? session.stateRestorationActivity, let data = userActivity.restoredStateData {
if let data {
DDLogInfo("AppCoordinator: Processing restored state - \(data)")
// If scene had state stored, restore state
self.showRestoredState(for: data)
Expand Down

0 comments on commit 76c0980

Please sign in to comment.