From 5371fca4eadee75222093439a65e8199a072c641 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 12:59:28 -0800 Subject: [PATCH 1/8] Fix theming on Article panel --- iOS/SceneCoordinator.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index b7d1a1f98..6407c94ed 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -297,6 +297,9 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { self.articleViewController = rootSplitViewController.viewController(for: .secondary) as? ArticleViewController self.articleViewController?.coordinator = self + if let navController = self.articleViewController?.navigationController { + configureNavigationController(navController) + } for sectionNode in treeController.rootNode.childNodes { markExpanded(sectionNode) From 574672f016707e6381a7f42940b567662415e5d2 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sat, 29 Jan 2022 07:51:00 +0800 Subject: [PATCH 2/8] Remove unread count code from section headers --- .../MasterFeedTableViewSectionHeader.swift | 6 ++--- ...sterFeedTableViewSectionHeaderLayout.swift | 27 +++---------------- 2 files changed, 5 insertions(+), 28 deletions(-) diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift index a2aff10d4..e194f41d7 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift @@ -97,7 +97,7 @@ class MasterFeedTableViewSectionHeader: UITableViewHeaderFooterView { } override func sizeThatFits(_ size: CGSize) -> CGSize { - let layout = MasterFeedTableViewSectionHeaderLayout(cellWidth: size.width, insets: safeAreaInsets, label: titleView, unreadCountView: unreadCountView) + let layout = MasterFeedTableViewSectionHeaderLayout(cellWidth: size.width, insets: safeAreaInsets, label: titleView) return CGSize(width: bounds.width, height: layout.height) } @@ -106,8 +106,7 @@ class MasterFeedTableViewSectionHeader: UITableViewHeaderFooterView { super.layoutSubviews() let layout = MasterFeedTableViewSectionHeaderLayout(cellWidth: contentView.bounds.size.width, insets: contentView.safeAreaInsets, - label: titleView, - unreadCountView: unreadCountView) + label: titleView) layoutWith(layout) } @@ -157,7 +156,6 @@ private extension MasterFeedTableViewSectionHeader { func layoutWith(_ layout: MasterFeedTableViewSectionHeaderLayout) { titleView.setFrameIfNotEqual(layout.titleRect) - unreadCountView.setFrameIfNotEqual(layout.unreadCountRect) disclosureButton.setFrameIfNotEqual(layout.disclosureButtonRect) let top = CGRect(x: safeAreaInsets.left, y: 0, width: frame.width - safeAreaInsets.right - safeAreaInsets.left, height: 0.33) diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeaderLayout.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeaderLayout.swift index 60748bb82..73dce3f69 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeaderLayout.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeaderLayout.swift @@ -12,19 +12,17 @@ import RSCore struct MasterFeedTableViewSectionHeaderLayout { private static let labelMarginRight = CGFloat(integerLiteral: 8) - private static let unreadCountMarginRight = CGFloat(integerLiteral: 0) private static let disclosureButtonSize = CGSize(width: 44, height: 44) private static let verticalPadding = CGFloat(integerLiteral: 11) private static let minRowHeight = CGFloat(integerLiteral: 44) let titleRect: CGRect - let unreadCountRect: CGRect let disclosureButtonRect: CGRect let height: CGFloat - init(cellWidth: CGFloat, insets: UIEdgeInsets, label: UILabel, unreadCountView: MasterFeedUnreadCountView) { + init(cellWidth: CGFloat, insets: UIEdgeInsets, label: UILabel) { let bounds = CGRect(x: insets.left, y: 0.0, width: floor(cellWidth - insets.right), height: 0.0) @@ -33,35 +31,20 @@ struct MasterFeedTableViewSectionHeaderLayout { rDisclosure.size = MasterFeedTableViewSectionHeaderLayout.disclosureButtonSize rDisclosure.origin.x = bounds.maxX - rDisclosure.size.width - // Unread Count - let unreadCountSize = unreadCountView.contentSize - let unreadCountIsHidden = unreadCountView.unreadCount < 1 - - var rUnread = CGRect.zero - if !unreadCountIsHidden { - rUnread.size = unreadCountSize - rUnread.origin.x = bounds.maxX - (MasterFeedTableViewSectionHeaderLayout.unreadCountMarginRight + unreadCountSize.width + rDisclosure.size.width) - } - - // Max Unread Count - // We can't reload Section Headers so we don't let the title extend into the (probably) worse case Unread Count area. - let maxUnreadCountView = MasterFeedUnreadCountView(frame: CGRect.zero) - maxUnreadCountView.unreadCount = 888 - let maxUnreadCountSize = maxUnreadCountView.contentSize // Title let rLabelx = 15.0 let rLabely = UIFontMetrics.default.scaledValue(for: MasterFeedTableViewSectionHeaderLayout.verticalPadding) var labelWidth = CGFloat.zero - labelWidth = cellWidth - (rLabelx + MasterFeedTableViewSectionHeaderLayout.labelMarginRight + maxUnreadCountSize.width + MasterFeedTableViewSectionHeaderLayout.unreadCountMarginRight) + labelWidth = cellWidth - (rLabelx + MasterFeedTableViewSectionHeaderLayout.labelMarginRight) let labelSizeInfo = MultilineUILabelSizer.size(for: label.text ?? "", font: label.font, numberOfLines: 0, width: Int(floor(labelWidth))) var rLabel = CGRect(x: rLabelx, y: rLabely, width: labelWidth, height: labelSizeInfo.size.height) // Determine cell height let paddedLabelHeight = rLabel.maxY + UIFontMetrics.default.scaledValue(for: MasterFeedTableViewSectionHeaderLayout.verticalPadding) - let maxGraphicsHeight = [rUnread, rDisclosure].maxY() + let maxGraphicsHeight = [rDisclosure].maxY() var cellHeight = max(paddedLabelHeight, maxGraphicsHeight) if cellHeight < MasterFeedTableViewSectionHeaderLayout.minRowHeight { cellHeight = MasterFeedTableViewSectionHeaderLayout.minRowHeight @@ -69,9 +52,6 @@ struct MasterFeedTableViewSectionHeaderLayout { // Center in Cell let newBounds = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: bounds.width, height: cellHeight) - if !unreadCountIsHidden { - rUnread = MasterFeedTableViewCellLayout.centerVertically(rUnread, newBounds) - } rDisclosure = MasterFeedTableViewCellLayout.centerVertically(rDisclosure, newBounds) // Small fonts need centered if we hit the minimum row height @@ -81,7 +61,6 @@ struct MasterFeedTableViewSectionHeaderLayout { // Assign the properties self.height = cellHeight - self.unreadCountRect = rUnread self.disclosureButtonRect = rDisclosure self.titleRect = rLabel From 1957ecb6f9023318b9aa0d5e4d001f684c00904f Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 16:01:01 -0800 Subject: [PATCH 3/8] Update how the refresh indicator works on the Timeline to better match the new 3 panel functionality --- .../MasterTimelineViewController.swift | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index ee682813c..87906f33e 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -17,11 +17,12 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner private var iconSize = IconSize.medium private lazy var feedTapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(showFeedInspector(_:))) - private var refreshProgressView: RefreshProgressView? + private var filterButton: UIBarButtonItem! @IBOutlet weak var markAllAsReadButton: UIBarButtonItem! - private var filterButton: UIBarButtonItem! + private var refreshProgressView: RefreshProgressView! + private var refreshProgressItemButton: UIBarButtonItem! private var firstUnreadButton: UIBarButtonItem! private lazy var dataSource = makeDataSource() @@ -91,8 +92,9 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner refreshControl = UIRefreshControl() refreshControl!.addTarget(self, action: #selector(refreshAccounts(_:)), for: .valueChanged) - - configureToolbar() + refreshProgressView = Bundle.main.loadNibNamed("RefreshProgressView", owner: self, options: nil)?[0] as? RefreshProgressView + refreshProgressItemButton = UIBarButtonItem(customView: refreshProgressView!) + resetUI(resetScroll: true) // Load the table and then scroll to the saved position if available @@ -608,20 +610,6 @@ extension MasterTimelineViewController: UISearchBarDelegate { private extension MasterTimelineViewController { - func configureToolbar() { - guard splitViewController?.isCollapsed ?? true else { - return - } - - guard let refreshProgressView = Bundle.main.loadNibNamed("RefreshProgressView", owner: self, options: nil)?[0] as? RefreshProgressView else { - return - } - - self.refreshProgressView = refreshProgressView - let refreshProgressItemButton = UIBarButtonItem(customView: refreshProgressView) - toolbarItems?.insert(refreshProgressItemButton, at: 2) - } - func resetUI(resetScroll: Bool) { title = coordinator.timelineFeed?.nameForDisplay ?? "Timeline" @@ -683,16 +671,9 @@ private extension MasterTimelineViewController { firstUnreadButton.isEnabled = coordinator.isTimelineUnreadAvailable if coordinator.isRootSplitCollapsed { - if let toolbarItems = toolbarItems, toolbarItems.last != firstUnreadButton { - var items = toolbarItems - items.append(firstUnreadButton) - setToolbarItems(items, animated: false) - } + setToolbarItems([markAllAsReadButton, .flexibleSpace(), refreshProgressItemButton, .flexibleSpace(), firstUnreadButton], animated: false) } else { - if let toolbarItems = toolbarItems, toolbarItems.last == firstUnreadButton { - let items = Array(toolbarItems[0.. Date: Fri, 28 Jan 2022 16:04:10 -0800 Subject: [PATCH 4/8] Delete dead code --- iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift index e194f41d7..9451a3539 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift @@ -62,8 +62,6 @@ class MasterFeedTableViewSectionHeader: UITableViewHeaderFooterView { return label }() - private let unreadCountView = MasterFeedUnreadCountView(frame: CGRect.zero) - private lazy var disclosureButton: UIButton = { let button = NonIntrinsicButton() button.tintColor = AppAssets.secondaryAccentColor From e81966c8845bc69f3e6d5072e5903c39548837cf Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 16:07:57 -0800 Subject: [PATCH 5/8] Remove obsolete function flag --- iOS/Article/ArticleViewController.swift | 1 - iOS/SceneCoordinator.swift | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index f58a490ab..0a6bdb90b 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -171,7 +171,6 @@ class ArticleViewController: UIViewController, MainControllerIdentifiable { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(true) - coordinator.isArticleViewControllerPending = false } override func viewWillDisappear(_ animated: Bool) { diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 6407c94ed..131d830a8 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -84,8 +84,6 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { private var savedSearchArticles: ArticleArray? = nil private var savedSearchArticleIds: Set? = nil - var isArticleViewControllerPending = false - private(set) var sortDirection = AppDefaults.shared.timelineSortDirection { didSet { if sortDirection != oldValue { @@ -1342,7 +1340,7 @@ extension SceneCoordinator: UINavigationControllerDelegate { // Don't clear it if we have pushed an ArticleViewController, but don't yet see it on the navigation stack. // This happens when we are going to the next unread and we need to grab another timeline to continue. The // ArticleViewController will be pushed, but we will briefly show the Timeline. Don't clear things out when that happens. - if viewController === masterTimelineViewController && lastMainControllerToAppear == .article && !isArticleViewControllerPending { + if viewController === masterTimelineViewController && lastMainControllerToAppear == .article { currentArticle = nil masterTimelineViewController?.updateArticleSelection(animations: [.scroll, .select, .navigation]) activityManager.invalidateReading() From 2a3bccd7d4dd57f7dac44488002973d85c8b52b5 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 16:12:01 -0800 Subject: [PATCH 6/8] Delete dead code --- iOS/Article/ArticleViewController.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 0a6bdb90b..46dd71935 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -169,10 +169,6 @@ class ArticleViewController: UIViewController, MainControllerIdentifiable { super.viewWillAppear(animated) } - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(true) - } - override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if searchBar != nil && !searchBar.isHidden { From ba4c17c0d778d25f253cd05bf502fcc27e7d488a Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 16:15:14 -0800 Subject: [PATCH 7/8] Restore full screen if that is what we used last --- iOS/Article/ArticleViewController.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 46dd71935..6009f6ff1 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -149,9 +149,6 @@ class ArticleViewController: UIViewController, MainControllerIdentifiable { articleExtractorButton.buttonState = controller.articleExtractorButtonState self.pageViewController.setViewControllers([controller], direction: .forward, animated: false, completion: nil) - if AppDefaults.shared.articleFullscreenEnabled { - controller.hideBars() - } // Search bar searchBar.translatesAutoresizingMaskIntoConstraints = false @@ -166,6 +163,10 @@ class ArticleViewController: UIViewController, MainControllerIdentifiable { override func viewWillAppear(_ animated: Bool) { navigationController?.isToolbarHidden = false + if AppDefaults.shared.articleFullscreenEnabled { + currentWebViewController?.hideBars() + } + super.viewWillAppear(animated) } From f78c059b1bc7055b243803eff4bd12e89d6d6818 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Jan 2022 16:21:35 -0800 Subject: [PATCH 8/8] Delay the show toolbar animation to prevent it from looking all crazy --- iOS/SceneCoordinator.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 131d830a8..1b20e86d4 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -1347,7 +1347,12 @@ extension SceneCoordinator: UINavigationControllerDelegate { // Restore any bars hidden by the article controller showStatusBar() - navigationController.setNavigationBarHidden(false, animated: true) + + // We delay the showing of the navigation bars because it freaks out on iOS 15 with the new split view controller + // if it is trying to show at the same time as the show timeline animation + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.setNavigationBarHidden(false, animated: true) + } navigationController.setToolbarHidden(false, animated: true) return }