From 8b39dc4abb6de52beace03c69c74fcb3aff37ee6 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Mon, 8 Nov 2021 09:52:12 +0800 Subject: [PATCH] Uses SceneCoordinator Adds a `func` to SceneCoordinator to handle dismisses vis-a-vis using notifications. --- iOS/AppDelegate.swift | 3 +-- iOS/MasterFeed/MasterFeedViewController.swift | 9 +-------- iOS/SceneCoordinator.swift | 17 +++++++++++++++++ iOS/SceneDelegate.swift | 6 +----- iOS/Settings/SettingsViewController.swift | 5 ----- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 168b22a8c..02d0bf1ad 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -211,9 +211,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD if let sceneDelegate = response.targetScene?.delegate as? SceneDelegate { sceneDelegate.handle(response) DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: { - NotificationCenter.default.post(name: .DidLaunchFromExternalAction, object: nil) + sceneDelegate.coordinator.dismissIfLaunchingFromExternalAction() }) - } } diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 70da39c08..f988830a9 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -75,7 +75,6 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { NotificationCenter.default.addObserver(self, selector: #selector(contentSizeCategoryDidChange), name: UIContentSizeCategory.didChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(configureContextMenu(_:)), name: .ActiveExtensionPointsDidChange, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(didLaunchFromExternalAction), name: .DidLaunchFromExternalAction, object: nil) refreshControl = UIRefreshControl() refreshControl!.addTarget(self, action: #selector(refreshAccounts(_:)), for: .valueChanged) @@ -688,13 +687,7 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { present(vc, animated: true) } } - - @objc func didLaunchFromExternalAction() { - guard let presentedController = presentedViewController as? SFSafariViewController else { - return - } - presentedController.dismiss(animated: true, completion: nil) - } + } // MARK: UIContextMenuInteractionDelegate diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index c03018039..1c6a526b9 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -1327,6 +1327,23 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { } + /// This will dismiss the foremost view controller if the user + /// has launched from an external action (i.e., a widget tap, or + /// selecting an artice via a notification). + /// + /// The dismiss is only applicable if the view controller is a + /// `SFSafariViewController` or `SettingsViewController`, + /// otherwise, this function does nothing. + func dismissIfLaunchingFromExternalAction() { + guard let presentedController = masterFeedViewController.presentedViewController else { return } + + if presentedController.isKind(of: SFSafariViewController.self) { + presentedController.dismiss(animated: true, completion: nil) + } + guard let settings = presentedController.children.first as? SettingsViewController else { return } + settings.dismiss(animated: true, completion: nil) + } + } // MARK: UISplitViewControllerDelegate diff --git a/iOS/SceneDelegate.swift b/iOS/SceneDelegate.swift index a2ac5f862..523446eed 100644 --- a/iOS/SceneDelegate.swift +++ b/iOS/SceneDelegate.swift @@ -11,10 +11,6 @@ import UserNotifications import Account import Zip -public extension Notification.Name { - static let DidLaunchFromExternalAction = Notification.Name("DidLaunchFromExternalAction") -} - class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? @@ -111,7 +107,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { DispatchQueue.main.async { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - NotificationCenter.default.post(name: .DidLaunchFromExternalAction, object: nil) + self.coordinator.dismissIfLaunchingFromExternalAction() } let urlString = context.url.absoluteString diff --git a/iOS/Settings/SettingsViewController.swift b/iOS/Settings/SettingsViewController.swift index eeed8472a..0d39bbe15 100644 --- a/iOS/Settings/SettingsViewController.swift +++ b/iOS/Settings/SettingsViewController.swift @@ -38,7 +38,6 @@ class SettingsViewController: UITableViewController { NotificationCenter.default.addObserver(self, selector: #selector(accountsDidChange), name: .UserDidDeleteAccount, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange), name: .DisplayNameDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(activeExtensionPointsDidChange), name: .ActiveExtensionPointsDidChange, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(didLaunchFromExternalAction), name: .DidLaunchFromExternalAction, object: nil) tableView.register(UINib(nibName: "SettingsComboTableViewCell", bundle: nil), forCellReuseIdentifier: "SettingsComboTableViewCell") @@ -390,10 +389,6 @@ class SettingsViewController: UITableViewController { tableView.reloadData() } - @objc func didLaunchFromExternalAction() { - dismiss(animated: true, completion: nil) - } - } // MARK: OPML Document Picker