From c7e3162c2268057afb74debbe6885d33d43e9362 Mon Sep 17 00:00:00 2001 From: Rizwan Mohamed Ibrahim Date: Fri, 24 Apr 2020 18:39:18 +0530 Subject: [PATCH 01/10] Deselect the cell row when selected for add account view controller To avoid the highlighting even after the row is selected --- iOS/Settings/AddAccountViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/iOS/Settings/AddAccountViewController.swift b/iOS/Settings/AddAccountViewController.swift index abe901c63..db94f78df 100644 --- a/iOS/Settings/AddAccountViewController.swift +++ b/iOS/Settings/AddAccountViewController.swift @@ -32,6 +32,7 @@ class AddAccountViewController: UITableViewController, AddAccountDismissDelegate #endif override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) switch indexPath.row { case 0: let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "AddLocalAccountNavigationViewController") as! UINavigationController From 43f175d71abb83c24111afa7c21c3841faf2c75c Mon Sep 17 00:00:00 2001 From: Rizwan Mohamed Ibrahim Date: Fri, 24 Apr 2020 18:49:49 +0530 Subject: [PATCH 02/10] Removes AddAccountDismissDelegate Delegate which was responsible to dismiss AddAccountViewController whenever presented view controller dismissed is not needed. So removing it simply will go to previous screen from where user comes. --- iOS/Account/FeedWranglerAccountViewController.swift | 6 +----- iOS/Account/FeedbinAccountViewController.swift | 3 --- iOS/Account/LocalAccountViewController.swift | 4 ---- iOS/Settings/AddAccountViewController.swift | 12 +----------- 4 files changed, 2 insertions(+), 23 deletions(-) diff --git a/iOS/Account/FeedWranglerAccountViewController.swift b/iOS/Account/FeedWranglerAccountViewController.swift index b6c297df8..5fa5d86e2 100644 --- a/iOS/Account/FeedWranglerAccountViewController.swift +++ b/iOS/Account/FeedWranglerAccountViewController.swift @@ -20,7 +20,6 @@ class FeedWranglerAccountViewController: UITableViewController { @IBOutlet weak var actionButton: UIButton! weak var account: Account? - weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -59,7 +58,6 @@ class FeedWranglerAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { @@ -120,9 +118,7 @@ class FeedWranglerAccountViewController: UITableViewController { } } - self.dismiss(animated: true, completion: nil) - self.delegate?.dismiss() - + self.dismiss(animated: true, completion: nil) } catch { self.showError(NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")) } diff --git a/iOS/Account/FeedbinAccountViewController.swift b/iOS/Account/FeedbinAccountViewController.swift index df6110b64..d51350710 100644 --- a/iOS/Account/FeedbinAccountViewController.swift +++ b/iOS/Account/FeedbinAccountViewController.swift @@ -20,7 +20,6 @@ class FeedbinAccountViewController: UITableViewController { @IBOutlet weak var actionButton: UIButton! weak var account: Account? - weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -60,7 +59,6 @@ class FeedbinAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { @@ -118,7 +116,6 @@ class FeedbinAccountViewController: UITableViewController { } self.dismiss(animated: true, completion: nil) - self.delegate?.dismiss() } catch { self.showError(NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")) } diff --git a/iOS/Account/LocalAccountViewController.swift b/iOS/Account/LocalAccountViewController.swift index be0c1596d..85d338f13 100644 --- a/iOS/Account/LocalAccountViewController.swift +++ b/iOS/Account/LocalAccountViewController.swift @@ -12,8 +12,6 @@ import Account class LocalAccountViewController: UITableViewController { @IBOutlet weak var nameTextField: UITextField! - - weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -25,14 +23,12 @@ class LocalAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func add(_ sender: Any) { let account = AccountManager.shared.createAccount(type: .onMyMac) account.name = nameTextField.text dismiss(animated: true, completion: nil) - delegate?.dismiss() } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { diff --git a/iOS/Settings/AddAccountViewController.swift b/iOS/Settings/AddAccountViewController.swift index abe901c63..d63050cd8 100644 --- a/iOS/Settings/AddAccountViewController.swift +++ b/iOS/Settings/AddAccountViewController.swift @@ -10,11 +10,7 @@ import Account import UIKit import RSCore -protocol AddAccountDismissDelegate: UIViewController { - func dismiss() -} - -class AddAccountViewController: UITableViewController, AddAccountDismissDelegate { +class AddAccountViewController: UITableViewController { @IBOutlet private weak var localAccountImageView: UIImageView! @IBOutlet private weak var localAccountNameLabel: UILabel! @@ -36,14 +32,10 @@ class AddAccountViewController: UITableViewController, AddAccountDismissDelegate case 0: let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "AddLocalAccountNavigationViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext - let addViewController = navController.topViewController as! LocalAccountViewController - addViewController.delegate = self present(navController, animated: true) case 1: let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "FeedbinAccountNavigationViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext - let addViewController = navController.topViewController as! FeedbinAccountViewController - addViewController.delegate = self present(navController, animated: true) case 2: let addAccount = OAuthAccountAuthorizationOperation(accountType: .feedly) @@ -53,8 +45,6 @@ class AddAccountViewController: UITableViewController, AddAccountDismissDelegate 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 From 54fc60aa51678b649e2328bc4eee7d4fec4ff81e Mon Sep 17 00:00:00 2001 From: Rizwan Mohamed Ibrahim Date: Fri, 24 Apr 2020 20:54:06 +0530 Subject: [PATCH 03/10] Add title for AddAccountViewController view controller title via storyboard --- iOS/Settings/Settings.storyboard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iOS/Settings/Settings.storyboard b/iOS/Settings/Settings.storyboard index 7983e3cb4..92b350795 100644 --- a/iOS/Settings/Settings.storyboard +++ b/iOS/Settings/Settings.storyboard @@ -519,10 +519,10 @@ - + - + From e93bec3114f511858dd21e2cffbb487008bdd1bd Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 25 Apr 2020 18:25:00 -0700 Subject: [PATCH 04/10] =?UTF-8?q?Fix=20bug=20where=20local=20account=20cou?= =?UTF-8?q?ld=20delete=20starred=20items=20if=20they=E2=80=99ve=20older=20?= =?UTF-8?q?and=20have=20fallen=20off=20the=20feed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frameworks/ArticlesDatabase/ArticlesTable.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index db997afb6..0800450f8 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -209,10 +209,10 @@ final class ArticlesTable: DatabaseTable { let newArticles = self.findAndSaveNewArticles(incomingArticles, fetchedArticlesDictionary, database) //5 let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) //6 - // Articles to delete are 1) no longer in feed and 2) older than 30 days. + // Articles to delete are 1) not starred and 2) older than 30 days and 3) no longer in feed. let cutoffDate = Date().bySubtracting(days: 30) let articlesToDelete = fetchedArticles.filter { (article) -> Bool in - return article.status.dateArrived < cutoffDate && !articleIDs.contains(article.articleID) + return !article.status.starred && article.status.dateArrived < cutoffDate && !articleIDs.contains(article.articleID) } self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, articlesToDelete, completion) //7 From 2de8e128b06399a334ab7472e3fb51313613776d Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 25 Apr 2020 18:37:08 -0700 Subject: [PATCH 05/10] =?UTF-8?q?Bump=20version=20to=2042.=20Oh=20hell=20y?= =?UTF-8?q?es=20we=E2=80=99ve=20been=20waiting=20for=20this=20one.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xcconfig/common/NetNewsWire_ios_target_common.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig index b76a85b25..ea57f1efd 100644 --- a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig +++ b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig @@ -1,7 +1,7 @@ // High Level Settings common to both the iOS application and any extensions we bundle with it MARKETING_VERSION = 5.0.1 -CURRENT_PROJECT_VERSION = 41 +CURRENT_PROJECT_VERSION = 42 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon From 31f3487d7aedc4c87a0f13bde75d342505091c33 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 28 Apr 2020 17:16:34 -0500 Subject: [PATCH 06/10] Reset focus when returning to the app from another app or the safari view controller. Issue #1963 --- iOS/RootSplitViewController.swift | 4 ++++ iOS/SceneCoordinator.swift | 8 ++++++++ iOS/SceneDelegate.swift | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/iOS/RootSplitViewController.swift b/iOS/RootSplitViewController.swift index 4a95fee0e..852c863d1 100644 --- a/iOS/RootSplitViewController.swift +++ b/iOS/RootSplitViewController.swift @@ -21,6 +21,10 @@ class RootSplitViewController: UISplitViewController { return .slide } + override func viewDidAppear(_ animated: Bool) { + coordinator.resetFocus() + } + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { self.coordinator.configurePanelMode(for: size) super.viewWillTransition(to: size, with: coordinator) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 3773f99b6..25b732781 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -405,6 +405,14 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { wasRootSplitViewControllerCollapsed = rootSplitViewController.isCollapsed } + func resetFocus() { + if currentArticle != nil { + masterTimelineViewController?.focus() + } else { + masterFeedViewController?.focus() + } + } + func selectFirstUnreadInAllUnread() { markExpanded(SmartFeedsController.shared) self.ensureFeedIsAvailableToSelect(SmartFeedsController.shared.unreadFeed) { diff --git a/iOS/SceneDelegate.swift b/iOS/SceneDelegate.swift index f95678c83..0a4ffdf80 100644 --- a/iOS/SceneDelegate.swift +++ b/iOS/SceneDelegate.swift @@ -66,7 +66,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneWillEnterForeground(_ scene: UIScene) { appDelegate.resumeDatabaseProcessingIfNecessary() appDelegate.prepareAccountsForForeground() - self.coordinator.configurePanelMode(for: window!.frame.size) + coordinator.configurePanelMode(for: window!.frame.size) + coordinator.resetFocus() } func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? { From e77abf42c34c65c85f3c79769438040fb85c336f Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 28 Apr 2020 17:53:24 -0500 Subject: [PATCH 07/10] Revert "Removes AddAccountDismissDelegate" --- iOS/Account/FeedWranglerAccountViewController.swift | 6 +++++- iOS/Account/FeedbinAccountViewController.swift | 3 +++ iOS/Account/LocalAccountViewController.swift | 4 ++++ iOS/Settings/AddAccountViewController.swift | 12 +++++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/iOS/Account/FeedWranglerAccountViewController.swift b/iOS/Account/FeedWranglerAccountViewController.swift index 5fa5d86e2..b6c297df8 100644 --- a/iOS/Account/FeedWranglerAccountViewController.swift +++ b/iOS/Account/FeedWranglerAccountViewController.swift @@ -20,6 +20,7 @@ class FeedWranglerAccountViewController: UITableViewController { @IBOutlet weak var actionButton: UIButton! weak var account: Account? + weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -58,6 +59,7 @@ class FeedWranglerAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) + delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { @@ -118,7 +120,9 @@ class FeedWranglerAccountViewController: UITableViewController { } } - self.dismiss(animated: true, completion: nil) + self.dismiss(animated: true, completion: nil) + self.delegate?.dismiss() + } catch { self.showError(NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")) } diff --git a/iOS/Account/FeedbinAccountViewController.swift b/iOS/Account/FeedbinAccountViewController.swift index d51350710..df6110b64 100644 --- a/iOS/Account/FeedbinAccountViewController.swift +++ b/iOS/Account/FeedbinAccountViewController.swift @@ -20,6 +20,7 @@ class FeedbinAccountViewController: UITableViewController { @IBOutlet weak var actionButton: UIButton! weak var account: Account? + weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -59,6 +60,7 @@ class FeedbinAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) + delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { @@ -116,6 +118,7 @@ class FeedbinAccountViewController: UITableViewController { } self.dismiss(animated: true, completion: nil) + self.delegate?.dismiss() } catch { self.showError(NSLocalizedString("Keychain error while storing credentials.", comment: "Credentials Error")) } diff --git a/iOS/Account/LocalAccountViewController.swift b/iOS/Account/LocalAccountViewController.swift index 85d338f13..be0c1596d 100644 --- a/iOS/Account/LocalAccountViewController.swift +++ b/iOS/Account/LocalAccountViewController.swift @@ -12,6 +12,8 @@ import Account class LocalAccountViewController: UITableViewController { @IBOutlet weak var nameTextField: UITextField! + + weak var delegate: AddAccountDismissDelegate? override func viewDidLoad() { super.viewDidLoad() @@ -23,12 +25,14 @@ class LocalAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) + delegate?.dismiss() } @IBAction func add(_ sender: Any) { let account = AccountManager.shared.createAccount(type: .onMyMac) account.name = nameTextField.text dismiss(animated: true, completion: nil) + delegate?.dismiss() } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { diff --git a/iOS/Settings/AddAccountViewController.swift b/iOS/Settings/AddAccountViewController.swift index e2c171ed3..db94f78df 100644 --- a/iOS/Settings/AddAccountViewController.swift +++ b/iOS/Settings/AddAccountViewController.swift @@ -10,7 +10,11 @@ import Account import UIKit import RSCore -class AddAccountViewController: UITableViewController { +protocol AddAccountDismissDelegate: UIViewController { + func dismiss() +} + +class AddAccountViewController: UITableViewController, AddAccountDismissDelegate { @IBOutlet private weak var localAccountImageView: UIImageView! @IBOutlet private weak var localAccountNameLabel: UILabel! @@ -33,10 +37,14 @@ class AddAccountViewController: UITableViewController { case 0: let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "AddLocalAccountNavigationViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext + let addViewController = navController.topViewController as! LocalAccountViewController + addViewController.delegate = self present(navController, animated: true) case 1: let navController = UIStoryboard.account.instantiateViewController(withIdentifier: "FeedbinAccountNavigationViewController") as! UINavigationController navController.modalPresentationStyle = .currentContext + let addViewController = navController.topViewController as! FeedbinAccountViewController + addViewController.delegate = self present(navController, animated: true) case 2: let addAccount = OAuthAccountAuthorizationOperation(accountType: .feedly) @@ -46,6 +54,8 @@ class AddAccountViewController: UITableViewController { 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 From 37bbee9fcce6701310f3537898816ce1895b7971 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 28 Apr 2020 17:58:06 -0500 Subject: [PATCH 08/10] Remove calls to dismiss delegate function on cancel. Issue #2010 --- iOS/Account/FeedWranglerAccountViewController.swift | 1 - iOS/Account/FeedbinAccountViewController.swift | 1 - iOS/Account/LocalAccountViewController.swift | 1 - 3 files changed, 3 deletions(-) diff --git a/iOS/Account/FeedWranglerAccountViewController.swift b/iOS/Account/FeedWranglerAccountViewController.swift index b6c297df8..39d1e2bbd 100644 --- a/iOS/Account/FeedWranglerAccountViewController.swift +++ b/iOS/Account/FeedWranglerAccountViewController.swift @@ -59,7 +59,6 @@ class FeedWranglerAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { diff --git a/iOS/Account/FeedbinAccountViewController.swift b/iOS/Account/FeedbinAccountViewController.swift index df6110b64..b33638b5d 100644 --- a/iOS/Account/FeedbinAccountViewController.swift +++ b/iOS/Account/FeedbinAccountViewController.swift @@ -60,7 +60,6 @@ class FeedbinAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func showHidePassword(_ sender: Any) { diff --git a/iOS/Account/LocalAccountViewController.swift b/iOS/Account/LocalAccountViewController.swift index be0c1596d..0bcbe8fa2 100644 --- a/iOS/Account/LocalAccountViewController.swift +++ b/iOS/Account/LocalAccountViewController.swift @@ -25,7 +25,6 @@ class LocalAccountViewController: UITableViewController { @IBAction func cancel(_ sender: Any) { dismiss(animated: true, completion: nil) - delegate?.dismiss() } @IBAction func add(_ sender: Any) { From a756a77943ed39ceb7c90aee78fa38592a0a266c Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Tue, 28 Apr 2020 16:40:37 -0700 Subject: [PATCH 09/10] Bump version to 43. --- xcconfig/common/NetNewsWire_ios_target_common.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig index ea57f1efd..2b155ae2f 100644 --- a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig +++ b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig @@ -1,7 +1,7 @@ // High Level Settings common to both the iOS application and any extensions we bundle with it MARKETING_VERSION = 5.0.1 -CURRENT_PROJECT_VERSION = 42 +CURRENT_PROJECT_VERSION = 43 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon From 704bffc7d2c1436ea27e01469bf397cb56e94b23 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Thu, 30 Apr 2020 11:42:52 -0700 Subject: [PATCH 10/10] Use explicit == func for Article. --- Frameworks/Articles/Article.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Frameworks/Articles/Article.swift b/Frameworks/Articles/Article.swift index 6e13633cc..855df90bd 100644 --- a/Frameworks/Articles/Article.swift +++ b/Frameworks/Articles/Article.swift @@ -61,6 +61,12 @@ public struct Article: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(articleID) } + + // MARK: - Equatable + + static public func ==(lhs: Article, rhs: Article) -> Bool { + return lhs.articleID == rhs.articleID && lhs.accountID == rhs.accountID && lhs.webFeedID == rhs.webFeedID && lhs.uniqueID == rhs.uniqueID && lhs.title == rhs.title && lhs.contentHTML == rhs.contentHTML && lhs.contentText == rhs.contentText && lhs.url == rhs.url && lhs.externalURL == rhs.externalURL && lhs.summary == rhs.summary && lhs.imageURL == rhs.imageURL && lhs.datePublished == rhs.datePublished && lhs.dateModified == rhs.dateModified && lhs.authors == rhs.authors + } } public extension Set where Element == Article {