From 0539336fce86db294f8b6de4c3ae8ffb5d76fbf3 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 25 Nov 2019 00:26:03 -0500 Subject: [PATCH 1/2] Allow Feed Wrangler accounts on iOS --- NetNewsWire.xcodeproj/project.pbxproj | 4 + iOS/Account/Account.storyboard | 151 ++++++++++++++- .../FeedWranglerAccountViewController.swift | 173 ++++++++++++++++++ iOS/AppAssets.swift | 6 + .../Contents.json | 15 ++ .../outline-512.png | Bin 0 -> 49563 bytes iOS/Settings/AddAccountViewController.swift | 6 + iOS/Settings/Settings.storyboard | 54 +++++- 8 files changed, 398 insertions(+), 11 deletions(-) create mode 100644 iOS/Account/FeedWranglerAccountViewController.swift create mode 100644 iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/outline-512.png diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index bd3a5a57e..27c355f46 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3B3A32A5238B820900314204 /* FeedWranglerAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */; }; 3B826DCB2385C84800FC1ADB /* AccountsFeedWrangler.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */; }; 3B826DCC2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */; }; 3B826DCD2385C89600FC1ADB /* AccountsFeedWrangler.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */; }; @@ -1219,6 +1220,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedWranglerAccountViewController.swift; sourceTree = ""; }; 3B826DB02385C84800FC1ADB /* AccountsFeedWrangler.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccountsFeedWrangler.xib; sourceTree = ""; }; 3B826DCA2385C84800FC1ADB /* AccountsFeedWranglerWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsFeedWranglerWindowController.swift; sourceTree = ""; }; 49F40DEF2335B71000552BF4 /* newsfoot.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = newsfoot.js; sourceTree = ""; }; @@ -1807,6 +1809,7 @@ 516A093F2361240900EAE89B /* Account.storyboard */, 51A1698F235E10D600EB091F /* LocalAccountViewController.swift */, 51A16996235E10D700EB091F /* FeedbinAccountViewController.swift */, + 3B3A328B238B820900314204 /* FeedWranglerAccountViewController.swift */, ); path = Account; sourceTree = ""; @@ -3947,6 +3950,7 @@ 51C452772265091600C03939 /* MultilineUILabelSizer.swift in Sources */, 51C452A522650A2D00C03939 /* SmallIconProvider.swift in Sources */, 516A09392360A2AE00EAE89B /* SettingsAccountTableViewCell.swift in Sources */, + 3B3A32A5238B820900314204 /* FeedWranglerAccountViewController.swift in Sources */, 51D5948722668EFA00DFC836 /* MarkStatusCommand.swift in Sources */, 51A1699C235E10D700EB091F /* AddAccountViewController.swift in Sources */, 51A16999235E10D700EB091F /* LocalAccountViewController.swift in Sources */, diff --git a/iOS/Account/Account.storyboard b/iOS/Account/Account.storyboard index 7cedd59df..9c4011f8f 100644 --- a/iOS/Account/Account.storyboard +++ b/iOS/Account/Account.storyboard @@ -2,7 +2,7 @@ - + @@ -39,6 +39,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/Account/FeedWranglerAccountViewController.swift b/iOS/Account/FeedWranglerAccountViewController.swift new file mode 100644 index 000000000..765c01781 --- /dev/null +++ b/iOS/Account/FeedWranglerAccountViewController.swift @@ -0,0 +1,173 @@ +// +// FeedWranglerAccountViewController.swift +// NetNewsWire +// +// Created by Jonathan Bennett on 2019-11-24. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import UIKit +import Account +import RSWeb + +class FeedWranglerAccountViewController: UITableViewController { + + @IBOutlet weak var activityIndicator: UIActivityIndicatorView! + @IBOutlet weak var cancelBarButtonItem: UIBarButtonItem! + @IBOutlet weak var emailTextField: UITextField! + @IBOutlet weak var passwordTextField: UITextField! + @IBOutlet weak var showHideButton: UIButton! + @IBOutlet weak var actionButton: UIButton! + + weak var account: Account? + weak var delegate: AddAccountDismissDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + + activityIndicator.isHidden = true + emailTextField.delegate = self + passwordTextField.delegate = self + + if let account = account, let credentials = try? account.retrieveCredentials(type: .feedWranglerBasic) { + actionButton.setTitle(NSLocalizedString("Update Credentials", comment: "Update Credentials"), for: .normal) + emailTextField.text = credentials.username + passwordTextField.text = credentials.secret + } else { + actionButton.setTitle(NSLocalizedString("Add Account", comment: "Update Credentials"), for: .normal) + } + + NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: UITextField.textDidChangeNotification, object: emailTextField) + NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: UITextField.textDidChangeNotification, object: passwordTextField) + + tableView.register(ImageHeaderView.self, forHeaderFooterViewReuseIdentifier: "SectionHeader") + } + + override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return section == 0 ? ImageHeaderView.rowHeight : super.tableView(tableView, heightForHeaderInSection: section) + } + + override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + if section == 0 { + let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "SectionHeader") as! ImageHeaderView + headerView.imageView.image = AppAssets.image(for: .feedWrangler) + return headerView + } else { + return super.tableView(tableView, viewForHeaderInSection: section) + } + } + + @IBAction func cancel(_ sender: Any) { + dismiss(animated: true, completion: nil) + delegate?.dismiss() + } + + @IBAction func showHidePassword(_ sender: Any) { + if passwordTextField.isSecureTextEntry { + passwordTextField.isSecureTextEntry = false + showHideButton.setTitle("Hide", for: .normal) + } else { + passwordTextField.isSecureTextEntry = true + showHideButton.setTitle("Show", for: .normal) + } + } + + @IBAction func action(_ sender: Any) { + + guard let email = emailTextField.text, let password = passwordTextField.text else { + showError(NSLocalizedString("Username & password required.", comment: "Credentials Error")) + return + } + + startAnimatingActivityIndicator() + disableNavigation() + + // When you fill in the email address via auto-complete it adds extra whitespace + let trimmedEmail = email.trimmingCharacters(in: .whitespaces) + let credentials = Credentials(type: .feedWranglerBasic, username: trimmedEmail, secret: password) + Account.validateCredentials(type: .feedWrangler, credentials: credentials) { result in + + self.stopAnimtatingActivityIndicator() + self.enableNavigation() + + switch result { + case .success(let validatedCredentials): + guard let validatedCredentials = validatedCredentials else { + self.showError(NSLocalizedString("Invalid email/password combination.", comment: "Credentials Error")) + return + } + + var newAccount = false + if self.account == nil { + self.account = AccountManager.shared.createAccount(type: .feedWrangler) + newAccount = true + } + + do { + try self.account?.removeCredentials(type: .feedWranglerBasic) + try self.account?.removeCredentials(type: .feedWranglerToken) + try self.account?.storeCredentials(credentials) + try self.account?.storeCredentials(validatedCredentials) + + if newAccount { + self.account?.refreshAll { result in + switch result { + case .success: + break + case .failure(let error): + self.presentError(error) + } + } + } + + self.dismiss(animated: true, completion: nil) + self.delegate?.dismiss() + + } catch { + self.showError(NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")) + } + case .failure: + self.showError(NSLocalizedString("Network error. Try again later.", comment: "Credentials Error")) + } + + } + } + + @objc func textDidChange(_ note: Notification) { + actionButton.isEnabled = !(emailTextField.text?.isEmpty ?? false) && !(passwordTextField.text?.isEmpty ?? false) + } + + private func showError(_ message: String) { + presentError(title: "Error", message: message) + } + + private func enableNavigation() { + self.cancelBarButtonItem.isEnabled = true + self.actionButton.isEnabled = true + } + + private func disableNavigation() { + cancelBarButtonItem.isEnabled = false + actionButton.isEnabled = false + } + + private func startAnimatingActivityIndicator() { + activityIndicator.isHidden = false + activityIndicator.startAnimating() + } + + private func stopAnimtatingActivityIndicator() { + self.activityIndicator.isHidden = true + self.activityIndicator.stopAnimating() + } + +} + +extension FeedWranglerAccountViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + +} diff --git a/iOS/AppAssets.swift b/iOS/AppAssets.swift index 081725a9a..ed2048aa1 100644 --- a/iOS/AppAssets.swift +++ b/iOS/AppAssets.swift @@ -26,6 +26,10 @@ struct AppAssets { static var accountFeedlyImage: UIImage = { return UIImage(named: "accountFeedly")! }() + + static var accountFeedWranglerImage: UIImage = { + return UIImage(named: "accountFeedWrangler")! + }() static var accountFreshRSSImage: UIImage = { return UIImage(named: "accountFreshRSS")! @@ -214,6 +218,8 @@ struct AppAssets { return AppAssets.accountFeedbinImage case .feedly: return AppAssets.accountFeedlyImage + case .feedWrangler: + return AppAssets.accountFeedWranglerImage case .freshRSS: return AppAssets.accountFreshRSSImage default: diff --git a/iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/Contents.json b/iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/Contents.json new file mode 100644 index 000000000..0721d5d1f --- /dev/null +++ b/iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "outline-512.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/outline-512.png b/iOS/Resources/Assets.xcassets/accountFeedWrangler.imageset/outline-512.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d29faa1137e0ddf91bf97b20336a1207c338df GIT binary patch literal 49563 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 YTb<&+Df~VTqec+s2M*E-ja@GOALHb7=Kufz literal 0 HcmV?d00001 diff --git a/iOS/Settings/AddAccountViewController.swift b/iOS/Settings/AddAccountViewController.swift index 0f803b8a6..30d7d0ce1 100644 --- a/iOS/Settings/AddAccountViewController.swift +++ b/iOS/Settings/AddAccountViewController.swift @@ -43,6 +43,12 @@ class AddAccountViewController: UITableViewController, AddAccountDismissDelegate addAccount.delegate = self addAccount.presentationAnchor = self.view.window! OperationQueue.main.addOperation(addAccount) + case 3: + let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "FeedWranglerAccountNavigationViewController") as! UINavigationController + navController.modalPresentationStyle = .currentContext + let addViewController = navController.topViewController as! FeedWranglerAccountViewController + addViewController.delegate = self + present(navController, animated: true) default: break } diff --git a/iOS/Settings/Settings.storyboard b/iOS/Settings/Settings.storyboard index c81c9ed12..fb985e5b9 100644 --- a/iOS/Settings/Settings.storyboard +++ b/iOS/Settings/Settings.storyboard @@ -2,7 +2,7 @@ - + @@ -19,7 +19,7 @@ - + @@ -267,7 +267,7 @@ - + @@ -284,7 +284,7 @@ - + @@ -301,7 +301,7 @@ - + @@ -318,14 +318,14 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -842,6 +875,7 @@ + From a0b1c7aac6f52e20b744b394a2693f749b58fec8 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 25 Nov 2019 05:16:20 -0500 Subject: [PATCH 2/2] localize button text --- iOS/Account/FeedWranglerAccountViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iOS/Account/FeedWranglerAccountViewController.swift b/iOS/Account/FeedWranglerAccountViewController.swift index 765c01781..a5356d09a 100644 --- a/iOS/Account/FeedWranglerAccountViewController.swift +++ b/iOS/Account/FeedWranglerAccountViewController.swift @@ -65,10 +65,10 @@ class FeedWranglerAccountViewController: UITableViewController { @IBAction func showHidePassword(_ sender: Any) { if passwordTextField.isSecureTextEntry { passwordTextField.isSecureTextEntry = false - showHideButton.setTitle("Hide", for: .normal) + showHideButton.setTitle(NSLocalizedString("Hide", comment: "Button Label"), for: .normal) } else { passwordTextField.isSecureTextEntry = true - showHideButton.setTitle("Show", for: .normal) + showHideButton.setTitle(NSLocalizedString("Show", comment: "Button Label"), for: .normal) } }