From 0db88c5f92d5a83ef0e7204cf99f2585294cd770 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sat, 6 Nov 2021 22:43:50 +0800 Subject: [PATCH] Fixes #3335 When the app is brought to the foreground from an external action (e.g., tapping on the widget, opening from a notification), a notification is posted (with a slight delay). `MasterFeedViewController` and `SettingsViewController` are observers. `MasterFeedViewController` will dismiss any `SFSafariViewController`s that are presented, while `SettingsViewController` will dismiss itself. --- iOS/AppDelegate.swift | 4 ++++ iOS/MasterFeed/MasterFeedViewController.swift | 8 ++++++++ iOS/SceneDelegate.swift | 10 ++++++++++ iOS/Settings/SettingsViewController.swift | 5 +++++ 4 files changed, 27 insertions(+) diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 659b7f9b0..168b22a8c 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -210,6 +210,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD default: 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) + }) + } } diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 7a4711d76..17664b632 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -75,6 +75,7 @@ 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(didLaunchFromURLContext), name: .DidLaunchFromExternalAction, object: nil) refreshControl = UIRefreshControl() refreshControl!.addTarget(self, action: #selector(refreshAccounts(_:)), for: .valueChanged) @@ -687,6 +688,13 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { present(vc, animated: true) } } + + @objc func didLaunchFromURLContext() { + guard let presentedController = presentedViewController as? SFSafariViewController else { + return + } + presentedController.dismiss(animated: true, completion: nil) + } } // MARK: UIContextMenuInteractionDelegate diff --git a/iOS/SceneDelegate.swift b/iOS/SceneDelegate.swift index 3da542328..a2ac5f862 100644 --- a/iOS/SceneDelegate.swift +++ b/iOS/SceneDelegate.swift @@ -11,6 +11,10 @@ import UserNotifications import Account import Zip +public extension Notification.Name { + static let DidLaunchFromExternalAction = Notification.Name("DidLaunchFromExternalAction") +} + class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? @@ -105,6 +109,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let context = urlContexts.first else { return } DispatchQueue.main.async { + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + NotificationCenter.default.post(name: .DidLaunchFromExternalAction, object: nil) + } + let urlString = context.url.absoluteString // Handle the feed: and feeds: schemes @@ -202,6 +211,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { return } + } } } diff --git a/iOS/Settings/SettingsViewController.swift b/iOS/Settings/SettingsViewController.swift index 0d39bbe15..1daf9adfe 100644 --- a/iOS/Settings/SettingsViewController.swift +++ b/iOS/Settings/SettingsViewController.swift @@ -38,6 +38,7 @@ 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(didLaunchFromURLContext), name: .DidLaunchFromExternalAction, object: nil) tableView.register(UINib(nibName: "SettingsComboTableViewCell", bundle: nil), forCellReuseIdentifier: "SettingsComboTableViewCell") @@ -389,6 +390,10 @@ class SettingsViewController: UITableViewController { tableView.reloadData() } + @objc func didLaunchFromURLContext() { + dismiss(animated: true, completion: nil) + } + } // MARK: OPML Document Picker