diff --git a/Shared/Resources/GlobalKeyboardShortcuts.plist b/Shared/Resources/GlobalKeyboardShortcuts.plist index 4c6f3662c..88e4eac90 100644 --- a/Shared/Resources/GlobalKeyboardShortcuts.plist +++ b/Shared/Resources/GlobalKeyboardShortcuts.plist @@ -106,11 +106,11 @@ title - Open in Browser + Open in App Browser key [return] action - openInBrowser: + openFeedInAppBrowser: key diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 9bd609774..b43783b64 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -256,6 +256,7 @@ class ArticleViewController: UIViewController { } // MARK: Keyboard Shortcuts + @objc func navigateToTimeline(_ sender: Any?) { coordinator.navigateToTimeline() } @@ -277,7 +278,10 @@ class ArticleViewController: UIViewController { func stopArticleExtractorIfProcessing() { currentWebViewController?.stopArticleExtractorIfProcessing() } - + + func openInAppBrowser() { + currentWebViewController?.openInAppBrowser() + } } // MARK: WebViewControllerDelegate diff --git a/iOS/Article/WebViewController.swift b/iOS/Article/WebViewController.swift index dacd94ced..3a31f19b8 100644 --- a/iOS/Article/WebViewController.swift +++ b/iOS/Article/WebViewController.swift @@ -227,7 +227,15 @@ class WebViewController: UIViewController { activityViewController.popoverPresentationController?.barButtonItem = popOverBarButtonItem present(activityViewController, animated: true) } - + + func openInAppBrowser() { + guard let preferredLink = article?.preferredLink, let url = URL(string: preferredLink) else { + return + } + + let vc = SFSafariViewController(url: url) + present(vc, animated: true) + } } // MARK: ArticleExtractorDelegate diff --git a/iOS/KeyboardManager.swift b/iOS/KeyboardManager.swift index c463fcde2..9129a4032 100644 --- a/iOS/KeyboardManager.swift +++ b/iOS/KeyboardManager.swift @@ -177,6 +177,9 @@ private extension KeyboardManager { let openInBrowserTitle = NSLocalizedString("Open In Browser", comment: "Open In Browser") keys.append(KeyboardManager.createKeyCommand(title: openInBrowserTitle, action: "openInBrowser:", input: UIKeyCommand.inputRightArrow, modifiers: [.command])) + let openInAppBrowserTitle = NSLocalizedString("Open In App Browser", comment: "Open In App Browser") + keys.append(KeyboardManager.createKeyCommand(title: openInAppBrowserTitle, action: "openInAppBrowser:", input: "\r", modifiers: [])) + let toggleReadTitle = NSLocalizedString("Toggle Read Status", comment: "Toggle Read Status") keys.append(KeyboardManager.createKeyCommand(title: toggleReadTitle, action: "toggleRead:", input: "u", modifiers: [.command, .shift])) diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 651afc6c2..57babb007 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -11,6 +11,7 @@ import Account import Articles import RSCore import RSTree +import SafariServices class MasterFeedViewController: UITableViewController, UndoableCommandRunner { @@ -514,7 +515,14 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { func focus() { becomeFirstResponder() } - + + func openInAppBrowser() { + if let indexPath = coordinator.currentFeedIndexPath, + let url = coordinator.homePageURLForFeed(indexPath) { + let vc = SFSafariViewController(url: url) + present(vc, animated: true) + } + } } // MARK: UIContextMenuInteractionDelegate diff --git a/iOS/RootSplitViewController.swift b/iOS/RootSplitViewController.swift index 33bd740c1..4117a0ee7 100644 --- a/iOS/RootSplitViewController.swift +++ b/iOS/RootSplitViewController.swift @@ -81,6 +81,14 @@ class RootSplitViewController: UISplitViewController { @objc func openInBrowser(_ sender: Any?) { coordinator.showBrowserForCurrentArticle() } + + @objc func openInAppBrowser(_ sender: Any?) { + coordinator.showInAppBrowserForCurrentArticle() + } + + @objc func openFeedInAppBrowser(_ sender: Any?) { + coordinator.showInAppBrowserForCurrentFeed() + } @objc func articleSearch(_ sender: Any?) { coordinator.showSearch() diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 64abb8d3d..22d1f30a3 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -12,6 +12,7 @@ import Account import Articles import RSCore import RSTree +import SafariServices enum PanelMode { case unset @@ -1183,6 +1184,14 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } UIApplication.shared.open(url, options: [:]) } + + func showInAppBrowserForCurrentArticle() { + articleViewController?.openInAppBrowser() + } + + func showInAppBrowserForCurrentFeed() { + masterFeedViewController.openInAppBrowser() + } func navigateToFeeds() { masterFeedViewController?.focus()