From 4ff273c3b5510c638303d41a0900343389c9bf25 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 23 Apr 2020 09:08:33 -0500 Subject: [PATCH] Add single Home Timeline and Mentions URL builder. --- NetNewsWire.xcodeproj/project.pbxproj | 24 ++++- iOS/Add/AddWebFeedViewController.swift | 20 +++- iOS/Add/SelectURLBuilder.swift | 17 +++ .../SelectURLBuilderTableViewController.swift | 8 +- iOS/Add/Twitter/TwitterAdd.storyboard | 102 ++++++++++++++++++ ...TwitterSelectTypeTableViewController.swift | 66 ++++++++++++ .../UIStoryboard-Extensions.swift | 4 + 7 files changed, 236 insertions(+), 5 deletions(-) create mode 100644 iOS/Add/SelectURLBuilder.swift create mode 100644 iOS/Add/Twitter/TwitterAdd.storyboard create mode 100644 iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 7cbe827ca..ad3301910 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -18,6 +18,9 @@ 49F40DF92335B71000552BF4 /* newsfoot.js in Resources */ = {isa = PBXBuildFile; fileRef = 49F40DEF2335B71000552BF4 /* newsfoot.js */; }; 510289AA2451967500426DDF /* SelectURLBuilderTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289A92451967500426DDF /* SelectURLBuilderTableViewController.swift */; }; 510289CD24519A1D00426DDF /* SelectComboTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289CC24519A1D00426DDF /* SelectComboTableViewCell.swift */; }; + 510289D02451BA3A00426DDF /* TwitterAdd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 510289CF2451BA3A00426DDF /* TwitterAdd.storyboard */; }; + 510289D22451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289D12451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift */; }; + 510289D42451BD7B00426DDF /* SelectURLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289D32451BD7B00426DDF /* SelectURLBuilder.swift */; }; 5102FD83244009F000534F17 /* Secrets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; }; 5102FD84244009F000534F17 /* Secrets.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 5102FD9B244009FA00534F17 /* Secrets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5102FD7B244008A700534F17 /* Secrets.framework */; }; @@ -1386,6 +1389,9 @@ 49F40DEF2335B71000552BF4 /* newsfoot.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = newsfoot.js; sourceTree = ""; }; 510289A92451967500426DDF /* SelectURLBuilderTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectURLBuilderTableViewController.swift; sourceTree = ""; }; 510289CC24519A1D00426DDF /* SelectComboTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectComboTableViewCell.swift; sourceTree = ""; }; + 510289CF2451BA3A00426DDF /* TwitterAdd.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = TwitterAdd.storyboard; sourceTree = ""; }; + 510289D12451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwitterSelectTypeTableViewController.swift; sourceTree = ""; }; + 510289D32451BD7B00426DDF /* SelectURLBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectURLBuilder.swift; sourceTree = ""; }; 5102FD72244008A700534F17 /* Secrets.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Secrets.xcodeproj; path = Frameworks/Secrets/Secrets.xcodeproj; sourceTree = SOURCE_ROOT; }; 5103A9972421643300410853 /* blank.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = blank.html; sourceTree = ""; }; 5103A9B324216A4200410853 /* blank.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = blank.html; sourceTree = ""; }; @@ -1927,6 +1933,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 510289CE2451BA1E00426DDF /* Twitter */ = { + isa = PBXGroup; + children = ( + 510289CF2451BA3A00426DDF /* TwitterAdd.storyboard */, + 510289D12451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift */, + ); + path = Twitter; + sourceTree = ""; + }; 5102FD73244008A700534F17 /* Products */ = { isa = PBXGroup; children = ( @@ -2271,10 +2286,12 @@ 51C4528B2265095F00C03939 /* AddFolderViewController.swift */, 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */, 51E36E70239D6610006F47A5 /* AddWebFeedSelectFolderTableViewCell.swift */, - 51E36E8B239D6765006F47A5 /* AddWebFeedSelectFolderTableViewCell.xib */, 51C452842265093600C03939 /* AddWebFeedViewController.swift */, - 510289A92451967500426DDF /* SelectURLBuilderTableViewController.swift */, 510289CC24519A1D00426DDF /* SelectComboTableViewCell.swift */, + 510289D32451BD7B00426DDF /* SelectURLBuilder.swift */, + 510289A92451967500426DDF /* SelectURLBuilderTableViewController.swift */, + 51E36E8B239D6765006F47A5 /* AddWebFeedSelectFolderTableViewCell.xib */, + 510289CE2451BA1E00426DDF /* Twitter */, ); path = Add; sourceTree = ""; @@ -3825,6 +3842,7 @@ 516A09422361248000EAE89B /* Inspector.storyboard in Resources */, 5103A9B424216A4200410853 /* blank.html in Resources */, 84C9FCA42262A1B800D921D6 /* LaunchScreenPhone.storyboard in Resources */, + 510289D02451BA3A00426DDF /* TwitterAdd.storyboard in Resources */, 51F85BEB22724CB600C787DC /* About.rtf in Resources */, 516A093B2360A4A000EAE89B /* SettingsTableViewCell.xib in Resources */, 511D43D1231FA62800FB1562 /* SidebarKeyboardShortcuts.plist in Resources */, @@ -4261,6 +4279,7 @@ 513146B2235A81A400387FDC /* AddWebFeedIntentHandler.swift in Sources */, 51D87EE12311D34700E63F03 /* ActivityType.swift in Sources */, 51C452772265091600C03939 /* MultilineUILabelSizer.swift in Sources */, + 510289D22451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift in Sources */, 51C452A522650A2D00C03939 /* SmallIconProvider.swift in Sources */, 51AB8AB323B7F4C6008F147D /* WebViewController.swift in Sources */, 516A09392360A2AE00EAE89B /* SettingsComboTableViewCell.swift in Sources */, @@ -4319,6 +4338,7 @@ 51C4529922650A0000C03939 /* ArticleStylesManager.swift in Sources */, 51EF0F802277A8330050506E /* MasterTimelineCellLayout.swift in Sources */, 51F85BF722749FA100C787DC /* UIFont-Extensions.swift in Sources */, + 510289D42451BD7B00426DDF /* SelectURLBuilder.swift in Sources */, 51C452AF2265108300C03939 /* ArticleArray.swift in Sources */, 51C4528E2265099C00C03939 /* SmartFeedsController.swift in Sources */, 51C9DE5823EA2EF4003D5A6D /* WrapperScriptMessageHandler.swift in Sources */, diff --git a/iOS/Add/AddWebFeedViewController.swift b/iOS/Add/AddWebFeedViewController.swift index 3c0f62e61..937b2fc89 100644 --- a/iOS/Add/AddWebFeedViewController.swift +++ b/iOS/Add/AddWebFeedViewController.swift @@ -68,6 +68,8 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle @IBAction func showURLBuilder(_ sender: Any) { let navController = UIStoryboard.add.instantiateViewController(withIdentifier: "SelectURLBuilderNavViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext + let selectURLBuilder = navController.topViewController as! SelectURLBuilderTableViewController + selectURLBuilder.delegate = self present(navController, animated: true) } @@ -124,7 +126,7 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle } @objc func textDidChange(_ note: Notification) { - delegate?.readyToAdd(state: urlTextField.text?.mayBeURL ?? false) + updateUI() } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -160,6 +162,17 @@ extension AddWebFeedViewController: AddWebFeedFolderViewControllerDelegate { } } +// MARK: AddWebFeedFolderViewControllerDelegate + +extension AddWebFeedViewController: SelectURLBuilderDelegate { + + func selectURLBuilderDidBuildURL(_ url: URL) { + urlTextField.text = url.absoluteString + updateUI() + } + +} + // MARK: UITextFieldDelegate extension AddWebFeedViewController: UITextFieldDelegate { @@ -174,6 +187,11 @@ extension AddWebFeedViewController: UITextFieldDelegate { // MARK: Private private extension AddWebFeedViewController { + + func updateUI() { + delegate?.readyToAdd(state: urlTextField.text?.mayBeURL ?? false) + } + func updateFolderLabel() { if let containerName = (container as? DisplayNameProvider)?.nameForDisplay { if container is Folder { diff --git a/iOS/Add/SelectURLBuilder.swift b/iOS/Add/SelectURLBuilder.swift new file mode 100644 index 000000000..6d87ccaca --- /dev/null +++ b/iOS/Add/SelectURLBuilder.swift @@ -0,0 +1,17 @@ +// +// SelectURLBuilder.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 4/23/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import UIKit + +protocol SelectURLBuilderDelegate: class { + func selectURLBuilderDidBuildURL(_ url: URL) +} + +protocol SelectURLBuilder { + var delegate: SelectURLBuilderDelegate? { get set } +} diff --git a/iOS/Add/SelectURLBuilderTableViewController.swift b/iOS/Add/SelectURLBuilderTableViewController.swift index dd677f9dd..8bbffd8b5 100644 --- a/iOS/Add/SelectURLBuilderTableViewController.swift +++ b/iOS/Add/SelectURLBuilderTableViewController.swift @@ -8,7 +8,9 @@ import UIKit -class SelectURLBuilderTableViewController: UITableViewController { +class SelectURLBuilderTableViewController: UITableViewController, SelectURLBuilder { + + weak var delegate: SelectURLBuilderDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -32,7 +34,9 @@ class SelectURLBuilderTableViewController: UITableViewController { } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - dismiss(animated: true) + let twitterURLBuilder = UIStoryboard.twitterAdd.instantiateInitialViewController() as! TwitterSelectTypeTableViewController + twitterURLBuilder.delegate = delegate + navigationController?.pushViewController(twitterURLBuilder, animated: true) } // MARK: Actions diff --git a/iOS/Add/Twitter/TwitterAdd.storyboard b/iOS/Add/Twitter/TwitterAdd.storyboard new file mode 100644 index 000000000..1dc09fe93 --- /dev/null +++ b/iOS/Add/Twitter/TwitterAdd.storyboard @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift b/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift new file mode 100644 index 000000000..6fc7cf83d --- /dev/null +++ b/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift @@ -0,0 +1,66 @@ +// +// TwitterSelectTypeTableViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 4/23/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import UIKit +import Account + +class TwitterSelectTypeTableViewController: UITableViewController, SelectURLBuilder { + + weak var delegate: SelectURLBuilderDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = super.tableView(tableView, cellForRowAt: indexPath) + if indexPath.row < 2 { + if findTwitterFeedProviders().count > 1 { + cell.accessoryType = .disclosureIndicator + } + } + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch indexPath.row { + case 0: + let twitterFeedProviders = findTwitterFeedProviders() + if twitterFeedProviders.count == 1 { + let username = twitterFeedProviders.first!.screenName + if let url = TwitterFeedProvider.buildURL(.homeTimeline, username: username, screenName: nil, searchField: nil) { + delegate?.selectURLBuilderDidBuildURL(url) + } + dismiss(animated: true) + } else { + // TODO: Create a controller for the next scene... + } + case 1: + let twitterFeedProviders = findTwitterFeedProviders() + if twitterFeedProviders.count == 1 { + let username = twitterFeedProviders.first!.screenName + if let url = TwitterFeedProvider.buildURL(.mentions, username: username, screenName: nil, searchField: nil) { + delegate?.selectURLBuilderDidBuildURL(url) + } + dismiss(animated: true) + } else { + // TODO: Create a controller for the next scene... + } + default: + fatalError() + } + } + +} + +private extension TwitterSelectTypeTableViewController { + + func findTwitterFeedProviders() -> [TwitterFeedProvider] { + return ExtensionPointManager.shared.activeExtensionPoints.values.compactMap { $0 as? TwitterFeedProvider } + } +} diff --git a/iOS/UIKit Extensions/UIStoryboard-Extensions.swift b/iOS/UIKit Extensions/UIStoryboard-Extensions.swift index ef48e061d..5c059adcb 100644 --- a/iOS/UIKit Extensions/UIStoryboard-Extensions.swift +++ b/iOS/UIKit Extensions/UIStoryboard-Extensions.swift @@ -20,6 +20,10 @@ extension UIStoryboard { return UIStoryboard(name: "Add", bundle: nil) } + static var twitterAdd: UIStoryboard { + return UIStoryboard(name: "TwitterAdd", bundle: nil) + } + static var settings: UIStoryboard { return UIStoryboard(name: "Settings", bundle: nil) }