diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index d7cfb6367..9494fef97 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -102,6 +102,10 @@ 512392C024E33A3C00F11704 /* RedditAdd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 516AE5FF246AF34100731738 /* RedditAdd.storyboard */; }; 512392C124E33A3C00F11704 /* RedditSelectTypeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE601246AF36100731738 /* RedditSelectTypeTableViewController.swift */; }; 512392C224E33A3C00F11704 /* RedditEnterDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE605246AF3A900731738 /* RedditEnterDetailTableViewController.swift */; }; + 512392C324E3451400F11704 /* TwitterAdd.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 510289CF2451BA3A00426DDF /* TwitterAdd.storyboard */; }; + 512392C424E3451400F11704 /* TwitterSelectTypeTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289D12451BC1F00426DDF /* TwitterSelectTypeTableViewController.swift */; }; + 512392C524E3451400F11704 /* TwitterEnterDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BEB22C2451E8340066DEDD /* TwitterEnterDetailTableViewController.swift */; }; + 512392C624E3451400F11704 /* TwitterSelectAccountTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510289D52451DDD100426DDF /* TwitterSelectAccountTableViewController.swift */; }; 5125E6CA24AE461D002A7562 /* TimelineLayoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B223DB24AC24D2001E4592 /* TimelineLayoutView.swift */; }; 5126EE97226CB48A00C22AFC /* SceneCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5126EE96226CB48A00C22AFC /* SceneCoordinator.swift */; }; 5127B238222B4849006D641D /* DetailKeyboardDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5127B236222B4849006D641D /* DetailKeyboardDelegate.swift */; }; @@ -4128,6 +4132,7 @@ 511D43D2231FA62C00FB1562 /* GlobalKeyboardShortcuts.plist in Resources */, 84C9FCA12262A1B300D921D6 /* Main.storyboard in Resources */, 51BB7C312335ACDE008E8144 /* page.html in Resources */, + 512392C324E3451400F11704 /* TwitterAdd.storyboard in Resources */, 516A093723609A3600EAE89B /* SettingsComboTableViewCell.xib in Resources */, 51F85BF32272531500C787DC /* Dedication.rtf in Resources */, 516A09422361248000EAE89B /* Inspector.storyboard in Resources */, @@ -4914,6 +4919,7 @@ 51C452A022650A1900C03939 /* WebFeedIconDownloader.swift in Sources */, 51C4529E22650A1900C03939 /* ImageDownloader.swift in Sources */, 51A66685238075AE00CB272D /* AddWebFeedDefaultContainer.swift in Sources */, + 512392C424E3451400F11704 /* TwitterSelectTypeTableViewController.swift in Sources */, 51B5C87723F22B8200032075 /* ExtensionContainers.swift in Sources */, 51C45292226509C800C03939 /* TodayFeedDelegate.swift in Sources */, 51C452A222650A1900C03939 /* RSHTMLMetadata+Extension.swift in Sources */, @@ -4953,11 +4959,13 @@ 51C4529C22650A1000C03939 /* SingleFaviconDownloader.swift in Sources */, 51E595A6228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */, 51F9F3F723DF6DB200A314FD /* ArticleIconSchemeHandler.swift in Sources */, + 512392C524E3451400F11704 /* TwitterEnterDetailTableViewController.swift in Sources */, 512AF9C2236ED52C0066F8BE /* ImageHeaderView.swift in Sources */, 512392C124E33A3C00F11704 /* RedditSelectTypeTableViewController.swift in Sources */, 515A5181243E90260089E588 /* ExtensionPointIdentifer.swift in Sources */, 51A1699F235E10D700EB091F /* AboutViewController.swift in Sources */, 51C45290226509C100C03939 /* PseudoFeed.swift in Sources */, + 512392C624E3451400F11704 /* TwitterSelectAccountTableViewController.swift in Sources */, 51C452A922650DC600C03939 /* ArticleRenderer.swift in Sources */, 51C45297226509E300C03939 /* DefaultFeedsImporter.swift in Sources */, 512E094D2268B8AB00BDCFDD /* DeleteCommand.swift in Sources */, diff --git a/iOS/Add/Twitter/TwitterAdd.storyboard b/iOS/Add/Twitter/TwitterAdd.storyboard index 688696203..d13411ea0 100644 --- a/iOS/Add/Twitter/TwitterAdd.storyboard +++ b/iOS/Add/Twitter/TwitterAdd.storyboard @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17147" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="q78-0w-suH"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17147" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="4Q4-Hi-Lic"> <device id="retina6_1" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> @@ -8,6 +8,22 @@ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <scenes> + <!--Navigation Controller--> + <scene sceneID="np9-bP-Yhx"> + <objects> + <navigationController id="4Q4-Hi-Lic" sceneMemberID="viewController"> + <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="9e6-4b-IPV"> + <rect key="frame" x="0.0" y="44" width="414" height="44"/> + <autoresizingMask key="autoresizingMask"/> + </navigationBar> + <connections> + <segue destination="q78-0w-suH" kind="relationship" relationship="rootViewController" id="xn5-zT-uXK"/> + </connections> + </navigationController> + <placeholder placeholderIdentifier="IBFirstResponder" id="sjJ-Fz-BXf" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="-1254" y="173"/> + </scene> <!--Select Type--> <scene sceneID="Fmm-TL-h7h"> <objects> @@ -19,11 +35,11 @@ <sections> <tableViewSection id="Dp6-La-NeL"> <cells> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="WAs-zr-8RJ" detailTextLabel="f8o-SY-a2H" style="IBUITableViewCellStyleSubtitle" id="VbH-aQ-M4H" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="WAs-zr-8RJ" detailTextLabel="f8o-SY-a2H" style="IBUITableViewCellStyleSubtitle" id="VbH-aQ-M4H" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> <rect key="frame" x="20" y="18" width="374" height="59"/> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VbH-aQ-M4H" id="Qud-m5-1ZQ"> - <rect key="frame" x="0.0" y="0.0" width="374" height="59"/> + <rect key="frame" x="0.0" y="0.0" width="343" height="59"/> <autoresizingMask key="autoresizingMask"/> <subviews> <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Home Timeline" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" id="WAs-zr-8RJ"> @@ -43,11 +59,11 @@ </subviews> </tableViewCellContentView> </tableViewCell> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="K0b-HX-8dR" detailTextLabel="uaZ-4Q-FBS" style="IBUITableViewCellStyleSubtitle" id="jft-wJ-OVX" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="K0b-HX-8dR" detailTextLabel="uaZ-4Q-FBS" style="IBUITableViewCellStyleSubtitle" id="jft-wJ-OVX" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> <rect key="frame" x="20" y="77" width="374" height="59"/> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="jft-wJ-OVX" id="dXF-Bc-NkR"> - <rect key="frame" x="0.0" y="0.0" width="374" height="59"/> + <rect key="frame" x="0.0" y="0.0" width="343" height="59"/> <autoresizingMask key="autoresizingMask"/> <subviews> <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Mentions" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" id="K0b-HX-8dR"> @@ -123,6 +139,7 @@ <outlet property="delegate" destination="q78-0w-suH" id="j69-O6-ths"/> </connections> </tableView> + <navigationItem key="navigationItem" title="Select Twitter Type" id="kjr-7P-QSh"/> <simulatedNavigationBarMetrics key="simulatedTopBarMetrics"/> </tableViewController> <placeholder placeholderIdentifier="IBFirstResponder" id="yI5-IG-7Sl" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/> @@ -138,15 +155,15 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <prototypes> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" textLabel="j8c-JM-nzm" style="IBUITableViewCellStyleDefault" id="vEE-Gx-Zgc" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="Cell" textLabel="j8c-JM-nzm" style="IBUITableViewCellStyleDefault" id="vEE-Gx-Zgc" customClass="VibrantTableViewCell" customModule="NetNewsWire" customModuleProvider="target"> <rect key="frame" x="20" y="55.5" width="374" height="43.5"/> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="vEE-Gx-Zgc" id="pa0-mR-hgR"> - <rect key="frame" x="0.0" y="0.0" width="374" height="43.5"/> + <rect key="frame" x="0.0" y="0.0" width="343" height="43.5"/> <autoresizingMask key="autoresizingMask"/> <subviews> <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" id="j8c-JM-nzm"> - <rect key="frame" x="20" y="0.0" width="334" height="43.5"/> + <rect key="frame" x="20" y="0.0" width="315" height="43.5"/> <autoresizingMask key="autoresizingMask"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <nil key="textColor"/> diff --git a/iOS/Add/Twitter/TwitterEnterDetailTableViewController.swift b/iOS/Add/Twitter/TwitterEnterDetailTableViewController.swift index 621488234..87043e9f6 100644 --- a/iOS/Add/Twitter/TwitterEnterDetailTableViewController.swift +++ b/iOS/Add/Twitter/TwitterEnterDetailTableViewController.swift @@ -9,19 +9,18 @@ import UIKit import Account -class TwitterEnterDetailTableViewController: UITableViewController, SelectURLBuilder { +class TwitterEnterDetailTableViewController: UITableViewController { @IBOutlet weak var detailTextField: UITextField! var doneBarButtonItem = UIBarButtonItem() var twitterFeedType: TwitterFeedType? - weak var delegate: SelectURLBuilderDelegate? override func viewDidLoad() { super.viewDidLoad() - doneBarButtonItem.title = NSLocalizedString("Done", comment: "Done") - doneBarButtonItem.style = .done + doneBarButtonItem.title = NSLocalizedString("Next", comment: "Next") + doneBarButtonItem.style = .plain doneBarButtonItem.target = self doneBarButtonItem.action = #selector(done) navigationItem.rightBarButtonItem = doneBarButtonItem @@ -42,21 +41,21 @@ class TwitterEnterDetailTableViewController: UITableViewController, SelectURLBui @objc func done() { guard let twitterFeedType = twitterFeedType, var text = detailTextField.text?.collapsingWhitespace else { return } - + + let url: String? if twitterFeedType == .screenName { if text.starts(with: "@") { text = String(text[text.index(text.startIndex, offsetBy: 1)..<text.endIndex]) } - if let url = TwitterFeedProvider.buildURL(twitterFeedType, username: nil, screenName: text, searchField: nil) { - delegate?.selectURLBuilderDidBuildURL(url) - } + url = TwitterFeedProvider.buildURL(twitterFeedType, username: nil, screenName: text, searchField: nil)?.absoluteString } else { - if let url = TwitterFeedProvider.buildURL(twitterFeedType, username: nil, screenName: nil, searchField: text) { - delegate?.selectURLBuilderDidBuildURL(url) - } + url = TwitterFeedProvider.buildURL(twitterFeedType, username: nil, screenName: nil, searchField: text)?.absoluteString } - dismiss(animated: true) + let addViewController = UIStoryboard.add.instantiateViewController(withIdentifier: "AddWebFeedViewController") as! AddWebFeedViewController + addViewController.addFeedType = .twitter + addViewController.initialFeed = url + navigationController?.pushViewController(addViewController, animated: true) } @objc func textDidChange(_ note: Notification) { diff --git a/iOS/Add/Twitter/TwitterSelectAccountTableViewController.swift b/iOS/Add/Twitter/TwitterSelectAccountTableViewController.swift index 401da77c1..502647eea 100644 --- a/iOS/Add/Twitter/TwitterSelectAccountTableViewController.swift +++ b/iOS/Add/Twitter/TwitterSelectAccountTableViewController.swift @@ -9,12 +9,11 @@ import UIKit import Account -class TwitterSelectAccountTableViewController: UITableViewController, SelectURLBuilder { +class TwitterSelectAccountTableViewController: UITableViewController { private var twitterFeedProviders = [TwitterFeedProvider]() var twitterFeedType: TwitterFeedType? - weak var delegate: SelectURLBuilderDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -33,11 +32,14 @@ class TwitterSelectAccountTableViewController: UITableViewController, SelectURLB override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let twitterFeedType = twitterFeedType else { return } + let username = twitterFeedProviders[indexPath.row].screenName - if let url = TwitterFeedProvider.buildURL(twitterFeedType, username: username, screenName: nil, searchField: nil) { - delegate?.selectURLBuilderDidBuildURL(url) - } - dismiss(animated: true) + let url = TwitterFeedProvider.buildURL(twitterFeedType, username: username, screenName: nil, searchField: nil)?.absoluteString + + let addViewController = UIStoryboard.add.instantiateViewController(withIdentifier: "AddWebFeedViewController") as! AddWebFeedViewController + addViewController.addFeedType = .twitter + addViewController.initialFeed = url + navigationController?.pushViewController(addViewController, animated: true) } } diff --git a/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift b/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift index 0c81c27f0..9258e5682 100644 --- a/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift +++ b/iOS/Add/Twitter/TwitterSelectTypeTableViewController.swift @@ -9,12 +9,10 @@ import UIKit import Account -class TwitterSelectTypeTableViewController: UITableViewController, SelectURLBuilder { +class TwitterSelectTypeTableViewController: UITableViewController { private var twitterFeedProviders = [TwitterFeedProvider]() - weak var delegate: SelectURLBuilderDelegate? - override func viewDidLoad() { super.viewDidLoad() twitterFeedProviders = ExtensionPointManager.shared.activeExtensionPoints.values.compactMap { $0 as? TwitterFeedProvider } @@ -35,38 +33,30 @@ class TwitterSelectTypeTableViewController: UITableViewController, SelectURLBuil case 0: 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) + let url = TwitterFeedProvider.buildURL(.homeTimeline, username: username, screenName: nil, searchField: nil)?.absoluteString + pushAddFeedController(url) } else { let selectAccount = UIStoryboard.twitterAdd.instantiateController(ofType: TwitterSelectAccountTableViewController.self) selectAccount.twitterFeedType = .homeTimeline - selectAccount.delegate = delegate navigationController?.pushViewController(selectAccount, animated: true) } case 1: 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) + let url = TwitterFeedProvider.buildURL(.mentions, username: username, screenName: nil, searchField: nil)?.absoluteString + pushAddFeedController(url) } else { let selectAccount = UIStoryboard.twitterAdd.instantiateController(ofType: TwitterSelectAccountTableViewController.self) selectAccount.twitterFeedType = .mentions - selectAccount.delegate = delegate navigationController?.pushViewController(selectAccount, animated: true) } case 2: let enterDetail = UIStoryboard.twitterAdd.instantiateController(ofType: TwitterEnterDetailTableViewController.self) enterDetail.twitterFeedType = .screenName - enterDetail.delegate = delegate navigationController?.pushViewController(enterDetail, animated: true) case 3: let enterDetail = UIStoryboard.twitterAdd.instantiateController(ofType: TwitterEnterDetailTableViewController.self) enterDetail.twitterFeedType = .search - enterDetail.delegate = delegate navigationController?.pushViewController(enterDetail, animated: true) default: fatalError() @@ -74,3 +64,14 @@ class TwitterSelectTypeTableViewController: UITableViewController, SelectURLBuil } } + +private extension TwitterSelectTypeTableViewController { + + func pushAddFeedController(_ url: String?) { + let addViewController = UIStoryboard.add.instantiateViewController(withIdentifier: "AddWebFeedViewController") as! AddWebFeedViewController + addViewController.addFeedType = .twitter + addViewController.initialFeed = url + navigationController?.pushViewController(addViewController, animated: true) + } + +} diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 8114977eb..98c1181d8 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -410,6 +410,11 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { self.coordinator.showAddRedditFeed() } + let addTwitterFeedActionTitle = NSLocalizedString("Add Twitter Feed", comment: "Add Twitter Feed") + let addTwitterFeedAction = UIAlertAction(title: addTwitterFeedActionTitle, style: .default) { _ in + self.coordinator.showAddTwitterFeed() + } + let addWebFolderdActionTitle = NSLocalizedString("Add Folder", comment: "Add Folder") let addWebFolderAction = UIAlertAction(title: addWebFolderdActionTitle, style: .default) { _ in self.coordinator.showAddFolder() @@ -417,6 +422,7 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { alertController.addAction(addWebFeedAction) alertController.addAction(addRedditFeedAction) + alertController.addAction(addTwitterFeedAction) alertController.addAction(addWebFolderAction) alertController.addAction(cancelAction) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 396e9efc4..b8052f0e4 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -1190,6 +1190,13 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { masterFeedViewController.present(addNavViewController, animated: true) } + func showAddTwitterFeed() { + let addNavViewController = UIStoryboard.twitterAdd.instantiateInitialViewController() as! UINavigationController + addNavViewController.modalPresentationStyle = .formSheet + addNavViewController.preferredContentSize = AddWebFeedViewController.preferredContentSizeForFormSheetDisplay + masterFeedViewController.present(addNavViewController, animated: true) + } + func showAddFolder() { let addNavViewController = UIStoryboard.add.instantiateViewController(withIdentifier: "AddFolderViewControllerNav") as! UINavigationController addNavViewController.modalPresentationStyle = .formSheet