From 1d26bc8c7063783948fe19ad6f6790df7a4b6827 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 18 Mar 2020 15:55:33 -0500 Subject: [PATCH 01/12] Revert "Set proper cell height for empty article array" --- .../MasterTimelineViewController.swift | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 2e4999a76..0abe0d939 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -70,7 +70,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner tableView.dataSource = dataSource numberOfTextLines = AppDefaults.timelineNumberOfLines iconSize = AppDefaults.timelineIconSize - tableView.rowHeight = calculateEstimatedRowHeight(forId: PrototypeFeedContent.feedId, withTitle: PrototypeFeedContent.longTitle, andFeed: PrototypeFeedContent.feedname) + resetEstimatedRowHeight() if let titleView = Bundle.main.loadNibNamed("MasterTimelineTitleView", owner: self, options: nil)?[0] as? MasterTimelineTitleView { navigationItem.titleView = titleView @@ -443,7 +443,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner if numberOfTextLines != AppDefaults.timelineNumberOfLines || iconSize != AppDefaults.timelineIconSize { numberOfTextLines = AppDefaults.timelineNumberOfLines iconSize = AppDefaults.timelineIconSize - tableView.rowHeight = calculateEstimatedRowHeight(forId: PrototypeFeedContent.feedId, withTitle: PrototypeFeedContent.longTitle, andFeed: PrototypeFeedContent.feedname) + resetEstimatedRowHeight() reloadAllVisibleCells() } } @@ -487,21 +487,26 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner // MARK: Cell Configuring - private func calculateEstimatedRowHeight(forId prototypeID: String, withTitle title: String, andFeed feedName: String) -> CGFloat { + private func resetEstimatedRowHeight() { + let longTitle = "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" + + let prototypeID = "prototype" let status = ArticleStatus(articleID: prototypeID, read: false, starred: false, userDeleted: false, dateArrived: Date()) - let prototypeArticle = Article(accountID: prototypeID, articleID: prototypeID, webFeedID: prototypeID, uniqueID: prototypeID, title: title, contentHTML: nil, contentText: nil, url: nil, externalURL: nil, summary: nil, imageURL: nil, datePublished: nil, dateModified: nil, authors: nil, status: status) + let prototypeArticle = Article(accountID: prototypeID, articleID: prototypeID, webFeedID: prototypeID, uniqueID: prototypeID, title: longTitle, contentHTML: nil, contentText: nil, url: nil, externalURL: nil, summary: nil, imageURL: nil, datePublished: nil, dateModified: nil, authors: nil, status: status) - let prototypeCellData = MasterTimelineCellData(article: prototypeArticle, showFeedName: true, feedName: feedName, iconImage: nil, showIcon: false, featuredImage: nil, numberOfLines: numberOfTextLines, iconSize: iconSize) + let prototypeCellData = MasterTimelineCellData(article: prototypeArticle, showFeedName: true, feedName: "Prototype Feed Name", iconImage: nil, showIcon: false, featuredImage: nil, numberOfLines: numberOfTextLines, iconSize: iconSize) if UIApplication.shared.preferredContentSizeCategory.isAccessibilityCategory { let layout = MasterTimelineAccessibilityCellLayout(width: tableView.bounds.width, insets: tableView.safeAreaInsets, cellData: prototypeCellData) - return layout.height + tableView.estimatedRowHeight = layout.height } else { let layout = MasterTimelineDefaultCellLayout(width: tableView.bounds.width, insets: tableView.safeAreaInsets, cellData: prototypeCellData) - return layout.height + tableView.estimatedRowHeight = layout.height } + } + } // MARK: Searching @@ -628,9 +633,7 @@ private extension MasterTimelineViewController { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([0]) snapshot.appendItems(coordinator.articles, toSection: 0) - if coordinator.articles.count == 0 { - tableView.rowHeight = calculateEstimatedRowHeight(forId: PrototypeFeedContent.feedId, withTitle: PrototypeFeedContent.longTitle, andFeed: PrototypeFeedContent.feedname) - } + dataSource.apply(snapshot, animatingDifferences: animated) { [weak self] in self?.restoreSelectionIfNecessary(adjustScroll: false) completion?() @@ -901,10 +904,3 @@ private extension MasterTimelineViewController { } } - -fileprivate struct PrototypeFeedContent { - static let longTitle = "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" - static let shortTitle = "prototype" - static let feedId = "feedId" - static let feedname = "prototype" -} From 8a75defee993a4aecf4865e1460aab193d3a2d2e Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 18 Mar 2020 16:06:05 -0500 Subject: [PATCH 02/12] Set row height when table is empty and set to automatic when articles are present. Issue #1919 --- iOS/MasterTimeline/MasterTimelineViewController.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 0abe0d939..87563f9f2 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -630,10 +630,16 @@ private extension MasterTimelineViewController { } func applyChanges(animated: Bool, completion: (() -> Void)? = nil) { + if coordinator.articles.count == 0 { + tableView.rowHeight = tableView.estimatedRowHeight + } else { + tableView.rowHeight = UITableView.automaticDimension + } + var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([0]) snapshot.appendItems(coordinator.articles, toSection: 0) - + dataSource.apply(snapshot, animatingDifferences: animated) { [weak self] in self?.restoreSelectionIfNecessary(adjustScroll: false) completion?() From 4d18c3475936622eb72a28e24209958811581733 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 18 Mar 2020 16:08:17 -0500 Subject: [PATCH 03/12] Update to the latest RSCore --- Shared/Extensions/RSImage-Extensions.swift | 2 +- submodules/RSCore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Shared/Extensions/RSImage-Extensions.swift b/Shared/Extensions/RSImage-Extensions.swift index 30a3d570b..e6f515270 100644 --- a/Shared/Extensions/RSImage-Extensions.swift +++ b/Shared/Extensions/RSImage-Extensions.swift @@ -28,7 +28,7 @@ extension RSImage { } static func scaledForIcon(_ data: Data) -> RSImage? { - let scaledMaxPixelSize = Int(ceil(CGFloat(RSImage.maxIconSize) * RSScreen.mainScreenScale)) + let scaledMaxPixelSize = Int(ceil(CGFloat(RSImage.maxIconSize) * RSScreen.maxScreenScale)) guard var cgImage = RSImage.scaleImage(data, maxPixelSize: scaledMaxPixelSize) else { return nil } diff --git a/submodules/RSCore b/submodules/RSCore index 34551c7ce..34e67f8b5 160000 --- a/submodules/RSCore +++ b/submodules/RSCore @@ -1 +1 @@ -Subproject commit 34551c7cebf98605e603d73983c8ad70cc9d390c +Subproject commit 34e67f8b5f566c29b60bbf6d31331334da0711fe From 910e14b4417e22adb2491a9694bcf5e56df67780 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Thu, 19 Mar 2020 22:22:58 -0700 Subject: [PATCH 04/12] =?UTF-8?q?Use=20a=20serial=20queue=20for=20RSImage.?= =?UTF-8?q?scaledForIcon,=20so=20we=20don=E2=80=99t=20end=20up=20having=20?= =?UTF-8?q?a=20ton=20of=20threads=20and=20doing=20too=20much=20at=20once,?= =?UTF-8?q?=20which=20hurts=20performance.=20Fix=20#1489.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared/Extensions/RSImage-Extensions.swift | 33 +++++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Shared/Extensions/RSImage-Extensions.swift b/Shared/Extensions/RSImage-Extensions.swift index e6f515270..94ae44892 100644 --- a/Shared/Extensions/RSImage-Extensions.swift +++ b/Shared/Extensions/RSImage-Extensions.swift @@ -6,6 +6,7 @@ // Copyright © 2019 Ranchero Software. All rights reserved. // +import RSCore #if os(macOS) import AppKit #else @@ -18,13 +19,8 @@ extension RSImage { static let maxIconSize = 48 - static func scaledForIcon(_ data: Data, imageResultBlock: @escaping (RSImage?) -> Void) { - DispatchQueue.global(qos: .default).async { - let image = RSImage.scaledForIcon(data) - DispatchQueue.main.async { - imageResultBlock(image) - } - } + static func scaledForIcon(_ data: Data, imageResultBlock: @escaping ImageResultBlock) { + IconScalerQueue.shared.scaledForIcon(data, imageResultBlock) } static func scaledForIcon(_ data: Data) -> RSImage? { @@ -41,3 +37,26 @@ extension RSImage { #endif } } + +// MARK: - IconScalerQueue + +private class IconScalerQueue { + + static let shared = IconScalerQueue() + + private let queue: DispatchQueue = { + let q = DispatchQueue(label: "IconScaler", attributes: .initiallyInactive) + q.setTarget(queue: DispatchQueue.global(qos: .default)) + q.activate() + return q + }() + + func scaledForIcon(_ data: Data, _ imageResultBlock: @escaping ImageResultBlock) { + queue.async { + let image = RSImage.scaledForIcon(data) + DispatchQueue.main.async { + imageResultBlock(image) + } + } + } +} From 316e4e62b226df138c4c54ee2edc8a107237c856 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 20 Mar 2020 06:58:11 -0500 Subject: [PATCH 05/12] Removed separator insets from layout code as they were no longer needed. --- .../Cell/MasterTimelineAccessibilityCellLayout.swift | 4 ---- iOS/MasterTimeline/Cell/MasterTimelineCellLayout.swift | 1 - iOS/MasterTimeline/Cell/MasterTimelineDefaultCellLayout.swift | 4 ---- iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift | 2 +- 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/iOS/MasterTimeline/Cell/MasterTimelineAccessibilityCellLayout.swift b/iOS/MasterTimeline/Cell/MasterTimelineAccessibilityCellLayout.swift index f104a2d0e..60c8355f3 100644 --- a/iOS/MasterTimeline/Cell/MasterTimelineAccessibilityCellLayout.swift +++ b/iOS/MasterTimeline/Cell/MasterTimelineAccessibilityCellLayout.swift @@ -19,7 +19,6 @@ struct MasterTimelineAccessibilityCellLayout: MasterTimelineCellLayout { let summaryRect: CGRect let feedNameRect: CGRect let dateRect: CGRect - let separatorInsets: UIEdgeInsets init(width: CGFloat, insets: UIEdgeInsets, cellData: MasterTimelineCellData) { @@ -34,9 +33,6 @@ struct MasterTimelineAccessibilityCellLayout: MasterTimelineCellLayout { // Start the point at the beginning position of the main block currentPoint.x += MasterTimelineDefaultCellLayout.unreadCircleDimension + MasterTimelineDefaultCellLayout.unreadCircleMarginRight - // Separator Insets - self.separatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) - // Icon Image if cellData.showIcon { self.iconImageRect = MasterTimelineAccessibilityCellLayout.rectForIconView(currentPoint, iconSize: cellData.iconSize) diff --git a/iOS/MasterTimeline/Cell/MasterTimelineCellLayout.swift b/iOS/MasterTimeline/Cell/MasterTimelineCellLayout.swift index b93c7601b..c235670c9 100644 --- a/iOS/MasterTimeline/Cell/MasterTimelineCellLayout.swift +++ b/iOS/MasterTimeline/Cell/MasterTimelineCellLayout.swift @@ -18,7 +18,6 @@ protocol MasterTimelineCellLayout { var summaryRect: CGRect {get} var feedNameRect: CGRect {get} var dateRect: CGRect {get} - var separatorInsets: UIEdgeInsets {get} } diff --git a/iOS/MasterTimeline/Cell/MasterTimelineDefaultCellLayout.swift b/iOS/MasterTimeline/Cell/MasterTimelineDefaultCellLayout.swift index b80666016..6b2ce58ad 100644 --- a/iOS/MasterTimeline/Cell/MasterTimelineDefaultCellLayout.swift +++ b/iOS/MasterTimeline/Cell/MasterTimelineDefaultCellLayout.swift @@ -51,7 +51,6 @@ struct MasterTimelineDefaultCellLayout: MasterTimelineCellLayout { let summaryRect: CGRect let feedNameRect: CGRect let dateRect: CGRect - let separatorInsets: UIEdgeInsets init(width: CGFloat, insets: UIEdgeInsets, cellData: MasterTimelineCellData) { @@ -66,9 +65,6 @@ struct MasterTimelineDefaultCellLayout: MasterTimelineCellLayout { // Start the point at the beginning position of the main block currentPoint.x += MasterTimelineDefaultCellLayout.unreadCircleDimension + MasterTimelineDefaultCellLayout.unreadCircleMarginRight - // Separator Insets - self.separatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) - // Icon Image if cellData.showIcon { self.iconImageRect = MasterTimelineDefaultCellLayout.rectForIconView(currentPoint, iconSize: cellData.iconSize) diff --git a/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift b/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift index 39dbd51e5..aa964b218 100644 --- a/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift +++ b/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift @@ -79,7 +79,7 @@ class MasterTimelineTableViewCell: VibrantTableViewCell { feedNameView.setFrameIfNotEqual(layout.feedNameRect) dateView.setFrameIfNotEqual(layout.dateRect) - separatorInset = layout.separatorInsets + separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) } func setIconImage(_ image: IconImage) { From e7436925adc47928e74ef1adb3626676b7dddd39 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 20 Mar 2020 10:34:18 -0500 Subject: [PATCH 06/12] Don't remove filtered feeds on article downloads. --- iOS/SceneCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index ea7065f76..14fbb5e1d 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -541,7 +541,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } @objc func downloadArticlesDidUpdateUnreadCounts(_ note: Notification) { - rebuildBackingStores() + rebuildBackingStoresWithMerge() } @objc func accountDidDownloadArticles(_ note: Notification) { From 9f516caa35052570db1bacb85e0d3f6c15d4f690 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sat, 21 Mar 2020 17:19:03 -0500 Subject: [PATCH 07/12] Don't use borders on nested tables. Issue #1936 --- iOS/Resources/styleSheet.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iOS/Resources/styleSheet.css b/iOS/Resources/styleSheet.css index d9eddcf15..5f403c4de 100644 --- a/iOS/Resources/styleSheet.css +++ b/iOS/Resources/styleSheet.css @@ -169,6 +169,10 @@ code, pre { border: 1px solid var(--secondary-accent-color); font-size: inherit; } +.nnw-overflow table table { + margin-bottom: 0; + border: none; +} .nnw-overflow td, .nnw-overflow th { -webkit-hyphens: none; word-break: normal; From 97226f543b84808d249a22a9b223cecd7db3be77 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 22 Mar 2020 10:18:07 -0500 Subject: [PATCH 08/12] Assign keyboard shortcuts to filters and change clean up shortcut. Issue #1842 --- iOS/KeyboardManager.swift | 10 +++- iOS/MasterFeed/MasterFeedViewController.swift | 28 +++++------ .../MasterTimelineViewController.swift | 26 +++------- iOS/RootSplitViewController.swift | 8 ++++ iOS/SceneCoordinator.swift | 48 +++++++++---------- 5 files changed, 57 insertions(+), 63 deletions(-) diff --git a/iOS/KeyboardManager.swift b/iOS/KeyboardManager.swift index 3c68dd119..7d11931b2 100644 --- a/iOS/KeyboardManager.swift +++ b/iOS/KeyboardManager.swift @@ -139,13 +139,19 @@ private extension KeyboardManager { keys.append(KeyboardManager.createKeyCommand(title: goToStarredTitle, action: "goToStarred:", input: "3", modifiers: [.command])) let articleSearchTitle = NSLocalizedString("Article Search", comment: "Article Search") - keys.append(KeyboardManager.createKeyCommand(title: articleSearchTitle, action: "articleSearch:", input: "f", modifiers: [.command, .shift])) + keys.append(KeyboardManager.createKeyCommand(title: articleSearchTitle, action: "articleSearch:", input: "f", modifiers: [.command, .alternate])) let markAllAsReadTitle = NSLocalizedString("Mark All as Read", comment: "Mark All as Read") keys.append(KeyboardManager.createKeyCommand(title: markAllAsReadTitle, action: "markAllAsRead:", input: "k", modifiers: [.command])) let cleanUp = NSLocalizedString("Clean Up", comment: "Clean Up") - keys.append(KeyboardManager.createKeyCommand(title: cleanUp, action: "cleanUp:", input: "h", modifiers: [.command, .shift])) + keys.append(KeyboardManager.createKeyCommand(title: cleanUp, action: "cleanUp:", input: "`", modifiers: [.command])) + + let toggleReadFeedsFilter = NSLocalizedString("Toggle Read Feeds Filter", comment: "Toggle Read Feeds Filter") + keys.append(KeyboardManager.createKeyCommand(title: toggleReadFeedsFilter, action: "toggleReadFeedsFilter:", input: "f", modifiers: [.command, .shift])) + + let toggleReadArticlesFilter = NSLocalizedString("Toggle Read Articles Filter", comment: "Toggle Read Articles Filter") + keys.append(KeyboardManager.createKeyCommand(title: toggleReadArticlesFilter, action: "toggleReadArticlesFilter:", input: "h", modifiers: [.command, .shift])) return keys } diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index 89b4895ec..5432c72a0 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -378,13 +378,7 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { } @IBAction func toggleFilter(_ sender: Any) { - if coordinator.isReadFeedsFiltered { - setFilterButtonToInactive() - coordinator.showAllFeeds() - } else { - setFilterButtonToActive() - coordinator.hideReadFeeds() - } + coordinator.toggleReadFeedsFilter() } @IBAction func add(_ sender: UIBarButtonItem) { @@ -509,6 +503,16 @@ class MasterFeedViewController: UITableViewController, UndoableCommandRunner { } } + func updateUI() { + if coordinator.isReadFeedsFiltered { + setFilterButtonToActive() + } else { + setFilterButtonToInactive() + } + refreshProgressView?.updateRefreshLabel() + addNewItemButton?.isEnabled = !AccountManager.shared.activeAccounts.isEmpty + } + func focus() { becomeFirstResponder() } @@ -580,16 +584,6 @@ private extension MasterFeedViewController { toolbarItems?.insert(refreshProgressItemButton, at: 2) } - func updateUI() { - if coordinator.isReadFeedsFiltered { - setFilterButtonToActive() - } else { - setFilterButtonToInactive() - } - refreshProgressView?.updateRefreshLabel() - addNewItemButton?.isEnabled = !AccountManager.shared.activeAccounts.isEmpty - } - func setFilterButtonToActive() { filterButton?.image = AppAssets.filterActiveImage filterButton?.accLabelText = NSLocalizedString("Selected - Filter Read Feeds", comment: "Selected - Filter Read Feeds") diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 87563f9f2..4cb77da86 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -111,13 +111,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner // MARK: Actions @IBAction func toggleFilter(_ sender: Any) { - if coordinator.isReadArticlesFiltered { - setFilterButtonToInactive() - coordinator.showAllArticles() - } else { - setFilterButtonToActive() - coordinator.hideReadArticles() - } + coordinator.toggleReadArticlesFilter() } @IBAction func markAllAsRead(_ sender: Any) { @@ -589,11 +583,13 @@ private extension MasterTimelineViewController { } if coordinator.isReadArticlesFiltered { - setFilterButtonToActive() + filterButton?.image = AppAssets.filterActiveImage + filterButton?.accLabelText = NSLocalizedString("Selected - Filter Read Articles", comment: "Selected - Filter Read Articles") } else { - setFilterButtonToInactive() + filterButton?.image = AppAssets.filterInactiveImage + filterButton?.accLabelText = NSLocalizedString("Filter Read Articles", comment: "Filter Read Articles") } - + tableView.selectRow(at: nil, animated: false, scrollPosition: .top) if resetScroll && dataSource.snapshot().itemIdentifiers(inSection: 0).count > 0 { tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false) @@ -603,16 +599,6 @@ private extension MasterTimelineViewController { } - func setFilterButtonToActive() { - filterButton?.image = AppAssets.filterActiveImage - filterButton?.accLabelText = NSLocalizedString("Selected - Filter Read Articles", comment: "Selected - Filter Read Articles") - } - - func setFilterButtonToInactive() { - filterButton?.image = AppAssets.filterInactiveImage - filterButton?.accLabelText = NSLocalizedString("Filter Read Articles", comment: "Filter Read Articles") - } - func updateToolbar() { markAllAsReadButton.isEnabled = coordinator.isTimelineUnreadAvailable firstUnreadButton.isEnabled = coordinator.isTimelineUnreadAvailable diff --git a/iOS/RootSplitViewController.swift b/iOS/RootSplitViewController.swift index 6f02ab425..df3805331 100644 --- a/iOS/RootSplitViewController.swift +++ b/iOS/RootSplitViewController.swift @@ -94,6 +94,14 @@ class RootSplitViewController: UISplitViewController { coordinator.cleanUp() } + @objc func toggleReadFeedsFilter(_ sender: Any?) { + coordinator.toggleReadFeedsFilter() + } + + @objc func toggleReadArticlesFilter(_ sender: Any?) { + coordinator.toggleReadArticlesFilter() + } + @objc func refresh(_ sender: Any?) { appDelegate.manualRefresh(errorHandler: ErrorHandler.present(self)) } diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 14fbb5e1d..3c5f552af 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -581,6 +581,30 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } } + func toggleReadFeedsFilter() { + if isReadFeedsFiltered { + treeControllerDelegate.isReadFiltered = false + } else { + treeControllerDelegate.isReadFiltered = true + } + rebuildBackingStores() + masterFeedViewController?.updateUI() + } + + func toggleReadArticlesFilter() { + guard let feedID = timelineFeed?.feedID else { + return + } + + if isReadArticlesFiltered { + readFilterEnabledTable[feedID] = false + } else { + readFilterEnabledTable[feedID] = true + } + + refreshTimeline(resetScroll: false) + } + func shadowNodesFor(section: Int) -> [Node] { return shadowTable[section] } @@ -617,30 +641,6 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } } - func showAllFeeds() { - treeControllerDelegate.isReadFiltered = false - rebuildBackingStores() - } - - func hideReadFeeds() { - treeControllerDelegate.isReadFiltered = true - rebuildBackingStores() - } - - func showAllArticles() { - if let feedID = timelineFeed?.feedID { - readFilterEnabledTable[feedID] = false - } - refreshTimeline(resetScroll: false) - } - - func hideReadArticles() { - if let feedID = timelineFeed?.feedID { - readFilterEnabledTable[feedID] = true - } - refreshTimeline(resetScroll: false) - } - func isExpanded(_ containerIdentifiable: ContainerIdentifiable) -> Bool { if let containerID = containerIdentifiable.containerID { return expandedTable.contains(containerID) From 85cbd204b3e6e4e91de66cd3387b115e8c754368 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 22 Mar 2020 10:23:31 -0500 Subject: [PATCH 09/12] Fixed clean up keyboard shortcut --- iOS/KeyboardManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOS/KeyboardManager.swift b/iOS/KeyboardManager.swift index 7d11931b2..a13f44ceb 100644 --- a/iOS/KeyboardManager.swift +++ b/iOS/KeyboardManager.swift @@ -145,7 +145,7 @@ private extension KeyboardManager { keys.append(KeyboardManager.createKeyCommand(title: markAllAsReadTitle, action: "markAllAsRead:", input: "k", modifiers: [.command])) let cleanUp = NSLocalizedString("Clean Up", comment: "Clean Up") - keys.append(KeyboardManager.createKeyCommand(title: cleanUp, action: "cleanUp:", input: "`", modifiers: [.command])) + keys.append(KeyboardManager.createKeyCommand(title: cleanUp, action: "cleanUp:", input: "'", modifiers: [.command])) let toggleReadFeedsFilter = NSLocalizedString("Toggle Read Feeds Filter", comment: "Toggle Read Feeds Filter") keys.append(KeyboardManager.createKeyCommand(title: toggleReadFeedsFilter, action: "toggleReadFeedsFilter:", input: "f", modifiers: [.command, .shift])) From fb4f72ad18207d22ef84f1e6401fe36efd45c0b6 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 22 Mar 2020 19:25:53 -0700 Subject: [PATCH 10/12] =?UTF-8?q?Save=20articles=20from=20multiple=20web?= =?UTF-8?q?=20feeds=20at=20once=20=E2=80=94=C2=A0rather=20than=20doing=20i?= =?UTF-8?q?t=20feed-by-feed=20=E2=80=94=20when=20syncing.=20(This=20makes?= =?UTF-8?q?=20syncing=20faster.)=20Fix=20#1794.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frameworks/Account/Account.swift | 81 +++++++++---------- .../ArticlesDatabase/ArticlesDatabase.swift | 4 +- .../ArticlesDatabase/ArticlesTable.swift | 12 ++- .../Extensions/Article+Database.swift | 11 ++- 4 files changed, 56 insertions(+), 52 deletions(-) diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 5bbc1f6b2..271677817 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -688,56 +688,49 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, completion(nil) return } - - let group = DispatchGroup() - var possibleError: DatabaseError? = nil - var newArticles = Set
() - var updatedArticles = Set
() - - for (webFeedID, items) in webFeedIDsAndItems { - - group.enter() - database.update(webFeedID: webFeedID, items: items, defaultRead: defaultRead) { updateArticlesResult in - switch updateArticlesResult { - case .success(let newAndUpdatedArticles): - if let articles = newAndUpdatedArticles.newArticles { - newArticles.formUnion(articles) - } - if let articles = newAndUpdatedArticles.updatedArticles { - updatedArticles.formUnion(articles) - } - case .failure(let databaseError): - possibleError = databaseError + database.update(webFeedIDsAndItems: webFeedIDsAndItems, defaultRead: defaultRead) { updateArticlesResult in + + func sendNotificationAbout(newArticles: Set
?, updatedArticles: Set
?) { + var webFeeds = Set() + + if let newArticles = newArticles { + webFeeds.formUnion(Set(newArticles.compactMap { $0.webFeed })) } - - group.leave() - } - - } - - group.notify(queue: DispatchQueue.main) { - var userInfo = [String: Any]() - var webFeeds = Set(newArticles.compactMap { $0.webFeed }) - webFeeds.formUnion(Set(updatedArticles.compactMap { $0.webFeed })) - - if !newArticles.isEmpty { - self.updateUnreadCounts(for: webFeeds) { - NotificationCenter.default.post(name: .DownloadArticlesDidUpdateUnreadCounts, object: self, userInfo: nil) + if let updatedArticles = updatedArticles { + webFeeds.formUnion(Set(updatedArticles.compactMap { $0.webFeed })) + } + + var shouldSendNotification = false + var userInfo = [String: Any]() + + if let newArticles = newArticles, !newArticles.isEmpty { + shouldSendNotification = true + userInfo[UserInfoKey.newArticles] = newArticles + self.updateUnreadCounts(for: webFeeds) { + NotificationCenter.default.post(name: .DownloadArticlesDidUpdateUnreadCounts, object: self, userInfo: nil) + } + } + + if let updatedArticles = updatedArticles, !updatedArticles.isEmpty { + shouldSendNotification = true + userInfo[UserInfoKey.updatedArticles] = updatedArticles + } + + if shouldSendNotification { + userInfo[UserInfoKey.webFeeds] = webFeeds + NotificationCenter.default.post(name: .AccountDidDownloadArticles, object: self, userInfo: userInfo) } - userInfo[UserInfoKey.newArticles] = newArticles } - - if !updatedArticles.isEmpty { - userInfo[UserInfoKey.updatedArticles] = updatedArticles + + switch updateArticlesResult { + case .success(let newAndUpdatedArticles): + sendNotificationAbout(newArticles: newAndUpdatedArticles.newArticles, updatedArticles: newAndUpdatedArticles.updatedArticles) + completion(nil) + case .failure(let databaseError): + completion(databaseError) } - - userInfo[UserInfoKey.webFeeds] = webFeeds - NotificationCenter.default.post(name: .AccountDidDownloadArticles, object: self, userInfo: userInfo) - - completion(possibleError) } - } @discardableResult diff --git a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift index 8b96e1f02..ec94b2e35 100644 --- a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift +++ b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift @@ -184,8 +184,8 @@ public final class ArticlesDatabase { // MARK: - Saving and Updating Articles /// Update articles and save new ones. - public func update(webFeedID: String, items: Set, defaultRead: Bool, completion: @escaping UpdateArticlesCompletionBlock) { - articlesTable.update(webFeedID, items, defaultRead, completion) + public func update(webFeedIDsAndItems: [String: Set], defaultRead: Bool, completion: @escaping UpdateArticlesCompletionBlock) { + articlesTable.update(webFeedIDsAndItems, defaultRead, completion) } // MARK: - Status diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 1f0ab8414..35b52d583 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -169,8 +169,8 @@ final class ArticlesTable: DatabaseTable { // MARK: - Updating - func update(_ webFeedID: String, _ items: Set, _ read: Bool, _ completion: @escaping UpdateArticlesCompletionBlock) { - if items.isEmpty { + func update(_ webFeedIDsAndItems: [String: Set], _ read: Bool, _ completion: @escaping UpdateArticlesCompletionBlock) { + if webFeedIDsAndItems.isEmpty { callUpdateArticlesCompletionBlock(nil, nil, completion) return } @@ -187,11 +187,15 @@ final class ArticlesTable: DatabaseTable { self.queue.runInTransaction { (databaseResult) in func makeDatabaseCalls(_ database: FMDatabase) { - let articleIDs = items.articleIDs() + var articleIDs = Set() + for (_, parsedItems) in webFeedIDsAndItems { + articleIDs.formUnion(parsedItems.articleIDs()) + } + let statusesDictionary = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, read, database) //1 assert(statusesDictionary.count == articleIDs.count) - let allIncomingArticles = Article.articlesWithWebFeedIDsAndItems(webFeedID, items, self.accountID, statusesDictionary) //2 + let allIncomingArticles = Article.articlesWithWebFeedIDsAndItems(webFeedIDsAndItems, self.accountID, statusesDictionary) //2 if allIncomingArticles.isEmpty { self.callUpdateArticlesCompletionBlock(nil, nil, completion) return diff --git a/Frameworks/ArticlesDatabase/Extensions/Article+Database.swift b/Frameworks/ArticlesDatabase/Extensions/Article+Database.swift index 165887067..47b88caf7 100644 --- a/Frameworks/ArticlesDatabase/Extensions/Article+Database.swift +++ b/Frameworks/ArticlesDatabase/Extensions/Article+Database.swift @@ -112,9 +112,16 @@ extension Article { // return Set(parsedItems.map{ Article(parsedItem: $0, maximumDateAllowed: maximumDateAllowed, accountID: accountID, feedID: feedID, status: statusesDictionary[$0.articleID]!) }) // } - static func articlesWithWebFeedIDsAndItems(_ webFeedID: String, _ items: Set, _ accountID: String, _ statusesDictionary: [String: ArticleStatus]) -> Set
{ + static func articlesWithWebFeedIDsAndItems(_ webFeedIDsAndItems: [String: Set], _ accountID: String, _ statusesDictionary: [String: ArticleStatus]) -> Set
{ let maximumDateAllowed = Date().addingTimeInterval(60 * 60 * 24) // Allow dates up to about 24 hours ahead of now - let feedArticles = Set(items.map{ Article(parsedItem: $0, maximumDateAllowed: maximumDateAllowed, accountID: accountID, webFeedID: webFeedID, status: statusesDictionary[$0.articleID]!) }) + var feedArticles = Set
() + for (webFeedID, parsedItems) in webFeedIDsAndItems { + for parsedItem in parsedItems { + let status = statusesDictionary[parsedItem.articleID]! + let article = Article(parsedItem: parsedItem, maximumDateAllowed: maximumDateAllowed, accountID: accountID, webFeedID: webFeedID, status: status) + feedArticles.insert(article) + } + } return feedArticles } } From 9918f6c2e1bfb87204260852502f667c9cd84201 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 23 Mar 2020 07:30:06 -0500 Subject: [PATCH 11/12] Updated to the lateset certs, profiles, and key --- buildscripts/certs/ios-dist.cer.enc | 62 ++-- buildscripts/certs/mac-dist.cer.enc | 60 ++-- buildscripts/certs/mac-dist.p12.enc | 136 +++---- .../profile/NetNewsWire.provisionprofile.enc | 340 +++++++++--------- .../NetNewsWireiOS.mobileprovision.enc | 328 +++++++++-------- submodules/RSCore | 2 +- 6 files changed, 476 insertions(+), 452 deletions(-) diff --git a/buildscripts/certs/ios-dist.cer.enc b/buildscripts/certs/ios-dist.cer.enc index 9fe00110f..0cc689a41 100644 --- a/buildscripts/certs/ios-dist.cer.enc +++ b/buildscripts/certs/ios-dist.cer.enc @@ -1,31 +1,31 @@ -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 diff --git a/buildscripts/certs/mac-dist.cer.enc b/buildscripts/certs/mac-dist.cer.enc index 4c331d119..eabeae857 100644 --- a/buildscripts/certs/mac-dist.cer.enc +++ b/buildscripts/certs/mac-dist.cer.enc @@ -1,30 +1,30 @@ -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 diff --git a/buildscripts/certs/mac-dist.p12.enc b/buildscripts/certs/mac-dist.p12.enc index d173fc62e..99fa654ea 100644 --- a/buildscripts/certs/mac-dist.p12.enc +++ b/buildscripts/certs/mac-dist.p12.enc @@ -1,68 +1,68 @@ -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 diff --git a/buildscripts/profile/NetNewsWire.provisionprofile.enc b/buildscripts/profile/NetNewsWire.provisionprofile.enc index 2d9138c73..0ef3c6f85 100644 --- a/buildscripts/profile/NetNewsWire.provisionprofile.enc +++ b/buildscripts/profile/NetNewsWire.provisionprofile.enc @@ -1,167 +1,173 @@ -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 diff --git a/buildscripts/profile/NetNewsWireiOS.mobileprovision.enc b/buildscripts/profile/NetNewsWireiOS.mobileprovision.enc index 23f5b0792..5e64e1bb5 100644 --- a/buildscripts/profile/NetNewsWireiOS.mobileprovision.enc +++ b/buildscripts/profile/NetNewsWireiOS.mobileprovision.enc @@ -1,155 +1,173 @@ -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 -ywGCdFWag12WabZsn8j65l0fsr/M7CKTA3OlL+K0+wpUISJxZcyRfbF5cJQ6il63 -1+XmkTarCqMJZc1owi3MpcYVSvsmMah1L0l9UPTsJrTyjqWvhYKAjV+ZUexqcML+ -WRuzEE/4jQEvOErjXn84o8NfI1FDRtHawB1Fn/hZ2Li4SSYm3TLbxRBZVmrVuB+N -BNaNGwFzTNKSSPEgwnl+euN8e740L6Bj/6nYBgj2s92ZzIPuxYIojOyrSaU/Izxw -y/Yovii82CcXe61BXXoamVvbIvjDXWfRL7Uun3BWAokHq6Rm6eJYKPh0F3MBBR/1 -GOv5k8Mh51dtqOjx/0KXrDIe/FPz5XFS2RkKOaKnn2dI8fZ1qLKjpN/BaVCY2pK1 -M2FKZVxh9NcC4uLxSioTpSl3CVr8l+/5HIZEy/grPxuhCGW7zHLWQr+80x4c17Ri -AeK+6a8NOd+2BuDans15uVpz9pP39jt5Sk419gbzKal2vam8wR4Myeo5BOtg0PCr -h7ayPkCBQrqye33PLZsm7dP7LKTnqTTH3Hph5K7pU6L11FJd8UDfuqJstSSaeK5D -W/GqLha3HqrfxgXc6ZZLguVEGUSaUrU7vHmaEd+XLBRd4JhvgngERyRUPJ5D+B7n -K8BG5lbLEwKmFB5PmMVzMsDFB9EaRM35uQGF3hdP4z3L8tTLUR9ydZIFzVaMJxgr -EoUs15NPM7EuIPzO+zL9ua4uKgHdO9kjP4WXhl8kd0qq+EHEEeQ0+oH8N+hR4tac -3JVRfPHeYsrU34SH0ddBl66EHnbL6i4egs9tlDdWN22p5Kjn4ZizpI2BpjSG5SLM -ycUgmFoDoq71HPSXaoFtiFPpKXorYNUrZbq5P+lq4QkpLeR3Fk7onta8h1U9R3Rk -Tk02C5UV9lVmT7p8nb+jiW2IBwviS4F378fX4WhUSjGQBl/+kiSwhPoNCN535Cbg -DyRH+h0B2pveQJMmXRLtrEybK+KGkuYiTw+1o21554MKErotDLDL2Ka0lMP4x45g -pvQ2IH45iQs7SqcN15U3/MbDy++4M9go8PX7h22SNSLXNZaPfnXVVDcsRwgx3LHS -N0fv9IgFh9xcYqfpZJm3YDz7DX6TUI3VCQQx7VAy3QLP38FuxbY6GCP9nmZlPASD -3fj9ahDf1JS0az46kmVYK8F7cwy2JKcHF6z41CSW13ys0X4qJIpaCkNdjfvZ8XY+ -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 diff --git a/submodules/RSCore b/submodules/RSCore index 34e67f8b5..a175db500 160000 --- a/submodules/RSCore +++ b/submodules/RSCore @@ -1 +1 @@ -Subproject commit 34e67f8b5f566c29b60bbf6d31331334da0711fe +Subproject commit a175db5009f8222fcbaa825d9501305e8727da6f From a6e75df412c278d0d0553de2e243def96a0d785d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 24 Mar 2020 12:21:08 -0500 Subject: [PATCH 12/12] Send out an event if we found a cached favicon downloader for new homepage URL. Issue #1940 --- Shared/Favicons/FaviconDownloader.swift | 21 +++++++++++++------ Shared/Favicons/SingleFaviconDownloader.swift | 8 ++++--- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Shared/Favicons/FaviconDownloader.swift b/Shared/Favicons/FaviconDownloader.swift index 25c83bcc1..99d8dd2e6 100644 --- a/Shared/Favicons/FaviconDownloader.swift +++ b/Shared/Favicons/FaviconDownloader.swift @@ -178,11 +178,6 @@ final class FaviconDownloader { remainingFaviconURLs[homePageURL] = nil - if self.homePageToFaviconURLCache[homePageURL] == nil { - self.homePageToFaviconURLCache[homePageURL] = singleFaviconDownloader.faviconURL - self.homePageToFaviconURLCacheDirty = true - } - postFaviconDidBecomeAvailableNotification(singleFaviconDownloader.faviconURL) } @@ -232,8 +227,22 @@ private extension FaviconDownloader { func faviconDownloader(withURL faviconURL: String, homePageURL: String?) -> SingleFaviconDownloader { + var firstTimeSeeingHomepageURL = false + + if let homePageURL = homePageURL, self.homePageToFaviconURLCache[homePageURL] == nil { + self.homePageToFaviconURLCache[homePageURL] = faviconURL + self.homePageToFaviconURLCacheDirty = true + firstTimeSeeingHomepageURL = true + } + if let downloader = singleFaviconDownloaderCache[faviconURL] { - downloader.downloadFaviconIfNeeded() + if firstTimeSeeingHomepageURL && !downloader.downloadFaviconIfNeeded() { + // This is to handle the scenario where we have different homepages, but the same favicon. + // This happens for Twitter and probably other sites like Blogger. Because the favicon + // is cached, we wouldn't send out a notification that it is now available unless we send + // it here. + postFaviconDidBecomeAvailableNotification(faviconURL) + } return downloader } diff --git a/Shared/Favicons/SingleFaviconDownloader.swift b/Shared/Favicons/SingleFaviconDownloader.swift index 8a37486f3..9ef2b61df 100644 --- a/Shared/Favicons/SingleFaviconDownloader.swift +++ b/Shared/Favicons/SingleFaviconDownloader.swift @@ -48,21 +48,23 @@ final class SingleFaviconDownloader { findFavicon() } - func downloadFaviconIfNeeded() { + func downloadFaviconIfNeeded() -> Bool { // If we don’t have an image, and lastDownloadAttemptDate is a while ago, try again. if let _ = iconImage { - return + return false } let retryInterval: TimeInterval = 30 * 60 // 30 minutes if Date().timeIntervalSince(lastDownloadAttemptDate) < retryInterval { - return + return false } lastDownloadAttemptDate = Date() findFavicon() + + return true } }