From 3271f1de2283202536a5d5014ec2c542a8d9d797 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 17 Mar 2020 10:44:26 -0300 Subject: [PATCH 001/245] Create Prepublishing VC --- .../ViewRelated/Post/PrepublishingViewController.swift | 8 ++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift new file mode 100644 index 000000000000..b0370f649d46 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -0,0 +1,8 @@ +import UIKit + +class PrepublishingViewController: UIViewController { + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .white + } +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 374cb90cd259..86b3dc2fbdec 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1052,6 +1052,7 @@ 8B8FE8582343955500F9AD2E /* PostAutoUploadMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B8FE8562343952B00F9AD2E /* PostAutoUploadMessages.swift */; }; 8B93856E22DC08060010BF02 /* PageListSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B93856D22DC08060010BF02 /* PageListSectionHeaderView.swift */; }; 8B939F4323832E5D00ACCB0F /* PostListViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */; }; + 8BAD272C241FEF3300E9D105 /* PrepublishingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */; }; 8BAD53D6241922B900230F4B /* WPAnalyticsEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */; }; 8BC12F72231FEBA1004DDA72 /* PostCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */; }; 8BC12F7523201917004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */; }; @@ -3429,6 +3430,7 @@ 8B8FE8562343952B00F9AD2E /* PostAutoUploadMessages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostAutoUploadMessages.swift; sourceTree = ""; }; 8B93856D22DC08060010BF02 /* PageListSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageListSectionHeaderView.swift; sourceTree = ""; }; 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostListViewControllerTests.swift; sourceTree = ""; }; + 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingViewController.swift; sourceTree = ""; }; 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPAnalyticsEvent.swift; sourceTree = ""; }; 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostCoordinatorTests.swift; sourceTree = ""; }; 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostService+MarkAsFailedAndDraftIfNeeded.swift"; sourceTree = ""; }; @@ -8305,6 +8307,7 @@ FFEECFFB2084DE2B009B8CDB /* PostSettingsViewController+FeaturedImageUpload.swift */, 593F26601CAB00CA00F14073 /* PostSharingController.swift */, E155EC711E9B7DCE009D7F63 /* PostTagPickerViewController.swift */, + 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */, 5D17F0BC1A1D4C5F0087CCB8 /* PrivateSiteURLProtocol.h */, 5D17F0BD1A1D4C5F0087CCB8 /* PrivateSiteURLProtocol.m */, 5903AE1C19B60AB9009D5354 /* WPButtonForNavigationBar.h */, @@ -12057,6 +12060,7 @@ 08AAD69F1CBEA47D002B2418 /* MenusService.m in Sources */, 9A4E216021F87AE200EFF212 /* QuickStartChecklistHeader.swift in Sources */, 98B52AE121F7AF4A006FF6B4 /* StatsDataHelper.swift in Sources */, + 8BAD272C241FEF3300E9D105 /* PrepublishingViewController.swift in Sources */, 9A22D9C0214A6BCA00BAEAF2 /* PageListTableViewHandler.swift in Sources */, 74729CA62056FE6000D1394D /* SearchableItemConvertable.swift in Sources */, FFE3B2C71B2E651400E9F1E0 /* WPAndDeviceMediaLibraryDataSource.m in Sources */, From 2b10dccbc403945952ee540f7327e7bbfa79ace4 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 17 Mar 2020 16:49:10 -0300 Subject: [PATCH 002/245] Creates BottomSheetViewController --- .../BottomSheetViewController.swift | 150 ++++++++++++++++++ .../Post/PrepublishingViewController.swift | 4 +- WordPress/WordPress.xcodeproj/project.pbxproj | 12 ++ 3 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift new file mode 100644 index 000000000000..89119e83c707 --- /dev/null +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -0,0 +1,150 @@ +import UIKit + +class BottomSheetViewController: UIViewController { + + private var isDeviceInLandscape: Bool { + return UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight + } + + enum Constants { + static let gripHeight: CGFloat = 5 + static let cornerRadius: CGFloat = 8 + static let buttonSpacing: CGFloat = 8 + static let additionalSafeAreaInsetsRegular: UIEdgeInsets = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0) + static let minimumWidth: CGFloat = 300 + + enum Header { + static let spacing: CGFloat = 16 + static let insets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18) + } + + enum Button { + static let height: CGFloat = 54 + static let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 35) + static let titleInsets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0) + static let imageTintColor: UIColor = .neutral(.shade30) + static let font: UIFont = .preferredFont(forTextStyle: .callout) + static let textColor: UIColor = .text + } + + enum Stack { + static let insets: UIEdgeInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0) + } + } + + let headerTitle: String + + private let childViewController: UIViewController + + init(childViewController: UIViewController) { + self.headerTitle = "Foobar" + self.childViewController = childViewController + super.init(nibName: nil, bundle: nil) + } + + func show(from presenting: UIViewController, sourceView: UIView? = nil) { + if UIDevice.isPad() { + modalPresentationStyle = .popover + popoverPresentationController?.sourceView = sourceView ?? UIView() + popoverPresentationController?.sourceRect = sourceView?.bounds ?? .zero + } else if isDeviceInLandscape { + if #available(iOS 13.0, *) { + modalPresentationStyle = .automatic + } else { + modalPresentationStyle = .pageSheet + } + } else { + transitioningDelegate = self + modalPresentationStyle = .custom + } + + presenting.present(self, animated: true) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private var gripButton: UIButton = { + let button = GripButton() + button.translatesAutoresizingMaskIntoConstraints = false + button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside) + return button + }() + + @objc func buttonPressed() { + dismiss(animated: true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.clipsToBounds = true + view.layer.cornerRadius = Constants.cornerRadius + view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] + view.backgroundColor = .basicBackground + + NSLayoutConstraint.activate([ + gripButton.heightAnchor.constraint(equalToConstant: Constants.gripHeight) + ]) + + addChild(childViewController) + + let stackView = UIStackView(arrangedSubviews: [ + gripButton, + childViewController.view + ]) + + stackView.setCustomSpacing(Constants.Header.spacing, after: gripButton) + + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + + refreshForTraits() + + view.addSubview(stackView) + view.pinSubviewToSafeArea(stackView, insets: Constants.Stack.insets) + + childViewController.didMove(toParent: self) + } + + open override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + refreshForTraits() + } + + private func refreshForTraits() { + if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { + gripButton.isHidden = true + additionalSafeAreaInsets = Constants.additionalSafeAreaInsetsRegular + } else { + gripButton.isHidden = false + additionalSafeAreaInsets = .zero + } + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + return preferredContentSize = CGSize(width: Constants.minimumWidth, height: view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) + } +} + +extension BottomSheetViewController: UIViewControllerTransitioningDelegate { + public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return BottomSheetAnimationController(transitionType: .presenting) + } + + public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return BottomSheetAnimationController(transitionType: .dismissing) + } + + public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + let presentationController = BottomSheetPresentationController(presentedViewController: presented, presenting: presenting) + return presentationController + } + + public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + return (self.presentedViewController?.presentationController as? BottomSheetPresentationController)?.interactionController + } +} + diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index b0370f649d46..150b0c92330b 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -3,6 +3,8 @@ import UIKit class PrepublishingViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .white + view.backgroundColor = .red + view.heightAnchor.constraint(equalToConstant: 100).isActive = true + view.translatesAutoresizingMaskIntoConstraints = false } } diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 86b3dc2fbdec..97052aa78943 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1062,6 +1062,7 @@ 8BD36E022395CAEA00EFFF1C /* MediaEditorOperation+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */; }; 8BD36E062395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */; }; 8BE7C84123466927006EDE70 /* I18n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE7C84023466927006EDE70 /* I18n.swift */; }; + 8BF5F789242138A600BE49B7 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */; }; 8BFE36FD230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */; }; 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */; }; 91138455228373EB00FB02B7 /* GutenbergVideoUploadProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91138454228373EB00FB02B7 /* GutenbergVideoUploadProcessor.swift */; }; @@ -3440,6 +3441,7 @@ 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+Description.swift"; sourceTree = ""; }; 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+DescriptionTests.swift"; sourceTree = ""; }; 8BE7C84023466927006EDE70 /* I18n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = I18n.swift; sourceTree = ""; }; + 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLs.swift"; sourceTree = ""; }; 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLsTests.swift"; sourceTree = ""; }; 8CE5BBD00FF1470AC4B88247 /* Pods_WordPressTodayWidget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressTodayWidget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -7360,6 +7362,7 @@ 8584FDB4192437160019C02E /* Utility */ = { isa = PBXGroup; children = ( + 8BF5F7872421388F00BE49B7 /* Bottom Sheet */, 1A433B1B2254CBC300AE7910 /* Networking */, 40247E002120FE2300AE1C3C /* Automated Transfer */, F198533821ADAA4E00DCDAE7 /* Editor */, @@ -7520,6 +7523,14 @@ name = Aztec; sourceTree = ""; }; + 8BF5F7872421388F00BE49B7 /* Bottom Sheet */ = { + isa = PBXGroup; + children = ( + 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */, + ); + path = "Bottom Sheet"; + sourceTree = ""; + }; 931D26FB19EDA0D000114F17 /* ALIterativeMigrator */ = { isa = PBXGroup; children = ( @@ -12179,6 +12190,7 @@ E137B1661F8B77D4006AC7FC /* WebNavigationDelegate.swift in Sources */, 937D9A0F19F83812007B9D5F /* WordPress-22-23.xcmappingmodel in Sources */, 9A1A67A622B2AD4E00FF8422 /* CountriesMap.swift in Sources */, + 8BF5F789242138A600BE49B7 /* BottomSheetViewController.swift in Sources */, 439F4F3A219B715300F8D0C7 /* RevisionsNavigationController.swift in Sources */, 40F46B6A22121BA800A2143B /* AnnualAndMostPopularTimeStatsRecordValue+CoreDataClass.swift in Sources */, 17D5C3F71FFCF2D800EB70FF /* MediaProgressCoordinatorNoticeViewModel.swift in Sources */, From a4869321f42710b70c21c74507c1e793e8918d63 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 17 Mar 2020 16:49:23 -0300 Subject: [PATCH 003/245] Display bottom sheet when publish is tapped --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 9f7c42eb4358..2f63ca3c9675 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -33,6 +33,12 @@ extension PostEditor where Self: UIViewController { dismissWhenDone: Bool, analyticsStat: WPAnalyticsStat?) { + let prepublishing = PrepublishingViewController() + let bottomSheet = BottomSheetViewController(childViewController: prepublishing) + bottomSheet.show(from: self, sourceView: navigationBarManager.publishButton) + + return + mapUIContentToPostAndSave(immediate: true) // Cancel publishing if media is currently being uploaded From ac5d5f980f2fda13f5db6d525ae14a66b77b07f2 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 17 Mar 2020 17:13:19 -0300 Subject: [PATCH 004/245] Remove trailing_newline --- .../Classes/Utility/Bottom Sheet/BottomSheetViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 89119e83c707..616a1667ec32 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -147,4 +147,3 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { return (self.presentedViewController?.presentationController as? BottomSheetPresentationController)?.interactionController } } - From 570ba2f702ee975669d79812226adc37aab37a8e Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 17 Mar 2020 17:25:01 -0300 Subject: [PATCH 005/245] Make sure that the child view controller is added to the Bottom Sheet --- WordPress/WordPress.xcodeproj/project.pbxproj | 12 ++++++++ .../BottomSheetViewControllerTests.swift | 29 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 97052aa78943..1691cecb2f4d 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1063,6 +1063,7 @@ 8BD36E062395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */; }; 8BE7C84123466927006EDE70 /* I18n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE7C84023466927006EDE70 /* I18n.swift */; }; 8BF5F789242138A600BE49B7 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */; }; + 8BF5F78D2421677300BE49B7 /* BottomSheetViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */; }; 8BFE36FD230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */; }; 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */; }; 91138455228373EB00FB02B7 /* GutenbergVideoUploadProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91138454228373EB00FB02B7 /* GutenbergVideoUploadProcessor.swift */; }; @@ -3442,6 +3443,7 @@ 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+DescriptionTests.swift"; sourceTree = ""; }; 8BE7C84023466927006EDE70 /* I18n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = I18n.swift; sourceTree = ""; }; 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; + 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewControllerTests.swift; sourceTree = ""; }; 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLs.swift"; sourceTree = ""; }; 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLsTests.swift"; sourceTree = ""; }; 8CE5BBD00FF1470AC4B88247 /* Pods_WordPressTodayWidget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressTodayWidget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -7297,6 +7299,7 @@ 852416D01A12ED2D0030700C /* Utility */ = { isa = PBXGroup; children = ( + 8BF5F78B2421676100BE49B7 /* Bottom Sheet */, F93735F422D53C1800A3C312 /* Logging */, 93B853211B44165B0064FE72 /* Analytics */, F198533B21ADAD0700DCDAE7 /* Editor */, @@ -7531,6 +7534,14 @@ path = "Bottom Sheet"; sourceTree = ""; }; + 8BF5F78B2421676100BE49B7 /* Bottom Sheet */ = { + isa = PBXGroup; + children = ( + 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */, + ); + path = "Bottom Sheet"; + sourceTree = ""; + }; 931D26FB19EDA0D000114F17 /* ALIterativeMigrator */ = { isa = PBXGroup; children = ( @@ -13166,6 +13177,7 @@ 748437EE1F1D4A7300E8DDAF /* RichContentFormatterTests.swift in Sources */, 8BE7C84123466927006EDE70 /* I18n.swift in Sources */, D88A649E208D82D2008AE9BC /* XCTestCase+Wait.swift in Sources */, + 8BF5F78D2421677300BE49B7 /* BottomSheetViewControllerTests.swift in Sources */, E18549DB230FBFEF003C620E /* BlogServiceDeduplicationTests.swift in Sources */, 400A2C8F2217AD7F000A8A59 /* ClicksStatsRecordValueTests.swift in Sources */, 7320C8BD2190C9FC0082FED5 /* UITextView+SummaryTests.swift in Sources */, diff --git a/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift new file mode 100644 index 000000000000..c1bf556d07d6 --- /dev/null +++ b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift @@ -0,0 +1,29 @@ +import XCTest +import Nimble + +@testable import WordPress + +class BottomSheetViewControllerTests: XCTestCase { + + /// - Add the given ViewController as a child View Controller + /// + func testAddTheGivenViewControllerAsAChildViewController() { + let viewController = UIViewController() + let bottomSheet = BottomSheetViewController(childViewController: viewController) + + bottomSheet.viewDidLoad() + + expect(bottomSheet.children).to(contain(viewController)) + } + + /// - Add the given ViewController view to the subviews of the Bottom Sheet + /// + func testAddGivenVCViewToTheBottomSheetSubviews() { + let viewController = UIViewController() + let bottomSheet = BottomSheetViewController(childViewController: viewController) + + bottomSheet.viewDidLoad() + + expect(bottomSheet.view.subviews.flatMap { $0.subviews }).to(contain(viewController.view)) + } +} From bd8c30f5fad6ff9549eeda911da124a3f6f5dfcc Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 18 Mar 2020 14:04:12 -0300 Subject: [PATCH 006/245] Do not fill the entire screen when the device is is landscape mode --- .../Bottom Sheet/BottomSheetViewController.swift | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 616a1667ec32..8e31cbeefe5a 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -2,10 +2,6 @@ import UIKit class BottomSheetViewController: UIViewController { - private var isDeviceInLandscape: Bool { - return UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight - } - enum Constants { static let gripHeight: CGFloat = 5 static let cornerRadius: CGFloat = 8 @@ -47,12 +43,6 @@ class BottomSheetViewController: UIViewController { modalPresentationStyle = .popover popoverPresentationController?.sourceView = sourceView ?? UIView() popoverPresentationController?.sourceRect = sourceView?.bounds ?? .zero - } else if isDeviceInLandscape { - if #available(iOS 13.0, *) { - modalPresentationStyle = .automatic - } else { - modalPresentationStyle = .pageSheet - } } else { transitioningDelegate = self modalPresentationStyle = .custom From 55f49231ab58147236330a0cfce9bc1b1ac1b5c0 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 18 Mar 2020 14:16:40 -0300 Subject: [PATCH 007/245] Removes headerTitle --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 8e31cbeefe5a..090822e0d9be 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -27,13 +27,10 @@ class BottomSheetViewController: UIViewController { static let insets: UIEdgeInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0) } } - - let headerTitle: String - + private let childViewController: UIViewController init(childViewController: UIViewController) { - self.headerTitle = "Foobar" self.childViewController = childViewController super.init(nibName: nil, bundle: nil) } From 386e6ec686d984728002cd54677f07c4da396c69 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 18 Mar 2020 14:18:35 -0300 Subject: [PATCH 008/245] Remove trailing_whitespace --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 090822e0d9be..17d183d3cb35 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -27,7 +27,7 @@ class BottomSheetViewController: UIViewController { static let insets: UIEdgeInsets = UIEdgeInsets(top: 5, left: 0, bottom: 0, right: 0) } } - + private let childViewController: UIViewController init(childViewController: UIViewController) { From 1ee829b1776cc84bc5132e58c4ccc3678fe45648 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 19 Mar 2020 15:55:27 -0300 Subject: [PATCH 009/245] Make text view to become first responder before the view appears --- .../ViewRelated/Post/PostTagPickerViewController.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift index 88bce076fad9..1e4f7bffd65d 100644 --- a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift @@ -95,10 +95,15 @@ class PostTagPickerViewController: UIViewController { keyboardObserver.tableView = tableView } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + textView.becomeFirstResponder() + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) updateSuggestions() - textView.becomeFirstResponder() loadTags() } From 8012c8e685291d480de9a2fce968aaf6c2382dfa Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 19 Mar 2020 15:55:54 -0300 Subject: [PATCH 010/245] Show tags picker on Prepublishing VC --- .../Post/PrepublishingViewController.swift | 58 +++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 150b0c92330b..c3879bf2fad9 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -1,10 +1,60 @@ import UIKit -class PrepublishingViewController: UIViewController { +class PrepublishingViewController: UITableViewController { + private let post: Post + + init(post: Post) { + self.post = post + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .red - view.heightAnchor.constraint(equalToConstant: 100).isActive = true - view.translatesAutoresizingMaskIntoConstraints = false + tableView.register(WPTableViewCell.self, forCellReuseIdentifier: Constants.reuseIdentifier) + } + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: Constants.reuseIdentifier) + + cell?.accessoryType = .disclosureIndicator + cell?.textLabel?.text = "Tags" + + return cell! } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let viewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) + + viewController.onValueChanged = { [weak self] tags in + self?.post.tags = tags + } + + navigationController?.pushViewController(viewController, animated: true) + } + + private enum Constants { + static let reuseIdentifier = "wpTableViewCell" + } +} + +class PrepublishingNavigationController: UINavigationController, BottomSheetPresentable { + var initialHeight: CGFloat = 200 +} + +typealias UIBottomSheetPresentable = BottomSheetPresentable & UIViewController + +protocol BottomSheetPresentable { + var initialHeight: CGFloat { get } } From bd87eafbeeba8c389f95f9fc1fc70b31e3c6df72 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 19 Mar 2020 15:56:15 -0300 Subject: [PATCH 011/245] Update bottom sheet height when the keyboard appears and disappears --- .../BottomSheetViewController.swift | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 17d183d3cb35..1c3bad2054d8 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -28,9 +28,13 @@ class BottomSheetViewController: UIViewController { } } - private let childViewController: UIViewController + private weak var childViewController: UIBottomSheetPresentable? - init(childViewController: UIViewController) { + private var heightConstraint: NSLayoutConstraint! + + var stackView: UIStackView! + + init(childViewController: UIBottomSheetPresentable) { self.childViewController = childViewController super.init(nibName: nil, bundle: nil) } @@ -66,6 +70,10 @@ class BottomSheetViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) + view.clipsToBounds = true view.layer.cornerRadius = Constants.cornerRadius view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] @@ -75,9 +83,19 @@ class BottomSheetViewController: UIViewController { gripButton.heightAnchor.constraint(equalToConstant: Constants.gripHeight) ]) + guard let childViewController = childViewController else { + return + } + + // Set the initial height of the child VC + heightConstraint = childViewController.view.heightAnchor.constraint(equalToConstant: childViewController.initialHeight) + heightConstraint.priority = UILayoutPriority(rawValue: 999) + heightConstraint.isActive = true + childViewController.view.translatesAutoresizingMaskIntoConstraints = false + addChild(childViewController) - let stackView = UIStackView(arrangedSubviews: [ + stackView = UIStackView(arrangedSubviews: [ gripButton, childViewController.view ]) @@ -114,6 +132,34 @@ class BottomSheetViewController: UIViewController { super.viewDidLayoutSubviews() return preferredContentSize = CGSize(width: Constants.minimumWidth, height: view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) } + + @objc func keyboardWillShow(_ notification: NSNotification) { + let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 0.30 + let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt ?? 0 + + UIView.animateKeyframes(withDuration: duration, + delay: 0, + options: UIView.KeyframeAnimationOptions(rawValue: curve), + animations: { + self.heightConstraint.constant = UIScreen.main.bounds.height - 200 + self.presentationController?.containerView?.setNeedsLayout() + self.presentationController?.containerView?.layoutIfNeeded() + }, completion: nil) + } + + @objc func keyboardWillHide(_ notification: NSNotification) { + let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 0.30 + let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt ?? 0 + + UIView.animateKeyframes(withDuration: duration, + delay: 0, + options: UIView.KeyframeAnimationOptions(rawValue: curve), + animations: { + self.heightConstraint.constant = self.childViewController?.initialHeight ?? 200 + self.presentationController?.containerView?.setNeedsLayout() + self.presentationController?.containerView?.layoutIfNeeded() + }, completion: nil) + } } extension BottomSheetViewController: UIViewControllerTransitioningDelegate { From 4ffa39ef9944d73074181ba73da9323786356e5f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 19 Mar 2020 15:56:42 -0300 Subject: [PATCH 012/245] Initiate the Prepublishing with a Navigation Controller --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 2f63ca3c9675..9ee050303f31 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -33,8 +33,9 @@ extension PostEditor where Self: UIViewController { dismissWhenDone: Bool, analyticsStat: WPAnalyticsStat?) { - let prepublishing = PrepublishingViewController() - let bottomSheet = BottomSheetViewController(childViewController: prepublishing) + let prepublishing = PrepublishingViewController(post: post as! Post) + let prepublishingNavigationController = PrepublishingNavigationController(rootViewController: prepublishing) + let bottomSheet = BottomSheetViewController(childViewController: prepublishingNavigationController) bottomSheet.show(from: self, sourceView: navigationBarManager.publishButton) return From 380fc5c4bebf861a379f876c72efb6de70dfb8f3 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 10:35:17 -0300 Subject: [PATCH 013/245] Display the tags of the post in the Tags cells Also, customize the cell to match the designs --- .../Post/PrepublishingViewController.swift | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index c3879bf2fad9..60742eb43ceb 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -14,7 +14,7 @@ class PrepublishingViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - tableView.register(WPTableViewCell.self, forCellReuseIdentifier: Constants.reuseIdentifier) + tableView.tableFooterView = UIView(frame: .zero) } override func numberOfSections(in tableView: UITableView) -> Int { @@ -26,12 +26,23 @@ class PrepublishingViewController: UITableViewController { } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: Constants.reuseIdentifier) + let cell: WPTableViewCell = { + guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.reuseIdentifier) as? WPTableViewCell else { + return WPTableViewCell.init(style: .value1, reuseIdentifier: Constants.reuseIdentifier) + } + return cell + }() - cell?.accessoryType = .disclosureIndicator - cell?.textLabel?.text = "Tags" + cell.preservesSuperviewLayoutMargins = false + cell.separatorInset = .zero + cell.layoutMargins = .zero - return cell! + cell.accessoryType = .disclosureIndicator + cell.textLabel?.text = "Tags" + cell.detailTextLabel?.text = post.tags + cell.detailTextLabel?.isEnabled = true + + return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { @@ -39,6 +50,7 @@ class PrepublishingViewController: UITableViewController { viewController.onValueChanged = { [weak self] tags in self?.post.tags = tags + self?.tableView.reloadData() } navigationController?.pushViewController(viewController, animated: true) From e5f4eede2a00823d5b8b01944f2eaa7af0f3d64f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:17:45 -0300 Subject: [PATCH 014/245] When dismissing the tag picker, make text view to resign first responder --- .../Classes/ViewRelated/Post/PostTagPickerViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift index 1e4f7bffd65d..5e8fdca9577f 100644 --- a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift @@ -116,6 +116,8 @@ class PostTagPickerViewController: UIViewController { onValueChanged?(tags.joined(separator: ", ")) } WPError.dismissNetworkingNotice() + + textView.resignFirstResponder() } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { From 8cc56f6fb17ece2e7076e95b056b5abc28b7294f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:18:03 -0300 Subject: [PATCH 015/245] Resize the views from all the VCs --- .../BottomSheetViewController.swift | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 1c3bad2054d8..727e4e31f1c6 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -137,14 +137,30 @@ class BottomSheetViewController: UIViewController { let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 0.30 let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt ?? 0 + let heightForKeyboard = UIScreen.main.bounds.height - 200 + UIView.animateKeyframes(withDuration: duration, delay: 0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: { - self.heightConstraint.constant = UIScreen.main.bounds.height - 200 + // Resize the bottom sheet + self.heightConstraint.constant = heightForKeyboard self.presentationController?.containerView?.setNeedsLayout() self.presentationController?.containerView?.layoutIfNeeded() - }, completion: nil) + + // Resize all the subviews if the child VC is a navigation controller + self.resizeAllViewControllers(height: heightForKeyboard) + }, completion: { _ in + // Make sure the subviews keeps the height of the bottom sheet + self.resizeAllViewControllers(height: heightForKeyboard) + }) + } + + private func resizeAllViewControllers(height: CGFloat) { + (childViewController as? UINavigationController)?.viewControllers.forEach { viewController in + let originalFrame = viewController.view.frame + viewController.view.frame = CGRect(x: originalFrame.origin.x, y: originalFrame.origin.y, width: originalFrame.width, height: height) + } } @objc func keyboardWillHide(_ notification: NSNotification) { From 00d3ac0682c3c1aacab729aae4720255444c7b0c Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:33:14 -0300 Subject: [PATCH 016/245] Undo stackview change --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 727e4e31f1c6..738ad174be7f 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -32,8 +32,6 @@ class BottomSheetViewController: UIViewController { private var heightConstraint: NSLayoutConstraint! - var stackView: UIStackView! - init(childViewController: UIBottomSheetPresentable) { self.childViewController = childViewController super.init(nibName: nil, bundle: nil) @@ -95,7 +93,7 @@ class BottomSheetViewController: UIViewController { addChild(childViewController) - stackView = UIStackView(arrangedSubviews: [ + let stackView = UIStackView(arrangedSubviews: [ gripButton, childViewController.view ]) From 4c26452a6b9fc0826c4f5312f6be43f8172807bd Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:34:33 -0300 Subject: [PATCH 017/245] Fix trailing_whitespace --- .../ViewRelated/Post/PrepublishingViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 60742eb43ceb..37dbc5203d12 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -7,11 +7,11 @@ class PrepublishingViewController: UITableViewController { self.post = post super.init(nibName: nil, bundle: nil) } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + override func viewDidLoad() { super.viewDidLoad() tableView.tableFooterView = UIView(frame: .zero) From eee5f13875acd7ccb567bd2b92c3647335c80fb9 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:36:35 -0300 Subject: [PATCH 018/245] Track when tags are added through prepublishing --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 5 +++++ .../ViewRelated/Post/PrepublishingViewController.swift | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index f6d23ecf28c3..fe5370d66f2d 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -5,6 +5,9 @@ import Foundation case mediaEditorShown case mediaEditorUsed + // Prepublishing Nudges + case prepublishingTagsAdded + /// A String that represents the event var value: String { switch self { @@ -12,6 +15,8 @@ import Foundation return "media_editor_shown" case .mediaEditorUsed: return "media_editor_used" + case .prepublishingTagsAdded + return "prepublishing_tags_added" } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 37dbc5203d12..aa5c30320932 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -49,6 +49,10 @@ class PrepublishingViewController: UITableViewController { let viewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) viewController.onValueChanged = { [weak self] tags in + if !tags.isEmpty { + WPAnalytics.track(.prepublishingTagsAdded) + } + self?.post.tags = tags self?.tableView.reloadData() } From 44486974839d5e84da679b6fbed61a97b8121577 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:48:48 -0300 Subject: [PATCH 019/245] Small fix on WAnalytics --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index fe5370d66f2d..58dc8dc29529 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -15,7 +15,7 @@ import Foundation return "media_editor_shown" case .mediaEditorUsed: return "media_editor_used" - case .prepublishingTagsAdded + case .prepublishingTagsAdded: return "prepublishing_tags_added" } } From 5faabf7f14a2043c8f57d0101181bd834663b91f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 20 Mar 2020 11:49:25 -0300 Subject: [PATCH 020/245] Create a struct to define the Prepublishing options --- .../Post/PrepublishingViewController.swift | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index aa5c30320932..410bb8793744 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -1,8 +1,16 @@ import UIKit +private struct PrepublishingOption { + let title: String +} + class PrepublishingViewController: UITableViewController { private let post: Post + private let options: [PrepublishingOption] = [ + PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) + ] + init(post: Post) { self.post = post super.init(nibName: nil, bundle: nil) @@ -22,7 +30,7 @@ class PrepublishingViewController: UITableViewController { } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 + return options.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -38,9 +46,12 @@ class PrepublishingViewController: UITableViewController { cell.layoutMargins = .zero cell.accessoryType = .disclosureIndicator - cell.textLabel?.text = "Tags" - cell.detailTextLabel?.text = post.tags - cell.detailTextLabel?.isEnabled = true + cell.textLabel?.text = options[indexPath.row].title + + if indexPath.row == 0 { + // Tags row + cell.detailTextLabel?.text = post.tags + } return cell } From caa9ce5a59f1782c7bb150c9500d4034db859fbe Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 23 Mar 2020 15:10:23 -0300 Subject: [PATCH 021/245] Add the publish button --- .../Post/PrepublishingViewController.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 410bb8793744..d47baf2cab15 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -1,4 +1,5 @@ import UIKit +import WordPressAuthenticator private struct PrepublishingOption { let title: String @@ -11,6 +12,13 @@ class PrepublishingViewController: UITableViewController { PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) ] + private let nuxButton: NUXButton = { + let nuxButton = NUXButton() + nuxButton.isPrimary = true + nuxButton.setTitle(NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post"), for: .normal) + return nuxButton + }() + init(post: Post) { self.post = post super.init(nibName: nil, bundle: nil) @@ -22,7 +30,8 @@ class PrepublishingViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - tableView.tableFooterView = UIView(frame: .zero) + + setupFooterWithButton() } override func numberOfSections(in tableView: UITableView) -> Int { @@ -71,8 +80,18 @@ class PrepublishingViewController: UITableViewController { navigationController?.pushViewController(viewController, animated: true) } + private func setupFooterWithButton() { + let footer = UIView(frame: Constants.footerFrame) + footer.addSubview(nuxButton) + footer.pinSubviewToSafeArea(nuxButton, insets: Constants.nuxButtonInsets) + nuxButton.translatesAutoresizingMaskIntoConstraints = false + tableView.tableFooterView = footer + } + private enum Constants { static let reuseIdentifier = "wpTableViewCell" + static let nuxButtonInsets = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 40) } } From 7fd33dcfccdd923a84ae7b65c9259ce9bbce789e Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 23 Mar 2020 17:46:42 -0300 Subject: [PATCH 022/245] Publishes the post when "Publish Now" is tapped --- .../ViewRelated/Post/PostEditor+Publish.swift | 20 ++++--------------- .../Post/PrepublishingViewController.swift | 14 +++++++++++-- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 9ee050303f31..e4d6a76442a4 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -33,13 +33,6 @@ extension PostEditor where Self: UIViewController { dismissWhenDone: Bool, analyticsStat: WPAnalyticsStat?) { - let prepublishing = PrepublishingViewController(post: post as! Post) - let prepublishingNavigationController = PrepublishingNavigationController(rootViewController: prepublishing) - let bottomSheet = BottomSheetViewController(childViewController: prepublishingNavigationController) - bottomSheet.show(from: self, sourceView: navigationBarManager.publishButton) - - return - mapUIContentToPostAndSave(immediate: true) // Cancel publishing if media is currently being uploaded @@ -151,17 +144,12 @@ extension PostEditor where Self: UIViewController { /// - dismissWhenDone: if `true`, the VC will be dismissed if the user picks "Publish". /// fileprivate func displayPublishConfirmationAlert(for action: PostEditorAction, onPublish publishAction: @escaping () -> ()) { - let title = action.publishingActionQuestionLabel - let keepEditingTitle = NSLocalizedString("Keep Editing", comment: "Button shown when the author is asked for publishing confirmation.") - let publishTitle = action.publishActionLabel - let style: UIAlertController.Style = UIDevice.isPad() ? .alert : .actionSheet - let alertController = UIAlertController(title: title, message: nil, preferredStyle: style) - - alertController.addCancelActionWithTitle(keepEditingTitle) - alertController.addDefaultActionWithTitle(publishTitle) { _ in + let prepublishing = PrepublishingViewController(post: post as! Post) { _ in publishAction() } - present(alertController, animated: true, completion: nil) + let prepublishingNavigationController = PrepublishingNavigationController(rootViewController: prepublishing) + let bottomSheet = BottomSheetViewController(childViewController: prepublishingNavigationController) + bottomSheet.show(from: self, sourceView: navigationBarManager.publishButton) } private func trackPostSave(stat: WPAnalyticsStat) { diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index d47baf2cab15..081766bf2ca9 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -8,19 +8,24 @@ private struct PrepublishingOption { class PrepublishingViewController: UITableViewController { private let post: Post + private let completion: (AbstractPost) -> () + private let options: [PrepublishingOption] = [ PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) ] - private let nuxButton: NUXButton = { + let nuxButton: NUXButton = { let nuxButton = NUXButton() nuxButton.isPrimary = true nuxButton.setTitle(NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post"), for: .normal) + nuxButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) + return nuxButton }() - init(post: Post) { + init(post: Post, completion: @escaping (AbstractPost) -> ()) { self.post = post + self.completion = completion super.init(nibName: nil, bundle: nil) } @@ -80,6 +85,11 @@ class PrepublishingViewController: UITableViewController { navigationController?.pushViewController(viewController, animated: true) } + @objc func publish(_ sender: UIButton) { + dismiss(animated: true) + completion(post) + } + private func setupFooterWithButton() { let footer = UIView(frame: Constants.footerFrame) footer.addSubview(nuxButton) From 2096f295f39c9349d8ae3c34da7e6bd1a66e24cf Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 23 Mar 2020 17:47:12 -0300 Subject: [PATCH 023/245] Fix unit tests --- .../Bottom Sheet/BottomSheetViewControllerTests.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift index c1bf556d07d6..b4654981647d 100644 --- a/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift +++ b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift @@ -8,7 +8,7 @@ class BottomSheetViewControllerTests: XCTestCase { /// - Add the given ViewController as a child View Controller /// func testAddTheGivenViewControllerAsAChildViewController() { - let viewController = UIViewController() + let viewController = BottomSheetPresentableViewController() let bottomSheet = BottomSheetViewController(childViewController: viewController) bottomSheet.viewDidLoad() @@ -19,7 +19,7 @@ class BottomSheetViewControllerTests: XCTestCase { /// - Add the given ViewController view to the subviews of the Bottom Sheet /// func testAddGivenVCViewToTheBottomSheetSubviews() { - let viewController = UIViewController() + let viewController = BottomSheetPresentableViewController() let bottomSheet = BottomSheetViewController(childViewController: viewController) bottomSheet.viewDidLoad() @@ -27,3 +27,7 @@ class BottomSheetViewControllerTests: XCTestCase { expect(bottomSheet.view.subviews.flatMap { $0.subviews }).to(contain(viewController.view)) } } + +private class BottomSheetPresentableViewController: UIViewController, BottomSheetPresentable { + var initialHeight: CGFloat = 0 +} From d82389d9cdafa985be59809f5f96891d9eb98c5e Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 23 Mar 2020 18:02:15 -0300 Subject: [PATCH 024/245] Dismiss the navigation controller and setup the button selector in configure --- .../ViewRelated/Post/PrepublishingViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 081766bf2ca9..da1d2c6ae9bb 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -18,7 +18,6 @@ class PrepublishingViewController: UITableViewController { let nuxButton = NUXButton() nuxButton.isPrimary = true nuxButton.setTitle(NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post"), for: .normal) - nuxButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) return nuxButton }() @@ -86,7 +85,7 @@ class PrepublishingViewController: UITableViewController { } @objc func publish(_ sender: UIButton) { - dismiss(animated: true) + navigationController?.dismiss(animated: true) completion(post) } @@ -96,6 +95,7 @@ class PrepublishingViewController: UITableViewController { footer.pinSubviewToSafeArea(nuxButton, insets: Constants.nuxButtonInsets) nuxButton.translatesAutoresizingMaskIntoConstraints = false tableView.tableFooterView = footer + nuxButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) } private enum Constants { From 13676e5e34e8d8a7bfb3ebb7d71b4b9bd61a0ca6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 23 Mar 2020 18:02:27 -0300 Subject: [PATCH 025/245] Make sure the callback works --- WordPress/WordPress.xcodeproj/project.pbxproj | 4 +++ ...epublishingNudgesViewControllerTests.swift | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 1691cecb2f4d..f793d7a51274 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1045,6 +1045,7 @@ 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; + 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; 8B7623382384373E00AB3EE7 /* PageListViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B7623372384373E00AB3EE7 /* PageListViewControllerTests.swift */; }; 8B821F3C240020E2006B697E /* PostServiceUploadingListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B821F3B240020E2006B697E /* PostServiceUploadingListTests.swift */; }; @@ -3425,6 +3426,7 @@ 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; + 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; 8B7623372384373E00AB3EE7 /* PageListViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageListViewControllerTests.swift; sourceTree = ""; }; 8B821F3B240020E2006B697E /* PostServiceUploadingListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingListTests.swift; sourceTree = ""; }; @@ -6285,6 +6287,7 @@ children = ( 59ECF87A1CB7061D00E68F25 /* PostSharingControllerTests.swift */, F18B43771F849F580089B817 /* PostAttachmentTests.swift */, + 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */, ); name = Posts; sourceTree = ""; @@ -13303,6 +13306,7 @@ D88A64B0208DA093008AE9BC /* StockPhotosResultsPageTests.swift in Sources */, 0879FC161E9301DD00E1EFC8 /* MediaTests.swift in Sources */, B556EFCB1DCA374200728F93 /* DictionaryHelpersTests.swift in Sources */, + 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */, 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */, 08A2AD791CCED2A800E84454 /* PostTagServiceTests.m in Sources */, F543AF5723A84E4D0022F595 /* PublishSettingsControllerTests.swift in Sources */, diff --git a/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift new file mode 100644 index 000000000000..02b3171f2369 --- /dev/null +++ b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift @@ -0,0 +1,31 @@ +import XCTest +import Nimble + +@testable import WordPress + +class PrepublishingNudgesViewControllerTests: XCTestCase { + + override class func setUp() { + super.setUp() + + /// We need that in order to initialize the Authenticator, otherwise this test crashes + /// This is because we're using the NUXButton. Ideally, that component should be extracted + WordPressAuthenticationManager().initializeWordPressAuthenticator() + } + + /// Call the completion block when the "Publish" button is pressed + /// + func testCallCompletionBlockWhenButtonTapped() { + let post = PostBuilder().build() + var returnedPost: AbstractPost? + let prepublishingViewController = PrepublishingViewController(post: post) { post in + returnedPost = post + } + prepublishingViewController.viewDidLoad() + + prepublishingViewController.nuxButton.sendActions(for: .touchUpInside) + + expect(returnedPost).to(equal(post)) + } + +} From 95d3207ae5e76ede3ad61455cf2f17a6ba7b73cc Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Tue, 24 Mar 2020 11:31:44 -0700 Subject: [PATCH 026/245] Change how the interactionControllerForDismissal gets the interaction controller --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 738ad174be7f..af1289ecc562 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -191,6 +191,7 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { } public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { - return (self.presentedViewController?.presentationController as? BottomSheetPresentationController)?.interactionController + + return (self.presentationController as? BottomSheetPresentationController)?.interactionController } } From 84e595ba7762a51eb27c81a23518d2be1fc47592 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 24 Mar 2020 17:31:48 -0300 Subject: [PATCH 027/245] Dismiss the nudges view only after calling completion --- .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index da1d2c6ae9bb..4517ab06c022 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -85,8 +85,8 @@ class PrepublishingViewController: UITableViewController { } @objc func publish(_ sender: UIButton) { - navigationController?.dismiss(animated: true) completion(post) + navigationController?.dismiss(animated: true) } private func setupFooterWithButton() { From c15f97d99ae9e81b6ccf54dce4f0bb72e04d0077 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 24 Mar 2020 17:49:50 -0300 Subject: [PATCH 028/245] Call the completion block after dismissing the Nudges view to avoid conflict --- .../ViewRelated/Post/PrepublishingViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 4517ab06c022..42eed336b821 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -85,8 +85,9 @@ class PrepublishingViewController: UITableViewController { } @objc func publish(_ sender: UIButton) { - completion(post) - navigationController?.dismiss(animated: true) + navigationController?.dismiss(animated: true) { + self.completion(self.post) + } } private func setupFooterWithButton() { From bda8ed7ec5306147c7f2a9687f79b2fb7faf0cab Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 24 Mar 2020 18:18:05 -0300 Subject: [PATCH 029/245] Fix test --- .../WordPressTest/PrepublishingNudgesViewControllerTests.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift index 02b3171f2369..f0fb6a11957d 100644 --- a/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift +++ b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift @@ -21,11 +21,12 @@ class PrepublishingNudgesViewControllerTests: XCTestCase { let prepublishingViewController = PrepublishingViewController(post: post) { post in returnedPost = post } + _ = UINavigationController(rootViewController: prepublishingViewController) prepublishingViewController.viewDidLoad() prepublishingViewController.nuxButton.sendActions(for: .touchUpInside) - expect(returnedPost).to(equal(post)) + expect(returnedPost).toEventually(equal(post)) } } From e9934bd6212fffc14eacfd9fd6c34e358f6f3877 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 24 Mar 2020 18:20:03 -0300 Subject: [PATCH 030/245] Rename methods and properties for better readability --- .../Post/PrepublishingViewController.swift | 14 +++++++------- .../PrepublishingNudgesViewControllerTests.swift | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 42eed336b821..f5ff9dd562ef 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -14,7 +14,7 @@ class PrepublishingViewController: UITableViewController { PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) ] - let nuxButton: NUXButton = { + let publishButton: NUXButton = { let nuxButton = NUXButton() nuxButton.isPrimary = true nuxButton.setTitle(NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post"), for: .normal) @@ -35,7 +35,7 @@ class PrepublishingViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - setupFooterWithButton() + setupPublishButton() } override func numberOfSections(in tableView: UITableView) -> Int { @@ -90,13 +90,13 @@ class PrepublishingViewController: UITableViewController { } } - private func setupFooterWithButton() { + private func setupPublishButton() { let footer = UIView(frame: Constants.footerFrame) - footer.addSubview(nuxButton) - footer.pinSubviewToSafeArea(nuxButton, insets: Constants.nuxButtonInsets) - nuxButton.translatesAutoresizingMaskIntoConstraints = false + footer.addSubview(publishButton) + footer.pinSubviewToSafeArea(publishButton, insets: Constants.nuxButtonInsets) + publishButton.translatesAutoresizingMaskIntoConstraints = false tableView.tableFooterView = footer - nuxButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) + publishButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) } private enum Constants { diff --git a/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift index f0fb6a11957d..6772ad74fda7 100644 --- a/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift +++ b/WordPress/WordPressTest/PrepublishingNudgesViewControllerTests.swift @@ -24,7 +24,7 @@ class PrepublishingNudgesViewControllerTests: XCTestCase { _ = UINavigationController(rootViewController: prepublishingViewController) prepublishingViewController.viewDidLoad() - prepublishingViewController.nuxButton.sendActions(for: .touchUpInside) + prepublishingViewController.publishButton.sendActions(for: .touchUpInside) expect(returnedPost).toEventually(equal(post)) } From ae8d20e85fcb05233f71a12caff340efed0c8344 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 25 Mar 2020 17:38:50 -0300 Subject: [PATCH 031/245] Creates the header --- .../Post/Prepublishing Nudge/Blog+Title.swift | 11 ++ .../PrepublishingHeaderView.swift | 66 ++++++++++ .../PrepublishingHeaderView.xib | 121 ++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 32 +++++ .../PrepublishingHeaderViewTests.swift | 26 ++++ 5 files changed, 256 insertions(+) create mode 100644 WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/Blog+Title.swift create mode 100644 WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift create mode 100644 WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib create mode 100644 WordPress/WordPressTest/PrepublishingHeaderViewTests.swift diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/Blog+Title.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/Blog+Title.swift new file mode 100644 index 000000000000..faa8ffeae08e --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/Blog+Title.swift @@ -0,0 +1,11 @@ +import Foundation + +extension Blog { + + /// The title of the blog + var title: String? { + let blogName = settings?.name + let title = blogName != nil && blogName?.isEmpty == false ? blogName : displayURL as String? + return title + } +} diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift new file mode 100644 index 000000000000..a9eea69d996e --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -0,0 +1,66 @@ +import UIKit +import Gridicons + +protocol PrepublishingHeaderViewDelegate: class { + func backButtonTapped() +} + +class PrepublishingHeaderView: UIView, NibLoadable { + + @IBOutlet weak var blogImageView: UIImageView! + @IBOutlet weak var publishingToLabel: UILabel! + @IBOutlet weak var blogTitleLabel: UILabel! + @IBOutlet weak var backButtonView: UIView! + @IBOutlet weak var leadingConstraint: NSLayoutConstraint! + @IBOutlet weak var backButton: UIButton! + + weak var delegate: PrepublishingHeaderViewDelegate? + + override func awakeFromNib() { + super.awakeFromNib() + configureBackButton() + configurePublishingToLabel() + configureBlogTitleLabel() + } + + func configure(_ blog: Blog) { + blogImageView.downloadSiteIcon(for: blog) + blogTitleLabel.text = blog.title + } + + func hideBackButton() { + backButtonView.layer.opacity = 0 + backButtonView.isHidden = true + leadingConstraint.constant = Constants.leftRightInset + } + + func showBackButton() { + backButtonView.layer.opacity = 1 + backButtonView.isHidden = false + leadingConstraint.constant = 0 + } + + @IBAction func backButtonTapped(_ sender: Any) { + delegate?.backButtonTapped() + } + + private func configureBackButton() { + backButtonView.isHidden = true + backButton.setImage(Gridicon.iconOfType(.chevronLeft, withSize: Constants.backButtonSize), for: .normal) + } + + private func configurePublishingToLabel() { + publishingToLabel.text = publishingToLabel.text?.uppercased() + publishingToLabel.font = WPStyleGuide.TableViewHeaderDetailView.titleFont + publishingToLabel.textColor = WPStyleGuide.TableViewHeaderDetailView.titleColor + } + + private func configureBlogTitleLabel() { + WPStyleGuide.applyPostTitleStyle(blogTitleLabel) + } + + private enum Constants { + static let backButtonSize = CGSize(width: 28, height: 28) + static let leftRightInset: CGFloat = 20 + } +} diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib new file mode 100644 index 000000000000..299a35a6ea7c --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index f793d7a51274..17194a0af7c0 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1044,6 +1044,10 @@ 85F8E19D1B018698000859BB /* PushAuthenticationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */; }; 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; + 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */; }; + 8B0732E9242BA1F000E7FBD3 /* PrepublishingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */; }; + 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; + 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; @@ -3425,6 +3429,10 @@ 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushAuthenticationServiceTests.swift; sourceTree = ""; }; 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; + 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrepublishingHeaderView.xib; sourceTree = ""; }; + 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderView.swift; sourceTree = ""; }; + 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; + 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; @@ -6285,6 +6293,7 @@ 59ECF8791CB705EB00E68F25 /* Posts */ = { isa = PBXGroup; children = ( + 8B0732EB242BEF6F00E7FBD3 /* Prepublishing Nudges */, 59ECF87A1CB7061D00E68F25 /* PostSharingControllerTests.swift */, F18B43771F849F580089B817 /* PostAttachmentTests.swift */, 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */, @@ -7505,6 +7514,24 @@ name = Networking; sourceTree = ""; }; + 8B0732EA242BEF1900E7FBD3 /* Prepublishing Nudge */ = { + isa = PBXGroup; + children = ( + 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */, + 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */, + 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */, + ); + path = "Prepublishing Nudge"; + sourceTree = ""; + }; + 8B0732EB242BEF6F00E7FBD3 /* Prepublishing Nudges */ = { + isa = PBXGroup; + children = ( + 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */, + ); + name = "Prepublishing Nudges"; + sourceTree = ""; + }; 8B7623352384372200AB3EE7 /* Pages */ = { isa = PBXGroup; children = ( @@ -8304,6 +8331,7 @@ isa = PBXGroup; children = ( F5D0A64C23CC157100B20D27 /* Preview */, + 8B0732EA242BEF1900E7FBD3 /* Prepublishing Nudge */, F57402A5235FF71F00374346 /* Scheduling */, 4349B0A6218A2E810034118A /* Revisions */, 5D1EBF56187C9B95003393F8 /* Categories */, @@ -10642,6 +10670,7 @@ 17E3634522C417F0000E0C79 /* jetpack_green_icon_20pt@2x.png in Resources */, 17E363A422C41DBA000E0C79 /* hot_pink_icon_40pt@2x.png in Resources */, B5C66B701ACF06CA00F68370 /* NoteBlockHeaderTableViewCell.xib in Resources */, + 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */, 17DC4C3822C5E6910059CA11 /* open_source_dark_icon_83.5@2x.png in Resources */, 17DC4C3522C5E6910059CA11 /* open_source_dark_icon_29pt.png in Resources */, 5D6C4AF61B603CA3005E3C43 /* WPTableViewActivityCell.xib in Resources */, @@ -12330,6 +12359,7 @@ 173BCE791CEB780800AE8817 /* Domain.swift in Sources */, 590E873B1CB8205700D1B734 /* PostListViewController.swift in Sources */, E15644EB1CE0E4C500D96E64 /* FeatureItemRow.swift in Sources */, + 8B0732E9242BA1F000E7FBD3 /* PrepublishingHeaderView.swift in Sources */, 0857C2791CE5375F0014AE99 /* MenuItemsVisualOrderingView.m in Sources */, D8212CB520AA68D5008E8AE8 /* ReaderSubscribingNotificationAction.swift in Sources */, FF8C54AD21F677260003ABCF /* GutenbergMediaInserterHelper.swift in Sources */, @@ -12801,6 +12831,7 @@ B5416D011C17693B00006DD8 /* UIApplication+Helpers.m in Sources */, 731E88CA21C9A10B0055C014 /* ErrorStateView.swift in Sources */, 08D345501CD7F50900358E8C /* MenusSelectionDetailView.m in Sources */, + 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */, 591AA5021CEF9BF20074934F /* Post+CoreDataProperties.swift in Sources */, E19B17AE1E5C6944007517C6 /* BasePost.swift in Sources */, 7E7947A9210BAC1D005BB851 /* NotificationContentRange.swift in Sources */, @@ -13305,6 +13336,7 @@ 8B7623382384373E00AB3EE7 /* PageListViewControllerTests.swift in Sources */, D88A64B0208DA093008AE9BC /* StockPhotosResultsPageTests.swift in Sources */, 0879FC161E9301DD00E1EFC8 /* MediaTests.swift in Sources */, + 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */, B556EFCB1DCA374200728F93 /* DictionaryHelpersTests.swift in Sources */, 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */, 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */, diff --git a/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift b/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift new file mode 100644 index 000000000000..8db8a7e68e7a --- /dev/null +++ b/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift @@ -0,0 +1,26 @@ +import UIKit +import Nimble + +@testable import WordPress + +class PrepublishingHeaderViewTests: XCTestCase { + + func testShareControllerCreated() { + let prepublishingHeaderView = PrepublishingHeaderView.loadFromNib() + let delegateMock = PrepublishingHeaderViewDelegateMock() + prepublishingHeaderView.delegate = delegateMock + + prepublishingHeaderView.backButton.sendActions(for: .touchUpInside) + + expect(delegateMock.didCallBackButtonTapped).to(beTrue()) + } + +} + +class PrepublishingHeaderViewDelegateMock: PrepublishingHeaderViewDelegate { + var didCallBackButtonTapped = false + + func backButtonTapped() { + didCallBackButtonTapped = true + } +} From 97f96c5c35d2bcddb81dde31667dcba5e7ec2810 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 25 Mar 2020 17:40:51 -0300 Subject: [PATCH 032/245] Add mark --- .../PrepublishingHeaderView.swift | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index a9eea69d996e..82eee729129c 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -16,18 +16,13 @@ class PrepublishingHeaderView: UIView, NibLoadable { weak var delegate: PrepublishingHeaderViewDelegate? - override func awakeFromNib() { - super.awakeFromNib() - configureBackButton() - configurePublishingToLabel() - configureBlogTitleLabel() - } - func configure(_ blog: Blog) { blogImageView.downloadSiteIcon(for: blog) blogTitleLabel.text = blog.title } + // MARK: - Back button + func hideBackButton() { backButtonView.layer.opacity = 0 backButtonView.isHidden = true @@ -44,6 +39,15 @@ class PrepublishingHeaderView: UIView, NibLoadable { delegate?.backButtonTapped() } + // MARK: - Style + + override func awakeFromNib() { + super.awakeFromNib() + configureBackButton() + configurePublishingToLabel() + configureBlogTitleLabel() + } + private func configureBackButton() { backButtonView.isHidden = true backButton.setImage(Gridicon.iconOfType(.chevronLeft, withSize: Constants.backButtonSize), for: .normal) From df2e5953adf865a0b1f476a26c4e87b6f3259dfe Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 25 Mar 2020 18:23:53 -0300 Subject: [PATCH 033/245] Add our custom navigation header in front of the actual navigation bar --- .../PrepublishingHeaderView.xib | 20 +++-- .../PrepublishingNavigationController.swift | 80 +++++++++++++++++++ .../Post/PrepublishingViewController.swift | 12 +-- WordPress/WordPress.xcodeproj/project.pbxproj | 4 + 4 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index 299a35a6ea7c..e81c9dc204a1 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -1,17 +1,16 @@ - + - - + @@ -62,16 +61,16 @@ - + - - - - + + + + - diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift new file mode 100644 index 000000000000..419a02efcccf --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -0,0 +1,80 @@ +import UIKit + +class PrepublishingNavigationController: UINavigationController, BottomSheetPresentable { + var initialHeight: CGFloat = 200 + + lazy var header: PrepublishingHeaderView = { + let header = PrepublishingHeaderView.loadFromNib() + header.translatesAutoresizingMaskIntoConstraints = false + header.delegate = self + return header + }() + + lazy var blog: Blog? = { + return (viewControllers.first { $0 is PrepublishingViewController } as? PrepublishingViewController)?.post.blog + }() + + override func viewDidLoad() { + super.viewDidLoad() + + delegate = self + + configureNavigationHeader() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + guard let blog = blog else { + return + } + + // Configure the header + header.configure(blog) + } + + private func configureNavigationHeader() { + view.addSubview(header) + + // Put our custom navigation in front of the current navigation + NSLayoutConstraint.activate([ + header.topAnchor.constraint(equalTo: view.topAnchor), + header.leftAnchor.constraint(equalTo: navigationBar.leftAnchor), + header.rightAnchor.constraint(equalTo: navigationBar.rightAnchor), + header.heightAnchor.constraint(equalToConstant: Constants.navigationHeaderHeight) + ]) + additionalSafeAreaInsets = UIEdgeInsets(top: Constants.navigationHeaderHeight - navigationBar.frame.height, left: 0, bottom: 0, right: 0) + } + + private enum Constants { + static let navigationHeaderHeight: CGFloat = 80 + } +} + +// MARK: - UINavigationControllerDelegate + +extension PrepublishingNavigationController: UINavigationControllerDelegate { + + /// Animated the back button based on what View Controller will be shown + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { + transitionCoordinator?.animate(alongsideTransition: { context in + viewController is PrepublishingViewController ? self.header.hideBackButton() : self.header.showBackButton() + }, completion: nil) + } +} + +// MARK: - PrepublishingHeaderViewDelegate + +extension PrepublishingNavigationController: PrepublishingHeaderViewDelegate { + + /// Pop the current view controller when Back button is pressed + func backButtonTapped() { + popViewController(animated: true) + } +} + +typealias UIBottomSheetPresentable = BottomSheetPresentable & UIViewController + +protocol BottomSheetPresentable { + var initialHeight: CGFloat { get } +} diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index f5ff9dd562ef..5567fd217f14 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -6,7 +6,7 @@ private struct PrepublishingOption { } class PrepublishingViewController: UITableViewController { - private let post: Post + let post: Post private let completion: (AbstractPost) -> () @@ -105,13 +105,3 @@ class PrepublishingViewController: UITableViewController { static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 40) } } - -class PrepublishingNavigationController: UINavigationController, BottomSheetPresentable { - var initialHeight: CGFloat = 200 -} - -typealias UIBottomSheetPresentable = BottomSheetPresentable & UIViewController - -protocol BottomSheetPresentable { - var initialHeight: CGFloat { get } -} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 17194a0af7c0..b67d938c1e25 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1048,6 +1048,7 @@ 8B0732E9242BA1F000E7FBD3 /* PrepublishingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */; }; 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; + 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; @@ -3433,6 +3434,7 @@ 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderView.swift; sourceTree = ""; }; 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; + 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; @@ -7520,6 +7522,7 @@ 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */, 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */, 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */, + 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */, ); path = "Prepublishing Nudge"; sourceTree = ""; @@ -12323,6 +12326,7 @@ E1E4CE0B1773C59B00430844 /* WPAvatarSource.m in Sources */, 983DBBAB22125DD500753988 /* StatsTableFooter.swift in Sources */, 85D239AE1AE5A5FC0074768D /* BlogSyncFacade.m in Sources */, + 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */, 5D97C2F315CAF8D8009B44DD /* UINavigationController+KeyboardFix.m in Sources */, D8B9B591204F658A003C6042 /* CommentsViewController+NetworkAware.swift in Sources */, 4034FDEA2007C42400153B87 /* ExpandableCell.swift in Sources */, From 6058281e3791edc44a48173d1af345451f8408de Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 26 Mar 2020 14:33:57 -0300 Subject: [PATCH 034/245] Fix top inset for iOS 12 and 11 --- .../PrepublishingNavigationController.swift | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 419a02efcccf..a06eca97e14b 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -14,6 +14,18 @@ class PrepublishingNavigationController: UINavigationController, BottomSheetPres return (viewControllers.first { $0 is PrepublishingViewController } as? PrepublishingViewController)?.post.blog }() + // In iOS 13+ we need to take into account the navigationBar frame height + // iOS 12 or 11 that's not needed + lazy var insets: UIEdgeInsets = { + var top: CGFloat = 0 + if #available(iOS 13, *) { + top = Constants.navigationHeaderHeight - navigationBar.frame.height + } else { + top = Constants.navigationHeaderHeight + } + return UIEdgeInsets(top: top, left: 0, bottom: 0, right: 0) + }() + override func viewDidLoad() { super.viewDidLoad() @@ -43,7 +55,7 @@ class PrepublishingNavigationController: UINavigationController, BottomSheetPres header.rightAnchor.constraint(equalTo: navigationBar.rightAnchor), header.heightAnchor.constraint(equalToConstant: Constants.navigationHeaderHeight) ]) - additionalSafeAreaInsets = UIEdgeInsets(top: Constants.navigationHeaderHeight - navigationBar.frame.height, left: 0, bottom: 0, right: 0) + additionalSafeAreaInsets = insets } private enum Constants { From 9165adfcc235ad458f95d1b7af752f0831cc91ef Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 26 Mar 2020 15:31:38 -0300 Subject: [PATCH 035/245] Fix trailing_whitespace --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 82eee729129c..72e85609900d 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -6,7 +6,7 @@ protocol PrepublishingHeaderViewDelegate: class { } class PrepublishingHeaderView: UIView, NibLoadable { - + @IBOutlet weak var blogImageView: UIImageView! @IBOutlet weak var publishingToLabel: UILabel! @IBOutlet weak var blogTitleLabel: UILabel! From 7c9e92beae62ddafaa66739de0282a6afd07d01b Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 26 Mar 2020 16:56:02 -0300 Subject: [PATCH 036/245] Show the title of the presented view controller --- .../PrepublishingHeaderView.swift | 25 +++++++++++++++++++ .../PrepublishingHeaderView.xib | 9 +++++++ .../PrepublishingNavigationController.swift | 9 ++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 72e85609900d..e396af60fa1f 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -13,6 +13,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var backButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var titleLabel: UILabel! weak var delegate: PrepublishingHeaderViewDelegate? @@ -39,6 +40,22 @@ class PrepublishingHeaderView: UIView, NibLoadable { delegate?.backButtonTapped() } + // MARK: - Title + + func setTitle(_ title: String?) { + titleLabel.text = title?.uppercased() + } + + func showTitle() { + publishingToLabel.layer.opacity = 0 + titleLabel.layer.opacity = 1 + } + + func hideTitle() { + publishingToLabel.layer.opacity = 1 + titleLabel.layer.opacity = 0 + } + // MARK: - Style override func awakeFromNib() { @@ -46,6 +63,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { configureBackButton() configurePublishingToLabel() configureBlogTitleLabel() + configureTitleLabel() } private func configureBackButton() { @@ -63,8 +81,15 @@ class PrepublishingHeaderView: UIView, NibLoadable { WPStyleGuide.applyPostTitleStyle(blogTitleLabel) } + private func configureTitleLabel() { + titleLabel.layer.opacity = 0 + titleLabel.font = WPStyleGuide.TableViewHeaderDetailView.titleFont + titleLabel.textColor = WPStyleGuide.TableViewHeaderDetailView.titleColor + } + private enum Constants { static let backButtonSize = CGSize(width: 28, height: 28) static let leftRightInset: CGFloat = 20 + static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") } } diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index e81c9dc204a1..4fa30a42060a 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -86,12 +86,20 @@ + + + @@ -103,6 +111,7 @@ + diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index a06eca97e14b..32ee92d222a2 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -70,7 +70,14 @@ extension PrepublishingNavigationController: UINavigationControllerDelegate { /// Animated the back button based on what View Controller will be shown func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { transitionCoordinator?.animate(alongsideTransition: { context in - viewController is PrepublishingViewController ? self.header.hideBackButton() : self.header.showBackButton() + if viewController is PrepublishingViewController { + self.header.hideBackButton() + self.header.hideTitle() + } else { + self.header.showBackButton() + self.header.setTitle(viewController.title) + self.header.showTitle() + } }, completion: nil) } } From 30cef8f01abdf65b39bcba9347c5acd8c887a31a Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 27 Mar 2020 10:40:03 -0300 Subject: [PATCH 037/245] Add separator in the header iOS 12 or below doesn't display it. I've added manually to avoid issues. --- .../PrepublishingHeaderView.swift | 8 +++++++- .../Prepublishing Nudge/PrepublishingHeaderView.xib | 11 +++++++++++ .../PrepublishingNavigationController.swift | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index e396af60fa1f..e5d8e4b5d7f7 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -14,7 +14,8 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @IBOutlet weak var backButton: UIButton! @IBOutlet weak var titleLabel: UILabel! - + @IBOutlet weak var separator: UIView! + weak var delegate: PrepublishingHeaderViewDelegate? func configure(_ blog: Blog) { @@ -64,6 +65,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { configurePublishingToLabel() configureBlogTitleLabel() configureTitleLabel() + configureSeparator() } private func configureBackButton() { @@ -81,6 +83,10 @@ class PrepublishingHeaderView: UIView, NibLoadable { WPStyleGuide.applyPostTitleStyle(blogTitleLabel) } + private func configureSeparator() { + WPStyleGuide.applyBorderStyle(separator) + } + private func configureTitleLabel() { titleLabel.layer.opacity = 0 titleLabel.font = WPStyleGuide.TableViewHeaderDetailView.titleFont diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index 4fa30a42060a..afee14ef3ed0 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -92,6 +92,13 @@ + + + + + + + @@ -99,8 +106,11 @@ + + + @@ -111,6 +121,7 @@ + diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 32ee92d222a2..d531ff3d0323 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -32,6 +32,7 @@ class PrepublishingNavigationController: UINavigationController, BottomSheetPres delegate = self configureNavigationHeader() + configureNavigationBar() } override func viewWillAppear(_ animated: Bool) { @@ -45,6 +46,17 @@ class PrepublishingNavigationController: UINavigationController, BottomSheetPres header.configure(blog) } + private func configureNavigationBar() { + if #available(iOS 13.0, *) { + let appearance = UINavigationBarAppearance() + appearance.configureWithTransparentBackground() + navigationBar.standardAppearance = appearance + } else { + let clearImage = UIImage(color: .clear, havingSize: CGSize(width: 1, height: 1)) + navigationBar.shadowImage = clearImage + } + } + private func configureNavigationHeader() { view.addSubview(header) From 20fa299bd3735d058bd63460fbdb6785f279b4c7 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 27 Mar 2020 10:49:23 -0300 Subject: [PATCH 038/245] Add layoutIfNeeded() to avoid animation jumpings --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index e5d8e4b5d7f7..ea7b88bac082 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -29,12 +29,14 @@ class PrepublishingHeaderView: UIView, NibLoadable { backButtonView.layer.opacity = 0 backButtonView.isHidden = true leadingConstraint.constant = Constants.leftRightInset + layoutIfNeeded() } func showBackButton() { backButtonView.layer.opacity = 1 backButtonView.isHidden = false leadingConstraint.constant = 0 + layoutIfNeeded() } @IBAction func backButtonTapped(_ sender: Any) { From b04c0b87ca15e7a9a279063c61da87051a31d02a Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 27 Mar 2020 10:50:48 -0300 Subject: [PATCH 039/245] Truncate big blog titles --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.xib | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index afee14ef3ed0..c771554e0140 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -61,16 +61,16 @@ - + + From 43835d764497beee4589e6c5bb73ba017c1f729f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 27 Mar 2020 11:16:20 -0300 Subject: [PATCH 040/245] Fix trailing_whitespace --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index ea7b88bac082..801846298f0a 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -15,7 +15,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var backButton: UIButton! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var separator: UIView! - + weak var delegate: PrepublishingHeaderViewDelegate? func configure(_ blog: Blog) { From 21e647262c51f494cbaeb266e4424b38fc21ada0 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 27 Mar 2020 13:44:25 -0300 Subject: [PATCH 041/245] Remove extra label --- .../PrepublishingHeaderView.swift | 27 +++++-------------- .../PrepublishingHeaderView.xib | 9 ------- .../PrepublishingNavigationController.swift | 11 +++----- .../Post/PrepublishingViewController.swift | 3 +++ 4 files changed, 13 insertions(+), 37 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 801846298f0a..d658eb119c15 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -13,7 +13,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var backButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @IBOutlet weak var backButton: UIButton! - @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var separator: UIView! weak var delegate: PrepublishingHeaderViewDelegate? @@ -45,18 +44,13 @@ class PrepublishingHeaderView: UIView, NibLoadable { // MARK: - Title - func setTitle(_ title: String?) { - titleLabel.text = title?.uppercased() - } - - func showTitle() { - publishingToLabel.layer.opacity = 0 - titleLabel.layer.opacity = 1 - } - - func hideTitle() { - publishingToLabel.layer.opacity = 1 - titleLabel.layer.opacity = 0 + func setTitle(_ title: String?, transitionDuration: TimeInterval = 0.2) { + UIView.transition(with: publishingToLabel, + duration: transitionDuration, + options: .transitionCrossDissolve, + animations: { + self.publishingToLabel.text = title?.uppercased() + }) } // MARK: - Style @@ -66,7 +60,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { configureBackButton() configurePublishingToLabel() configureBlogTitleLabel() - configureTitleLabel() configureSeparator() } @@ -89,12 +82,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { WPStyleGuide.applyBorderStyle(separator) } - private func configureTitleLabel() { - titleLabel.layer.opacity = 0 - titleLabel.font = WPStyleGuide.TableViewHeaderDetailView.titleFont - titleLabel.textColor = WPStyleGuide.TableViewHeaderDetailView.titleColor - } - private enum Constants { static let backButtonSize = CGSize(width: 28, height: 28) static let leftRightInset: CGFloat = 20 diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index c771554e0140..ece1f9164d1d 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -87,12 +87,6 @@ - @@ -106,9 +100,7 @@ - - @@ -123,7 +115,6 @@ - diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index d531ff3d0323..0d02a7a40f10 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -82,14 +82,9 @@ extension PrepublishingNavigationController: UINavigationControllerDelegate { /// Animated the back button based on what View Controller will be shown func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { transitionCoordinator?.animate(alongsideTransition: { context in - if viewController is PrepublishingViewController { - self.header.hideBackButton() - self.header.hideTitle() - } else { - self.header.showBackButton() - self.header.setTitle(viewController.title) - self.header.showTitle() - } + viewController is PrepublishingViewController ? self.header.hideBackButton() : self.header.showBackButton() + + self.header.setTitle(viewController.title, transitionDuration: context.transitionDuration) }, completion: nil) } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 5567fd217f14..0e4a37186905 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -35,6 +35,8 @@ class PrepublishingViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() + title = Constants.title + setupPublishButton() } @@ -103,5 +105,6 @@ class PrepublishingViewController: UITableViewController { static let reuseIdentifier = "wpTableViewCell" static let nuxButtonInsets = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 40) + static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") } } From 7b9b6381bdea198320b892874029ca46991bb371 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 30 Mar 2020 11:29:31 -0300 Subject: [PATCH 042/245] Change gridicon API to the newest one --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index d658eb119c15..523da20ade26 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -65,7 +65,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { private func configureBackButton() { backButtonView.isHidden = true - backButton.setImage(Gridicon.iconOfType(.chevronLeft, withSize: Constants.backButtonSize), for: .normal) + backButton.setImage(.gridicon(.chevronLeft, size: Constants.backButtonSize), for: .normal) } private func configurePublishingToLabel() { From db1db9d73f2c6cddf7927a81e0d94e0e04479139 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 30 Mar 2020 16:32:27 -0300 Subject: [PATCH 043/245] Extract Visibility option so it can be reused --- .../Post/PostSettingsViewController.m | 55 +--------- ...PostVisibilitySelectorViewController.swift | 103 ++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 + 3 files changed, 110 insertions(+), 52 deletions(-) create mode 100644 WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift diff --git a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m index f3fc6efd5a6f..cbc201465f50 100644 --- a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m +++ b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m @@ -1034,59 +1034,10 @@ - (void)showPostStatusSelector - (void)showPostVisibilitySelector { - NSArray *titles = @[ - NSLocalizedString(@"Public", @"Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."), - NSLocalizedString(@"Password protected", @"Privacy setting for posts set to 'Password protected'. Should be the same as in core WP."), - NSLocalizedString(@"Private", @"Privacy setting for posts set to 'Private'. Should be the same as in core WP.") - ]; - NSDictionary *visiblityDict = @{ - @"DefaultValue": NSLocalizedString(@"Public", @"Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."), - @"Title" : NSLocalizedString(@"Visibility", nil), - @"Titles" : titles, - @"Values" : titles, - @"CurrentValue" : [self titleForVisibility]}; - SettingsSelectionViewController *vc = [[SettingsSelectionViewController alloc] initWithDictionary:visiblityDict]; - __weak SettingsSelectionViewController *weakVc = vc; - vc.onItemSelected = ^(NSString *visibility) { + PostVisibilitySelectorViewController *vc = [[PostVisibilitySelectorViewController alloc] init:self.apost]; + __weak PostVisibilitySelectorViewController *weakVc = vc; + vc.completion = ^{ [weakVc dismiss]; - - NSAssert(self.apost != nil, @"The post should not be nil here."); - NSAssert(!self.apost.isFault, @"The post should not be a fault here here."); - NSAssert(self.apost.managedObjectContext != nil, @"The post's MOC should not be nil here."); - - if ([visibility isEqualToString:NSLocalizedString(@"Private", @"Post privacy status in the Post Editor/Settings area (compare with WP core translations).")]) { - self.apost.status = PostStatusPrivate; - self.apost.password = nil; - } else { - if ([self.apost.status isEqualToString:PostStatusPrivate]) { - if ([self.apost.original.status isEqualToString:PostStatusPrivate]) { - self.apost.status = PostStatusPublish; - } else { - // restore the original status - self.apost.status = self.apost.original.status; - } - } - if ([visibility isEqualToString:NSLocalizedString(@"Password protected", @"Post password protection in the Post Editor/Settings area (compare with WP core translations).")]) { - - NSString *password = @""; - - NSAssert(self.apost.original != nil, - @"We're expecting to have a reference to the original post here."); - NSAssert(!self.apost.original.isFault, - @"The original post should not be a fault here here."); - NSAssert(self.apost.original.managedObjectContext != nil, - @"The original post's MOC should not be nil here."); - - if (self.apost.original.password) { - // restore the original password - password = self.apost.original.password; - } - self.apost.password = password; - } else { - self.apost.password = nil; - } - } - [self.tableView reloadData]; }; [self.navigationController pushViewController:vc animated:YES]; diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift new file mode 100644 index 000000000000..38affadcff14 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -0,0 +1,103 @@ +import UIKit + +@objc class PostVisibilitySelectorViewController: SettingsSelectionViewController { + /// The post to change the visibility + private var post: AbstractPost! + + /// A completion block that is called after the user select an option + @objc var completion: (() -> Void)? + + // MARK: - Constructors + + @objc init(_ post: AbstractPost) { + self.post = post + + let titles: NSArray = [ + NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."), + NSLocalizedString("Password protected", comment: "Privacy setting for posts set to 'Password protected'. Should be the same as in core WP."), + NSLocalizedString("Private", comment: "Privacy setting for posts set to 'Private'. Should be the same as in core WP.") + ] + + let visiblityDict: [AnyHashable: Any] = [ + "DefaultValue": NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."), + "Title": NSLocalizedString("Visibility", comment: ""), + "Titles": titles, + "Values": titles, + "CurrentValue": post.titleForVisibility + ] + + super.init(dictionary: visiblityDict) + + onItemSelected = { visibility in + guard let visibility = visibility as? String, + !post.isFault, post.managedObjectContext != nil else { + return + } + + if visibility == AbstractPost.privateLabel { + post.status = .publishPrivate + post.password = nil + } else { + if post.status == .publishPrivate { + if post.original?.status == .publishPrivate { + post.status = .publish + } else { + // restore the original status + post.status = post.original?.status + } + } + + if visibility == AbstractPost.passwordProtectedLabel { + var password = "" + + assert(post.original != nil, + "We're expecting to have a reference to the original post here.") + assert(!post.original!.isFault, + "We're expecting to have a reference to the original post here.") + assert(post.original!.managedObjectContext != nil, + "The original post's MOC should not be nil here.") + + if let originalPassword = post.original?.password { + password = originalPassword + } + post.password = password + } else { + post.password = nil + } + } + + self.completion?() + + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override init!(style: UITableView.Style, andDictionary dictionary: [AnyHashable : Any]!) { + super.init(style: style, andDictionary: dictionary) + } + + override init(style: UITableView.Style) { + super.init(style: style) + } +} + +// MARK: - Abstract Post private extension + +private extension AbstractPost { + static let passwordProtectedLabel = NSLocalizedString("Password protected", comment: "Privacy setting for posts set to 'Password protected'. Should be the same as in core WP.") + static let privateLabel = NSLocalizedString("Private", comment: "Privacy setting for posts set to 'Private'. Should be the same as in core WP.") + static let publicLabel = NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP.") + + var titleForVisibility: String { + if password != nil { + return AbstractPost.passwordProtectedLabel + } else if status == .publishPrivate { + return AbstractPost.privateLabel + } + + return AbstractPost.publicLabel + } +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 618fe21377d0..76710b40aac7 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1064,6 +1064,7 @@ 8B939F4323832E5D00ACCB0F /* PostListViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */; }; 8BAD272C241FEF3300E9D105 /* PrepublishingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */; }; 8BAD53D6241922B900230F4B /* WPAnalyticsEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */; }; + 8BB2768424323A94002D2BEC /* PostVisibilitySelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB2768324323A94002D2BEC /* PostVisibilitySelectorViewController.swift */; }; 8BC12F72231FEBA1004DDA72 /* PostCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */; }; 8BC12F7523201917004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */; }; 8BC12F7723201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F7623201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift */; }; @@ -3462,6 +3463,7 @@ 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostListViewControllerTests.swift; sourceTree = ""; }; 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingViewController.swift; sourceTree = ""; }; 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPAnalyticsEvent.swift; sourceTree = ""; }; + 8BB2768324323A94002D2BEC /* PostVisibilitySelectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostVisibilitySelectorViewController.swift; sourceTree = ""; }; 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostCoordinatorTests.swift; sourceTree = ""; }; 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostService+MarkAsFailedAndDraftIfNeeded.swift"; sourceTree = ""; }; 8BC12F7623201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostService+MarkAsFailedAndDraftIfNeededTests.swift"; sourceTree = ""; }; @@ -8404,6 +8406,7 @@ FFEECFFB2084DE2B009B8CDB /* PostSettingsViewController+FeaturedImageUpload.swift */, 593F26601CAB00CA00F14073 /* PostSharingController.swift */, E155EC711E9B7DCE009D7F63 /* PostTagPickerViewController.swift */, + 8BB2768324323A94002D2BEC /* PostVisibilitySelectorViewController.swift */, 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */, 5D17F0BC1A1D4C5F0087CCB8 /* PrivateSiteURLProtocol.h */, 5D17F0BD1A1D4C5F0087CCB8 /* PrivateSiteURLProtocol.m */, @@ -12815,6 +12818,7 @@ 988AC37522F10DD900BC1433 /* FileDownloadsStatsRecordValue+CoreDataProperties.swift in Sources */, E1A03EE217422DCF0085D192 /* BlogToAccount.m in Sources */, 436D55DF210F866900CEAA33 /* StoryboardLoadable.swift in Sources */, + 8BB2768424323A94002D2BEC /* PostVisibilitySelectorViewController.swift in Sources */, D8212CC320AA7F57008E8AE8 /* ReaderBlockSiteAction.swift in Sources */, 5D44EB381986D8BA008B7175 /* ReaderSiteService.m in Sources */, B518E1651CCAA19200ADFE75 /* Blog+Capabilities.swift in Sources */, From 99f98b874a8ed409a3973be0d6f2320736b55388 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 30 Mar 2020 16:37:47 -0300 Subject: [PATCH 044/245] Fix lint issues --- .../Post/PostVisibilitySelectorViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift index 38affadcff14..6c44c7ad5ba8 100644 --- a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -20,7 +20,7 @@ import UIKit let visiblityDict: [AnyHashable: Any] = [ "DefaultValue": NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."), - "Title": NSLocalizedString("Visibility", comment: ""), + "Title": NSLocalizedString("Visibility", comment: "Visibility label"), "Titles": titles, "Values": titles, "CurrentValue": post.titleForVisibility @@ -75,7 +75,7 @@ import UIKit fatalError("init(coder:) has not been implemented") } - override init!(style: UITableView.Style, andDictionary dictionary: [AnyHashable : Any]!) { + override init!(style: UITableView.Style, andDictionary dictionary: [AnyHashable: Any]!) { super.init(style: style, andDictionary: dictionary) } From 9c12d5b7af72109307697250ea7cade310edfa54 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Mon, 30 Mar 2020 15:17:52 -0700 Subject: [PATCH 045/245] Add a new bottom sheet presentation controller --- .../DrawerPresentationController.swift | 342 ++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 + 2 files changed, 346 insertions(+) create mode 100644 WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift new file mode 100644 index 000000000000..0135c1b5ee6f --- /dev/null +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -0,0 +1,342 @@ +import UIKit + +public enum DrawerPosition { + case top + case bottom + case closed +} + +public protocol DrawerPresentable: AnyObject { + var initialHeight: CGFloat { get } + var scrollableView: UIScrollView? { get } + var allowsUserTransition: Bool { get } + var allowsDragToDismiss: Bool { get } +} + +typealias UIDrawerPresentable = DrawerPresentable & UIViewController + +public extension DrawerPresentable where Self: UIViewController { + //Default values + var allowsUserTransition: Bool { + return true + } + + var initialHeight: CGFloat { + return 0 + } + + var scrollableView: UIScrollView? { + return nil + } + + var allowsDragToDismiss: Bool { + return true + } + + // Helpers + var presentedVC: DrawerPresentationController? { + guard let navController = self.navigationController else { + return presentationController as? DrawerPresentationController + } + + return navController.presentationController as? DrawerPresentationController + } +} + +public class DrawerPresentationController: FancyAlertPresentationController { + private enum Constants { + static let transitionDuration: TimeInterval = 0.2 + static let defaultTopMargin: CGFloat = 20 + static let flickVelocity: CGFloat = 300 + static let bounceAmount: CGFloat = 0.01 + } + + override public var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = self.containerView else { + return .zero + } + + var frame = containerView.frame + let y = bottomYPosition + + frame.origin.y = y + + return frame + } + + public var position: DrawerPosition = .bottom + + public func transition(to position: DrawerPosition) { + self.position = position + + if position == .closed { + dismiss() + return + } + + var margin: CGFloat = 0 + + switch position { + case .top: + margin = topYPosition + + case .bottom: + margin = bottomYPosition + + default: + margin = 0 + } + + setTopMargin(margin) + } + + @objc func dismiss() { + self.presentedViewController.dismiss(animated: true, completion: nil) + } + + public override func presentationTransitionWillBegin() { + super.presentationTransitionWillBegin() + + configureScrollViewInsets() + } + + public override func presentationTransitionDidEnd(_ completed: Bool) { + super.presentationTransitionDidEnd(completed) + + configureScrollViewInsets() + } + + + //MARK: - Internal Positions + private var closedPosition: CGFloat { + guard let presentedView = self.presentedView else { + return 0 + } + + return presentedView.bounds.height + } + + private var bottomYPosition: CGFloat { + return calculatedTopMargin(for: presentableInitialHeight) + } + + private var topYPosition: CGFloat { + return Constants.defaultTopMargin + safeAreaInsets.top + } + + + //MARK: - Panning + private lazy var tapGestureRecognizer: UITapGestureRecognizer = { + return UITapGestureRecognizer(target: self, action: #selector(self.dismiss)) + }() + + private lazy var panGestureRecognizer: UIPanGestureRecognizer = { + return UIPanGestureRecognizer(target: self, action: #selector(self.pan(_:))) + }() + + var interactionController: UIPercentDrivenInteractiveTransition? + + override public func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + + addGestures() + } + + private var startPoint: CGPoint? + +} + +//MARK: - Dragging +private extension DrawerPresentationController { + private func addGestures() { + guard let presentedView = self.presentedView else { return } + + presentedView.addGestureRecognizer(self.panGestureRecognizer) + } + + @objc func pan(_ gesture: UIPanGestureRecognizer) { + guard let presentedView = self.presentedView else { return } + + let translation = gesture.translation(in: presentedView) + let allowsUserTransition = presentableViewController?.allowsUserTransition ?? false + let allowDragToDismiss = presentableViewController?.allowsDragToDismiss ?? true + + switch gesture.state { + case .began: + startPoint = presentedView.frame.origin + + case .changed: + let startY = startPoint?.y ?? 0 + var yTranslation = translation.y + + if (!allowsUserTransition || !allowDragToDismiss) { + let maxBounce: CGFloat = (startY * Constants.bounceAmount) + + if yTranslation < 0 { + yTranslation = max(yTranslation, maxBounce * -1) + } else { + if !allowDragToDismiss { + yTranslation = min(yTranslation, maxBounce) + } + } + } + + self.setTopMargin((startY + yTranslation), animated: false) + + case .ended: + /// Helper closure to prevent user transitions + let transition:(DrawerPosition) -> () = { pos in + + if allowsUserTransition { + self.transition(to: pos) + return + } + + if pos == .closed && allowDragToDismiss { + self.transition(to: pos) + } else { + self.transition(to: self.position) + } + } + + let velocity = gesture.velocity(in: presentedView).y + let startY = startPoint?.y ?? 0 + + let currentPosition = (startY + translation.y) + let position = closestPosition(for: currentPosition) + + // Determine how to handle flicking of the view + if ((abs(velocity) - Constants.flickVelocity) > 0) { + //Flick up + if velocity < 0 { + transition(.top) + } + else { + if(position == .top){ + transition(.bottom) + } else { + transition(.closed) + } + } + + return + } + + transition(position) + + startPoint = nil + + default: + return + } + } + +} + +private extension UIScrollView { + /** + A flag to determine if a scroll view is scrolling + */ + var isScrolling: Bool { + return isDragging && !isDecelerating || isTracking + } +} + +//MARK: - Private: Helpers +private extension DrawerPresentationController { + + private func configureScrollViewInsets() { + guard + let scrollView = presentableViewController?.scrollableView, + !scrollView.isScrolling, + let presentedView = self.presentedView + else { return } + + + let bottom = presentingViewController.bottomLayoutGuide.length + let margin = presentedView.frame.origin.y + bottom + + /** + Disable vertical scroll indicator until we start to scroll + to avoid visual bugs + */ +// scrollView.showsVerticalScrollIndicator = false +// scrollView.scrollIndicatorInsets = .zero +// + scrollView.contentInset.bottom = margin + } + + private var presentableViewController: DrawerPresentable? { + return presentedViewController as? DrawerPresentable + } + + private var presentableInitialHeight: CGFloat { + guard let presentableVC = presentableViewController else { + return 0 + } + + return presentableVC.initialHeight + } + + private func calculatedTopMargin(for height: CGFloat) -> CGFloat { + guard let containerView = self.containerView else { + return 0 + } + + let bounds = containerView.bounds + let margin = bounds.maxY - (safeAreaInsets.bottom + ((height > 0) ? height : (bounds.height * 0.5))) + + //Limit the max height + return max(margin, safeAreaInsets.top) + } + + private func setTopMargin(_ margin: CGFloat, animated: Bool = true) { + guard let presentedView = self.presentedView else { + return + } + + var frame = presentedView.frame + frame.origin.y = margin + + let animations = { + presentedView.frame = frame + + self.configureScrollViewInsets() + } + + + if animated { + UIView.animate(withDuration: Constants.transitionDuration, animations: animations) + } else { + animations() + } + } + + private var safeAreaInsets: UIEdgeInsets { + guard let rootViewController = self.rootViewController else { + return .zero + } + + return rootViewController.view.safeAreaInsets + } + + func closestPosition(for yPosition: CGFloat) -> DrawerPosition { + let positions = [closedPosition, bottomYPosition, topYPosition] + let closestVal = positions.min(by: { abs(yPosition - $0) < abs(yPosition - $1) }) ?? yPosition + + var returnPosition: DrawerPosition = .closed + + if closestVal == topYPosition { + returnPosition = .top + } else if(closestVal == bottomYPosition) { + returnPosition = .bottom + } + + return returnPosition + } + + + private var rootViewController: UIViewController? { + return UIApplication.shared.keyWindow?.rootViewController + } +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 618fe21377d0..159ae7816df7 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -338,6 +338,7 @@ 319D6E8519E44F7F0013871C /* SuggestionsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 319D6E8419E44F7F0013871C /* SuggestionsTableViewCell.m */; }; 31C9F82E1A2368A2008BB945 /* BlogDetailHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 31C9F82D1A2368A2008BB945 /* BlogDetailHeaderView.m */; }; 31EC15081A5B6675009FC8B3 /* WPStyleGuide+Suggestions.m in Sources */ = {isa = PBXBuildFile; fileRef = 31EC15071A5B6675009FC8B3 /* WPStyleGuide+Suggestions.m */; }; + 320B40DE2432533600DAB738 /* DrawerPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 320B40DD2432533600DAB738 /* DrawerPresentationController.swift */; }; 321E292623A5F10900588610 /* FullScreenCommentReplyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 328CEC5D23A532BA00A6899E /* FullScreenCommentReplyViewController.swift */; }; 323F8F3023A22C4C000BA49C /* SiteCreationRotatingMessageViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32C6CDDA23A1FF0D002556FF /* SiteCreationRotatingMessageViewTests.swift */; }; 323F8F3123A22C8F000BA49C /* SiteCreationRotatingMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3221278523A0BD27002CA183 /* SiteCreationRotatingMessageView.swift */; }; @@ -2676,6 +2677,7 @@ 31EC15061A5B6675009FC8B3 /* WPStyleGuide+Suggestions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WPStyleGuide+Suggestions.h"; sourceTree = ""; }; 31EC15071A5B6675009FC8B3 /* WPStyleGuide+Suggestions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "WPStyleGuide+Suggestions.m"; sourceTree = ""; }; 31FA16CC1A49B3C0003E1887 /* WordPress 25.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "WordPress 25.xcdatamodel"; sourceTree = ""; }; + 320B40DD2432533600DAB738 /* DrawerPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DrawerPresentationController.swift; sourceTree = ""; }; 3221278523A0BD27002CA183 /* SiteCreationRotatingMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteCreationRotatingMessageView.swift; sourceTree = ""; }; 32282CF82390B614003378A7 /* WordPress 94.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "WordPress 94.xcdatamodel"; sourceTree = ""; }; 3249615023F20111004C7733 /* PostSignUpInterstitialViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostSignUpInterstitialViewController.swift; sourceTree = ""; }; @@ -10175,6 +10177,7 @@ F5E032E22408D537003AF350 /* Action Sheet */ = { isa = PBXGroup; children = ( + 320B40DD2432533600DAB738 /* DrawerPresentationController.swift */, F5E032E32408D537003AF350 /* ActionSheetViewController.swift */, F5E032E42408D537003AF350 /* GripView.swift */, F5E032E52408D537003AF350 /* BottomSheetPresentationController.swift */, @@ -12360,6 +12363,7 @@ 7E3E7A6020E44E490075D159 /* FooterContentGroup.swift in Sources */, 59A3CADD1CD2FF0C009BFA1B /* BasePageListCell.m in Sources */, 436D56202117312700CEAA33 /* RegisterDomainSuggestionsTableViewController.swift in Sources */, + 320B40DE2432533600DAB738 /* DrawerPresentationController.swift in Sources */, E114D79A153D85A800984182 /* WPError.m in Sources */, 7E53AB0220FE5EAE005796FE /* ContentRouter.swift in Sources */, E16273E11B2ACEB600088AF7 /* BlogToBlog32to33.swift in Sources */, From df873b78d161b26852442e80e9f433dbd9d42b58 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Mon, 30 Mar 2020 15:18:25 -0700 Subject: [PATCH 046/245] Replace BottomSheetPresentationController with DrawerPresentationController --- .../BottomSheetViewController.swift | 77 ++++++------------- .../PrepublishingNavigationController.swift | 14 ++-- 2 files changed, 30 insertions(+), 61 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index af1289ecc562..f2a99237386e 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -1,6 +1,11 @@ import UIKit -class BottomSheetViewController: UIViewController { +class BottomSheetViewController: UIViewController, DrawerPresentable { + var initialHeight: CGFloat = 200 + + var scrollableView: UIScrollView? { + return self.childViewController?.scrollableView + } enum Constants { static let gripHeight: CGFloat = 5 @@ -28,11 +33,9 @@ class BottomSheetViewController: UIViewController { } } - private weak var childViewController: UIBottomSheetPresentable? - - private var heightConstraint: NSLayoutConstraint! + private weak var childViewController: UIDrawerPresentable? - init(childViewController: UIBottomSheetPresentable) { + init(childViewController: UIDrawerPresentable) { self.childViewController = childViewController super.init(nibName: nil, bundle: nil) } @@ -85,12 +88,6 @@ class BottomSheetViewController: UIViewController { return } - // Set the initial height of the child VC - heightConstraint = childViewController.view.heightAnchor.constraint(equalToConstant: childViewController.initialHeight) - heightConstraint.priority = UILayoutPriority(rawValue: 999) - heightConstraint.isActive = true - childViewController.view.translatesAutoresizingMaskIntoConstraints = false - addChild(childViewController) let stackView = UIStackView(arrangedSubviews: [ @@ -131,48 +128,20 @@ class BottomSheetViewController: UIViewController { return preferredContentSize = CGSize(width: Constants.minimumWidth, height: view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) } - @objc func keyboardWillShow(_ notification: NSNotification) { - let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 0.30 - let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt ?? 0 - - let heightForKeyboard = UIScreen.main.bounds.height - 200 - - UIView.animateKeyframes(withDuration: duration, - delay: 0, - options: UIView.KeyframeAnimationOptions(rawValue: curve), - animations: { - // Resize the bottom sheet - self.heightConstraint.constant = heightForKeyboard - self.presentationController?.containerView?.setNeedsLayout() - self.presentationController?.containerView?.layoutIfNeeded() - - // Resize all the subviews if the child VC is a navigation controller - self.resizeAllViewControllers(height: heightForKeyboard) - }, completion: { _ in - // Make sure the subviews keeps the height of the bottom sheet - self.resizeAllViewControllers(height: heightForKeyboard) - }) - } - - private func resizeAllViewControllers(height: CGFloat) { - (childViewController as? UINavigationController)?.viewControllers.forEach { viewController in - let originalFrame = viewController.view.frame - viewController.view.frame = CGRect(x: originalFrame.origin.x, y: originalFrame.origin.y, width: originalFrame.width, height: height) + var presentedVC: DrawerPresentationController? { + guard let navController = self.navigationController else { + return presentationController as? DrawerPresentationController } + + return navController.presentationController as? DrawerPresentationController + } + + @objc func keyboardWillShow(_ notification: NSNotification) { + self.presentedVC?.transition(to: .top) } @objc func keyboardWillHide(_ notification: NSNotification) { - let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 0.30 - let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt ?? 0 - - UIView.animateKeyframes(withDuration: duration, - delay: 0, - options: UIView.KeyframeAnimationOptions(rawValue: curve), - animations: { - self.heightConstraint.constant = self.childViewController?.initialHeight ?? 200 - self.presentationController?.containerView?.setNeedsLayout() - self.presentationController?.containerView?.layoutIfNeeded() - }, completion: nil) + self.presentedVC?.transition(to: .bottom) } } @@ -186,12 +155,12 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { } public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { - let presentationController = BottomSheetPresentationController(presentedViewController: presented, presenting: presenting) + let presentationController = DrawerPresentationController(presentedViewController: presented, presenting: presenting) return presentationController } - public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { - - return (self.presentationController as? BottomSheetPresentationController)?.interactionController - } +// public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { +// +// return (self.presentationController as? DrawerPresentationController)?.interactionController +// } } diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 0d02a7a40f10..ad2a9f09d9e6 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -1,8 +1,14 @@ import UIKit -class PrepublishingNavigationController: UINavigationController, BottomSheetPresentable { +class PrepublishingNavigationController: UINavigationController, DrawerPresentable { var initialHeight: CGFloat = 200 + var scrollableView: UIScrollView? { + let scroll = visibleViewController?.view as? UIScrollView + + return scroll + } + lazy var header: PrepublishingHeaderView = { let header = PrepublishingHeaderView.loadFromNib() header.translatesAutoresizingMaskIntoConstraints = false @@ -98,9 +104,3 @@ extension PrepublishingNavigationController: PrepublishingHeaderViewDelegate { popViewController(animated: true) } } - -typealias UIBottomSheetPresentable = BottomSheetPresentable & UIViewController - -protocol BottomSheetPresentable { - var initialHeight: CGFloat { get } -} From f2e47765f7ce42aff072afbccdc9a691fbf53962 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 31 Mar 2020 17:41:33 -0300 Subject: [PATCH 047/245] Remove duplicated code --- .../ViewRelated/Post/PostSettingsViewController.m | 13 +------------ .../Post/PostVisibilitySelectorViewController.swift | 4 ++-- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m index cbc201465f50..52a0dcc9856a 100644 --- a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m +++ b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m @@ -671,7 +671,7 @@ - (UITableViewCell *)configureMetaPostMetaCellForIndexPath:(NSIndexPath *)indexP // Visibility cell = [self getWPTableViewDisclosureCell]; cell.textLabel.text = NSLocalizedString(@"Visibility", @"The visibility settings of the post. Should be the same as in core WP."); - cell.detailTextLabel.text = [self titleForVisibility]; + cell.detailTextLabel.text = [self.apost titleForVisibility]; cell.tag = PostSettingsRowVisibility; cell.accessibilityIdentifier = @"Visibility"; @@ -1281,17 +1281,6 @@ - (void)featuredImageFailedLoading:(NSIndexPath *)indexPath withError:(NSError * cell.textLabel.text = NSLocalizedString(@"Featured Image did not load", @""); } -- (NSString *)titleForVisibility -{ - if (self.apost.password) { - return NSLocalizedString(@"Password protected", @"Privacy setting for posts set to 'Password protected'. Should be the same as in core WP."); - } else if ([self.apost.status isEqualToString:PostStatusPrivate]) { - return NSLocalizedString(@"Private", @"Privacy setting for posts set to 'Private'. Should be the same as in core WP."); - } - - return NSLocalizedString(@"Public", @"Privacy setting for posts set to 'Public' (default). Should be the same as in core WP."); -} - - (NoResultsViewController *)noResultsView { if (!_noResultsView) { diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift index 6c44c7ad5ba8..16b3d4ba717d 100644 --- a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -86,12 +86,12 @@ import UIKit // MARK: - Abstract Post private extension -private extension AbstractPost { +extension AbstractPost { static let passwordProtectedLabel = NSLocalizedString("Password protected", comment: "Privacy setting for posts set to 'Password protected'. Should be the same as in core WP.") static let privateLabel = NSLocalizedString("Private", comment: "Privacy setting for posts set to 'Private'. Should be the same as in core WP.") static let publicLabel = NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP.") - var titleForVisibility: String { + @objc var titleForVisibility: String { if password != nil { return AbstractPost.passwordProtectedLabel } else if status == .publishPrivate { From 972b3e7ba7a4b09d9e3527afbe7b7240efcb8128 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 30 Mar 2020 17:32:31 -0300 Subject: [PATCH 048/245] Increase nudges view height --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 0d02a7a40f10..05dd6ac30a1a 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -1,7 +1,7 @@ import UIKit class PrepublishingNavigationController: UINavigationController, BottomSheetPresentable { - var initialHeight: CGFloat = 200 + var initialHeight: CGFloat = 300 lazy var header: PrepublishingHeaderView = { let header = PrepublishingHeaderView.loadFromNib() From 86127200c69a0aa667befaa907526cc75b8e8de4 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 30 Mar 2020 18:05:28 -0300 Subject: [PATCH 049/245] Display Visibility options --- ...PostVisibilitySelectorViewController.swift | 4 +-- .../Post/PrepublishingViewController.swift | 30 ++++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift index 16b3d4ba717d..7f68e8fb5c04 100644 --- a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -28,7 +28,7 @@ import UIKit super.init(dictionary: visiblityDict) - onItemSelected = { visibility in + onItemSelected = { [weak self] visibility in guard let visibility = visibility as? String, !post.isFault, post.managedObjectContext != nil else { return @@ -66,7 +66,7 @@ import UIKit } } - self.completion?() + self?.completion?() } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 0e4a37186905..ea16d64fcf1f 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -11,6 +11,7 @@ class PrepublishingViewController: UITableViewController { private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ + PrepublishingOption(title: NSLocalizedString("Visibility", comment: "Label for Visibility")), PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) ] @@ -64,6 +65,8 @@ class PrepublishingViewController: UITableViewController { cell.textLabel?.text = options[indexPath.row].title if indexPath.row == 0 { + cell.detailTextLabel?.text = post.titleForVisibility + } else { // Tags row cell.detailTextLabel?.text = post.tags } @@ -72,18 +75,29 @@ class PrepublishingViewController: UITableViewController { } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let viewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) + if indexPath.row == 0 { + let viewController = PostVisibilitySelectorViewController(post) - viewController.onValueChanged = { [weak self] tags in - if !tags.isEmpty { - WPAnalytics.track(.prepublishingTagsAdded) + viewController.completion = { [weak self] in + self?.navigationController?.popViewController(animated: true) + self?.tableView.reloadData() } - self?.post.tags = tags - self?.tableView.reloadData() - } + navigationController?.pushViewController(viewController, animated: true) + } else { + let viewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) + + viewController.onValueChanged = { [weak self] tags in + if !tags.isEmpty { + WPAnalytics.track(.prepublishingTagsAdded) + } - navigationController?.pushViewController(viewController, animated: true) + self?.post.tags = tags + self?.tableView.reloadData() + } + + navigationController?.pushViewController(viewController, animated: true) + } } @objc func publish(_ sender: UIButton) { From f60f307f82bef975142717a5a8a2d9b82c68e5b3 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 31 Mar 2020 15:22:29 -0300 Subject: [PATCH 050/245] Creates a Alert Controller that prompts for a password --- .../UIPasswordAlertController.swift | 70 +++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 ++ 2 files changed, 74 insertions(+) create mode 100644 WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift new file mode 100644 index 000000000000..e2e04b6df564 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift @@ -0,0 +1,70 @@ +import UIKit +import Gridicons + +/// Display an Alert Controller that prompts for a password +class UIPasswordAlertController { + + var passwordField: UITextField! + + var onSubmit: ((String?) -> Void)? + + var onCancel: (() -> Void)? + + init(onSubmit: @escaping (String?) -> Void, onCancel: @escaping () -> Void) { + self.onSubmit = onSubmit + self.onCancel = onCancel + } + + /// Show the Alert Controller from a given view controller + func show(from viewController: UIViewController) { + let alertController = UIAlertController( + title: AbstractPost.passwordProtectedLabel, + message: Constants.passwordMessage, + preferredStyle: .alert + ) + + let submitAction = UIAlertAction(title: Constants.alertSubmit, style: .default) { _ in + self.onSubmit?(self.passwordField.text) + self.onSubmit = nil + self.onCancel = nil + alertController.dismiss(animated: true) + } + + let cancelAction = UIAlertAction(title: Constants.alertCancel, style: .cancel) { _ in + self.onCancel?() + self.onSubmit = nil + self.onCancel = nil + alertController.dismiss(animated: true) + } + + alertController.addTextField { textField in + self.passwordField = textField + textField.placeholder = Constants.postPassword + let button = UIButton() + textField.rightView = button + textField.rightViewMode = .always + self.togglePassword(button) + button.addTarget(self, action: #selector(self.togglePassword(_:)), for: .touchUpInside) + } + + alertController.addAction(submitAction) + alertController.addAction(cancelAction) + + viewController.present(alertController, animated: true, completion: nil) + } + + /// Toggle the UITextField isSecureTextEntry on/off + @objc func togglePassword(_ sender: UIButton) { + let isSecureTextEntry = !passwordField.isSecureTextEntry + passwordField.isSecureTextEntry = isSecureTextEntry + sender.setImage(isSecureTextEntry ? .gridicon(.visible) : .gridicon(.notVisible), for: .normal) + } + + private enum Constants { + static let alertSubmit = NSLocalizedString("OK", comment: "Submit button on prompt for user information.") + static let alertCancel = NSLocalizedString("Cancel", comment: "Cancel prompt for user information.") + static let postPassword = NSLocalizedString("Post Password", comment: "Placeholder of a field to type a password to protect the post.") + static let passwordMessage = NSLocalizedString("Add a password to protect this post", comment: "Message explaining why the user might enter a password.") + } + +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 76710b40aac7..f4ca6f76e500 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1053,6 +1053,7 @@ 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; + 8B1CF00F2433902700578582 /* UIPasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; @@ -3452,6 +3453,7 @@ 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; + 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIPasswordAlertController.swift; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; @@ -7564,6 +7566,7 @@ 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */, 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */, 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */, + 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */, ); path = "Prepublishing Nudge"; sourceTree = ""; @@ -12187,6 +12190,7 @@ 40EE947F2213213F00CD264F /* PublicizeConnectionStatsRecordValue+CoreDataClass.swift in Sources */, F5660D03235CF73800020B1E /* SchedulingCalendarViewController.swift in Sources */, 1702BBE01CF3034E00766A33 /* DomainsService.swift in Sources */, + 8B1CF00F2433902700578582 /* UIPasswordAlertController.swift in Sources */, D817799420ABFDB300330998 /* ReaderPostCellActions.swift in Sources */, 402B2A7920ACD7690027C1DC /* ActivityStore.swift in Sources */, E62AFB6A1DC8E593007484FC /* NSAttributedString+WPRichText.swift in Sources */, From c4e83f6b7c7e133aa1fdaa167a3f7a36f6b76d90 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 31 Mar 2020 15:50:07 -0300 Subject: [PATCH 051/245] Prompts for a passwor when the user selects "Password protected" --- .../Post/PostSettingsViewController.m | 2 +- ...PostVisibilitySelectorViewController.swift | 4 +- .../Post/PrepublishingViewController.swift | 106 +++++++++++++----- 3 files changed, 84 insertions(+), 28 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m index 52a0dcc9856a..b6deff1d95d3 100644 --- a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m +++ b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m @@ -1036,7 +1036,7 @@ - (void)showPostVisibilitySelector { PostVisibilitySelectorViewController *vc = [[PostVisibilitySelectorViewController alloc] init:self.apost]; __weak PostVisibilitySelectorViewController *weakVc = vc; - vc.completion = ^{ + vc.completion = ^(NSString *visibility) { [weakVc dismiss]; [self.tableView reloadData]; }; diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift index 7f68e8fb5c04..272f5a5dd18a 100644 --- a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -5,7 +5,7 @@ import UIKit private var post: AbstractPost! /// A completion block that is called after the user select an option - @objc var completion: (() -> Void)? + @objc var completion: ((String) -> Void)? // MARK: - Constructors @@ -66,7 +66,7 @@ import UIKit } } - self?.completion?() + self?.completion?(visibility) } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index ea16d64fcf1f..b89fbcc9ad57 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -2,17 +2,23 @@ import UIKit import WordPressAuthenticator private struct PrepublishingOption { + let id: PrepublishingIdentifier let title: String } +private enum PrepublishingIdentifier { + case visibility + case tags +} + class PrepublishingViewController: UITableViewController { let post: Post private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ - PrepublishingOption(title: NSLocalizedString("Visibility", comment: "Label for Visibility")), - PrepublishingOption(title: NSLocalizedString("Tags", comment: "Label for Tags")) + PrepublishingOption(id: .visibility, title: NSLocalizedString("Visibility", comment: "Label for Visibility")), + PrepublishingOption(id: .tags, title: NSLocalizedString("Tags", comment: "Label for Tags")) ] let publishButton: NUXButton = { @@ -64,11 +70,11 @@ class PrepublishingViewController: UITableViewController { cell.accessoryType = .disclosureIndicator cell.textLabel?.text = options[indexPath.row].title - if indexPath.row == 0 { - cell.detailTextLabel?.text = post.titleForVisibility - } else { - // Tags row - cell.detailTextLabel?.text = post.tags + switch options[indexPath.row].id { + case .tags: + configureTagCell(cell) + case .visibility: + configureVisibilityCell(cell) } return cell @@ -76,36 +82,57 @@ class PrepublishingViewController: UITableViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if indexPath.row == 0 { - let viewController = PostVisibilitySelectorViewController(post) + didTapVisibilityCell() + } else { + didTapTagCell() + } + } - viewController.completion = { [weak self] in - self?.navigationController?.popViewController(animated: true) - self?.tableView.reloadData() - } + // MARK: - Tags - navigationController?.pushViewController(viewController, animated: true) - } else { - let viewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) + private func configureTagCell(_ cell: WPTableViewCell) { + cell.detailTextLabel?.text = post.tags + } - viewController.onValueChanged = { [weak self] tags in - if !tags.isEmpty { - WPAnalytics.track(.prepublishingTagsAdded) - } + private func didTapTagCell() { + let tagPickerViewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) - self?.post.tags = tags - self?.tableView.reloadData() + tagPickerViewController.onValueChanged = { [weak self] tags in + if !tags.isEmpty { + WPAnalytics.track(.prepublishingTagsAdded) } - navigationController?.pushViewController(viewController, animated: true) + self?.post.tags = tags + self?.tableView.reloadData() } + + navigationController?.pushViewController(tagPickerViewController, animated: true) } - @objc func publish(_ sender: UIButton) { - navigationController?.dismiss(animated: true) { - self.completion(self.post) + // MARK: - Visibility + + private func configureVisibilityCell(_ cell: WPTableViewCell) { + cell.detailTextLabel?.text = post.titleForVisibility + } + + private func didTapVisibilityCell() { + let visbilitySelectorViewController = PostVisibilitySelectorViewController(post) + + visbilitySelectorViewController.completion = { [weak self] option in + self?.navigationController?.popViewController(animated: true) + self?.tableView.reloadData() + + // If tue user selects password protected, prompt for a password + if option == AbstractPost.passwordProtectedLabel { + self?.showPasswordAlert() + } } + + navigationController?.pushViewController(visbilitySelectorViewController, animated: true) } + // MARK: - Publish Button + private func setupPublishButton() { let footer = UIView(frame: Constants.footerFrame) footer.addSubview(publishButton) @@ -115,6 +142,35 @@ class PrepublishingViewController: UITableViewController { publishButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) } + @objc func publish(_ sender: UIButton) { + navigationController?.dismiss(animated: true) { + self.completion(self.post) + } + } + + // MARK: - Password Prompt + + private func showPasswordAlert() { + let passwordAlertController = UIPasswordAlertController(onSubmit: { [weak self] password in + guard let password = password, !password.isEmpty else { + self?.cancelPasswordProtectedPost() + return + } + + self?.post.password = password + }, onCancel: { [weak self] in + self?.cancelPasswordProtectedPost() + }) + + passwordAlertController.show(from: self) + } + + private func cancelPasswordProtectedPost() { + post.status = .publish + post.password = nil + tableView.reloadData() + } + private enum Constants { static let reuseIdentifier = "wpTableViewCell" static let nuxButtonInsets = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) From b4bdde9f8aeaa8eb6d43ae8fe6ae9e5d19042456 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 31 Mar 2020 16:13:00 -0300 Subject: [PATCH 052/245] Replace "add" by "enter" --- .../Post/Prepublishing Nudge/UIPasswordAlertController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift index e2e04b6df564..fe5ab0243719 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift @@ -64,7 +64,7 @@ class UIPasswordAlertController { static let alertSubmit = NSLocalizedString("OK", comment: "Submit button on prompt for user information.") static let alertCancel = NSLocalizedString("Cancel", comment: "Cancel prompt for user information.") static let postPassword = NSLocalizedString("Post Password", comment: "Placeholder of a field to type a password to protect the post.") - static let passwordMessage = NSLocalizedString("Add a password to protect this post", comment: "Message explaining why the user might enter a password.") + static let passwordMessage = NSLocalizedString("Enter a password to protect this post", comment: "Message explaining why the user might enter a password.") } } From ab482c3cae201242ebb8ca440a3dadb327b7e0da Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 31 Mar 2020 16:54:46 -0300 Subject: [PATCH 053/245] Display the prompt while Visibility is still open --- .../ViewRelated/Post/PrepublishingViewController.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index b89fbcc9ad57..7573a151b49c 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -119,12 +119,13 @@ class PrepublishingViewController: UITableViewController { let visbilitySelectorViewController = PostVisibilitySelectorViewController(post) visbilitySelectorViewController.completion = { [weak self] option in - self?.navigationController?.popViewController(animated: true) self?.tableView.reloadData() // If tue user selects password protected, prompt for a password if option == AbstractPost.passwordProtectedLabel { self?.showPasswordAlert() + } else { + self?.navigationController?.popViewController(animated: true) } } @@ -158,6 +159,7 @@ class PrepublishingViewController: UITableViewController { } self?.post.password = password + self?.navigationController?.popViewController(animated: true) }, onCancel: { [weak self] in self?.cancelPasswordProtectedPost() }) From 3e47cd58e02ce2a9dfc8f98a6185fff0c4e555b0 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 1 Apr 2020 10:47:09 -0300 Subject: [PATCH 054/245] Extract AbstractPost extension to it's own file --- .../AbstractPost+TitleForVisibility.swift | 18 ++++++++++++++++++ .../PostVisibilitySelectorViewController.swift | 18 ------------------ WordPress/WordPress.xcodeproj/project.pbxproj | 4 ++++ 3 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 WordPress/Classes/Models/AbstractPost+TitleForVisibility.swift diff --git a/WordPress/Classes/Models/AbstractPost+TitleForVisibility.swift b/WordPress/Classes/Models/AbstractPost+TitleForVisibility.swift new file mode 100644 index 000000000000..b19b15960aaf --- /dev/null +++ b/WordPress/Classes/Models/AbstractPost+TitleForVisibility.swift @@ -0,0 +1,18 @@ +import Foundation + +extension AbstractPost { + static let passwordProtectedLabel = NSLocalizedString("Password protected", comment: "Privacy setting for posts set to 'Password protected'. Should be the same as in core WP.") + static let privateLabel = NSLocalizedString("Private", comment: "Privacy setting for posts set to 'Private'. Should be the same as in core WP.") + static let publicLabel = NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP.") + + /// A title describing the status. Ie.: "Public" or "Private" or "Password protected" + @objc var titleForVisibility: String { + if password != nil { + return AbstractPost.passwordProtectedLabel + } else if status == .publishPrivate { + return AbstractPost.privateLabel + } + + return AbstractPost.publicLabel + } +} diff --git a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift index 272f5a5dd18a..39872c1f8488 100644 --- a/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostVisibilitySelectorViewController.swift @@ -83,21 +83,3 @@ import UIKit super.init(style: style) } } - -// MARK: - Abstract Post private extension - -extension AbstractPost { - static let passwordProtectedLabel = NSLocalizedString("Password protected", comment: "Privacy setting for posts set to 'Password protected'. Should be the same as in core WP.") - static let privateLabel = NSLocalizedString("Private", comment: "Privacy setting for posts set to 'Private'. Should be the same as in core WP.") - static let publicLabel = NSLocalizedString("Public", comment: "Privacy setting for posts set to 'Public' (default). Should be the same as in core WP.") - - @objc var titleForVisibility: String { - if password != nil { - return AbstractPost.passwordProtectedLabel - } else if status == .publishPrivate { - return AbstractPost.privateLabel - } - - return AbstractPost.publicLabel - } -} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index f4ca6f76e500..a10f896316e5 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1054,6 +1054,7 @@ 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; 8B1CF00F2433902700578582 /* UIPasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */; }; + 8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; @@ -3454,6 +3455,7 @@ 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIPasswordAlertController.swift; sourceTree = ""; }; + 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+TitleForVisibility.swift"; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; @@ -5605,6 +5607,7 @@ 40232A9D230A6A740036B0B6 /* AbstractPost+HashHelpers.m */, E19B17B11E5C8F36007517C6 /* AbstractPost.swift */, 74729CAD205722E300D1394D /* AbstractPost+Searchable.swift */, + 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */, 5D42A3D8175E7452005CFF05 /* BasePost.h */, 5D42A3D9175E7452005CFF05 /* BasePost.m */, E19B17AD1E5C6944007517C6 /* BasePost.swift */, @@ -12814,6 +12817,7 @@ 9A341E5721997A340036662E /* Blog+BlogAuthors.swift in Sources */, 7E3AB3DB20F52654001F33B6 /* ActivityContentStyles.swift in Sources */, 9A034CEB237DB8660047B41B /* StatsForegroundObservable.swift in Sources */, + 8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */, E6431DE71C4E892900FD8D90 /* SharingViewController.m in Sources */, 7E4123C820F417EF00DF8486 /* FormattableActivity.swift in Sources */, 9A162F2B21C2A21A00FDC035 /* RevisionPreviewTextViewManager.swift in Sources */, From 9e529169838271c03163c043de1f3b1a574c88cf Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 1 Apr 2020 10:47:14 -0300 Subject: [PATCH 055/245] Fix white space --- .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 7573a151b49c..826d5b2207b1 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -163,7 +163,7 @@ class PrepublishingViewController: UITableViewController { }, onCancel: { [weak self] in self?.cancelPasswordProtectedPost() }) - + passwordAlertController.show(from: self) } From cabbeffa639edb7978864f775e912eb8057d86b4 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 09:45:26 -0700 Subject: [PATCH 056/245] Use a spring animation when transitioning between Drawer positions --- .../Action Sheet/DrawerPresentationController.swift | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 0135c1b5ee6f..a1ad0c3358d3 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -304,9 +304,8 @@ private extension DrawerPresentationController { self.configureScrollViewInsets() } - if animated { - UIView.animate(withDuration: Constants.transitionDuration, animations: animations) + animate(animations) } else { animations() } @@ -335,6 +334,14 @@ private extension DrawerPresentationController { return returnPosition } + private func animate(_ animations: @escaping () -> Void) { + UIView.animate(withDuration: Constants.transitionDuration, + delay: 0, + usingSpringWithDamping: 0.8, + initialSpringVelocity: 0, + options: .curveEaseInOut, + animations: animations) + } private var rootViewController: UIViewController? { return UIApplication.shared.keyWindow?.rootViewController From 50377458b8af4d4ecd3b7a52228a1d7401719f46 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 09:49:30 -0700 Subject: [PATCH 057/245] Add more customization for the bottom/top drawer heights --- .../DrawerPresentationController.swift | 66 ++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index a1ad0c3358d3..babbde680d4a 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -6,11 +6,32 @@ public enum DrawerPosition { case closed } +public enum DrawerHeight { + // The maximum height for the screen + case maxHeight + + //Height is based on the specified margin from the top of the screen + case topMargin(CGFloat) + + // Height will be equal to the the content height value + case contentHeight(CGFloat) +} + public protocol DrawerPresentable: AnyObject { - var initialHeight: CGFloat { get } - var scrollableView: UIScrollView? { get } + /// The height of the drawer when it's in the expanded position + var topHeight: DrawerHeight { get } + + /// The height of the drawer when it's in the collapsed position + var bottomHeight: DrawerHeight { get } + + /// Whether or not the user is allowed to swipe to switch between the expanded and collapsed position var allowsUserTransition: Bool { get } + + /// Whether or not the user is allowed to drag to dismiss the drawer var allowsDragToDismiss: Bool { get } + + /// A scroll view that should have its insets adjusted when the drawer is expanded/collapsed + var scrollableView: UIScrollView? { get } } typealias UIDrawerPresentable = DrawerPresentable & UIViewController @@ -21,8 +42,12 @@ public extension DrawerPresentable where Self: UIViewController { return true } - var initialHeight: CGFloat { - return 0 + var bottomHeight: DrawerHeight { + return .contentHeight(0) + } + + var topHeight: DrawerHeight { + return .topMargin(20) } var scrollableView: UIScrollView? { @@ -117,13 +142,37 @@ public class DrawerPresentationController: FancyAlertPresentationController { } private var bottomYPosition: CGFloat { - return calculatedTopMargin(for: presentableInitialHeight) + guard let presentableVC = presentableViewController else { + return calculatedTopMargin(for: 0) + } + + return topMargin(with: presentableVC.bottomHeight) } private var topYPosition: CGFloat { - return Constants.defaultTopMargin + safeAreaInsets.top + guard let presentableVC = presentableViewController else { + return calculatedTopMargin(for: Constants.defaultTopMargin) + } + + return topMargin(with: presentableVC.topHeight) } + private func topMargin(with drawerHeight: DrawerHeight) -> CGFloat { + var topMargin: CGFloat + + switch drawerHeight { + case .contentHeight(let height): + topMargin = calculatedTopMargin(for: height) + + case .topMargin(let margin): + topMargin = safeAreaInsets.top + margin + + case .maxHeight: + topMargin = safeAreaInsets.top + } + + return topMargin + } //MARK: - Panning private lazy var tapGestureRecognizer: UITapGestureRecognizer = { @@ -143,7 +192,6 @@ public class DrawerPresentationController: FancyAlertPresentationController { } private var startPoint: CGPoint? - } //MARK: - Dragging @@ -181,7 +229,9 @@ private extension DrawerPresentationController { } } - self.setTopMargin((startY + yTranslation), animated: false) + let maxY = topMargin(with: .maxHeight) + + self.setTopMargin(max((startY + yTranslation), maxY), animated: false) case .ended: /// Helper closure to prevent user transitions From e7d8379f6dded19ff1379130b9248b284c1a2637 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 10:02:38 -0700 Subject: [PATCH 058/245] Change drawer positions from top/bottom to expanded/collapsed --- .../DrawerPresentationController.swift | 62 ++++++++----------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index babbde680d4a..4516230d9447 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -1,8 +1,8 @@ import UIKit public enum DrawerPosition { - case top - case bottom + case expanded + case collapsed case closed } @@ -19,10 +19,10 @@ public enum DrawerHeight { public protocol DrawerPresentable: AnyObject { /// The height of the drawer when it's in the expanded position - var topHeight: DrawerHeight { get } + var expandedHeight: DrawerHeight { get } /// The height of the drawer when it's in the collapsed position - var bottomHeight: DrawerHeight { get } + var collapsedHeight: DrawerHeight { get } /// Whether or not the user is allowed to swipe to switch between the expanded and collapsed position var allowsUserTransition: Bool { get } @@ -42,12 +42,12 @@ public extension DrawerPresentable where Self: UIViewController { return true } - var bottomHeight: DrawerHeight { - return .contentHeight(0) + var expandedHeight: DrawerHeight { + return .topMargin(20) } - var topHeight: DrawerHeight { - return .topMargin(20) + var collapsedHeight: DrawerHeight { + return .contentHeight(0) } var scrollableView: UIScrollView? { @@ -70,7 +70,7 @@ public extension DrawerPresentable where Self: UIViewController { public class DrawerPresentationController: FancyAlertPresentationController { private enum Constants { - static let transitionDuration: TimeInterval = 0.2 + static let transitionDuration: TimeInterval = 0.5 static let defaultTopMargin: CGFloat = 20 static let flickVelocity: CGFloat = 300 static let bounceAmount: CGFloat = 0.01 @@ -82,14 +82,14 @@ public class DrawerPresentationController: FancyAlertPresentationController { } var frame = containerView.frame - let y = bottomYPosition + let y = collapsedYPosition frame.origin.y = y return frame } - public var position: DrawerPosition = .bottom + public var position: DrawerPosition = .collapsed public func transition(to position: DrawerPosition) { self.position = position @@ -102,11 +102,11 @@ public class DrawerPresentationController: FancyAlertPresentationController { var margin: CGFloat = 0 switch position { - case .top: - margin = topYPosition + case .expanded: + margin = expandedYPosition - case .bottom: - margin = bottomYPosition + case .collapsed: + margin = collapsedYPosition default: margin = 0 @@ -141,20 +141,20 @@ public class DrawerPresentationController: FancyAlertPresentationController { return presentedView.bounds.height } - private var bottomYPosition: CGFloat { + private var collapsedYPosition: CGFloat { guard let presentableVC = presentableViewController else { return calculatedTopMargin(for: 0) } - return topMargin(with: presentableVC.bottomHeight) + return topMargin(with: presentableVC.collapsedHeight) } - private var topYPosition: CGFloat { + private var expandedYPosition: CGFloat { guard let presentableVC = presentableViewController else { return calculatedTopMargin(for: Constants.defaultTopMargin) } - return topMargin(with: presentableVC.topHeight) + return topMargin(with: presentableVC.expandedHeight) } private func topMargin(with drawerHeight: DrawerHeight) -> CGFloat { @@ -259,11 +259,11 @@ private extension DrawerPresentationController { if ((abs(velocity) - Constants.flickVelocity) > 0) { //Flick up if velocity < 0 { - transition(.top) + transition(.expanded) } else { - if(position == .top){ - transition(.bottom) + if(position == .expanded){ + transition(.collapsed) } else { transition(.closed) } @@ -320,14 +320,6 @@ private extension DrawerPresentationController { return presentedViewController as? DrawerPresentable } - private var presentableInitialHeight: CGFloat { - guard let presentableVC = presentableViewController else { - return 0 - } - - return presentableVC.initialHeight - } - private func calculatedTopMargin(for height: CGFloat) -> CGFloat { guard let containerView = self.containerView else { return 0 @@ -370,15 +362,15 @@ private extension DrawerPresentationController { } func closestPosition(for yPosition: CGFloat) -> DrawerPosition { - let positions = [closedPosition, bottomYPosition, topYPosition] + let positions = [closedPosition, collapsedYPosition, expandedYPosition] let closestVal = positions.min(by: { abs(yPosition - $0) < abs(yPosition - $1) }) ?? yPosition var returnPosition: DrawerPosition = .closed - if closestVal == topYPosition { - returnPosition = .top - } else if(closestVal == bottomYPosition) { - returnPosition = .bottom + if closestVal == expandedYPosition { + returnPosition = .expanded + } else if(closestVal == collapsedYPosition) { + returnPosition = .collapsed } return returnPosition From 6717aa60ae586fb8f3f5b32969cd08d7c67a2176 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 10:03:00 -0700 Subject: [PATCH 059/245] Update bottom sheet to use new drawer naming --- .../Bottom Sheet/BottomSheetViewController.swift | 13 ++++++++++--- .../PrepublishingNavigationController.swift | 9 ++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index f2a99237386e..cb2feef9af8b 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -1,7 +1,14 @@ import UIKit class BottomSheetViewController: UIViewController, DrawerPresentable { - var initialHeight: CGFloat = 200 + // Drawer + var expandedHeight: DrawerHeight { + return self.childViewController?.expandedHeight ?? .maxHeight + } + + var collapsedHeight: DrawerHeight { + return self.childViewController?.collapsedHeight ?? .contentHeight(200) + } var scrollableView: UIScrollView? { return self.childViewController?.scrollableView @@ -137,11 +144,11 @@ class BottomSheetViewController: UIViewController, DrawerPresentable { } @objc func keyboardWillShow(_ notification: NSNotification) { - self.presentedVC?.transition(to: .top) + self.presentedVC?.transition(to: .expanded) } @objc func keyboardWillHide(_ notification: NSNotification) { - self.presentedVC?.transition(to: .bottom) + self.presentedVC?.transition(to: .collapsed) } } diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index ad2a9f09d9e6..ff5739f67ffc 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -1,7 +1,14 @@ import UIKit class PrepublishingNavigationController: UINavigationController, DrawerPresentable { - var initialHeight: CGFloat = 200 + // Drawer + var expandedHeight: DrawerHeight { + return .maxHeight + } + + var collapsedHeight: DrawerHeight { + return .contentHeight(250) + } var scrollableView: UIScrollView? { let scroll = visibleViewController?.view as? UIScrollView From eea170366677e5baf8bb75f9665f2f6b566573f5 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 10:34:16 -0700 Subject: [PATCH 060/245] Add tap to dismiss to the drawer presentation controller --- .../DrawerPresentationController.swift | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 4516230d9447..4cb3bfe209e8 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -30,6 +30,9 @@ public protocol DrawerPresentable: AnyObject { /// Whether or not the user is allowed to drag to dismiss the drawer var allowsDragToDismiss: Bool { get } + /// Whether or not the user is allowed to tap outside the view to dismiss the drawer + var allowsTapToDismiss: Bool { get } + /// A scroll view that should have its insets adjusted when the drawer is expanded/collapsed var scrollableView: UIScrollView? { get } } @@ -58,6 +61,10 @@ public extension DrawerPresentable where Self: UIViewController { return true } + var allowsTapToDismiss: Bool { + return true + } + // Helpers var presentedVC: DrawerPresentationController? { guard let navController = self.navigationController else { @@ -174,17 +181,17 @@ public class DrawerPresentationController: FancyAlertPresentationController { return topMargin } - //MARK: - Panning + //MARK: - Gestures private lazy var tapGestureRecognizer: UITapGestureRecognizer = { - return UITapGestureRecognizer(target: self, action: #selector(self.dismiss)) + let gesture = UITapGestureRecognizer(target: self, action: #selector(self.dismiss(_:))) + gesture.delegate = self + return gesture }() private lazy var panGestureRecognizer: UIPanGestureRecognizer = { return UIPanGestureRecognizer(target: self, action: #selector(self.pan(_:))) }() - var interactionController: UIPercentDrivenInteractiveTransition? - override public func containerViewWillLayoutSubviews() { super.containerViewWillLayoutSubviews() @@ -197,9 +204,27 @@ public class DrawerPresentationController: FancyAlertPresentationController { //MARK: - Dragging private extension DrawerPresentationController { private func addGestures() { - guard let presentedView = self.presentedView else { return } + guard + let presentedView = self.presentedView, + let containerView = self.containerView + else { return } - presentedView.addGestureRecognizer(self.panGestureRecognizer) + presentedView.addGestureRecognizer(panGestureRecognizer) + containerView.addGestureRecognizer(tapGestureRecognizer) + } + + @objc func dismiss(_ gesture: UIPanGestureRecognizer) { + var canDismiss = true + + if let presentableVC = presentableViewController { + canDismiss = presentableVC.allowsTapToDismiss + } + + guard canDismiss else { + return + } + + dismiss() } @objc func pan(_ gesture: UIPanGestureRecognizer) { @@ -292,6 +317,24 @@ private extension UIScrollView { } } +extension DrawerPresentationController: UIGestureRecognizerDelegate { + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { + /// Shouldn't happen; should always have container & presented view when tapped + guard + let containerView = containerView, + let presentedView = presentedView + else { + return false + } + + let touchPoint = touch.location(in: containerView) + let isInPresentedView = presentedView.frame.contains(touchPoint) + + /// Do not accept the touch if inside of the presented view + return (gestureRecognizer == tapGestureRecognizer) && isInPresentedView == false + } +} + //MARK: - Private: Helpers private extension DrawerPresentationController { From 0409438d416f2aba11f512d861638bef0b4ff960 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 10:39:31 -0700 Subject: [PATCH 061/245] Rename startPoint to dragStartPoint --- .../Action Sheet/DrawerPresentationController.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 4cb3bfe209e8..be62ce2864b7 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -198,7 +198,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { addGestures() } - private var startPoint: CGPoint? + private var dragStartPoint: CGPoint? } //MARK: - Dragging @@ -236,10 +236,10 @@ private extension DrawerPresentationController { switch gesture.state { case .began: - startPoint = presentedView.frame.origin + dragStartPoint = presentedView.frame.origin case .changed: - let startY = startPoint?.y ?? 0 + let startY = dragStartPoint?.y ?? 0 var yTranslation = translation.y if (!allowsUserTransition || !allowDragToDismiss) { @@ -275,7 +275,7 @@ private extension DrawerPresentationController { } let velocity = gesture.velocity(in: presentedView).y - let startY = startPoint?.y ?? 0 + let startY = dragStartPoint?.y ?? 0 let currentPosition = (startY + translation.y) let position = closestPosition(for: currentPosition) @@ -299,7 +299,7 @@ private extension DrawerPresentationController { transition(position) - startPoint = nil + dragStartPoint = nil default: return From f250318727ecc2d748dd052a65210c2e616ba020 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 10:52:02 -0700 Subject: [PATCH 062/245] Fix lint issues --- .../DrawerPresentationController.swift | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index be62ce2864b7..5fbab77f28a2 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -139,7 +139,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { } - //MARK: - Internal Positions + // MARK: - Internal Positions private var closedPosition: CGFloat { guard let presentedView = self.presentedView else { return 0 @@ -181,7 +181,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { return topMargin } - //MARK: - Gestures + // MARK: - Gestures private lazy var tapGestureRecognizer: UITapGestureRecognizer = { let gesture = UITapGestureRecognizer(target: self, action: #selector(self.dismiss(_:))) gesture.delegate = self @@ -201,7 +201,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { private var dragStartPoint: CGPoint? } -//MARK: - Dragging +// MARK: - Dragging private extension DrawerPresentationController { private func addGestures() { guard @@ -242,7 +242,7 @@ private extension DrawerPresentationController { let startY = dragStartPoint?.y ?? 0 var yTranslation = translation.y - if (!allowsUserTransition || !allowDragToDismiss) { + if !allowsUserTransition || !allowDragToDismiss { let maxBounce: CGFloat = (startY * Constants.bounceAmount) if yTranslation < 0 { @@ -260,8 +260,7 @@ private extension DrawerPresentationController { case .ended: /// Helper closure to prevent user transitions - let transition:(DrawerPosition) -> () = { pos in - + let transition: (DrawerPosition) -> () = { pos in if allowsUserTransition { self.transition(to: pos) return @@ -281,13 +280,13 @@ private extension DrawerPresentationController { let position = closestPosition(for: currentPosition) // Determine how to handle flicking of the view - if ((abs(velocity) - Constants.flickVelocity) > 0) { + if (abs(velocity) - Constants.flickVelocity) > 0 { //Flick up if velocity < 0 { transition(.expanded) } else { - if(position == .expanded){ + if position == .expanded { transition(.collapsed) } else { transition(.closed) @@ -335,7 +334,7 @@ extension DrawerPresentationController: UIGestureRecognizerDelegate { } } -//MARK: - Private: Helpers +// MARK: - Private: Helpers private extension DrawerPresentationController { private func configureScrollViewInsets() { @@ -412,7 +411,7 @@ private extension DrawerPresentationController { if closestVal == expandedYPosition { returnPosition = .expanded - } else if(closestVal == collapsedYPosition) { + } else if closestVal == collapsedYPosition { returnPosition = .collapsed } From 4676c19b324a56aa39c26f3d7a8378917a638443 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 11:12:18 -0700 Subject: [PATCH 063/245] Rename Drawer presentation controller position property to currentPosition --- .../DrawerPresentationController.swift | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 5fbab77f28a2..3512954c7447 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -96,10 +96,10 @@ public class DrawerPresentationController: FancyAlertPresentationController { return frame } - public var position: DrawerPosition = .collapsed + public var currentPosition: DrawerPosition = .collapsed public func transition(to position: DrawerPosition) { - self.position = position + currentPosition = position if position == .closed { dismiss() @@ -259,17 +259,13 @@ private extension DrawerPresentationController { self.setTopMargin(max((startY + yTranslation), maxY), animated: false) case .ended: - /// Helper closure to prevent user transitions + /// Helper closure to prevent user transition/dismiss let transition: (DrawerPosition) -> () = { pos in - if allowsUserTransition { - self.transition(to: pos) - return - } - - if pos == .closed && allowDragToDismiss { + if allowsUserTransition || pos == .closed && allowDragToDismiss { self.transition(to: pos) } else { - self.transition(to: self.position) + //Reset to the original position + self.transition(to: self.currentPosition) } } From 59c68b6a2741652b8032a45c9852eab26d27d4dc Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 12:09:52 -0700 Subject: [PATCH 064/245] Move drawer defaults to an enum --- .../DrawerPresentationController.swift | 67 +++++++++++-------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 3512954c7447..6f1321a3f16d 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -39,18 +39,34 @@ public protocol DrawerPresentable: AnyObject { typealias UIDrawerPresentable = DrawerPresentable & UIViewController +private enum Constants { + static let transitionDuration: TimeInterval = 0.5 + + static let flickVelocity: CGFloat = 300 + static let bounceAmount: CGFloat = 0.01 + + enum Defaults { + static let expandedHeight: DrawerHeight = .topMargin(20) + static let collapsedHeight: DrawerHeight = .contentHeight(0) + + static let allowsUserTransition: Bool = true + static let allowsTapToDismiss: Bool = true + static let allowsDragToDismiss: Bool = true + } +} + public extension DrawerPresentable where Self: UIViewController { //Default values var allowsUserTransition: Bool { - return true + return Constants.Defaults.allowsUserTransition } var expandedHeight: DrawerHeight { - return .topMargin(20) + return Constants.Defaults.expandedHeight } var collapsedHeight: DrawerHeight { - return .contentHeight(0) + return Constants.Defaults.collapsedHeight } var scrollableView: UIScrollView? { @@ -58,11 +74,11 @@ public extension DrawerPresentable where Self: UIViewController { } var allowsDragToDismiss: Bool { - return true + return Constants.Defaults.allowsDragToDismiss } var allowsTapToDismiss: Bool { - return true + return Constants.Defaults.allowsTapToDismiss } // Helpers @@ -76,13 +92,6 @@ public extension DrawerPresentable where Self: UIViewController { } public class DrawerPresentationController: FancyAlertPresentationController { - private enum Constants { - static let transitionDuration: TimeInterval = 0.5 - static let defaultTopMargin: CGFloat = 20 - static let flickVelocity: CGFloat = 300 - static let bounceAmount: CGFloat = 0.01 - } - override public var frameOfPresentedViewInContainerView: CGRect { guard let containerView = self.containerView else { return .zero @@ -96,8 +105,12 @@ public class DrawerPresentationController: FancyAlertPresentationController { return frame } + /// Returns the current position of the drawer public var currentPosition: DrawerPosition = .collapsed + + /// Animates between the drawer positions + /// - Parameter position: The position to animate to public func transition(to position: DrawerPosition) { currentPosition = position @@ -140,6 +153,8 @@ public class DrawerPresentationController: FancyAlertPresentationController { // MARK: - Internal Positions + // Helpers to calculate the Y positions for the drawer positions + private var closedPosition: CGFloat { guard let presentedView = self.presentedView else { return 0 @@ -149,21 +164,19 @@ public class DrawerPresentationController: FancyAlertPresentationController { } private var collapsedYPosition: CGFloat { - guard let presentableVC = presentableViewController else { - return calculatedTopMargin(for: 0) - } + let height = presentableViewController?.collapsedHeight ?? Constants.Defaults.collapsedHeight - return topMargin(with: presentableVC.collapsedHeight) + return topMargin(with: height) } private var expandedYPosition: CGFloat { - guard let presentableVC = presentableViewController else { - return calculatedTopMargin(for: Constants.defaultTopMargin) - } + let height = presentableViewController?.expandedHeight ?? Constants.Defaults.expandedHeight - return topMargin(with: presentableVC.expandedHeight) + return topMargin(with: height) } + /// Calculates the Y position for the view based on a DrawerHeight enum + /// - Parameter drawerHeight: The drawer height to calculate private func topMargin(with drawerHeight: DrawerHeight) -> CGFloat { var topMargin: CGFloat @@ -213,12 +226,11 @@ private extension DrawerPresentationController { containerView.addGestureRecognizer(tapGestureRecognizer) } + /// Dismiss action for the tap gesture + /// Will prevent dismissal if the `allowsTapToDismiss` is false + /// - Parameter gesture: The tap gesture @objc func dismiss(_ gesture: UIPanGestureRecognizer) { - var canDismiss = true - - if let presentableVC = presentableViewController { - canDismiss = presentableVC.allowsTapToDismiss - } + let canDismiss = presentableViewController?.allowsTapToDismiss ?? Constants.Defaults.allowsTapToDismiss guard canDismiss else { return @@ -231,8 +243,8 @@ private extension DrawerPresentationController { guard let presentedView = self.presentedView else { return } let translation = gesture.translation(in: presentedView) - let allowsUserTransition = presentableViewController?.allowsUserTransition ?? false - let allowDragToDismiss = presentableViewController?.allowsDragToDismiss ?? true + let allowsUserTransition = presentableViewController?.allowsUserTransition ?? Constants.Defaults.allowsUserTransition + let allowDragToDismiss = presentableViewController?.allowsDragToDismiss ?? Constants.Defaults.allowsDragToDismiss switch gesture.state { case .began: @@ -300,7 +312,6 @@ private extension DrawerPresentationController { return } } - } private extension UIScrollView { From ea9d1cd4d2dcd7f855306c2fe8615c36dc508c24 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Wed, 1 Apr 2020 12:45:15 -0700 Subject: [PATCH 065/245] Fix deprecation warnings --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 8 +------- .../Action Sheet/DrawerPresentationController.swift | 6 ++++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index cb2feef9af8b..74d113773b9f 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -162,12 +162,6 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { } public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { - let presentationController = DrawerPresentationController(presentedViewController: presented, presenting: presenting) - return presentationController + return DrawerPresentationController(presentedViewController: presented, presenting: presenting) } - -// public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { -// -// return (self.presentationController as? DrawerPresentationController)?.interactionController -// } } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 6f1321a3f16d..de36f445bed7 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -352,7 +352,7 @@ private extension DrawerPresentationController { else { return } - let bottom = presentingViewController.bottomLayoutGuide.length + let bottom = presentingViewController.view.safeAreaLayoutGuide.layoutFrame.origin.y let margin = presentedView.frame.origin.y + bottom /** @@ -435,6 +435,8 @@ private extension DrawerPresentationController { } private var rootViewController: UIViewController? { - return UIApplication.shared.keyWindow?.rootViewController + let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first + + return keyWindow?.rootViewController } } From 0b1c08b1087c841faf3a4d2eb2618d1ac593bd5c Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 1 Apr 2020 15:40:06 -0500 Subject: [PATCH 066/245] Point podfile to latest Auth branch changes - showSigninV2 removed --- Podfile | 4 ++-- Podfile.lock | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Podfile b/Podfile index ef4d8a61ff44..54c3fe750fbf 100644 --- a/Podfile +++ b/Podfile @@ -183,9 +183,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1-beta.1' - pod 'WordPressAuthenticator', '~> 1.12.0-beta.6' + # pod 'WordPressAuthenticator', '~> 1.12.0-beta.6' # While in PR - # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' + pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/229-remove-showSigninV2' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index c22793b9d970..7fc8d9f1e966 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -476,7 +476,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.0) - - WordPressAuthenticator (~> 1.12.0-beta.6) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/229-remove-showSigninV2`) - WordPressKit (~> 4.7.0-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -523,7 +523,6 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS - - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -609,6 +608,9 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.24.0 + WordPressAuthenticator: + :branch: issue/229-remove-showSigninV2 + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.24.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -622,6 +624,9 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.24.0 + WordPressAuthenticator: + :commit: a1203c556a5f4cd099acb2598d7229191c883e2d + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -709,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: c1b08461afaad1a4bd24d8c91e95bcb1d1d106ba +PODFILE CHECKSUM: 0820a03022e58c9c009bac9f8368fe75220145e1 COCOAPODS: 1.8.4 From ab40cdfb9f216d3a9ace14d5c8be2740cd3470c9 Mon Sep 17 00:00:00 2001 From: Gibson Tang Date: Thu, 2 Apr 2020 10:40:33 +0800 Subject: [PATCH 067/245] fixed https://github.com/wordpress-mobile/WordPress-iOS/issues/12156 --- .../Stats/Period Stats/Overview/OverviewCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift b/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift index 472a1048aab8..9956c17baa81 100644 --- a/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift +++ b/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift @@ -69,8 +69,8 @@ struct OverviewTabData: FilterTabBarItem { StatsPeriodHelper().dateAvailableAfterDate(date, period: period) == false { return .neutral(.shade40) } - - return difference < 0 ? WPStyleGuide.Stats.negativeColor : WPStyleGuide.Stats.positiveColor + return WPStyleGuide.grey() + //return difference < 0 ? WPStyleGuide.Stats.negativeColor : WPStyleGuide.Stats.positiveColor } var title: String { From 53d2d012f18eed6a2c5de0004ab3dfff6166d5f8 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 2 Apr 2020 11:15:34 -0300 Subject: [PATCH 068/245] Rename UIPasswordAlertController to PasswordAlertController --- ...lertController.swift => PasswordAlertController.swift} | 2 +- .../ViewRelated/Post/PrepublishingViewController.swift | 2 +- WordPress/WordPress.xcodeproj/project.pbxproj | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) rename WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/{UIPasswordAlertController.swift => PasswordAlertController.swift} (98%) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift similarity index 98% rename from WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift rename to WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift index fe5ab0243719..19077b9fa245 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/UIPasswordAlertController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift @@ -2,7 +2,7 @@ import UIKit import Gridicons /// Display an Alert Controller that prompts for a password -class UIPasswordAlertController { +class PasswordAlertController { var passwordField: UITextField! diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 826d5b2207b1..2b49bd557cce 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -152,7 +152,7 @@ class PrepublishingViewController: UITableViewController { // MARK: - Password Prompt private func showPasswordAlert() { - let passwordAlertController = UIPasswordAlertController(onSubmit: { [weak self] password in + let passwordAlertController = PasswordAlertController(onSubmit: { [weak self] password in guard let password = password, !password.isEmpty else { self?.cancelPasswordProtectedPost() return diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index a10f896316e5..9a56647ce359 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1053,7 +1053,7 @@ 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; - 8B1CF00F2433902700578582 /* UIPasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */; }; + 8B1CF00F2433902700578582 /* PasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* PasswordAlertController.swift */; }; 8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; @@ -3454,7 +3454,7 @@ 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; - 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIPasswordAlertController.swift; sourceTree = ""; }; + 8B1CF00E2433902700578582 /* PasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordAlertController.swift; sourceTree = ""; }; 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+TitleForVisibility.swift"; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; @@ -7569,7 +7569,7 @@ 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */, 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */, 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */, - 8B1CF00E2433902700578582 /* UIPasswordAlertController.swift */, + 8B1CF00E2433902700578582 /* PasswordAlertController.swift */, ); path = "Prepublishing Nudge"; sourceTree = ""; @@ -12193,7 +12193,7 @@ 40EE947F2213213F00CD264F /* PublicizeConnectionStatsRecordValue+CoreDataClass.swift in Sources */, F5660D03235CF73800020B1E /* SchedulingCalendarViewController.swift in Sources */, 1702BBE01CF3034E00766A33 /* DomainsService.swift in Sources */, - 8B1CF00F2433902700578582 /* UIPasswordAlertController.swift in Sources */, + 8B1CF00F2433902700578582 /* PasswordAlertController.swift in Sources */, D817799420ABFDB300330998 /* ReaderPostCellActions.swift in Sources */, 402B2A7920ACD7690027C1DC /* ActivityStore.swift in Sources */, E62AFB6A1DC8E593007484FC /* NSAttributedString+WPRichText.swift in Sources */, From add61fbf45fe4c57fb927772bae14b6fd755c291 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 08:38:42 -0700 Subject: [PATCH 069/245] Fix an issue when determining which presentationController to return --- .../BottomSheetViewController.swift | 8 ------- .../DrawerPresentationController.swift | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 74d113773b9f..9e3b10f149b6 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -135,14 +135,6 @@ class BottomSheetViewController: UIViewController, DrawerPresentable { return preferredContentSize = CGSize(width: Constants.minimumWidth, height: view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) } - var presentedVC: DrawerPresentationController? { - guard let navController = self.navigationController else { - return presentationController as? DrawerPresentationController - } - - return navController.presentationController as? DrawerPresentationController - } - @objc func keyboardWillShow(_ notification: NSNotification) { self.presentedVC?.transition(to: .expanded) } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index de36f445bed7..3f9a08c544dd 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -56,7 +56,7 @@ private enum Constants { } public extension DrawerPresentable where Self: UIViewController { - //Default values + // Default values var allowsUserTransition: Bool { return Constants.Defaults.allowsUserTransition } @@ -82,12 +82,22 @@ public extension DrawerPresentable where Self: UIViewController { } // Helpers + + /// Try to determine the correct DrawerPresentationController to use + + /// Returns the `DrawerPresentationController` for a view controller if there is one + /// This tries to determine the correct one to use in the following order: + /// - The view controller + /// - The navController + /// - The navController parentViewController + /// - The views parentViewController var presentedVC: DrawerPresentationController? { - guard let navController = self.navigationController else { - return presentationController as? DrawerPresentationController - } + let presentationController = self.presentationController as? DrawerPresentationController + let navigationPresentationController = navigationController?.presentationController as? DrawerPresentationController + let navParentPresetationController = navigationController?.parent?.presentationController as? DrawerPresentationController + let parentPresentationController = parent?.presentationController as? DrawerPresentationController - return navController.presentationController as? DrawerPresentationController + return presentationController ?? navigationPresentationController ?? navParentPresetationController ?? parentPresentationController } } @@ -315,9 +325,7 @@ private extension DrawerPresentationController { } private extension UIScrollView { - /** - A flag to determine if a scroll view is scrolling - */ + /// A flag to determine if a scroll view is scrolling var isScrolling: Bool { return isDragging && !isDecelerating || isTracking } From 5fbe9157f2aad1994ffa4c369c98de97abbf2a66 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 09:47:32 -0700 Subject: [PATCH 070/245] Move DrawerPresentable options to extensions --- .../BottomSheetViewController.swift | 30 +++++++++-------- .../PrepublishingNavigationController.swift | 33 +++++++++++-------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 9e3b10f149b6..2dc74a6c61c1 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -1,19 +1,6 @@ import UIKit -class BottomSheetViewController: UIViewController, DrawerPresentable { - // Drawer - var expandedHeight: DrawerHeight { - return self.childViewController?.expandedHeight ?? .maxHeight - } - - var collapsedHeight: DrawerHeight { - return self.childViewController?.collapsedHeight ?? .contentHeight(200) - } - - var scrollableView: UIScrollView? { - return self.childViewController?.scrollableView - } - +class BottomSheetViewController: UIViewController { enum Constants { static let gripHeight: CGFloat = 5 static let cornerRadius: CGFloat = 8 @@ -157,3 +144,18 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { return DrawerPresentationController(presentedViewController: presented, presenting: presenting) } } + +// MARK: - DrawerDelegate +extension BottomSheetViewController: DrawerPresentable { + var expandedHeight: DrawerHeight { + return childViewController?.expandedHeight ?? .maxHeight + } + + var collapsedHeight: DrawerHeight { + return childViewController?.collapsedHeight ?? .contentHeight(200) + } + + var scrollableView: UIScrollView? { + return childViewController?.scrollableView + } +} diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index ff5739f67ffc..362f789f0b76 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -1,20 +1,7 @@ import UIKit -class PrepublishingNavigationController: UINavigationController, DrawerPresentable { - // Drawer - var expandedHeight: DrawerHeight { - return .maxHeight - } - - var collapsedHeight: DrawerHeight { - return .contentHeight(250) - } - var scrollableView: UIScrollView? { - let scroll = visibleViewController?.view as? UIScrollView - - return scroll - } +class PrepublishingNavigationController: UINavigationController { lazy var header: PrepublishingHeaderView = { let header = PrepublishingHeaderView.loadFromNib() @@ -111,3 +98,21 @@ extension PrepublishingNavigationController: PrepublishingHeaderViewDelegate { popViewController(animated: true) } } + +// MARK: - DrawerPresentable + +extension PrepublishingNavigationController: DrawerPresentable { + var expandedHeight: DrawerHeight { + return .maxHeight + } + + var collapsedHeight: DrawerHeight { + return .contentHeight(250) + } + + var scrollableView: UIScrollView? { + let scroll = visibleViewController?.view as? UIScrollView + + return scroll + } +} From 25541e42b281b60f583a97d214d245105be8c3e4 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 09:48:06 -0700 Subject: [PATCH 071/245] Clean up self references --- .../System/Action Sheet/DrawerPresentationController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 3f9a08c544dd..3f899773f2ae 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -146,7 +146,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { } @objc func dismiss() { - self.presentedViewController.dismiss(animated: true, completion: nil) + presentedViewController.dismiss(animated: true, completion: nil) } public override func presentationTransitionWillBegin() { @@ -278,7 +278,7 @@ private extension DrawerPresentationController { let maxY = topMargin(with: .maxHeight) - self.setTopMargin(max((startY + yTranslation), maxY), animated: false) + setTopMargin(max((startY + yTranslation), maxY), animated: false) case .ended: /// Helper closure to prevent user transition/dismiss From 9a01bcdad4394a7d36e2be2591b518ac2228d476 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 09:55:47 -0700 Subject: [PATCH 072/245] Rename the UIDrawerPresentable type to DrawerPresentableViewController --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 4 ++-- .../System/Action Sheet/DrawerPresentationController.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 2dc74a6c61c1..d758723234c9 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -27,9 +27,9 @@ class BottomSheetViewController: UIViewController { } } - private weak var childViewController: UIDrawerPresentable? + private weak var childViewController: DrawerPresentableViewController? - init(childViewController: UIDrawerPresentable) { + init(childViewController: DrawerPresentableViewController) { self.childViewController = childViewController super.init(nibName: nil, bundle: nil) } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 3f899773f2ae..6e3a7ec739d2 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -37,8 +37,6 @@ public protocol DrawerPresentable: AnyObject { var scrollableView: UIScrollView? { get } } -typealias UIDrawerPresentable = DrawerPresentable & UIViewController - private enum Constants { static let transitionDuration: TimeInterval = 0.5 @@ -55,6 +53,8 @@ private enum Constants { } } +typealias DrawerPresentableViewController = DrawerPresentable & UIViewController + public extension DrawerPresentable where Self: UIViewController { // Default values var allowsUserTransition: Bool { From 24e526895687dd364f32a70c90696c0a1dbf2a51 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 09:57:28 -0700 Subject: [PATCH 073/245] Update DrawerPresentationController comments --- .../Action Sheet/DrawerPresentationController.swift | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 6e3a7ec739d2..940b1ff97364 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -10,7 +10,7 @@ public enum DrawerHeight { // The maximum height for the screen case maxHeight - //Height is based on the specified margin from the top of the screen + // Height is based on the specified margin from the top of the screen case topMargin(CGFloat) // Height will be equal to the the content height value @@ -363,13 +363,6 @@ private extension DrawerPresentationController { let bottom = presentingViewController.view.safeAreaLayoutGuide.layoutFrame.origin.y let margin = presentedView.frame.origin.y + bottom - /** - Disable vertical scroll indicator until we start to scroll - to avoid visual bugs - */ -// scrollView.showsVerticalScrollIndicator = false -// scrollView.scrollIndicatorInsets = .zero -// scrollView.contentInset.bottom = margin } @@ -385,7 +378,7 @@ private extension DrawerPresentationController { let bounds = containerView.bounds let margin = bounds.maxY - (safeAreaInsets.bottom + ((height > 0) ? height : (bounds.height * 0.5))) - //Limit the max height + // Limit the max height return max(margin, safeAreaInsets.top) } From bb399a8a36047d86962c62f67b07d74f94f580bf Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Thu, 2 Apr 2020 12:43:32 -0700 Subject: [PATCH 074/245] Fix broke BottomSheet test --- .../Bottom Sheet/BottomSheetViewControllerTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift index b4654981647d..307fb760a1df 100644 --- a/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift +++ b/WordPress/WordPressTest/Bottom Sheet/BottomSheetViewControllerTests.swift @@ -28,6 +28,6 @@ class BottomSheetViewControllerTests: XCTestCase { } } -private class BottomSheetPresentableViewController: UIViewController, BottomSheetPresentable { +private class BottomSheetPresentableViewController: UIViewController, DrawerPresentable { var initialHeight: CGFloat = 0 } From b49dbfc7e2718846d1cd549622b31b030a41bba6 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Thu, 2 Apr 2020 17:02:22 -0500 Subject: [PATCH 075/245] Add ReaderStreamViewController as child viewController in ReaderTabBarViewController - Update ReaderTabViewModel, add factory method makeChildViewController() - Update ReaderTabView, add method addContentToContainerView() which adds the child viewController received from the viewModel. - Update ReaderTabView, add horizontalDivider view --- .../Reader/Tab Navigation/ReaderTabView.swift | 36 ++++++++++++++----- .../Tab Navigation/ReaderTabViewModel.swift | 27 ++++++++++++-- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index e848ec6fb5e2..a6a2722a8976 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -9,6 +9,7 @@ class ReaderTabView: UIView { private let resetFilterButton: UIButton private let settingsButton: UIButton private let verticalDivider: UIView + private let horizontalDivider: UIView private let containerView: UIView private let viewModel: ReaderTabViewModel @@ -21,6 +22,7 @@ class ReaderTabView: UIView { resetFilterButton = UIButton(type: .custom) settingsButton = UIButton(type: .custom) verticalDivider = UIView() + horizontalDivider = UIView() containerView = UIView() self.viewModel = viewModel @@ -49,9 +51,9 @@ extension ReaderTabView { setupButtonsView() setupFilterButton() setupResetFilterButton() - setupVerticalDivider() + setupDivider(verticalDivider) + setupDivider(horizontalDivider) setupSettingsButton() - setupContainerView() activateConstraints() } @@ -61,6 +63,7 @@ extension ReaderTabView { addSubview(mainStackView) mainStackView.addArrangedSubview(tabBar) mainStackView.addArrangedSubview(buttonsStackView) + mainStackView.addArrangedSubview(horizontalDivider) mainStackView.addArrangedSubview(containerView) } @@ -74,6 +77,7 @@ extension ReaderTabView { return } self.populateTabBar(with: items) + self.addContentToContainerView() } } @@ -119,9 +123,9 @@ extension ReaderTabView { resetFilterButton.isHidden = true } - private func setupVerticalDivider() { - verticalDivider.translatesAutoresizingMaskIntoConstraints = false - verticalDivider.backgroundColor = .divider + private func setupDivider(_ divider: UIView) { + divider.translatesAutoresizingMaskIntoConstraints = false + divider.backgroundColor = .divider } private func setupSettingsButton() { @@ -130,9 +134,20 @@ extension ReaderTabView { WPStyleGuide.applyReaderSettingsButtonStyle(settingsButton) } - private func setupContainerView() { + private func addContentToContainerView() { + guard let controller = self.next as? ReaderTabViewController else { + return + } + + let childController = viewModel.makeChildViewController() containerView.translatesAutoresizingMaskIntoConstraints = false - containerView.backgroundColor = .lightGray + childController.view.translatesAutoresizingMaskIntoConstraints = false + + controller.addChild(childController) + + containerView.addSubview(childController.view) + containerView.pinSubviewToAllEdges(childController.view) + childController.didMove(toParent: controller) } private func activateConstraints() { @@ -140,9 +155,11 @@ extension ReaderTabView { NSLayoutConstraint.activate([ buttonsStackView.heightAnchor.constraint(equalToConstant: Appearance.barHeight), resetFilterButton.widthAnchor.constraint(equalToConstant: Appearance.resetButtonWidth), - verticalDivider.widthAnchor.constraint(equalToConstant: Appearance.verticalDividerWidth), + verticalDivider.widthAnchor.constraint(equalToConstant: Appearance.dividerWidth), verticalDivider.heightAnchor.constraint(equalTo: buttonsStackView.heightAnchor, multiplier: Appearance.verticalDividerHeightMultiplier), + horizontalDivider.heightAnchor.constraint(equalToConstant: Appearance.dividerWidth), + horizontalDivider.widthAnchor.constraint(equalTo: mainStackView.widthAnchor), settingsButton.widthAnchor.constraint(equalToConstant: Appearance.settingsButtonWidth) ]) } @@ -167,6 +184,7 @@ extension ReaderTabView { self.viewModel.navigateToTab(at: tabBar.selectedIndex) } }) + viewModel.selectedIndex = tabBar.selectedIndex } /// Filter button @@ -213,7 +231,7 @@ extension ReaderTabView { static let resetButtonInsets = UIEdgeInsets(top: 1, left: -4, bottom: -1, right: 4) static let settingsButtonWidth: CGFloat = 56 - static let verticalDividerWidth: CGFloat = 1 + static let dividerWidth: CGFloat = 1 static let verticalDividerHeightMultiplier: CGFloat = 0.6 } } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 03322df12408..947ebeca5c7b 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -1,6 +1,14 @@ class ReaderTabViewModel { + var tabItems = [ReaderTabItem]() + + var selectedIndex = 0 { + didSet { + // TODO: - READERNAV - implement transition on ReaderContent + } + } + // TODO: - READERNAV - Methods to be implemented. Signature will likely change func navigateToTab(at index: Int) { } @@ -36,8 +44,9 @@ extension ReaderTabViewModel { return } - let tabItems = topics.map { ReaderTabItem(topic: $0) } - completion(ReaderHelpers.rearrange(items: tabItems)) + tabItems = ReaderHelpers.rearrange(items: topics.map { ReaderTabItem(topic: $0) }) + + completion(tabItems) } catch { DDLogError("There was a problem fetching topics for the menu." + error.localizedDescription) @@ -58,3 +67,17 @@ extension ReaderTabViewModel { }) } } + + +// MARK: Reader Content +extension ReaderTabViewModel { + + private var currentTopic: ReaderAbstractTopic? { + return tabItems[selectedIndex].topic + } + + func makeChildViewController() -> UIViewController { + // TODO: - READERNAV - Remove force unwrapping + return ReaderStreamViewController.controllerWithTopic(currentTopic!) + } +} From cc676d6c4aa66758ddc29b89fbb82c6e82923a3f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 11:18:33 -0300 Subject: [PATCH 076/245] Extract blog timezone --- WordPress/Classes/Models/Blog+Timezone.swift | 27 +++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 +++ 2 files changed, 31 insertions(+) create mode 100644 WordPress/Classes/Models/Blog+Timezone.swift diff --git a/WordPress/Classes/Models/Blog+Timezone.swift b/WordPress/Classes/Models/Blog+Timezone.swift new file mode 100644 index 000000000000..37ac7b730b3b --- /dev/null +++ b/WordPress/Classes/Models/Blog+Timezone.swift @@ -0,0 +1,27 @@ +import Foundation + +extension Blog { + @objc var timeZone: NSTimeZone { + let timeZoneName: String? = getOption(name: "timezone") + let gmtOffSet: NSNumber? = getOption(name: "gmt_offset") + let optionValue: NSString? = getOption(name: "time_zone") + let oneHourInSeconds: Float = 60 * 60 + + var timeZone: NSTimeZone! + + if let timeZoneName = timeZoneName, !timeZoneName.isEmpty { + timeZone = NSTimeZone(name: timeZoneName) + } else if let gmtOffSet = gmtOffSet?.floatValue { + timeZone = NSTimeZone(forSecondsFromGMT: Int(gmtOffSet * oneHourInSeconds)) + } else if let optionValue = optionValue { + let timeZoneOffsetSeconds = Int(optionValue.floatValue * oneHourInSeconds) + timeZone = NSTimeZone(forSecondsFromGMT: timeZoneOffsetSeconds) + } + + if timeZone == nil { + timeZone = NSTimeZone(forSecondsFromGMT: 0) + } + + return timeZone + } +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 7f8a3458b357..eb37b1f6426b 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1045,6 +1045,7 @@ 85D239AE1AE5A5FC0074768D /* BlogSyncFacade.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D239A21AE5A5FC0074768D /* BlogSyncFacade.m */; }; 85DA8C4418F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m in Sources */ = {isa = PBXBuildFile; fileRef = 85DA8C4318F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m */; }; 85F8E19D1B018698000859BB /* PushAuthenticationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */; }; + 8B0570D1243775850021A436 /* Blog+Timezone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D0243775850021A436 /* Blog+Timezone.swift */; }; 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */; }; @@ -3434,6 +3435,7 @@ 85DA8C4318F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPAnalyticsTrackerWPCom.m; sourceTree = ""; }; 85ED98AA17DFB17200090D0B /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushAuthenticationServiceTests.swift; sourceTree = ""; }; + 8B0570D0243775850021A436 /* Blog+Timezone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Timezone.swift"; sourceTree = ""; }; 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrepublishingHeaderView.xib; sourceTree = ""; }; @@ -8495,6 +8497,7 @@ 73713582208EA4B900CCDFC8 /* Blog+Files.swift */, B5EEDB961C91F10400676B2B /* Blog+Interface.swift */, E11C4B6F2010930B00A6619C /* Blog+Jetpack.swift */, + 8B0570D0243775850021A436 /* Blog+Timezone.swift */, B5D889401BEBE30A007C4684 /* BlogSettings.swift */, B55F1AA71C10936600FD04D4 /* BlogSettings+Discussion.swift */, 8217380A1FE05EE600BEC94C /* BlogSettings+DateAndTimeFormat.swift */, @@ -12188,6 +12191,7 @@ E6F058021C1A122B008000F9 /* ReaderPostMenu.swift in Sources */, 9A5C854822B3E42800BEE7A3 /* CountriesMapCell.swift in Sources */, B5B410B61B1772B000CFCF8D /* NavigationTitleView.swift in Sources */, + 8B0570D1243775850021A436 /* Blog+Timezone.swift in Sources */, 8BAD53D6241922B900230F4B /* WPAnalyticsEvent.swift in Sources */, E1D458691309589C00BF0235 /* Coordinate.m in Sources */, 323F8F3123A22C8F000BA49C /* SiteCreationRotatingMessageView.swift in Sources */, From 41198f96108b8c6e6878b7bfae345697dd4b5997 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 3 Apr 2020 09:33:26 -0500 Subject: [PATCH 077/245] Add navigation between tabs on the Reader - Update ReaderTabViewModel.swift, add callback to inject topic into ReaderStreamViewController - Update ReaderTabView.swift, changed calls to viewModel methods to reflect changes in ReaderTabViewModel.swift --- .../Reader/Tab Navigation/ReaderTabView.swift | 18 ++++------ .../Tab Navigation/ReaderTabViewModel.swift | 35 ++++++++++--------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index a6a2722a8976..79cd0fec714c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -135,11 +135,12 @@ extension ReaderTabView { } private func addContentToContainerView() { - guard let controller = self.next as? ReaderTabViewController else { + guard let controller = self.next as? UIViewController, + let readetTabItem = tabBar.items[tabBar.selectedIndex] as? ReaderTabItem, + let childController = viewModel.makeChildViewController(with: readetTabItem) else { return } - let childController = viewModel.makeChildViewController() containerView.translatesAutoresizingMaskIntoConstraints = false childController.view.translatesAutoresizingMaskIntoConstraints = false @@ -175,16 +176,10 @@ extension ReaderTabView { return } - UIView.animate(withDuration: Appearance.tabBarAnimationsDuration, - animations: { + self.viewModel.showTab(for: tabBar.items[tabBar.selectedIndex]) + UIView.animate(withDuration: Appearance.tabBarAnimationsDuration) { self.buttonsStackView.isHidden = tabItems[tabBar.selectedIndex].shouldHideButtonsView - }, - completion: { finished in - if finished { - self.viewModel.navigateToTab(at: tabBar.selectedIndex) - } - }) - viewModel.selectedIndex = tabBar.selectedIndex + } } /// Filter button @@ -226,7 +221,6 @@ extension ReaderTabView { static let filterButtonimageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) static let filterButtonTitleInsets = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0) - static let resetButtonWidth: CGFloat = 32 static let resetButtonInsets = UIEdgeInsets(top: 1, left: -4, bottom: -1, right: 4) static let settingsButtonWidth: CGFloat = 56 diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 947ebeca5c7b..8f6d0ca86196 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -1,17 +1,17 @@ class ReaderTabViewModel { - var tabItems = [ReaderTabItem]() + var navigationClosure: ((ReaderAbstractTopic) -> Void)? - var selectedIndex = 0 { - didSet { - // TODO: - READERNAV - implement transition on ReaderContent + // TODO: - READERNAV - Methods to be implemented. Signature will likely change + func showTab(for item: FilterTabBarItem) { + guard let readerItem = item as? ReaderTabItem, + let topic = readerItem.topic else { + return } + navigationClosure?(topic) } - // TODO: - READERNAV - Methods to be implemented. Signature will likely change - func navigateToTab(at index: Int) { } - func performSearch() { } func presentFilter() { } @@ -44,9 +44,7 @@ extension ReaderTabViewModel { return } - tabItems = ReaderHelpers.rearrange(items: topics.map { ReaderTabItem(topic: $0) }) - - completion(tabItems) + completion(ReaderHelpers.rearrange(items: topics.map { ReaderTabItem(topic: $0) })) } catch { DDLogError("There was a problem fetching topics for the menu." + error.localizedDescription) @@ -72,12 +70,17 @@ extension ReaderTabViewModel { // MARK: Reader Content extension ReaderTabViewModel { - private var currentTopic: ReaderAbstractTopic? { - return tabItems[selectedIndex].topic - } + func makeChildViewController(with item: ReaderTabItem) -> UIViewController? { + guard let topic = item.topic else { + return nil + } + + let controller = ReaderStreamViewController.controllerWithTopic(topic) + + self.navigationClosure = { topic in + controller.readerTopic = topic + } - func makeChildViewController() -> UIViewController { - // TODO: - READERNAV - Remove force unwrapping - return ReaderStreamViewController.controllerWithTopic(currentTopic!) + return controller } } From 69558174adc0a10cd4ebc12bb6b1072b704cc2e1 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 11:33:57 -0300 Subject: [PATCH 078/245] Increase Nudges height --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 362f789f0b76..e0eca70ba454 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -107,7 +107,7 @@ extension PrepublishingNavigationController: DrawerPresentable { } var collapsedHeight: DrawerHeight { - return .contentHeight(250) + return .contentHeight(300) } var scrollableView: UIScrollView? { From 72a8885f968af95d0511852e4c5a2579441a7aa6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 11:44:38 -0300 Subject: [PATCH 079/245] Create a static function so SchedulingCalendarViewController can present itself The VC that use it doesn't need to know the presentation details --- ...ngCalendarViewController+PresentFrom.swift | 27 +++++++++++++++++++ WordPress/WordPress.xcodeproj/project.pbxproj | 4 +++ 2 files changed, 31 insertions(+) create mode 100644 WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift new file mode 100644 index 000000000000..93799380d295 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift @@ -0,0 +1,27 @@ +import Foundation + +extension SchedulingCalendarViewController { + static func present(from viewController: UIViewController, post: AbstractPost) { + let model = PublishSettingsViewModel(post: post) + let schedulingCalendarViewController = SchedulingCalendarViewController() + schedulingCalendarViewController.coordinator = DateCoordinator(date: model.date, timeZone: model.timeZone, dateFormatter: model.dateFormatter, dateTimeFormatter: model.dateTimeFormatter) { date in + // Date picked + } + let vc = LightNavigationController(rootViewController: schedulingCalendarViewController) + vc.modalPresentationStyle = .custom + vc.transitioningDelegate = schedulingCalendarViewController + viewController.present(vc, animated: true) + } +} + +extension SchedulingCalendarViewController: UIViewControllerTransitioningDelegate, UIAdaptivePresentationControllerDelegate { + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + let presentationController = HalfScreenPresentationController(presentedViewController: presented, presenting: presenting) + presentationController.delegate = self + return presentationController + } + + func adaptivePresentationStyle(for: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { + return traitCollection.verticalSizeClass == .compact ? .overFullScreen : .none + } +} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index eb37b1f6426b..1cee0bbb8c0a 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1046,6 +1046,7 @@ 85DA8C4418F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m in Sources */ = {isa = PBXBuildFile; fileRef = 85DA8C4318F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m */; }; 85F8E19D1B018698000859BB /* PushAuthenticationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */; }; 8B0570D1243775850021A436 /* Blog+Timezone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D0243775850021A436 /* Blog+Timezone.swift */; }; + 8B0570D3243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */; }; 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */; }; @@ -3436,6 +3437,7 @@ 85ED98AA17DFB17200090D0B /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushAuthenticationServiceTests.swift; sourceTree = ""; }; 8B0570D0243775850021A436 /* Blog+Timezone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Timezone.swift"; sourceTree = ""; }; + 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SchedulingCalendarViewController+PresentFrom.swift"; sourceTree = ""; }; 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrepublishingHeaderView.xib; sourceTree = ""; }; @@ -10113,6 +10115,7 @@ F59AAC0F235E430E00385EE6 /* ChosenValueRow.swift */, F5660D08235D1CDD00020B1E /* CalendarMonthView.swift */, F5660CFF235CE82100020B1E /* SchedulingCalendarViewController.swift */, + 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */, F5844B6A235EAF3D007C6557 /* HalfScreenPresentationController.swift */, F59AAC15235EA46D00385EE6 /* LightNavigationController.swift */, F57402A6235FF9C300374346 /* SchedulingDate+Helpers.swift */, @@ -12819,6 +12822,7 @@ D865722E2186F96D0023A99C /* SiteSegmentsWizardContent.swift in Sources */, E66969E01B9E648100EC9C00 /* ReaderTopicToReaderDefaultTopic37to38.swift in Sources */, F1DB8D2B2288C24500906E2F /* UploadsManager.swift in Sources */, + 8B0570D3243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift in Sources */, 82A062DE2017BCBA0084CE7C /* ActivityListSectionHeaderView.swift in Sources */, 73FEC871220B358500CEF791 /* WPAccount+RestApi.swift in Sources */, B5FF3BE71CAD881100C1D597 /* ImageCropOverlayView.swift in Sources */, From 1556006370a1a1ef007e7c7c4a43a7c0af41b85f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 11:48:56 -0300 Subject: [PATCH 080/245] Add the Schedule option and present the Calendar --- .../Post/PrepublishingViewController.swift | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 2b49bd557cce..37971ab9d2ac 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -7,6 +7,7 @@ private struct PrepublishingOption { } private enum PrepublishingIdentifier { + case schedule case visibility case tags } @@ -17,6 +18,7 @@ class PrepublishingViewController: UITableViewController { private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ + PrepublishingOption(id: .schedule, title: NSLocalizedString("Publish", comment: "Label for Publish")), PrepublishingOption(id: .visibility, title: NSLocalizedString("Visibility", comment: "Label for Visibility")), PrepublishingOption(id: .tags, title: NSLocalizedString("Tags", comment: "Label for Tags")) ] @@ -75,16 +77,21 @@ class PrepublishingViewController: UITableViewController { configureTagCell(cell) case .visibility: configureVisibilityCell(cell) + case .schedule: + configureScheduleCell(cell) } return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if indexPath.row == 0 { - didTapVisibilityCell() - } else { + switch options[indexPath.row].id { + case .tags: didTapTagCell() + case .visibility: + didTapVisibilityCell() + case .schedule: + didTapSchedule() } } @@ -132,6 +139,29 @@ class PrepublishingViewController: UITableViewController { navigationController?.pushViewController(visbilitySelectorViewController, animated: true) } + // MARK: - Schedule + + var scheduleLabel: String { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .long + dateFormatter.timeStyle = .short + dateFormatter.timeZone = post.blog.timeZone as TimeZone + + if let dateCreated = post.dateCreated, !post.shouldPublishImmediately() { + return dateFormatter.string(from: dateCreated) + } else { + return NSLocalizedString("Immediately", comment: "Label that indicates that the post will be immediately published"); + } + } + + func configureScheduleCell(_ cell: WPTableViewCell) { + cell.detailTextLabel?.text = scheduleLabel + } + + func didTapSchedule() { + SchedulingCalendarViewController.present(from: self, post: post) + } + // MARK: - Publish Button private func setupPublishButton() { From a6b29976dd7b8d1be1713a6d39402dd6bf3379c6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 12:10:08 -0300 Subject: [PATCH 081/245] Refactor the Scheduling to use PublishSettingsViewModel --- .../Post/PrepublishingViewController.swift | 24 +++++++------------ .../PublishSettingsViewController.swift | 16 +++++++------ ...ngCalendarViewController+PresentFrom.swift | 7 ++---- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 37971ab9d2ac..97d5b7503a0e 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -15,6 +15,10 @@ private enum PrepublishingIdentifier { class PrepublishingViewController: UITableViewController { let post: Post + private lazy var publishSettingsViewModel: PublishSettingsViewModel = { + return PublishSettingsViewModel(post: post) + }() + private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ @@ -141,25 +145,15 @@ class PrepublishingViewController: UITableViewController { // MARK: - Schedule - var scheduleLabel: String { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .long - dateFormatter.timeStyle = .short - dateFormatter.timeZone = post.blog.timeZone as TimeZone - - if let dateCreated = post.dateCreated, !post.shouldPublishImmediately() { - return dateFormatter.string(from: dateCreated) - } else { - return NSLocalizedString("Immediately", comment: "Label that indicates that the post will be immediately published"); - } - } - func configureScheduleCell(_ cell: WPTableViewCell) { - cell.detailTextLabel?.text = scheduleLabel + cell.detailTextLabel?.text = publishSettingsViewModel.detailString } func didTapSchedule() { - SchedulingCalendarViewController.present(from: self, post: post) + SchedulingCalendarViewController.present(from: self, viewModel: publishSettingsViewModel) { [weak self] date in + self?.publishSettingsViewModel.setDate(date) + self?.tableView.reloadData() + } } // MARK: - Publish Button diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift index 05614445f506..a2ff77958fa5 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift @@ -26,6 +26,14 @@ struct PublishSettingsViewModel { let timeZone: TimeZone let title: String? + var detailString: String { + if let date = date { + return dateTimeFormatter.string(from: date) + } else { + return NSLocalizedString("Immediately", comment: "Undated post time label") + } + } + private let post: AbstractPost let dateFormatter: DateFormatter @@ -150,15 +158,9 @@ private struct DateAndTimeRow: ImmuTableRow { let rows: [ImmuTableRow] = viewModel.cells.map { cell in switch cell { case .dateTime: - let detailString: String - if let date = viewModel.date { - detailString = viewModel.dateTimeFormatter.string(from: date) - } else { - detailString = NSLocalizedString("Immediately", comment: "Undated post time label") - } return DateAndTimeRow( title: NSLocalizedString("Date and Time", comment: "Date and Time"), - detail: detailString, + detail: viewModel.detailString, accessibilityIdentifier: "Date and Time Row", action: presenter.present(dateTimeCalendarViewController(with: viewModel)) ) diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift index 93799380d295..4d9a70353f67 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift @@ -1,12 +1,9 @@ import Foundation extension SchedulingCalendarViewController { - static func present(from viewController: UIViewController, post: AbstractPost) { - let model = PublishSettingsViewModel(post: post) + static func present(from viewController: UIViewController, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void) { let schedulingCalendarViewController = SchedulingCalendarViewController() - schedulingCalendarViewController.coordinator = DateCoordinator(date: model.date, timeZone: model.timeZone, dateFormatter: model.dateFormatter, dateTimeFormatter: model.dateTimeFormatter) { date in - // Date picked - } + schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated) let vc = LightNavigationController(rootViewController: schedulingCalendarViewController) vc.modalPresentationStyle = .custom vc.transitioningDelegate = schedulingCalendarViewController From 004278e6c980e27d5b025fd34e7320cbf1a4a60e Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 13:06:49 -0300 Subject: [PATCH 082/245] Remove Blog+TimeZone Is not needed after the refactor --- WordPress/Classes/Models/Blog+Timezone.swift | 27 ------------------- WordPress/WordPress.xcodeproj/project.pbxproj | 4 --- 2 files changed, 31 deletions(-) delete mode 100644 WordPress/Classes/Models/Blog+Timezone.swift diff --git a/WordPress/Classes/Models/Blog+Timezone.swift b/WordPress/Classes/Models/Blog+Timezone.swift deleted file mode 100644 index 37ac7b730b3b..000000000000 --- a/WordPress/Classes/Models/Blog+Timezone.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation - -extension Blog { - @objc var timeZone: NSTimeZone { - let timeZoneName: String? = getOption(name: "timezone") - let gmtOffSet: NSNumber? = getOption(name: "gmt_offset") - let optionValue: NSString? = getOption(name: "time_zone") - let oneHourInSeconds: Float = 60 * 60 - - var timeZone: NSTimeZone! - - if let timeZoneName = timeZoneName, !timeZoneName.isEmpty { - timeZone = NSTimeZone(name: timeZoneName) - } else if let gmtOffSet = gmtOffSet?.floatValue { - timeZone = NSTimeZone(forSecondsFromGMT: Int(gmtOffSet * oneHourInSeconds)) - } else if let optionValue = optionValue { - let timeZoneOffsetSeconds = Int(optionValue.floatValue * oneHourInSeconds) - timeZone = NSTimeZone(forSecondsFromGMT: timeZoneOffsetSeconds) - } - - if timeZone == nil { - timeZone = NSTimeZone(forSecondsFromGMT: 0) - } - - return timeZone - } -} diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 1cee0bbb8c0a..d46e33f4f514 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1045,7 +1045,6 @@ 85D239AE1AE5A5FC0074768D /* BlogSyncFacade.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D239A21AE5A5FC0074768D /* BlogSyncFacade.m */; }; 85DA8C4418F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m in Sources */ = {isa = PBXBuildFile; fileRef = 85DA8C4318F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m */; }; 85F8E19D1B018698000859BB /* PushAuthenticationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */; }; - 8B0570D1243775850021A436 /* Blog+Timezone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D0243775850021A436 /* Blog+Timezone.swift */; }; 8B0570D3243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */; }; 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; @@ -3436,7 +3435,6 @@ 85DA8C4318F3F29A0074C8A4 /* WPAnalyticsTrackerWPCom.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPAnalyticsTrackerWPCom.m; sourceTree = ""; }; 85ED98AA17DFB17200090D0B /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 85F8E19C1B018698000859BB /* PushAuthenticationServiceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushAuthenticationServiceTests.swift; sourceTree = ""; }; - 8B0570D0243775850021A436 /* Blog+Timezone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Timezone.swift"; sourceTree = ""; }; 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SchedulingCalendarViewController+PresentFrom.swift"; sourceTree = ""; }; 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; @@ -8499,7 +8497,6 @@ 73713582208EA4B900CCDFC8 /* Blog+Files.swift */, B5EEDB961C91F10400676B2B /* Blog+Interface.swift */, E11C4B6F2010930B00A6619C /* Blog+Jetpack.swift */, - 8B0570D0243775850021A436 /* Blog+Timezone.swift */, B5D889401BEBE30A007C4684 /* BlogSettings.swift */, B55F1AA71C10936600FD04D4 /* BlogSettings+Discussion.swift */, 8217380A1FE05EE600BEC94C /* BlogSettings+DateAndTimeFormat.swift */, @@ -12194,7 +12191,6 @@ E6F058021C1A122B008000F9 /* ReaderPostMenu.swift in Sources */, 9A5C854822B3E42800BEE7A3 /* CountriesMapCell.swift in Sources */, B5B410B61B1772B000CFCF8D /* NavigationTitleView.swift in Sources */, - 8B0570D1243775850021A436 /* Blog+Timezone.swift in Sources */, 8BAD53D6241922B900230F4B /* WPAnalyticsEvent.swift in Sources */, E1D458691309589C00BF0235 /* Coordinate.m in Sources */, 323F8F3123A22C8F000BA49C /* SiteCreationRotatingMessageView.swift in Sources */, From d588a0ed34dd9e4ac0a88714342c7220702f697b Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 13:07:49 -0300 Subject: [PATCH 083/245] Hide the Nudges view when presenting the calendar --- .../Post/PrepublishingViewController.swift | 6 ++++++ .../DrawerPresentationController.swift | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 97d5b7503a0e..019b81ba2e58 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -19,6 +19,10 @@ class PrepublishingViewController: UITableViewController { return PublishSettingsViewModel(post: post) }() + private lazy var presentedVC: DrawerPresentationController? = { + return (navigationController as? PrepublishingNavigationController)?.presentedVC + }() + private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ @@ -150,9 +154,11 @@ class PrepublishingViewController: UITableViewController { } func didTapSchedule() { + presentedVC?.transition(to: .hidden) SchedulingCalendarViewController.present(from: self, viewModel: publishSettingsViewModel) { [weak self] date in self?.publishSettingsViewModel.setDate(date) self?.tableView.reloadData() + self?.presentedVC?.transition(to: .collapsed) } } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 940b1ff97364..501fd7a73a4e 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -4,6 +4,7 @@ public enum DrawerPosition { case expanded case collapsed case closed + case hidden } public enum DrawerHeight { @@ -15,6 +16,9 @@ public enum DrawerHeight { // Height will be equal to the the content height value case contentHeight(CGFloat) + + // Height to hidden the bottom sheet + case hidden } public protocol DrawerPresentable: AnyObject { @@ -138,6 +142,9 @@ public class DrawerPresentationController: FancyAlertPresentationController { case .collapsed: margin = collapsedYPosition + case .hidden: + margin = hiddenYPosition + default: margin = 0 } @@ -185,6 +192,10 @@ public class DrawerPresentationController: FancyAlertPresentationController { return topMargin(with: height) } + private var hiddenYPosition: CGFloat { + return topMargin(with: .hidden) + } + /// Calculates the Y position for the view based on a DrawerHeight enum /// - Parameter drawerHeight: The drawer height to calculate private func topMargin(with drawerHeight: DrawerHeight) -> CGFloat { @@ -199,6 +210,9 @@ public class DrawerPresentationController: FancyAlertPresentationController { case .maxHeight: topMargin = safeAreaInsets.top + + case .hidden: + topMargin = UIScreen.main.bounds.height } return topMargin @@ -336,7 +350,8 @@ extension DrawerPresentationController: UIGestureRecognizerDelegate { /// Shouldn't happen; should always have container & presented view when tapped guard let containerView = containerView, - let presentedView = presentedView + let presentedView = presentedView, + currentPosition != .hidden else { return false } From b4caedd0a5719121c4d53ac29c2269d5437eba8b Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 13:23:29 -0300 Subject: [PATCH 084/245] Refactor to display the Nudges view again when the calendar disappears --- .../Post/PrepublishingViewController.swift | 16 +++++++++++----- .../PublishSettingsViewController.swift | 14 ++++++++++---- ...ulingCalendarViewController+PresentFrom.swift | 4 ++-- .../SchedulingCalendarViewController.swift | 9 ++++++++- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 019b81ba2e58..7db47d9b5a72 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -155,11 +155,17 @@ class PrepublishingViewController: UITableViewController { func didTapSchedule() { presentedVC?.transition(to: .hidden) - SchedulingCalendarViewController.present(from: self, viewModel: publishSettingsViewModel) { [weak self] date in - self?.publishSettingsViewModel.setDate(date) - self?.tableView.reloadData() - self?.presentedVC?.transition(to: .collapsed) - } + SchedulingCalendarViewController.present( + from: self, + viewModel: publishSettingsViewModel, + updated: { [weak self] date in + self?.publishSettingsViewModel.setDate(date) + }, + onDismiss: { [weak self] in + self?.tableView.reloadData() + self?.presentedVC?.transition(to: .collapsed) + } + ) } // MARK: - Publish Button diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift index a2ff77958fa5..a9e3b6231916 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift @@ -196,10 +196,16 @@ private struct DateAndTimeRow: ImmuTableRow { return { [weak self] row in let schedulingCalendarViewController = SchedulingCalendarViewController() - schedulingCalendarViewController.coordinator = DateCoordinator(date: model.date, timeZone: model.timeZone, dateFormatter: model.dateFormatter, dateTimeFormatter: model.dateTimeFormatter) { [weak self] date in - self?.viewModel.setDate(date) - NotificationCenter.default.post(name: Foundation.Notification.Name(rawValue: ImmuTableViewController.modelChangedNotification), object: nil) - } + schedulingCalendarViewController.coordinator = DateCoordinator( + date: model.date, + timeZone: model.timeZone, + dateFormatter: model.dateFormatter, + dateTimeFormatter: model.dateTimeFormatter, + updated: { [weak self] date in + self?.viewModel.setDate(date) + NotificationCenter.default.post(name: Foundation.Notification.Name(rawValue: ImmuTableViewController.modelChangedNotification), object: nil) + } + ) return self?.calendarNavigationController(rootViewController: schedulingCalendarViewController) ?? UINavigationController() } diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift index 4d9a70353f67..4842c46ff54e 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift @@ -1,9 +1,9 @@ import Foundation extension SchedulingCalendarViewController { - static func present(from viewController: UIViewController, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void) { + static func present(from viewController: UIViewController, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void, onDismiss: @escaping () -> Void) { let schedulingCalendarViewController = SchedulingCalendarViewController() - schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated) + schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated, onDismiss: onDismiss) let vc = LightNavigationController(rootViewController: schedulingCalendarViewController) vc.modalPresentationStyle = .custom vc.transitioningDelegate = schedulingCalendarViewController diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift index a85fa19a6b67..c2c24b25558b 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift @@ -12,13 +12,15 @@ class DateCoordinator { let dateFormatter: DateFormatter let dateTimeFormatter: DateFormatter let updated: (Date?) -> Void + let onDismiss: (() -> Void)? - init(date: Date?, timeZone: TimeZone, dateFormatter: DateFormatter, dateTimeFormatter: DateFormatter, updated: @escaping (Date?) -> Void) { + init(date: Date?, timeZone: TimeZone, dateFormatter: DateFormatter, dateTimeFormatter: DateFormatter, updated: @escaping (Date?) -> Void, onDismiss: (() -> Void)? = nil) { self.date = date self.timeZone = timeZone self.dateFormatter = dateFormatter self.dateTimeFormatter = dateTimeFormatter self.updated = updated + self.onDismiss = onDismiss } } @@ -90,6 +92,11 @@ class SchedulingCalendarViewController: UIViewController, DatePickerSheet, DateC calculatePreferredSize() } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + coordinator?.onDismiss?() + } + private func calculatePreferredSize() { let targetSize = CGSize(width: view.bounds.width, height: UIView.layoutFittingCompressedSize.height) From 67a0b69f47ba616eb3cb4d216adb0479372a03ed Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 13:38:13 -0300 Subject: [PATCH 085/245] Increase Publish Now button margin --- .../ViewRelated/Post/PrepublishingViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 7db47d9b5a72..356ecdb49b6a 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -211,8 +211,8 @@ class PrepublishingViewController: UITableViewController { private enum Constants { static let reuseIdentifier = "wpTableViewCell" - static let nuxButtonInsets = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) - static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 40) + static let nuxButtonInsets = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15) + static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 80) static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") } } From c1685359d1de28559995a8e9b2b092d9d5ee6e77 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 14:01:59 -0300 Subject: [PATCH 086/245] Set the height constant for iPad --- .../PrepublishingNavigationController.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index e0eca70ba454..5c7dc51a5253 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -33,6 +33,11 @@ class PrepublishingNavigationController: UINavigationController { configureNavigationHeader() configureNavigationBar() + + // Set the height for iPad + if UIDevice.isPad() { + view.heightAnchor.constraint(equalToConstant: Constants.height).isActive = true + } } override func viewWillAppear(_ animated: Bool) { @@ -72,6 +77,7 @@ class PrepublishingNavigationController: UINavigationController { private enum Constants { static let navigationHeaderHeight: CGFloat = 80 + static let height: CGFloat = 300 } } @@ -107,7 +113,7 @@ extension PrepublishingNavigationController: DrawerPresentable { } var collapsedHeight: DrawerHeight { - return .contentHeight(300) + return .contentHeight(Constants.height) } var scrollableView: UIScrollView? { From 96ee5893db288620df002da4b3f728fceabe113f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 14:09:39 -0300 Subject: [PATCH 087/245] Display the calendar as modal in iPad --- .../Post/PrepublishingViewController.swift | 5 +++-- ...ingCalendarViewController+PresentFrom.swift | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 356ecdb49b6a..3c3f8558b6e8 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -99,7 +99,7 @@ class PrepublishingViewController: UITableViewController { case .visibility: didTapVisibilityCell() case .schedule: - didTapSchedule() + didTapSchedule(indexPath) } } @@ -153,10 +153,11 @@ class PrepublishingViewController: UITableViewController { cell.detailTextLabel?.text = publishSettingsViewModel.detailString } - func didTapSchedule() { + func didTapSchedule(_ indexPath: IndexPath) { presentedVC?.transition(to: .hidden) SchedulingCalendarViewController.present( from: self, + sourceView: tableView.cellForRow(at: indexPath)?.contentView, viewModel: publishSettingsViewModel, updated: { [weak self] date in self?.publishSettingsViewModel.setDate(date) diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift index 4842c46ff54e..99944c448ff2 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift @@ -1,12 +1,24 @@ import Foundation extension SchedulingCalendarViewController { - static func present(from viewController: UIViewController, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void, onDismiss: @escaping () -> Void) { + static func present(from viewController: UIViewController, sourceView: UIView?, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void, onDismiss: @escaping () -> Void) { let schedulingCalendarViewController = SchedulingCalendarViewController() schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated, onDismiss: onDismiss) let vc = LightNavigationController(rootViewController: schedulingCalendarViewController) - vc.modalPresentationStyle = .custom - vc.transitioningDelegate = schedulingCalendarViewController + + if UIDevice.isPad() { + vc.modalPresentationStyle = .popover + } else { + vc.modalPresentationStyle = .custom + vc.transitioningDelegate = schedulingCalendarViewController + } + + if let popoverController = vc.popoverPresentationController, + let sourceView = sourceView { + popoverController.sourceView = sourceView + popoverController.sourceRect = sourceView.frame + } + viewController.present(vc, animated: true) } } From 94e7ff48ea5db284f66dd25a0b0bd7a691beb903 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 14:52:07 -0300 Subject: [PATCH 088/245] Change the "Publish Now" button when the post is scheduled --- .../Post/PrepublishingViewController.swift | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 3c3f8558b6e8..84e81a5c9b0f 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -34,7 +34,6 @@ class PrepublishingViewController: UITableViewController { let publishButton: NUXButton = { let nuxButton = NUXButton() nuxButton.isPrimary = true - nuxButton.setTitle(NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post"), for: .normal) return nuxButton }() @@ -161,9 +160,10 @@ class PrepublishingViewController: UITableViewController { viewModel: publishSettingsViewModel, updated: { [weak self] date in self?.publishSettingsViewModel.setDate(date) + self?.tableView.reloadData() + self?.updatePublishButtonLabel() }, onDismiss: { [weak self] in - self?.tableView.reloadData() self?.presentedVC?.transition(to: .collapsed) } ) @@ -178,6 +178,11 @@ class PrepublishingViewController: UITableViewController { publishButton.translatesAutoresizingMaskIntoConstraints = false tableView.tableFooterView = footer publishButton.addTarget(self, action: #selector(publish(_:)), for: .touchUpInside) + updatePublishButtonLabel() + } + + private func updatePublishButtonLabel() { + publishButton.setTitle(post.isScheduled() ? Constants.scheduleNow : Constants.publishNow, for: .normal) } @objc func publish(_ sender: UIButton) { @@ -215,5 +220,7 @@ class PrepublishingViewController: UITableViewController { static let nuxButtonInsets = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15) static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 80) static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") + static let publishNow = NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post") + static let scheduleNow = NSLocalizedString("Schedule Now", comment: "Label for the button that schedules the post") } } From 891b793c97773af614f45bd1907b08baaaae24f4 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 16:45:52 -0300 Subject: [PATCH 089/245] Update WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift Co-Authored-By: Emily Laguna --- .../System/Action Sheet/DrawerPresentationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 501fd7a73a4e..5187e400126b 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -17,7 +17,7 @@ public enum DrawerHeight { // Height will be equal to the the content height value case contentHeight(CGFloat) - // Height to hidden the bottom sheet + // Height in the hidden state will be equal the screens height case hidden } From 8593b55555d810f7169725be37c69bfc71fcc32d Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 16:45:10 -0300 Subject: [PATCH 090/245] Fix a bug where Scheduling was being kept selected --- .../Post/PrepublishingViewController.swift | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 84e81a5c9b0f..f9f2cfc55073 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -102,6 +102,10 @@ class PrepublishingViewController: UITableViewController { } } + private func reloadData() { + tableView.reloadData() + } + // MARK: - Tags private func configureTagCell(_ cell: WPTableViewCell) { @@ -117,7 +121,7 @@ class PrepublishingViewController: UITableViewController { } self?.post.tags = tags - self?.tableView.reloadData() + self?.reloadData() } navigationController?.pushViewController(tagPickerViewController, animated: true) @@ -133,7 +137,7 @@ class PrepublishingViewController: UITableViewController { let visbilitySelectorViewController = PostVisibilitySelectorViewController(post) visbilitySelectorViewController.completion = { [weak self] option in - self?.tableView.reloadData() + self?.reloadData() // If tue user selects password protected, prompt for a password if option == AbstractPost.passwordProtectedLabel { @@ -160,10 +164,11 @@ class PrepublishingViewController: UITableViewController { viewModel: publishSettingsViewModel, updated: { [weak self] date in self?.publishSettingsViewModel.setDate(date) - self?.tableView.reloadData() + self?.reloadData() self?.updatePublishButtonLabel() }, onDismiss: { [weak self] in + self?.reloadData() self?.presentedVC?.transition(to: .collapsed) } ) @@ -212,7 +217,7 @@ class PrepublishingViewController: UITableViewController { private func cancelPasswordProtectedPost() { post.status = .publish post.password = nil - tableView.reloadData() + reloadData() } private enum Constants { From 26d27780de844dd4c8bf4319005a30128179a52d Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 3 Apr 2020 16:57:06 -0300 Subject: [PATCH 091/245] Fix how onDismiss behave --- ...edulingCalendarViewController+PresentFrom.swift | 14 ++++++++++++-- .../SchedulingCalendarViewController.swift | 9 +-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift index 99944c448ff2..edc9112cb2bc 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController+PresentFrom.swift @@ -3,8 +3,9 @@ import Foundation extension SchedulingCalendarViewController { static func present(from viewController: UIViewController, sourceView: UIView?, viewModel: PublishSettingsViewModel, updated: @escaping (Date?) -> Void, onDismiss: @escaping () -> Void) { let schedulingCalendarViewController = SchedulingCalendarViewController() - schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated, onDismiss: onDismiss) - let vc = LightNavigationController(rootViewController: schedulingCalendarViewController) + schedulingCalendarViewController.coordinator = DateCoordinator(date: viewModel.date, timeZone: viewModel.timeZone, dateFormatter: viewModel.dateFormatter, dateTimeFormatter: viewModel.dateTimeFormatter, updated: updated) + let vc = SchedulingLightNavigationController(rootViewController: schedulingCalendarViewController) + vc.onDismiss = onDismiss if UIDevice.isPad() { vc.modalPresentationStyle = .popover @@ -34,3 +35,12 @@ extension SchedulingCalendarViewController: UIViewControllerTransitioningDelegat return traitCollection.verticalSizeClass == .compact ? .overFullScreen : .none } } + +class SchedulingLightNavigationController: LightNavigationController { + var onDismiss: (() -> Void)? + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + onDismiss?() + } +} diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift index c2c24b25558b..a85fa19a6b67 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/SchedulingCalendarViewController.swift @@ -12,15 +12,13 @@ class DateCoordinator { let dateFormatter: DateFormatter let dateTimeFormatter: DateFormatter let updated: (Date?) -> Void - let onDismiss: (() -> Void)? - init(date: Date?, timeZone: TimeZone, dateFormatter: DateFormatter, dateTimeFormatter: DateFormatter, updated: @escaping (Date?) -> Void, onDismiss: (() -> Void)? = nil) { + init(date: Date?, timeZone: TimeZone, dateFormatter: DateFormatter, dateTimeFormatter: DateFormatter, updated: @escaping (Date?) -> Void) { self.date = date self.timeZone = timeZone self.dateFormatter = dateFormatter self.dateTimeFormatter = dateTimeFormatter self.updated = updated - self.onDismiss = onDismiss } } @@ -92,11 +90,6 @@ class SchedulingCalendarViewController: UIViewController, DatePickerSheet, DateC calculatePreferredSize() } - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - coordinator?.onDismiss?() - } - private func calculatePreferredSize() { let targetSize = CGSize(width: view.bounds.width, height: UIView.layoutFittingCompressedSize.height) From 33d9400e24b11a0a10b4ca049b18dc71c65d027e Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 3 Apr 2020 16:34:06 -0500 Subject: [PATCH 092/245] Update ReaderTabView.swift, fixed wrong condition in selectedTabDidChange(_:) --- .../Utility/BuildInformation/FeatureFlag.swift | 2 +- .../Reader/Tab Navigation/ReaderTabView.swift | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index ad0e225bb5c3..5db166f11633 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return false + return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] } } } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index c501cf87b4dd..356c634258d0 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -137,7 +137,7 @@ extension ReaderTabView { guard let controller = self.next as? UIViewController, let readetTabItem = tabBar.items[tabBar.selectedIndex] as? ReaderTabItem, let childController = viewModel.makeChildViewController(with: readetTabItem) else { - return + return } containerView.translatesAutoresizingMaskIntoConstraints = false @@ -169,15 +169,16 @@ extension ReaderTabView { extension ReaderTabView { /// Tab bar @objc private func selectedTabDidChange(_ tabBar: FilterTabBar) { - // hide/show buttons view depending on the selected TabBarItem - guard let tabItems = tabBar.items as? [ReaderTabItem], - buttonsStackView.isHidden != tabItems[tabBar.selectedIndex].shouldHideButtonsView else { + guard let tabItems = tabBar.items as? [ReaderTabItem] else { return } - self.viewModel.showTab(for: tabBar.items[tabBar.selectedIndex]) + // hide/show buttons depending on the selected tab. Do not call the animation if not necessary. + guard buttonsStackView.isHidden != tabItems[tabBar.selectedIndex].shouldHideButtonsView else { + return + } UIView.animate(withDuration: Appearance.tabBarAnimationsDuration) { - self.buttonsStackView.isHidden = tabItems[tabBar.selectedIndex].shouldHideButtonsView + self.buttonsStackView.isHidden = tabItems[tabBar.selectedIndex].shouldHideButtonsView } } From 8e2563326be9969d0b2382faee6cf0f728988dba Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 3 Apr 2020 16:50:16 -0500 Subject: [PATCH 093/245] Update ReaderStreamViewController+Helper.swift, remove manage header from followed sites --- .../Reader/ReaderStreamViewController+Helper.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index 04d4d724296c..a7e3ed068a76 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -50,10 +50,6 @@ extension ReaderStreamViewController { return nil } - if ReaderHelpers.topicIsFollowing(topic) { - return Bundle.main.loadNibNamed("ReaderFollowedSitesStreamHeader", owner: nil, options: nil)!.first as! ReaderFollowedSitesStreamHeader - } - // if tag if ReaderHelpers.isTopicTag(topic) { return Bundle.main.loadNibNamed("ReaderTagStreamHeader", owner: nil, options: nil)!.first as! ReaderTagStreamHeader From 2f177182db3f8dc8ec12f5d76429145d67162c8b Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 09:54:59 -0300 Subject: [PATCH 094/245] Adapt the Bottom Sheet for landscape mode --- .../DrawerPresentationController.swift | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 5187e400126b..c646c7133986 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -47,6 +47,8 @@ private enum Constants { static let flickVelocity: CGFloat = 300 static let bounceAmount: CGFloat = 0.01 + static let maxWidthPercentage: CGFloat = 0.66 /// Used to constrain the width to a smaller size (instead of full width) when sheet is too wide + enum Defaults { static let expandedHeight: DrawerHeight = .topMargin(20) static let collapsedHeight: DrawerHeight = .contentHeight(0) @@ -113,10 +115,26 @@ public class DrawerPresentationController: FancyAlertPresentationController { var frame = containerView.frame let y = collapsedYPosition + var width: CGFloat = containerView.bounds.width - (containerView.safeAreaInsets.left + containerView.safeAreaInsets.right) frame.origin.y = y - return frame + /// If we're in a compact vertical size class, constrain the width a bit more so it doesn't get overly wide. + if traitCollection.verticalSizeClass == .compact { + width = width * Constants.maxWidthPercentage + } + + /// If we constrain the width, this centers the view by applying the appropriate insets based on width + let leftInset: CGFloat = ((containerView.bounds.width - width) / 2) + + return CGRect(x: leftInset, y: frame.origin.y, width: width, height: frame.height) + } + + override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + coordinator.animate(alongsideTransition: { _ in + self.presentedView?.frame = self.frameOfPresentedViewInContainerView + }, completion: nil) + super.viewWillTransition(to: size, with: coordinator) } /// Returns the current position of the drawer @@ -162,6 +180,11 @@ public class DrawerPresentationController: FancyAlertPresentationController { configureScrollViewInsets() } + public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + transition(to: currentPosition) + } + public override func presentationTransitionDidEnd(_ completed: Bool) { super.presentationTransitionDidEnd(completed) From dd752b614d78adb6ea96895d280792a825915184 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 6 Apr 2020 10:09:17 -0500 Subject: [PATCH 095/245] Update podfile and lock to point to test branch for Auth changes --- Podfile | 4 ++-- Podfile.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Podfile b/Podfile index f38b859d0fc2..d9a2b8238048 100644 --- a/Podfile +++ b/Podfile @@ -183,11 +183,11 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - # pod 'WordPressAuthenticator', '~> 1.12.0-beta.6' + # pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' # While in PR pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/229-remove-showSigninV2' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' - # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' + #pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index 917a9329dac2..df85542b03c6 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -374,7 +374,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.12.0): + - WordPressAuthenticator (1.13.0-beta.1): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -475,8 +475,8 @@ DEPENDENCIES: - SimulatorStatusMagic - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/229-remove-showSigninV2`) - WordPress-Editor-iOS (~> 1.17.1) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/229-remove-showSigninV2`) - WordPressKit (~> 4.7.0) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -625,7 +625,7 @@ CHECKOUT OPTIONS: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 WordPressAuthenticator: - :commit: a1203c556a5f4cd099acb2598d7229191c883e2d + :commit: 56e6f1a69880c65ea550d14b368440449f6a8757 :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: @@ -697,7 +697,7 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: 593bbdad097e4752cc464ac1c6ef460e1a9801a8 + WordPressAuthenticator: b64a15c023570a85ffa748766fd3e7469eac9449 WordPressKit: 0602e8188245b3267269570d3d78c138e64a4eba WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 @@ -714,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 0820a03022e58c9c009bac9f8368fe75220145e1 +PODFILE CHECKSUM: 3d503f205063726b5eb061f53c2d9b827cdc88d6 COCOAPODS: 1.8.4 From 9ce7291bdbd11621baf049d53248605f202e9d7c Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 6 Apr 2020 11:54:54 -0500 Subject: [PATCH 096/245] Update ReaderTabViewModel.swift, refactor constants in a private enum, add applicationWillTerminate and accountChanged notification observers to handle cleanup actions --- .../Tab Navigation/ReaderTabViewModel.swift | 95 ++++++++++++++++--- 1 file changed, 80 insertions(+), 15 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 8f6d0ca86196..556cd1acd8e1 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -1,17 +1,21 @@ class ReaderTabViewModel { - var navigationClosure: ((ReaderAbstractTopic) -> Void)? + var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? + + init() { + addNotificationsObservers() + } - // TODO: - READERNAV - Methods to be implemented. Signature will likely change func showTab(for item: FilterTabBarItem) { guard let readerItem = item as? ReaderTabItem, let topic = readerItem.topic else { - return + return } - navigationClosure?(topic) + tabSelectionCallback?(topic) } - + + // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } func presentFilter() { } @@ -27,12 +31,11 @@ extension ReaderTabViewModel { /// Fetch request to extract reader menu topics from Core Data private var topicsFetchRequest: NSFetchRequest { - let fetchRequest = NSFetchRequest(entityName: "ReaderAbstractTopic") + let fetchRequest = NSFetchRequest(entityName: ReaderTopics.entityName) - fetchRequest.predicate = NSPredicate(format: "following == %@ AND showInMenu == YES AND type == 'default' OR type == 'list' OR type == 'team'", - NSNumber(value: ReaderHelpers.isLoggedIn())) + fetchRequest.predicate = NSPredicate(format: ReaderTopics.predicate, NSNumber(value: ReaderHelpers.isLoggedIn())) - fetchRequest.sortDescriptors = [NSSortDescriptor(key: "type", ascending: true)] + fetchRequest.sortDescriptors = [NSSortDescriptor(key: ReaderTopics.sortByKey, ascending: true)] return fetchRequest } @@ -47,7 +50,7 @@ extension ReaderTabViewModel { completion(ReaderHelpers.rearrange(items: topics.map { ReaderTabItem(topic: $0) })) } catch { - DDLogError("There was a problem fetching topics for the menu." + error.localizedDescription) + DDLogError(ReaderTopics.fetchRequestError + error.localizedDescription) completion(nil) } } @@ -60,10 +63,20 @@ extension ReaderTabViewModel { service.fetchReaderMenu(success: { [weak self] in self?.fetchTabBarItems(completion: completion) }, failure: { error in - DDLogError("Error syncing menu: \(String(describing: error))") + DDLogError(ReaderTopics.remoteFetchError + "\(String(describing: error))") completion(nil) }) } + + private enum ReaderTopics { + static let predicate = "following == %@ AND showInMenu == YES AND type == 'default' OR type == 'list' OR type == 'team'" + + static let entityName = "ReaderAbstractTopic" + static let sortByKey = "type" + + static let fetchRequestError = "There was a problem fetching topics for the menu. " + static let remoteFetchError = "Error syncing menu: " + } } @@ -74,13 +87,65 @@ extension ReaderTabViewModel { guard let topic = item.topic else { return nil } - let controller = ReaderStreamViewController.controllerWithTopic(topic) - self.navigationClosure = { topic in - controller.readerTopic = topic + self.tabSelectionCallback = { [weak controller] topic in + controller?.readerTopic = topic } - return controller } } + + +// MARK: - Logout and Termination Cleanup +extension ReaderTabViewModel { + + private func addNotificationsObservers() { + NotificationCenter.default.addObserver(forName: UIApplication.willTerminateNotification, + object: nil, + queue: nil) { notification in + self.cleanupStaleContent(removeAllTopics: false) + self.unflagInUseContent() + } + + NotificationCenter.default.addObserver(forName: .WPAccountDefaultWordPressComAccountChanged, + object: nil, + queue: nil) { notification in + self.unflagInUseContent() + self.clearSavedPosts() + self.cleanupStaleContent(removeAllTopics: true) + self.clearSearchSuggestions() + } + } + + /// Clears the inUse flag from any topics or posts so marked. + private func unflagInUseContent() { + let context = ContextManager.sharedInstance().mainContext + ReaderPostService(managedObjectContext: context).clearInUseFlags() + ReaderTopicService(managedObjectContext: context).clearInUseFlags() + } + + /// Clean up topics that do not belong in the menu and posts that have no topic + /// This is merely a convenient place to perform this task. + private func cleanupStaleContent(removeAllTopics removeAll: Bool) { + let context = ContextManager.sharedInstance().mainContext + ReaderPostService(managedObjectContext: context).deletePostsWithNoTopic() + + if removeAll { + ReaderTopicService(managedObjectContext: context).deleteAllTopics() + } else { + ReaderTopicService(managedObjectContext: context).deleteNonMenuTopics() + } + } + + /// Clears all saved posts, so they can be deleted by cleanup methods. + private func clearSavedPosts() { + let context = ContextManager.sharedInstance().mainContext + ReaderPostService(managedObjectContext: context).clearSavedPostFlags() + } + + private func clearSearchSuggestions() { + let context = ContextManager.sharedInstance().mainContext + ReaderSearchSuggestionService(managedObjectContext: context).deleteAllSuggestions() + } +} From 2edb803ff7278dcd8cb2ed0349b5002cb2a078b8 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 6 Apr 2020 12:02:44 -0500 Subject: [PATCH 097/245] Update ReaderStreamViewController+Helper.swift, refactor headerForStream(_:) method, add FeatureFlag check for following header, not needed in the new version of the reader --- .../Reader/ReaderFollowedSitesStreamHeader.swift | 2 +- .../Reader/ReaderStreamViewController+Helper.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderFollowedSitesStreamHeader.swift b/WordPress/Classes/ViewRelated/Reader/ReaderFollowedSitesStreamHeader.swift index c179ea29c474..8c0fc5e3af66 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderFollowedSitesStreamHeader.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderFollowedSitesStreamHeader.swift @@ -1,7 +1,7 @@ import Foundation import Gridicons import WordPressShared.WPStyleGuide - +// TODO: - READERNAV - This (and the related xib) might need to be removed once the new Reader Tab Navigation is stable @objc open class ReaderFollowedSitesStreamHeader: UIView, ReaderStreamHeader { @IBOutlet fileprivate weak var borderedView: UIView! @IBOutlet fileprivate weak var imageView: UIImageView! diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index a7e3ed068a76..61008782cbb3 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -45,9 +45,9 @@ extension ReaderStreamViewController { } func headerForStream(_ topic: ReaderAbstractTopic) -> ReaderHeader? { - if ReaderHelpers.topicIsFreshlyPressed(topic) || ReaderHelpers.topicIsLiked(topic) { - // no header for these special lists - return nil + + if ReaderHelpers.topicIsFollowing(topic), !FeatureFlag.newReaderNavigation.enabled { + return Bundle.main.loadNibNamed("ReaderFollowedSitesStreamHeader", owner: nil, options: nil)!.first as! ReaderFollowedSitesStreamHeader } // if tag From 9f76a227a00b25b35419b663ef1b3cf9ca0fa29b Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 14:13:02 -0300 Subject: [PATCH 098/245] When going portrait/landscape keep the current position --- .../System/Action Sheet/DrawerPresentationController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index c646c7133986..dbab96d1d5b4 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -133,6 +133,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: { _ in self.presentedView?.frame = self.frameOfPresentedViewInContainerView + self.transition(to: self.currentPosition) }, completion: nil) super.viewWillTransition(to: size, with: coordinator) } From ac47a85c1cd88220e265c9f10edc4134b74aecf0 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 16:16:33 -0300 Subject: [PATCH 099/245] Keep a safe margin to the top --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 5c7dc51a5253..5d2b13713b3b 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -109,7 +109,7 @@ extension PrepublishingNavigationController: PrepublishingHeaderViewDelegate { extension PrepublishingNavigationController: DrawerPresentable { var expandedHeight: DrawerHeight { - return .maxHeight + return .topMargin(20) } var collapsedHeight: DrawerHeight { From eb696199789afdbb2080711e5c7e4a568c9770d4 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 6 Apr 2020 14:27:19 -0500 Subject: [PATCH 100/245] Force the podfile.lock checksum to update so it can pick up the latest commit from the Auth branch --- Podfile | 2 +- Podfile.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Podfile b/Podfile index d9a2b8238048..2418dcc4f538 100644 --- a/Podfile +++ b/Podfile @@ -187,7 +187,7 @@ target 'WordPress' do # While in PR pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/229-remove-showSigninV2' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' - #pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' + # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index df85542b03c6..9c514b394d01 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -714,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 3d503f205063726b5eb061f53c2d9b827cdc88d6 +PODFILE CHECKSUM: 00c9cae4648be273afc6cda7c101714162c5df7b COCOAPODS: 1.8.4 From 51cbb55a035c191efded828cb7fe25693e7a1357 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 16:46:00 -0300 Subject: [PATCH 101/245] Make the width configurable --- .../BottomSheetViewController.swift | 4 +++ .../DrawerPresentationController.swift | 34 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index d758723234c9..0b8fe7c7618e 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -147,6 +147,10 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { // MARK: - DrawerDelegate extension BottomSheetViewController: DrawerPresentable { + var width: DrawerWidth { + childViewController?.width ?? .percentage(0.66) + } + var expandedHeight: DrawerHeight { return childViewController?.expandedHeight ?? .maxHeight } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index dbab96d1d5b4..a6982bea48e6 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -21,6 +21,17 @@ public enum DrawerHeight { case hidden } +public enum DrawerWidth { + // Fills the whole screen width + case maxWidth + + // When in compact mode, fills a percentage of the screen + case percentage(CGFloat) + + // Width will be equal to the the content height value + case contentWidth(CGFloat) +} + public protocol DrawerPresentable: AnyObject { /// The height of the drawer when it's in the expanded position var expandedHeight: DrawerHeight { get } @@ -28,6 +39,9 @@ public protocol DrawerPresentable: AnyObject { /// The height of the drawer when it's in the collapsed position var collapsedHeight: DrawerHeight { get } + /// The width of the Drawer in compact screen + var width: DrawerWidth { get } + /// Whether or not the user is allowed to swipe to switch between the expanded and collapsed position var allowsUserTransition: Bool { get } @@ -47,11 +61,10 @@ private enum Constants { static let flickVelocity: CGFloat = 300 static let bounceAmount: CGFloat = 0.01 - static let maxWidthPercentage: CGFloat = 0.66 /// Used to constrain the width to a smaller size (instead of full width) when sheet is too wide - enum Defaults { static let expandedHeight: DrawerHeight = .topMargin(20) static let collapsedHeight: DrawerHeight = .contentHeight(0) + static let compactWidth: DrawerWidth = .percentage(0.66) static let allowsUserTransition: Bool = true static let allowsTapToDismiss: Bool = true @@ -75,6 +88,10 @@ public extension DrawerPresentable where Self: UIViewController { return Constants.Defaults.collapsedHeight } + var width: DrawerWidth { + return Constants.Defaults.compactWidth + } + var scrollableView: UIScrollView? { return nil } @@ -120,8 +137,17 @@ public class DrawerPresentationController: FancyAlertPresentationController { frame.origin.y = y /// If we're in a compact vertical size class, constrain the width a bit more so it doesn't get overly wide. - if traitCollection.verticalSizeClass == .compact { - width = width * Constants.maxWidthPercentage + if let widthForCompactSizeClass = presentableViewController?.width, + traitCollection.verticalSizeClass == .compact { + + switch widthForCompactSizeClass { + case .percentage(let percentage): + width = width * percentage + case .contentWidth(let givenWidth): + width = givenWidth + case .maxWidth: + break + } } /// If we constrain the width, this centers the view by applying the appropriate insets based on width From 8a2267119637800d235d25236017ce895b618de5 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 6 Apr 2020 14:52:35 -0500 Subject: [PATCH 102/245] Update release notes for 14.7 and add an internal note --- RELEASE-NOTES.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index cec2c3ec3603..cbc5431ba166 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,3 +1,7 @@ +14.7 +----- +* [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. + 14.6 ----- * [internal] the login flow with 2-factor authentication enabled has code changes that can cause regressions. See https://git.io/Jvdil for testing details. From 6ff8c5c185c03c7180cec93beebeb87a8a41d9ea Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 17:27:48 -0300 Subject: [PATCH 103/245] Fix visibility cell getting clipped off --- .../PrepublishingNavigationController.swift | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 5d2b13713b3b..666e5221fb16 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -14,17 +14,22 @@ class PrepublishingNavigationController: UINavigationController { return (viewControllers.first { $0 is PrepublishingViewController } as? PrepublishingViewController)?.post.blog }() - // In iOS 13+ we need to take into account the navigationBar frame height - // iOS 12 or 11 that's not needed - lazy var insets: UIEdgeInsets = { + + private func updateAdditionalAreaInsets() { var top: CGFloat = 0 + + // In iOS 13+ we need to take into account the navigationBar frame height + // iOS 12 or 11 that's not needed if #available(iOS 13, *) { top = Constants.navigationHeaderHeight - navigationBar.frame.height } else { top = Constants.navigationHeaderHeight } - return UIEdgeInsets(top: top, left: 0, bottom: 0, right: 0) - }() + + let insets = UIEdgeInsets(top: top, left: 0, bottom: 0, right: 0) + + additionalSafeAreaInsets = insets + } override func viewDidLoad() { super.viewDidLoad() @@ -51,6 +56,11 @@ class PrepublishingNavigationController: UINavigationController { header.configure(blog) } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + updateAdditionalAreaInsets() + } + private func configureNavigationBar() { if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() @@ -72,7 +82,6 @@ class PrepublishingNavigationController: UINavigationController { header.rightAnchor.constraint(equalTo: navigationBar.rightAnchor), header.heightAnchor.constraint(equalToConstant: Constants.navigationHeaderHeight) ]) - additionalSafeAreaInsets = insets } private enum Constants { From c4e584f27fc0ae6bb3ede0467df5c926bd05278f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 6 Apr 2020 18:09:31 -0300 Subject: [PATCH 104/245] Rename width to compactWidth --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 4 ++-- .../System/Action Sheet/DrawerPresentationController.swift | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 0b8fe7c7618e..d33b3c20d4ab 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -147,8 +147,8 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { // MARK: - DrawerDelegate extension BottomSheetViewController: DrawerPresentable { - var width: DrawerWidth { - childViewController?.width ?? .percentage(0.66) + var compactWidth: DrawerWidth { + childViewController?.compactWidth ?? .percentage(0.66) } var expandedHeight: DrawerHeight { diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index a6982bea48e6..dc28c18c9ec9 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -40,7 +40,7 @@ public protocol DrawerPresentable: AnyObject { var collapsedHeight: DrawerHeight { get } /// The width of the Drawer in compact screen - var width: DrawerWidth { get } + var compactWidth: DrawerWidth { get } /// Whether or not the user is allowed to swipe to switch between the expanded and collapsed position var allowsUserTransition: Bool { get } @@ -88,7 +88,7 @@ public extension DrawerPresentable where Self: UIViewController { return Constants.Defaults.collapsedHeight } - var width: DrawerWidth { + var compactWidth: DrawerWidth { return Constants.Defaults.compactWidth } @@ -137,7 +137,7 @@ public class DrawerPresentationController: FancyAlertPresentationController { frame.origin.y = y /// If we're in a compact vertical size class, constrain the width a bit more so it doesn't get overly wide. - if let widthForCompactSizeClass = presentableViewController?.width, + if let widthForCompactSizeClass = presentableViewController?.compactWidth, traitCollection.verticalSizeClass == .compact { switch widthForCompactSizeClass { From 4d466b50db399c41aac4267b040b08a0a4f5a25d Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 6 Apr 2020 17:52:11 -0500 Subject: [PATCH 105/245] Upodate ReaderStreamViewController.swift, add setTopic method to allow injecting a topic and handling the special case of Discover --- .../Reader/ReaderStreamViewController.swift | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index c8d45fe92c39..26509bee593c 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -135,6 +135,11 @@ import WordPressFlux /// - Returns: An instance of the controller /// @objc class func controllerWithTopic(_ topic: ReaderAbstractTopic) -> ReaderStreamViewController { + // if a default discover topic is provided, treat it as a site to retrieve the header + if ReaderHelpers.topicIsDiscover(topic) && FeatureFlag.newReaderNavigation.enabled { + return controllerWithSiteID(ReaderHelpers.discoverSiteID, isFeed: false) + } + let storyboard = UIStoryboard(name: "Reader", bundle: Bundle.main) let controller = storyboard.instantiateViewController(withIdentifier: "ReaderStreamViewController") as! ReaderStreamViewController controller.readerTopic = topic @@ -1663,3 +1668,17 @@ extension ReaderStreamViewController: UIViewControllerTransitioningDelegate { return FancyAlertPresentationController(presentedViewController: presented, presenting: presenting) } } + + +// MARK: - Topic Injection +extension ReaderStreamViewController { + func setTopic(_ topic: ReaderAbstractTopic) { + guard ReaderHelpers.topicIsDiscover(topic) else { + readerTopic = topic + return + } + readerTopic = nil + isFeed = false + siteID = ReaderHelpers.discoverSiteID + } +} From bc0b8825c059109cf9d46fbb64e3152a58efa79f Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 6 Apr 2020 17:54:07 -0500 Subject: [PATCH 106/245] Update FilterTabBar.swift, add pinLeadingEdgeToSafeArea boolean property, to set a leading edge constraint for the scroll view to the safe area --- .../Classes/ViewRelated/System/FilterTabBar.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift index cec035d0e663..c81faf83f1c6 100644 --- a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift +++ b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift @@ -175,6 +175,8 @@ class FilterTabBar: UIControl { } } + private var pinLeadingEdgeToSafeArea: Bool + enum TabSizingStyle { /// The tabs will fill the space available to the filter bar, /// with all tabs having equal widths. Tabs will not scroll. @@ -198,12 +200,14 @@ class FilterTabBar: UIControl { // MARK: - Initialization required init?(coder aDecoder: NSCoder) { + self.pinLeadingEdgeToSafeArea = true super.init(coder: aDecoder) commonInit() } - init() { + init(pinLeadingEdgeToSafeArea: Bool = true) { + self.pinLeadingEdgeToSafeArea = pinLeadingEdgeToSafeArea super.init(frame: .zero) translatesAutoresizingMaskIntoConstraints = false commonInit() @@ -314,10 +318,12 @@ class FilterTabBar: UIControl { let padding = (tabSizingStyle == .equalWidths) ? 0 : AppearanceMetrics.horizontalPadding stackViewEdgeConstraints = [ - scrollView.contentLayoutGuide.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor, constant: padding), stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -padding) ] + if pinLeadingEdgeToSafeArea { + stackViewEdgeConstraints.append(scrollView.contentLayoutGuide.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor)) + } } private func activateTabSizingConstraints() { From 87195630987610bdcd388bdb7d8ade01c750dec4 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 6 Apr 2020 17:56:16 -0500 Subject: [PATCH 107/245] Update ReaderTabView.swift, ReaderTabViewModel.swift, refactored constants and calls to ReaderStreamViewController.setTopic(_:) --- .../ViewRelated/Reader/Tab Navigation/ReaderTabView.swift | 2 +- .../Reader/Tab Navigation/ReaderTabViewModel.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 356c634258d0..e3ab48a21375 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -17,7 +17,7 @@ class ReaderTabView: UIView { init(viewModel: ReaderTabViewModel) { mainStackView = UIStackView() buttonsStackView = UIStackView() - tabBar = FilterTabBar() + tabBar = FilterTabBar(pinLeadingEdgeToSafeArea: false) filterButton = PostMetaButton(type: .custom) resetFilterButton = UIButton(type: .custom) settingsButton = UIButton(type: .custom) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 556cd1acd8e1..5e1f1f66a85f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -33,7 +33,7 @@ extension ReaderTabViewModel { private var topicsFetchRequest: NSFetchRequest { let fetchRequest = NSFetchRequest(entityName: ReaderTopics.entityName) - fetchRequest.predicate = NSPredicate(format: ReaderTopics.predicate, NSNumber(value: ReaderHelpers.isLoggedIn())) + fetchRequest.predicate = NSPredicate(format: ReaderTopics.predicateFormat, NSNumber(value: ReaderHelpers.isLoggedIn())) fetchRequest.sortDescriptors = [NSSortDescriptor(key: ReaderTopics.sortByKey, ascending: true)] return fetchRequest @@ -69,7 +69,7 @@ extension ReaderTabViewModel { } private enum ReaderTopics { - static let predicate = "following == %@ AND showInMenu == YES AND type == 'default' OR type == 'list' OR type == 'team'" + static let predicateFormat = "following == %@ AND showInMenu == YES AND type == 'default' OR type == 'list' OR type == 'team'" static let entityName = "ReaderAbstractTopic" static let sortByKey = "type" @@ -90,7 +90,7 @@ extension ReaderTabViewModel { let controller = ReaderStreamViewController.controllerWithTopic(topic) self.tabSelectionCallback = { [weak controller] topic in - controller?.readerTopic = topic + controller?.setTopic(topic) } return controller } From f666e7c1888220008100034ac53c287bc19c598e Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 10:23:17 -0300 Subject: [PATCH 108/245] Just change frame properties instead of creating a new one --- .../System/Action Sheet/DrawerPresentationController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index dc28c18c9ec9..1dcb6408b870 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -149,11 +149,12 @@ public class DrawerPresentationController: FancyAlertPresentationController { break } } + frame.size.width = width /// If we constrain the width, this centers the view by applying the appropriate insets based on width - let leftInset: CGFloat = ((containerView.bounds.width - width) / 2) + frame.origin.x = ((containerView.bounds.width - width) / 2) - return CGRect(x: leftInset, y: frame.origin.y, width: width, height: frame.height) + return frame } override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { From f190818c53fc97122f2460c3280df479bc410567 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 11:45:12 -0300 Subject: [PATCH 109/245] Change navigation header to display title --- .../PrepublishingHeaderView.swift | 22 ++++++++++++++----- .../PrepublishingHeaderView.xib | 14 ++++++++++++ .../PrepublishingNavigationController.swift | 8 ++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 523da20ade26..3eb89f5fbcf8 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -9,6 +9,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var blogImageView: UIImageView! @IBOutlet weak var publishingToLabel: UILabel! + @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var blogTitleLabel: UILabel! @IBOutlet weak var backButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @@ -45,12 +46,21 @@ class PrepublishingHeaderView: UIView, NibLoadable { // MARK: - Title func setTitle(_ title: String?, transitionDuration: TimeInterval = 0.2) { - UIView.transition(with: publishingToLabel, - duration: transitionDuration, - options: .transitionCrossDissolve, - animations: { - self.publishingToLabel.text = title?.uppercased() - }) + titleLabel.text = title + } + + func showTitle() { + titleLabel.layer.opacity = 1 + blogTitleLabel.layer.opacity = 0 + publishingToLabel.layer.opacity = 0 + blogImageView.layer.opacity = 0 + } + + func hideTitle() { + titleLabel.layer.opacity = 0 + blogTitleLabel.layer.opacity = 1 + publishingToLabel.layer.opacity = 1 + blogImageView.layer.opacity = 1 } // MARK: - Style diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index ece1f9164d1d..a88315785b3b 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -94,13 +94,26 @@ + + + @@ -115,6 +128,7 @@ + diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 666e5221fb16..b20c4ab6dcfb 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -97,7 +97,13 @@ extension PrepublishingNavigationController: UINavigationControllerDelegate { /// Animated the back button based on what View Controller will be shown func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { transitionCoordinator?.animate(alongsideTransition: { context in - viewController is PrepublishingViewController ? self.header.hideBackButton() : self.header.showBackButton() + if viewController is PrepublishingViewController { + self.header.hideBackButton() + self.header.hideTitle() + } else { + self.header.showBackButton() + self.header.showTitle() + } self.header.setTitle(viewController.title, transitionDuration: context.transitionDuration) }, completion: nil) From e70901ca2d8185814ba2e8c8056d9868d4440f5a Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 11:45:12 -0300 Subject: [PATCH 110/245] Change navigation header to display title --- .../PrepublishingHeaderView.swift | 22 ++++++++++++++----- .../PrepublishingHeaderView.xib | 14 ++++++++++++ .../PrepublishingNavigationController.swift | 8 ++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 523da20ade26..3eb89f5fbcf8 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -9,6 +9,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var blogImageView: UIImageView! @IBOutlet weak var publishingToLabel: UILabel! + @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var blogTitleLabel: UILabel! @IBOutlet weak var backButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @@ -45,12 +46,21 @@ class PrepublishingHeaderView: UIView, NibLoadable { // MARK: - Title func setTitle(_ title: String?, transitionDuration: TimeInterval = 0.2) { - UIView.transition(with: publishingToLabel, - duration: transitionDuration, - options: .transitionCrossDissolve, - animations: { - self.publishingToLabel.text = title?.uppercased() - }) + titleLabel.text = title + } + + func showTitle() { + titleLabel.layer.opacity = 1 + blogTitleLabel.layer.opacity = 0 + publishingToLabel.layer.opacity = 0 + blogImageView.layer.opacity = 0 + } + + func hideTitle() { + titleLabel.layer.opacity = 0 + blogTitleLabel.layer.opacity = 1 + publishingToLabel.layer.opacity = 1 + blogImageView.layer.opacity = 1 } // MARK: - Style diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index ece1f9164d1d..a88315785b3b 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -94,13 +94,26 @@ + + + @@ -115,6 +128,7 @@ + diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 666e5221fb16..b20c4ab6dcfb 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -97,7 +97,13 @@ extension PrepublishingNavigationController: UINavigationControllerDelegate { /// Animated the back button based on what View Controller will be shown func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { transitionCoordinator?.animate(alongsideTransition: { context in - viewController is PrepublishingViewController ? self.header.hideBackButton() : self.header.showBackButton() + if viewController is PrepublishingViewController { + self.header.hideBackButton() + self.header.hideTitle() + } else { + self.header.showBackButton() + self.header.showTitle() + } self.header.setTitle(viewController.title, transitionDuration: context.transitionDuration) }, completion: nil) From 5610a04797ca643e00148d219dba17ea5bb12666 Mon Sep 17 00:00:00 2001 From: Emily Laguna Date: Tue, 7 Apr 2020 09:31:08 -0700 Subject: [PATCH 111/245] Idea to reduce the nav bar height on the prepublish nudges view --- .../PrepublishingNavigationController.swift | 94 +------------------ .../Post/PrepublishingViewController.swift | 25 +++++ 2 files changed, 29 insertions(+), 90 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index b20c4ab6dcfb..81594d923230 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -2,41 +2,10 @@ import UIKit class PrepublishingNavigationController: UINavigationController { - - lazy var header: PrepublishingHeaderView = { - let header = PrepublishingHeaderView.loadFromNib() - header.translatesAutoresizingMaskIntoConstraints = false - header.delegate = self - return header - }() - - lazy var blog: Blog? = { - return (viewControllers.first { $0 is PrepublishingViewController } as? PrepublishingViewController)?.post.blog - }() - - - private func updateAdditionalAreaInsets() { - var top: CGFloat = 0 - - // In iOS 13+ we need to take into account the navigationBar frame height - // iOS 12 or 11 that's not needed - if #available(iOS 13, *) { - top = Constants.navigationHeaderHeight - navigationBar.frame.height - } else { - top = Constants.navigationHeaderHeight - } - - let insets = UIEdgeInsets(top: top, left: 0, bottom: 0, right: 0) - - additionalSafeAreaInsets = insets - } - override func viewDidLoad() { super.viewDidLoad() - delegate = self - configureNavigationHeader() configureNavigationBar() // Set the height for iPad @@ -45,80 +14,25 @@ class PrepublishingNavigationController: UINavigationController { } } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - guard let blog = blog else { - return - } - - // Configure the header - header.configure(blog) - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - updateAdditionalAreaInsets() - } - private func configureNavigationBar() { if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() - appearance.configureWithTransparentBackground() + appearance.configureWithOpaqueBackground() +// appearance.backgroundColor = .white + navigationBar.standardAppearance = appearance + } else { let clearImage = UIImage(color: .clear, havingSize: CGSize(width: 1, height: 1)) navigationBar.shadowImage = clearImage } } - private func configureNavigationHeader() { - view.addSubview(header) - - // Put our custom navigation in front of the current navigation - NSLayoutConstraint.activate([ - header.topAnchor.constraint(equalTo: view.topAnchor), - header.leftAnchor.constraint(equalTo: navigationBar.leftAnchor), - header.rightAnchor.constraint(equalTo: navigationBar.rightAnchor), - header.heightAnchor.constraint(equalToConstant: Constants.navigationHeaderHeight) - ]) - } - private enum Constants { - static let navigationHeaderHeight: CGFloat = 80 static let height: CGFloat = 300 } } -// MARK: - UINavigationControllerDelegate - -extension PrepublishingNavigationController: UINavigationControllerDelegate { - - /// Animated the back button based on what View Controller will be shown - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { - transitionCoordinator?.animate(alongsideTransition: { context in - if viewController is PrepublishingViewController { - self.header.hideBackButton() - self.header.hideTitle() - } else { - self.header.showBackButton() - self.header.showTitle() - } - - self.header.setTitle(viewController.title, transitionDuration: context.transitionDuration) - }, completion: nil) - } -} - -// MARK: - PrepublishingHeaderViewDelegate - -extension PrepublishingNavigationController: PrepublishingHeaderViewDelegate { - - /// Pop the current view controller when Back button is pressed - func backButtonTapped() { - popViewController(animated: true) - } -} // MARK: - DrawerPresentable diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index f9f2cfc55073..781eba76dfbc 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -15,6 +15,11 @@ private enum PrepublishingIdentifier { class PrepublishingViewController: UITableViewController { let post: Post + lazy var header: PrepublishingHeaderView = { + let header = PrepublishingHeaderView.loadFromNib() + return header + }() + private lazy var publishSettingsViewModel: PublishSettingsViewModel = { return PublishSettingsViewModel(post: post) }() @@ -53,13 +58,32 @@ class PrepublishingViewController: UITableViewController { title = Constants.title + header.configure(post.blog) setupPublishButton() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navigationController?.setNavigationBarHidden(true, animated: animated) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + navigationController?.setNavigationBarHidden(false, animated: animated) + } + override func numberOfSections(in tableView: UITableView) -> Int { return 1 } + override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + return header + } + + override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return Constants.headerHeight + } + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return options.count } @@ -227,5 +251,6 @@ class PrepublishingViewController: UITableViewController { static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") static let publishNow = NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post") static let scheduleNow = NSLocalizedString("Schedule Now", comment: "Label for the button that schedules the post") + static let headerHeight: CGFloat = 80 } } From 7bcda010515657e4d395a800df96854434cb356f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 16:25:27 -0300 Subject: [PATCH 112/245] Set the title to an empty string --- .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 781eba76dfbc..910574040618 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -56,7 +56,7 @@ class PrepublishingViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - title = Constants.title + title = "" header.configure(post.blog) setupPublishButton() @@ -248,7 +248,6 @@ class PrepublishingViewController: UITableViewController { static let reuseIdentifier = "wpTableViewCell" static let nuxButtonInsets = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15) static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 80) - static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") static let publishNow = NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post") static let scheduleNow = NSLocalizedString("Schedule Now", comment: "Label for the button that schedules the post") static let headerHeight: CGFloat = 80 From 445da7d5d824bef2be47c940e17a5ff350b64a97 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 16:25:41 -0300 Subject: [PATCH 113/245] Use LightNavigationController --- .../PrepublishingNavigationController.swift | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 81594d923230..9029b58590d8 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -1,33 +1,15 @@ import UIKit - -class PrepublishingNavigationController: UINavigationController { +class PrepublishingNavigationController: LightNavigationController { override func viewDidLoad() { super.viewDidLoad() - - configureNavigationBar() - // Set the height for iPad if UIDevice.isPad() { view.heightAnchor.constraint(equalToConstant: Constants.height).isActive = true } } - private func configureNavigationBar() { - if #available(iOS 13.0, *) { - let appearance = UINavigationBarAppearance() - appearance.configureWithOpaqueBackground() -// appearance.backgroundColor = .white - - navigationBar.standardAppearance = appearance - - } else { - let clearImage = UIImage(color: .clear, havingSize: CGSize(width: 1, height: 1)) - navigationBar.shadowImage = clearImage - } - } - private enum Constants { static let height: CGFloat = 300 } From dc2bff296a124bf6ff60c0a9a595f4a2f7fdfc14 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 17:25:49 -0300 Subject: [PATCH 114/245] Remove title related methods --- .../PrepublishingHeaderView.swift | 21 ------------------- .../PrepublishingHeaderView.xib | 14 ------------- 2 files changed, 35 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 3eb89f5fbcf8..a6db082efebf 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -9,7 +9,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var blogImageView: UIImageView! @IBOutlet weak var publishingToLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var blogTitleLabel: UILabel! @IBOutlet weak var backButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! @@ -43,26 +42,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { delegate?.backButtonTapped() } - // MARK: - Title - - func setTitle(_ title: String?, transitionDuration: TimeInterval = 0.2) { - titleLabel.text = title - } - - func showTitle() { - titleLabel.layer.opacity = 1 - blogTitleLabel.layer.opacity = 0 - publishingToLabel.layer.opacity = 0 - blogImageView.layer.opacity = 0 - } - - func hideTitle() { - titleLabel.layer.opacity = 0 - blogTitleLabel.layer.opacity = 1 - publishingToLabel.layer.opacity = 1 - blogImageView.layer.opacity = 1 - } - // MARK: - Style override func awakeFromNib() { diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index a88315785b3b..ece1f9164d1d 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -94,26 +94,13 @@ - - - @@ -128,7 +115,6 @@ - From 99cddd42ea43e1ca1b1554428dd2942826cb1eb8 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 7 Apr 2020 15:57:43 -0500 Subject: [PATCH 115/245] Update constraints for new Reader Navigation - Update Newscard.xib, changed priority of two constraints to 999 to avoid breaking - Update ReaderStreamViewController.swift, removed explicit constraints to avoid breaking - Update FilterTabBar.swift, replaced explicit constraint to layout guide leading anchor with stackView.isLayoutMarginsRelativeArrangement = true - Update NoResults.storyboard, changed priority of one constraint to 999 to avoid breaking --- WordPress/Classes/ViewRelated/Reader/NewsCard.xib | 4 ++-- .../Reader/ReaderStreamViewController.swift | 12 ++++++------ .../Reader/Tab Navigation/ReaderTabView.swift | 2 +- .../Classes/ViewRelated/System/FilterTabBar.swift | 11 ++--------- .../Classes/ViewRelated/Views/NoResults.storyboard | 2 +- 5 files changed, 12 insertions(+), 19 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/NewsCard.xib b/WordPress/Classes/ViewRelated/Reader/NewsCard.xib index f6b77d7f0bbe..dc037081c8a6 100644 --- a/WordPress/Classes/ViewRelated/Reader/NewsCard.xib +++ b/WordPress/Classes/ViewRelated/Reader/NewsCard.xib @@ -79,9 +79,9 @@ - + - + diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 26509bee593c..26c9d4ca85b0 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -444,12 +444,12 @@ import WordPressFlux } tableView.tableHeaderView = header - - // This feels somewhat hacky, but it is the only way I found to insert a stack view into the header without breaking the autolayout constraints. - header.centerXAnchor.constraint(equalTo: tableView.centerXAnchor).isActive = true - header.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true - header.topAnchor.constraint(equalTo: tableView.topAnchor).isActive = true - + if !FeatureFlag.newReaderNavigation.enabled { + // This feels somewhat hacky, but it is the only way I found to insert a stack view into the header without breaking the autolayout constraints. + header.centerXAnchor.constraint(equalTo: tableView.centerXAnchor).isActive = true + header.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true + header.topAnchor.constraint(equalTo: tableView.topAnchor).isActive = true + } tableView.tableHeaderView?.layoutIfNeeded() tableView.tableHeaderView = tableView.tableHeaderView } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index e3ab48a21375..356c634258d0 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -17,7 +17,7 @@ class ReaderTabView: UIView { init(viewModel: ReaderTabViewModel) { mainStackView = UIStackView() buttonsStackView = UIStackView() - tabBar = FilterTabBar(pinLeadingEdgeToSafeArea: false) + tabBar = FilterTabBar() filterButton = PostMetaButton(type: .custom) resetFilterButton = UIButton(type: .custom) settingsButton = UIButton(type: .custom) diff --git a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift index c81faf83f1c6..e8bec0426124 100644 --- a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift +++ b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift @@ -175,8 +175,6 @@ class FilterTabBar: UIControl { } } - private var pinLeadingEdgeToSafeArea: Bool - enum TabSizingStyle { /// The tabs will fill the space available to the filter bar, /// with all tabs having equal widths. Tabs will not scroll. @@ -200,14 +198,12 @@ class FilterTabBar: UIControl { // MARK: - Initialization required init?(coder aDecoder: NSCoder) { - self.pinLeadingEdgeToSafeArea = true super.init(coder: aDecoder) commonInit() } - init(pinLeadingEdgeToSafeArea: Bool = true) { - self.pinLeadingEdgeToSafeArea = pinLeadingEdgeToSafeArea + init() { super.init(frame: .zero) translatesAutoresizingMaskIntoConstraints = false commonInit() @@ -235,7 +231,7 @@ class FilterTabBar: UIControl { ]) scrollView.addSubview(stackView) - + stackView.isLayoutMarginsRelativeArrangement = true // We will manually constrain the stack view to the content layout guide scrollView.contentInsetAdjustmentBehavior = .never @@ -321,9 +317,6 @@ class FilterTabBar: UIControl { stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor, constant: padding), stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -padding) ] - if pinLeadingEdgeToSafeArea { - stackViewEdgeConstraints.append(scrollView.contentLayoutGuide.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor)) - } } private func activateTabSizingConstraints() { diff --git a/WordPress/Classes/ViewRelated/Views/NoResults.storyboard b/WordPress/Classes/ViewRelated/Views/NoResults.storyboard index d9bb79faa6d4..299cf9ca9cf4 100644 --- a/WordPress/Classes/ViewRelated/Views/NoResults.storyboard +++ b/WordPress/Classes/ViewRelated/Views/NoResults.storyboard @@ -84,7 +84,7 @@ - + From 602792a5c0c88d8357f191a6acc9e2e21f3d30bb Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 7 Apr 2020 17:59:32 -0300 Subject: [PATCH 116/245] Remove outdated reference --- WordPress/WordPress.xcodeproj/project.pbxproj | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 3a5d0a8895f8..af763703d6ed 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1050,12 +1050,12 @@ 8B0570D3243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */; }; 8B05D29123A9417E0063B9AA /* WPMediaEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */; }; 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; - 8B158B2A243CF07F00C66823 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */; }; 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */; }; 8B0732E9242BA1F000E7FBD3 /* PrepublishingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */; }; 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; + 8B158B2A243CF07F00C66823 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */; }; 8B1CF00F2433902700578582 /* PasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* PasswordAlertController.swift */; }; 8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; @@ -1078,7 +1078,6 @@ 8BD36E022395CAEA00EFFF1C /* MediaEditorOperation+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */; }; 8BD36E062395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */; }; 8BE7C84123466927006EDE70 /* I18n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE7C84023466927006EDE70 /* I18n.swift */; }; - 8BF5F789242138A600BE49B7 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */; }; 8BF5F78D2421677300BE49B7 /* BottomSheetViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */; }; 8BFE36FD230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */; }; 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */; }; @@ -3450,12 +3449,12 @@ 8B0570D2243781100021A436 /* SchedulingCalendarViewController+PresentFrom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SchedulingCalendarViewController+PresentFrom.swift"; sourceTree = ""; }; 8B05D29023A9417E0063B9AA /* WPMediaEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPMediaEditor.swift; sourceTree = ""; }; 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; - 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrepublishingHeaderView.xib; sourceTree = ""; }; 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderView.swift; sourceTree = ""; }; 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; + 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; 8B1CF00E2433902700578582 /* PasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordAlertController.swift; sourceTree = ""; }; 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+TitleForVisibility.swift"; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; @@ -3478,7 +3477,6 @@ 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+Description.swift"; sourceTree = ""; }; 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+DescriptionTests.swift"; sourceTree = ""; }; 8BE7C84023466927006EDE70 /* I18n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = I18n.swift; sourceTree = ""; }; - 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewControllerTests.swift; sourceTree = ""; }; 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLs.swift"; sourceTree = ""; }; 8BFE36FE230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLsTests.swift"; sourceTree = ""; }; @@ -7589,6 +7587,7 @@ 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */, ); name = "Prepublishing Nudges"; + sourceTree = ""; }; 8B158B28243CF05900C66823 /* Bottom Sheet */ = { isa = PBXGroup; @@ -7622,14 +7621,6 @@ name = Aztec; sourceTree = ""; }; - 8BF5F7872421388F00BE49B7 /* Bottom Sheet */ = { - isa = PBXGroup; - children = ( - 8BF5F788242138A600BE49B7 /* BottomSheetViewController.swift */, - ); - path = "Bottom Sheet"; - sourceTree = ""; - }; 8BF5F78B2421676100BE49B7 /* Bottom Sheet */ = { isa = PBXGroup; children = ( @@ -12283,7 +12274,6 @@ E137B1661F8B77D4006AC7FC /* WebNavigationDelegate.swift in Sources */, 937D9A0F19F83812007B9D5F /* WordPress-22-23.xcmappingmodel in Sources */, 9A1A67A622B2AD4E00FF8422 /* CountriesMap.swift in Sources */, - 8BF5F789242138A600BE49B7 /* BottomSheetViewController.swift in Sources */, 439F4F3A219B715300F8D0C7 /* RevisionsNavigationController.swift in Sources */, 40F46B6A22121BA800A2143B /* AnnualAndMostPopularTimeStatsRecordValue+CoreDataClass.swift in Sources */, 17D5C3F71FFCF2D800EB70FF /* MediaProgressCoordinatorNoticeViewModel.swift in Sources */, From e25de7fe321714ed80cde6f8c5941db881c35bd7 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 7 Apr 2020 16:36:11 -0500 Subject: [PATCH 117/245] Fixed lint violations in PR #13840 --- .../ViewRelated/Reader/ReaderStreamViewController+Helper.swift | 2 +- .../ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index 61008782cbb3..d84ee3b35006 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -45,7 +45,7 @@ extension ReaderStreamViewController { } func headerForStream(_ topic: ReaderAbstractTopic) -> ReaderHeader? { - + if ReaderHelpers.topicIsFollowing(topic), !FeatureFlag.newReaderNavigation.enabled { return Bundle.main.loadNibNamed("ReaderFollowedSitesStreamHeader", owner: nil, options: nil)!.first as! ReaderFollowedSitesStreamHeader } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 5e1f1f66a85f..2b1b256420b9 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -14,7 +14,7 @@ class ReaderTabViewModel { } tabSelectionCallback?(topic) } - + // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } From 4d363c765b482f3c6fdc8ac7e0d68835c90b4e35 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 7 Apr 2020 19:10:53 -0600 Subject: [PATCH 118/245] Fix new tab selection logic --- WordPress/Classes/ViewRelated/System/WPTabBarController.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/WPTabBarController.m b/WordPress/Classes/ViewRelated/System/WPTabBarController.m index b904f041fd28..d737b3a276bc 100644 --- a/WordPress/Classes/ViewRelated/System/WPTabBarController.m +++ b/WordPress/Classes/ViewRelated/System/WPTabBarController.m @@ -824,9 +824,9 @@ - (Blog *)currentOrLastBlog - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { - NSUInteger newIndex = [tabBarController.viewControllers indexOfObject:viewController]; + NSUInteger selectedIndex = [tabBarController.viewControllers indexOfObject:viewController]; - newIndex = [self adjustedTabIndex:newIndex toTabType:false]; + NSUInteger newIndex = [self adjustedTabIndex:selectedIndex toTabType:false]; if (newIndex == WPTabNewPost) { [self showPostTab]; @@ -834,7 +834,7 @@ - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectView } // If we're selecting a new tab... - if (newIndex != tabBarController.selectedIndex) { + if (selectedIndex != tabBarController.selectedIndex) { switch (newIndex) { case WPTabMySites: { [self bypassBlogListViewControllerIfNecessary]; From 51b3e8edc59b405d4527c35bb35c6b0151a669ce Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 7 Apr 2020 19:17:46 -0600 Subject: [PATCH 119/245] Add release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 9ee510e772d0..6f34b4664489 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,6 @@ 14.7 ----- +* [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. 14.6 ----- From f889d60d4d102ae242a3acc5ab60ba79f57222ee Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 11:53:53 -0300 Subject: [PATCH 120/245] End editing to avoid issues with accesibility --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 6543106d9471..55cb47ba16ea 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -144,6 +144,9 @@ extension PostEditor where Self: UIViewController { /// - dismissWhenDone: if `true`, the VC will be dismissed if the user picks "Publish". /// fileprivate func displayPublishConfirmationAlert(for action: PostEditorAction, onPublish publishAction: @escaping () -> ()) { + // End editing to avoid issues with accessibility + view.endEditing(true) + let prepublishing = PrepublishingViewController(post: post as! Post) { _ in publishAction() } From 33ca30bfedef10a611375aaa7c9fecf0b32a39cd Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 16:36:33 -0300 Subject: [PATCH 121/245] Do not perform transition if voice ernabled and show a close button The transition was causing some odd issues --- .../PrepublishingHeaderView.swift | 33 +++++++++++-------- .../PrepublishingHeaderView.xib | 10 +++--- .../Post/PrepublishingViewController.swift | 33 +++++++++++++++++-- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index a6db082efebf..f60fbd6fcd61 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -2,7 +2,7 @@ import UIKit import Gridicons protocol PrepublishingHeaderViewDelegate: class { - func backButtonTapped() + func closeButtonTapped() } class PrepublishingHeaderView: UIView, NibLoadable { @@ -10,9 +10,9 @@ class PrepublishingHeaderView: UIView, NibLoadable { @IBOutlet weak var blogImageView: UIImageView! @IBOutlet weak var publishingToLabel: UILabel! @IBOutlet weak var blogTitleLabel: UILabel! - @IBOutlet weak var backButtonView: UIView! + @IBOutlet weak var closeButtonView: UIView! @IBOutlet weak var leadingConstraint: NSLayoutConstraint! - @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var closeButton: UIButton! @IBOutlet weak var separator: UIView! weak var delegate: PrepublishingHeaderViewDelegate? @@ -22,24 +22,24 @@ class PrepublishingHeaderView: UIView, NibLoadable { blogTitleLabel.text = blog.title } - // MARK: - Back button + // MARK: - Close button - func hideBackButton() { - backButtonView.layer.opacity = 0 - backButtonView.isHidden = true + func hideCloseButton() { + closeButtonView.layer.opacity = 0 + closeButtonView.isHidden = true leadingConstraint.constant = Constants.leftRightInset layoutIfNeeded() } - func showBackButton() { - backButtonView.layer.opacity = 1 - backButtonView.isHidden = false + func showCloseButton() { + closeButtonView.layer.opacity = 1 + closeButtonView.isHidden = false leadingConstraint.constant = 0 layoutIfNeeded() } - @IBAction func backButtonTapped(_ sender: Any) { - delegate?.backButtonTapped() + @IBAction func closeButtonTapped(_ sender: Any) { + delegate?.closeButtonTapped() } // MARK: - Style @@ -53,8 +53,12 @@ class PrepublishingHeaderView: UIView, NibLoadable { } private func configureBackButton() { - backButtonView.isHidden = true - backButton.setImage(.gridicon(.chevronLeft, size: Constants.backButtonSize), for: .normal) + closeButtonView.isHidden = true + closeButton.setImage(.gridicon(.cross, size: Constants.backButtonSize), for: .normal) + closeButton.accessibilityHint = Constants.doubleTapToDismiss + + // Only show close button for accessibility purposes + UIAccessibility.isVoiceOverRunning ? showCloseButton() : hideCloseButton() } private func configurePublishingToLabel() { @@ -75,5 +79,6 @@ class PrepublishingHeaderView: UIView, NibLoadable { static let backButtonSize = CGSize(width: 28, height: 28) static let leftRightInset: CGFloat = 20 static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") + static let doubleTapToDismiss = NSLocalizedString("Double tap to dismiss", comment: "Voiceover accessibility hint informing the user they can double tap a modal alert to dismiss it") } } diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index ece1f9164d1d..c9be0c2a39f0 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -26,9 +26,9 @@ - + - + @@ -108,10 +108,10 @@ - - + + @@ -120,7 +120,7 @@ - + diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 910574040618..a610a3bd3d02 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -58,8 +58,13 @@ class PrepublishingViewController: UITableViewController { title = "" + header.delegate = self header.configure(post.blog) setupPublishButton() + + announcePublishButton() + + tableView.isScrollEnabled = false } override func viewWillAppear(_ animated: Bool) { @@ -181,7 +186,7 @@ class PrepublishingViewController: UITableViewController { } func didTapSchedule(_ indexPath: IndexPath) { - presentedVC?.transition(to: .hidden) + transitionIfVoiceOverDisabled(to: .hidden) SchedulingCalendarViewController.present( from: self, sourceView: tableView.cellForRow(at: indexPath)?.contentView, @@ -193,7 +198,7 @@ class PrepublishingViewController: UITableViewController { }, onDismiss: { [weak self] in self?.reloadData() - self?.presentedVC?.transition(to: .collapsed) + self?.transitionIfVoiceOverDisabled(to: .collapsed) } ) } @@ -244,6 +249,24 @@ class PrepublishingViewController: UITableViewController { reloadData() } + // MARK: - Accessibility + + private func announcePublishButton() { + DispatchQueue.main.asyncAfter(deadline: .now()) { + UIAccessibility.post(notification: .screenChanged, argument: self.publishButton) + } + } + + /// Only perform a transition if Voice Over is disabled + /// This avoids some unresponsiveness + private func transitionIfVoiceOverDisabled(to position: DrawerPosition) { + guard !UIAccessibility.isVoiceOverRunning else { + return + } + + presentedVC?.transition(to: position) + } + private enum Constants { static let reuseIdentifier = "wpTableViewCell" static let nuxButtonInsets = UIEdgeInsets(top: 20, left: 15, bottom: 20, right: 15) @@ -253,3 +276,9 @@ class PrepublishingViewController: UITableViewController { static let headerHeight: CGFloat = 80 } } + +extension PrepublishingViewController: PrepublishingHeaderViewDelegate { + func closeButtonTapped() { + dismiss(animated: true) + } +} From 73a734bf628d99508f6365e9f7f2396ff7a32429 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 16:42:31 -0300 Subject: [PATCH 122/245] Fix trailing whitespace --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 55cb47ba16ea..cc6f6ece121a 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -146,7 +146,7 @@ extension PostEditor where Self: UIViewController { fileprivate func displayPublishConfirmationAlert(for action: PostEditorAction, onPublish publishAction: @escaping () -> ()) { // End editing to avoid issues with accessibility view.endEditing(true) - + let prepublishing = PrepublishingViewController(post: post as! Post) { _ in publishAction() } From 593811610dc6952c73fe446a0ad8c2fc2042c251 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 17:14:33 -0300 Subject: [PATCH 123/245] Fix tests --- WordPress/WordPress.xcodeproj/project.pbxproj | 24 +++++++++---------- .../PrepublishingHeaderViewTests.swift | 10 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index af763703d6ed..815e25be1c57 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1052,7 +1052,6 @@ 8B05D29323AA572A0063B9AA /* GutenbergMediaEditorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */; }; 8B0732E7242B9C5200E7FBD3 /* PrepublishingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */; }; 8B0732E9242BA1F000E7FBD3 /* PrepublishingHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */; }; - 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */; }; 8B0732F0242BF7E800E7FBD3 /* Blog+Title.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */; }; 8B0732F3242BF99B00E7FBD3 /* PrepublishingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */; }; 8B158B2A243CF07F00C66823 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */; }; @@ -1077,6 +1076,7 @@ 8BC6020D2390412000EFE3D0 /* NullBlogPropertySanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC6020C2390412000EFE3D0 /* NullBlogPropertySanitizerTests.swift */; }; 8BD36E022395CAEA00EFFF1C /* MediaEditorOperation+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */; }; 8BD36E062395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */; }; + 8BE69512243E674300FF492F /* PrepublishingHeaderViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE69511243E674300FF492F /* PrepublishingHeaderViewTests.swift */; }; 8BE7C84123466927006EDE70 /* I18n.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE7C84023466927006EDE70 /* I18n.swift */; }; 8BF5F78D2421677300BE49B7 /* BottomSheetViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */; }; 8BFE36FD230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */; }; @@ -3451,7 +3451,6 @@ 8B05D29223AA572A0063B9AA /* GutenbergMediaEditorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GutenbergMediaEditorImage.swift; sourceTree = ""; }; 8B0732E6242B9C5200E7FBD3 /* PrepublishingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrepublishingHeaderView.xib; sourceTree = ""; }; 8B0732E8242BA1F000E7FBD3 /* PrepublishingHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderView.swift; sourceTree = ""; }; - 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingHeaderViewTests.swift; sourceTree = ""; }; 8B0732EE242BF6EA00E7FBD3 /* Blog+Title.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blog+Title.swift"; sourceTree = ""; }; 8B0732F1242BF97B00E7FBD3 /* PrepublishingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNavigationController.swift; sourceTree = ""; }; 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; @@ -3476,6 +3475,7 @@ 8BC6020C2390412000EFE3D0 /* NullBlogPropertySanitizerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullBlogPropertySanitizerTests.swift; sourceTree = ""; }; 8BD36E012395CAEA00EFFF1C /* MediaEditorOperation+Description.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+Description.swift"; sourceTree = ""; }; 8BD36E052395CC4400EFFF1C /* MediaEditorOperation+DescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaEditorOperation+DescriptionTests.swift"; sourceTree = ""; }; + 8BE69511243E674300FF492F /* PrepublishingHeaderViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = PrepublishingHeaderViewTests.swift; path = WordPressTest/PrepublishingHeaderViewTests.swift; sourceTree = SOURCE_ROOT; }; 8BE7C84023466927006EDE70 /* I18n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = I18n.swift; sourceTree = ""; }; 8BF5F78C2421677300BE49B7 /* BottomSheetViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewControllerTests.swift; sourceTree = ""; }; 8BFE36FC230F16580061EBA8 /* AbstractPost+fixLocalMediaURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+fixLocalMediaURLs.swift"; sourceTree = ""; }; @@ -6339,7 +6339,7 @@ 59ECF8791CB705EB00E68F25 /* Posts */ = { isa = PBXGroup; children = ( - 8B0732EB242BEF6F00E7FBD3 /* Prepublishing Nudges */, + 8BE69514243E676C00FF492F /* Prepublishing Nudges */, 59ECF87A1CB7061D00E68F25 /* PostSharingControllerTests.swift */, F18B43771F849F580089B817 /* PostAttachmentTests.swift */, 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */, @@ -7581,14 +7581,6 @@ path = "Prepublishing Nudge"; sourceTree = ""; }; - 8B0732EB242BEF6F00E7FBD3 /* Prepublishing Nudges */ = { - isa = PBXGroup; - children = ( - 8B0732EC242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift */, - ); - name = "Prepublishing Nudges"; - sourceTree = ""; - }; 8B158B28243CF05900C66823 /* Bottom Sheet */ = { isa = PBXGroup; children = ( @@ -7621,6 +7613,14 @@ name = Aztec; sourceTree = ""; }; + 8BE69514243E676C00FF492F /* Prepublishing Nudges */ = { + isa = PBXGroup; + children = ( + 8BE69511243E674300FF492F /* PrepublishingHeaderViewTests.swift */, + ); + name = "Prepublishing Nudges"; + sourceTree = ""; + }; 8BF5F78B2421676100BE49B7 /* Bottom Sheet */ = { isa = PBXGroup; children = ( @@ -13365,6 +13365,7 @@ 730354BA21C867E500CD18C2 /* SiteCreatorTests.swift in Sources */, B566EC751B83867800278395 /* NSMutableAttributedStringTests.swift in Sources */, E6B9B8AF1B94FA1C0001B92F /* ReaderStreamViewControllerTests.swift in Sources */, + 8BE69512243E674300FF492F /* PrepublishingHeaderViewTests.swift in Sources */, 40F50B82221310F000CBBB73 /* StatsTestCase.swift in Sources */, 02BE5CC02281B53F00E351BA /* RegisterDomainDetailsViewModelLoadingStateTests.swift in Sources */, 40EE948222132F5800CD264F /* PublicizeConectionStatsRecordValueTests.swift in Sources */, @@ -13389,7 +13390,6 @@ 8B7623382384373E00AB3EE7 /* PageListViewControllerTests.swift in Sources */, D88A64B0208DA093008AE9BC /* StockPhotosResultsPageTests.swift in Sources */, 0879FC161E9301DD00E1EFC8 /* MediaTests.swift in Sources */, - 8B0732ED242BEF8500E7FBD3 /* PrepublishingHeaderViewTests.swift in Sources */, B556EFCB1DCA374200728F93 /* DictionaryHelpersTests.swift in Sources */, 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */, 8BFE36FF230F1C850061EBA8 /* AbstractPost+fixLocalMediaURLsTests.swift in Sources */, diff --git a/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift b/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift index 8db8a7e68e7a..47833f7abefe 100644 --- a/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift +++ b/WordPress/WordPressTest/PrepublishingHeaderViewTests.swift @@ -10,17 +10,17 @@ class PrepublishingHeaderViewTests: XCTestCase { let delegateMock = PrepublishingHeaderViewDelegateMock() prepublishingHeaderView.delegate = delegateMock - prepublishingHeaderView.backButton.sendActions(for: .touchUpInside) + prepublishingHeaderView.closeButton.sendActions(for: .touchUpInside) - expect(delegateMock.didCallBackButtonTapped).to(beTrue()) + expect(delegateMock.didCallCloseButtonTapped).to(beTrue()) } } class PrepublishingHeaderViewDelegateMock: PrepublishingHeaderViewDelegate { - var didCallBackButtonTapped = false + var didCallCloseButtonTapped = false - func backButtonTapped() { - didCallBackButtonTapped = true + func closeButtonTapped() { + didCallCloseButtonTapped = true } } From 14f38dedabcef78a53abf2626c08874bf9df5571 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 8 Apr 2020 16:03:17 -0500 Subject: [PATCH 124/245] Fixed divider styles for PR #13840 - Update FilterTabBar.swift, set divider height to .hairlineBorderWidth instead of 0.5 - Update ReaderTabView.swift, set dividers width to .hairlineBorderWidth, set divider color to .lightGray, hide bottom divider when buttons view is hidden, to avoid double divider at the bottom --- .../Reader/Tab Navigation/ReaderTabView.swift | 12 ++++++++---- .../Classes/ViewRelated/System/FilterTabBar.swift | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 356c634258d0..93a6cc5b7c6a 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -87,6 +87,7 @@ extension ReaderTabView { return } buttonsStackView.isHidden = tabItem.shouldHideButtonsView + horizontalDivider.isHidden = tabItem.shouldHideButtonsView } private func setupButtonsView() { @@ -124,7 +125,7 @@ extension ReaderTabView { private func setupDivider(_ divider: UIView) { divider.translatesAutoresizingMaskIntoConstraints = false - divider.backgroundColor = .divider + divider.backgroundColor = Appearance.dividerColor } private func setupSettingsButton() { @@ -173,12 +174,14 @@ extension ReaderTabView { return } self.viewModel.showTab(for: tabBar.items[tabBar.selectedIndex]) - // hide/show buttons depending on the selected tab. Do not call the animation if not necessary. + // hide/show buttons depending on the selected tab. Do not execute the animation if not necessary. guard buttonsStackView.isHidden != tabItems[tabBar.selectedIndex].shouldHideButtonsView else { return } UIView.animate(withDuration: Appearance.tabBarAnimationsDuration) { - self.buttonsStackView.isHidden = tabItems[tabBar.selectedIndex].shouldHideButtonsView + let shouldHideButtons = tabItems[tabBar.selectedIndex].shouldHideButtonsView + self.buttonsStackView.isHidden = shouldHideButtons + self.horizontalDivider.isHidden = shouldHideButtons } } @@ -225,7 +228,8 @@ extension ReaderTabView { static let resetButtonInsets = UIEdgeInsets(top: 1, left: -4, bottom: -1, right: 4) static let settingsButtonWidth: CGFloat = 56 - static let dividerWidth: CGFloat = 1 + static let dividerWidth: CGFloat = .hairlineBorderWidth + static let dividerColor: UIColor = .lightGray static let verticalDividerHeightMultiplier: CGFloat = 0.6 } } diff --git a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift index e8bec0426124..1407c17d1218 100644 --- a/WordPress/Classes/ViewRelated/System/FilterTabBar.swift +++ b/WordPress/Classes/ViewRelated/System/FilterTabBar.swift @@ -456,7 +456,7 @@ class FilterTabBar: UIControl { private enum AppearanceMetrics { static let height: CGFloat = 46.0 - static let bottomDividerHeight: CGFloat = 0.5 + static let bottomDividerHeight: CGFloat = .hairlineBorderWidth static let selectionIndicatorHeight: CGFloat = 2.0 static let horizontalPadding: CGFloat = 0.0 static let buttonInsets = UIEdgeInsets(top: 14.0, left: 12.0, bottom: 14.0, right: 12.0) From 027983affdf82148325fec8127acdcb9c13677d5 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 8 Apr 2020 16:48:01 -0500 Subject: [PATCH 125/245] fix typos for PR #13840 - Update ReaderTabView.swift, fixed misspelled variable in addContentToContainerView() - Update ReaderTabViewModel.swift, removed unnecessary string interpolation in fetchReaderMenu(_:) --- .../ViewRelated/Reader/Tab Navigation/ReaderTabView.swift | 4 ++-- .../Reader/Tab Navigation/ReaderTabViewModel.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 93a6cc5b7c6a..be7baf874c5d 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -136,8 +136,8 @@ extension ReaderTabView { private func addContentToContainerView() { guard let controller = self.next as? UIViewController, - let readetTabItem = tabBar.items[tabBar.selectedIndex] as? ReaderTabItem, - let childController = viewModel.makeChildViewController(with: readetTabItem) else { + let readerTabItem = tabBar.items[tabBar.selectedIndex] as? ReaderTabItem, + let childController = viewModel.makeChildViewController(with: readerTabItem) else { return } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 2b1b256420b9..86ba10d80a6c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -63,7 +63,7 @@ extension ReaderTabViewModel { service.fetchReaderMenu(success: { [weak self] in self?.fetchTabBarItems(completion: completion) }, failure: { error in - DDLogError(ReaderTopics.remoteFetchError + "\(String(describing: error))") + DDLogError(ReaderTopics.remoteFetchError + String(describing: error)) completion(nil) }) } From 6103c4eac9c57734734a6c00c5fe1b33382a4e2b Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 8 Apr 2020 17:36:47 -0500 Subject: [PATCH 126/245] Update FeatureFlag.swift, disable flag override for .newReaderNavigation --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 5db166f11633..12f279e576e5 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -78,6 +78,8 @@ extension FeatureFlag: OverrideableFlag { return false case .floatingCreateButton: return false + case .newReaderNavigation: + return false default: return true } From 8ac0265ace918764114b3e5e00c5ce5dd4823e99 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 9 Apr 2020 09:29:40 -0300 Subject: [PATCH 127/245] Add accessiblity label in close button --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index f60fbd6fcd61..1a04ec55e4bb 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -55,6 +55,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { private func configureBackButton() { closeButtonView.isHidden = true closeButton.setImage(.gridicon(.cross, size: Constants.backButtonSize), for: .normal) + closeButton.accessibilityLabel = Constants.close closeButton.accessibilityHint = Constants.doubleTapToDismiss // Only show close button for accessibility purposes @@ -79,6 +80,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { static let backButtonSize = CGSize(width: 28, height: 28) static let leftRightInset: CGFloat = 20 static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") + static let close = NSLocalizedString("Close", comment: "Voiceover accessibility label informing the user that this button dismiss the current view") static let doubleTapToDismiss = NSLocalizedString("Double tap to dismiss", comment: "Voiceover accessibility hint informing the user they can double tap a modal alert to dismiss it") } } From 0c6379de1ad4d3b10e99f27ad15e00eab452b76d Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 9 Apr 2020 09:36:59 -0300 Subject: [PATCH 128/245] Merge hide and show close button into a single method --- .../PrepublishingHeaderView.swift | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index 1a04ec55e4bb..cf5aa273c859 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -24,17 +24,10 @@ class PrepublishingHeaderView: UIView, NibLoadable { // MARK: - Close button - func hideCloseButton() { - closeButtonView.layer.opacity = 0 - closeButtonView.isHidden = true - leadingConstraint.constant = Constants.leftRightInset - layoutIfNeeded() - } - - func showCloseButton() { - closeButtonView.layer.opacity = 1 - closeButtonView.isHidden = false - leadingConstraint.constant = 0 + func toggleCloseButton(visible: Bool) { + closeButtonView.layer.opacity = visible ? 1 : 0 + closeButtonView.isHidden = visible ? false : true + leadingConstraint.constant = visible ? 0 : Constants.leftRightInset layoutIfNeeded() } @@ -59,7 +52,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { closeButton.accessibilityHint = Constants.doubleTapToDismiss // Only show close button for accessibility purposes - UIAccessibility.isVoiceOverRunning ? showCloseButton() : hideCloseButton() + toggleCloseButton(visible: UIAccessibility.isVoiceOverRunning) } private func configurePublishingToLabel() { From 95d5eca25572f35be982df8ee77304eed0cb15c7 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 9 Apr 2020 09:13:33 -0500 Subject: [PATCH 129/245] Update after merge conflicts --- Podfile.lock | 2 +- RELEASE-NOTES.txt | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 47626c0b2e38..a40de059b06a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -719,6 +719,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 8f757fa2c0ba428e705b7ef942992892ccf3ffdd +PODFILE CHECKSUM: e64fd9bc97a3d57f97bd7a20c373dcdb2d2713d6 COCOAPODS: 1.8.4 diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 4ae9ab2e7187..9d43d01abea1 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,11 +1,7 @@ 14.7 ----- * [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. - ----- * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad - ------ 14.6 ----- From ba4e73c64f37b401d15db5f29e2900d602f862ce Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 9 Apr 2020 09:23:49 -0500 Subject: [PATCH 130/245] Point podfile to latest Auth release, 1.13.0-beta.1 --- Podfile | 4 ++-- Podfile.lock | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Podfile b/Podfile index 95373eda1ba5..6c3e05450e68 100644 --- a/Podfile +++ b/Podfile @@ -185,9 +185,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - # pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' + pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' # While in PR - pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/229-remove-showSigninV2' + # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index a40de059b06a..d3be74f6258d 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/229-remove-showSigninV2`) + - WordPressAuthenticator (~> 1.13.0-beta.1) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,6 +527,7 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS + - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -612,9 +613,6 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :branch: issue/229-remove-showSigninV2 - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -628,9 +626,6 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :commit: 56e6f1a69880c65ea550d14b368440449f6a8757 - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -719,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: e64fd9bc97a3d57f97bd7a20c373dcdb2d2713d6 +PODFILE CHECKSUM: 082f5addde6658b17532f09619ce370f79441e6b COCOAPODS: 1.8.4 From 885af3b0bf7b430c21121bafb7967f161281700f Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 18:17:09 -0300 Subject: [PATCH 131/245] Add "..." to match web labels --- WordPress/Classes/ViewRelated/Post/PostEditorState.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditorState.swift b/WordPress/Classes/ViewRelated/Post/PostEditorState.swift index de5b2d0d2c04..9bbf501fef83 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditorState.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditorState.swift @@ -35,7 +35,7 @@ public enum PostEditorAction { var publishActionLabel: String { switch self { case .publish: - return NSLocalizedString("Publish", comment: "Label for the publish (verb) button. Tapping publishes a draft post.") + return "\(NSLocalizedString("Publish", comment: "Label for the publish (verb) button. Tapping publishes a draft post."))..." case .publishNow: return NSLocalizedString("Publish Now", comment: "Title of button allowing the user to immediately publish the post they are editing.") case .save: @@ -43,9 +43,9 @@ public enum PostEditorAction { case .saveAsDraft: return NSLocalizedString("Save as Draft", comment: "Title of button allowing users to change the status of the post they are currently editing to Draft.") case .schedule: - return NSLocalizedString("Schedule", comment: "Schedule button, this is what the Publish button changes to in the Post Editor if the post has been scheduled for posting later.") + return "\(NSLocalizedString("Schedule", comment: "Schedule button, this is what the Publish button changes to in the Post Editor if the post has been scheduled for posting later."))..." case .submitForReview: - return NSLocalizedString("Submit for Review", comment: "Submit for review button label (saving content, ex: Post, Page, Comment).") + return "\(NSLocalizedString("Submit for Review", comment: "Submit for review button label (saving content, ex: Post, Page, Comment)."))..." case .update: return NSLocalizedString("Update", comment: "Update button label (saving content, ex: Post, Page, Comment).") } From 8be09dfe9471866631de23b7a584a773fec342fb Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 18:17:25 -0300 Subject: [PATCH 132/245] Fix the publish() flow --- .../WordPressUITests/Screens/Editor/AztecEditorScreen.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift index faaf7c4fafd2..d15cd4d9997d 100644 --- a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift @@ -18,7 +18,8 @@ class AztecEditorScreen: BaseScreen { private var htmlTextField = "aztec-html-text-view" let editorCloseButton = XCUIApplication().navigationBars["Azctec Editor Navigation Bar"].buttons["Close"] - let publishButton = XCUIApplication().buttons["Publish"] + let publishButton = XCUIApplication().buttons["Publish..."] + let publishNowButton = XCUIApplication().buttons["Publish Now"] let moreButton = XCUIApplication().buttons["more_post_options"] let uploadProgressBar = XCUIApplication().progressIndicators["Progress"] @@ -262,6 +263,7 @@ class AztecEditorScreen: BaseScreen { func publish() -> EditorNoticeComponent { publishButton.tap() + publishNowButton.tap() confirmPublish() return EditorNoticeComponent(withNotice: "Post published", andAction: "View") From 8d93eda135494a24cf173dc3c0b4d08084917557 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 19:02:11 -0300 Subject: [PATCH 133/245] Fix confirmation --- .../Screens/Editor/AztecEditorScreen.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift index d15cd4d9997d..8c65e5e4cbfd 100644 --- a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift @@ -263,7 +263,7 @@ class AztecEditorScreen: BaseScreen { func publish() -> EditorNoticeComponent { publishButton.tap() - publishNowButton.tap() + confirmPublish() return EditorNoticeComponent(withNotice: "Post published", andAction: "View") @@ -273,11 +273,7 @@ class AztecEditorScreen: BaseScreen { if FancyAlertComponent.isLoaded() { FancyAlertComponent().acceptAlert() } else { - if isIpad { - app.alerts.buttons["Publish"].tap() - } else { - app.sheets.buttons["Publish"].tap() - } + publishNowButton.tap() } } From ee0eb57a707e9c11df8bf7fce68b2e97281c0f76 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 19:29:28 -0300 Subject: [PATCH 134/245] Fix BlockEditor test --- .../WordPressUITests/Screens/Editor/BlockEditorScreen.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift index 3d2dcece3881..5dbfcaa4a822 100644 --- a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift @@ -133,11 +133,7 @@ class BlockEditorScreen: BaseScreen { if FancyAlertComponent.isLoaded() { FancyAlertComponent().acceptAlert() } else { - if isIpad { - app.alerts.buttons["Publish"].tap() - } else { - app.sheets.buttons["Publish"].tap() - } + publishNowButton.tap() } } From 2c8d4e5a846b328e927a78c431a188a6c84fe0db Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 19:49:03 -0300 Subject: [PATCH 135/245] Add publishNowButton reference --- .../WordPressUITests/Screens/Editor/BlockEditorScreen.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift index 5dbfcaa4a822..3fb00537545e 100644 --- a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift @@ -7,6 +7,7 @@ class BlockEditorScreen: BaseScreen { let editorNavBar = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"] let editorCloseButton = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"].buttons["Close"] let publishButton = XCUIApplication().buttons["Publish"] + let publishNowButton = XCUIApplication().buttons["Publish Now"] let moreButton = XCUIApplication().buttons["more_post_options"] // Editor area From 3d42c405be0c138e2d0c19482ed18f4ba49c1356 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 20:19:53 -0300 Subject: [PATCH 136/245] Fix publish button label --- .../WordPressUITests/Screens/Editor/BlockEditorScreen.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift index 3fb00537545e..45e78bcdf8b5 100644 --- a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift @@ -6,7 +6,7 @@ class BlockEditorScreen: BaseScreen { // Navigation bar let editorNavBar = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"] let editorCloseButton = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"].buttons["Close"] - let publishButton = XCUIApplication().buttons["Publish"] + let publishButton = XCUIApplication().buttons["Publish..."] let publishNowButton = XCUIApplication().buttons["Publish Now"] let moreButton = XCUIApplication().buttons["more_post_options"] From 3bde66d0091792eaac7e216d2c6970b47783f21a Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 21:49:47 -0300 Subject: [PATCH 137/245] Remove FancyAlert from publish flow --- .../ViewRelated/Post/PostEditor+Publish.swift | 15 +-- .../FancyAlertViewController+Async.swift | 111 ------------------ .../FancyAlertViewController+SavedPosts.swift | 2 + WordPress/WordPress.xcodeproj/project.pbxproj | 4 - 4 files changed, 3 insertions(+), 129 deletions(-) delete mode 100644 WordPress/Classes/ViewRelated/System/FancyAlertViewController+Async.swift diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index cc6f6ece121a..38bbfde7b618 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -97,20 +97,7 @@ extension PostEditor where Self: UIViewController { } } - let promoBlock = { [unowned self] in - UserDefaults.standard.asyncPromoWasDisplayed = true - - let controller = FancyAlertViewController.makeAsyncPostingAlertController(action: action, isPage: isPage, onConfirm: publishBlock) - controller.modalPresentationStyle = .custom - controller.transitioningDelegate = self - self.present(controller, animated: true, completion: nil) - } - - - if action.isAsync && - !UserDefaults.standard.asyncPromoWasDisplayed { - promoBlock() - } else if action.isAsync, + if action.isAsync, let postStatus = self.post.original?.status ?? self.post.status, ![.publish, .publishPrivate].contains(postStatus) { // Only display confirmation alert for unpublished posts diff --git a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+Async.swift b/WordPress/Classes/ViewRelated/System/FancyAlertViewController+Async.swift deleted file mode 100644 index b96817d4859e..000000000000 --- a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+Async.swift +++ /dev/null @@ -1,111 +0,0 @@ -import UIKit -import SafariServices - -private protocol AlertStrings { - static var titleText: String { get } - static var bodyText: String { get } - static var confirmTitle: String { get } -} - -extension FancyAlertViewController { - - typealias ButtonConfig = FancyAlertViewController.Config.ButtonConfig - - private struct PublishPostStrings: AlertStrings { - static let titleText = NSLocalizedString("Publish with Confidence", comment: "Title of alert informing users about the async publishing feature.") - static let bodyText = NSLocalizedString("You can now leave the editor and your post will save and publish behind the scenes! Give it a try!", comment: "Body text of alert informing users about the async publishing feature.") - static let confirmTitle = NSLocalizedString("Publish Now", comment: "Publish button shown in alert informing users about the async publishing feature.") - } - - private struct SchedulePostStrings: AlertStrings { - static let titleText = NSLocalizedString("Schedule with Confidence", comment: "Title of alert informing users about the async publishing feature, when scheduling a post.") - static let bodyText = NSLocalizedString("You can now leave the editor and your post will save and schedule behind the scenes! Give it a try!", comment: "Body text of alert informing users about the async publishing feature, when scheduling a post.") - static let confirmTitle = NSLocalizedString("Schedule Now", comment: "Schedule button shown in alert informing users about the async publishing feature.") - } - - private struct PublishPageStrings: AlertStrings { - static let titleText = NSLocalizedString("Publish with Confidence", comment: "Title of alert informing users about the async publishing feature.") - static let bodyText = NSLocalizedString("You can now leave the editor and your page will save and publish behind the scenes! Give it a try!", comment: "Body text of alert informing users about the async publishing feature, when publishing a page.") - static let confirmTitle = NSLocalizedString("Publish Now", comment: "Publish button shown in alert informing users about the async publishing feature.") - } - - private struct SchedulePageStrings: AlertStrings { - static let titleText = NSLocalizedString("Schedule with Confidence", comment: "Title of alert informing users about the async publishing feature, when scheduling a page.") - static let bodyText = NSLocalizedString("You can now leave the editor and your page will save and schedule behind the scenes! Give it a try!", comment: "Body text of alert informing users about the async publishing feature, when scheduling a page.") - static let confirmTitle = NSLocalizedString("Schedule Now", comment: "Schedule button shown in alert informing users about the async publishing feature.") - } - - private struct GeneralStrings { - static let keepEditingTitle = NSLocalizedString("Keep Editing", comment: "Button title shown in alert informing users about the async publishing feature.") - static let moreHelpTitle = NSLocalizedString("How does it work?", comment: "Title of the more help button on alert helping users understand their site address") - } - - static func makeAsyncPostingAlertController(action: PostEditorAction, isPage: Bool, onConfirm: @escaping (() -> Void)) -> FancyAlertViewController { - let strings = self.strings(for: action, isPage: isPage) - - let confirmButton = ButtonConfig(strings.confirmTitle) { controller, _ in - controller.dismiss(animated: true, completion: { - onConfirm() - }) - } - - let dismissButton = ButtonConfig(GeneralStrings.keepEditingTitle) { controller, _ in - controller.dismiss(animated: true) - } - - let moreHelpButton = ButtonConfig(GeneralStrings.moreHelpTitle) { controller, _ in - guard let url = URL(string: "http://en.blog.wordpress.com/2018/04/23/ios-nine-point-eight/") else { - return - } - - let safariViewController = SFSafariViewController(url: url) - safariViewController.modalPresentationStyle = .pageSheet - controller.present(safariViewController, animated: true) - } - - let image = UIImage(named: "wp-illustration-easy-async") - - let config = FancyAlertViewController.Config(titleText: strings.titleText, - bodyText: strings.bodyText, - headerImage: image, - dividerPosition: .bottom, - defaultButton: confirmButton, - cancelButton: dismissButton, - moreInfoButton: moreHelpButton, - titleAccessoryButton: nil, - dismissAction: {}) - - let controller = FancyAlertViewController.controllerWithConfiguration(configuration: config) - return controller - } - - private static func strings(for action: PostEditorAction, isPage: Bool) -> AlertStrings.Type { - switch (action, isPage) { - case (.schedule, true): - return SchedulePageStrings.self - case (.schedule, false): - return SchedulePostStrings.self - case (_, true): - return PublishPageStrings.self - case (_, false): - return PublishPostStrings.self - } - } -} - -// MARK: - User Defaults - -extension UserDefaults { - private enum Keys: String { - case asyncPromoWasDisplayed = "AsyncPromoWasDisplayed" - } - - var asyncPromoWasDisplayed: Bool { - get { - return bool(forKey: Keys.asyncPromoWasDisplayed.rawValue) - } - set { - set(newValue, forKey: Keys.asyncPromoWasDisplayed.rawValue) - } - } -} diff --git a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift b/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift index 334a314c32f2..3c0691b533b9 100644 --- a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift +++ b/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift @@ -2,6 +2,8 @@ import UIKit import Gridicons extension FancyAlertViewController { + typealias ButtonConfig = FancyAlertViewController.Config.ButtonConfig + private struct Strings { static let titleText = NSLocalizedString("Save Posts for Later", comment: "Title of alert informing users about the Reader Save for Later feature.") static let bodyText = NSLocalizedString("Save this post, and come back to read it whenever you'd like. It will only be available on this device — saved posts don't sync to other devices.", comment: "Body text of alert informing users about the Reader Save for Later feature.") diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 815e25be1c57..b35481cf725f 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -143,7 +143,6 @@ 1714F8D020E6DA8900226DCB /* RouteMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1714F8CF20E6DA8900226DCB /* RouteMatcher.swift */; }; 1715179220F4B2EB002C4A38 /* Routes+Stats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715179120F4B2EB002C4A38 /* Routes+Stats.swift */; }; 1715179420F4B5CD002C4A38 /* MySitesCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1715179320F4B5CD002C4A38 /* MySitesCoordinator.swift */; }; - 171909E4206CFFCD0054DF0B /* FancyAlertViewController+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171909E3206CFFCD0054DF0B /* FancyAlertViewController+Async.swift */; }; 171963401D378D5100898E8B /* SearchWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1719633F1D378D5100898E8B /* SearchWrapperView.swift */; }; 1724DDC81C60F1200099D273 /* PlanDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1724DDC71C60F1200099D273 /* PlanDetailViewController.swift */; }; 1724DDCC1C6121D00099D273 /* Plans.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1724DDCB1C6121D00099D273 /* Plans.storyboard */; }; @@ -2466,7 +2465,6 @@ 1714F8CF20E6DA8900226DCB /* RouteMatcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteMatcher.swift; sourceTree = ""; }; 1715179120F4B2EB002C4A38 /* Routes+Stats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Routes+Stats.swift"; sourceTree = ""; }; 1715179320F4B5CD002C4A38 /* MySitesCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySitesCoordinator.swift; sourceTree = ""; }; - 171909E3206CFFCD0054DF0B /* FancyAlertViewController+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FancyAlertViewController+Async.swift"; sourceTree = ""; }; 1719633F1D378D5100898E8B /* SearchWrapperView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchWrapperView.swift; sourceTree = ""; }; 1724DDC71C60F1200099D273 /* PlanDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlanDetailViewController.swift; sourceTree = ""; }; 1724DDCB1C6121D00099D273 /* Plans.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Plans.storyboard; sourceTree = ""; }; @@ -5273,7 +5271,6 @@ isa = PBXGroup; children = ( 405B53FA1F83C369002E19BF /* FancyAlerts+VerificationPrompt.swift */, - 171909E3206CFFCD0054DF0B /* FancyAlertViewController+Async.swift */, 176BB87E20D0068500751DCE /* FancyAlertViewController+SavedPosts.swift */, 4319AADD2090F00C0025D68E /* FancyAlertViewController+NotificationPrimer.swift */, 43290CF3214F755400F6B398 /* FancyAlertViewController+QuickStart.swift */, @@ -12726,7 +12723,6 @@ CE46018B21139E8300F242B6 /* FooterTextContent.swift in Sources */, B5EEDB971C91F10400676B2B /* Blog+Interface.swift in Sources */, 5D839AA8187F0D6B00811F4A /* PostFeaturedImageCell.m in Sources */, - 171909E4206CFFCD0054DF0B /* FancyAlertViewController+Async.swift in Sources */, FFCB9F4B22A125BD0080A45F /* WPException.m in Sources */, 9A9E3FAD230E9DD000909BC4 /* StatsGhostCells.swift in Sources */, E14DF70620C922F200959BA9 /* NotificationCenter+ObserveOnce.swift in Sources */, From 6111dd74553f062803b0236ecbc15d20f0541126 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 8 Apr 2020 21:54:55 -0300 Subject: [PATCH 138/245] Fix trailing_whitespace --- .../System/FancyAlertViewController+SavedPosts.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift b/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift index 3c0691b533b9..26a8cf8e14a9 100644 --- a/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift +++ b/WordPress/Classes/ViewRelated/System/FancyAlertViewController+SavedPosts.swift @@ -3,7 +3,7 @@ import Gridicons extension FancyAlertViewController { typealias ButtonConfig = FancyAlertViewController.Config.ButtonConfig - + private struct Strings { static let titleText = NSLocalizedString("Save Posts for Later", comment: "Title of alert informing users about the Reader Save for Later feature.") static let bodyText = NSLocalizedString("Save this post, and come back to read it whenever you'd like. It will only be available on this device — saved posts don't sync to other devices.", comment: "Body text of alert informing users about the Reader Save for Later feature.") From ac2c6c9e73ecda952b04b401e9e32c5d1ca34a1a Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Thu, 9 Apr 2020 12:50:21 -0500 Subject: [PATCH 139/245] Update WPContentSyncHelper.swift, force resyncing when switching to a different topic --- WordPress/Classes/Utility/WPContentSyncHelper.swift | 4 ++-- .../ViewRelated/Reader/ReaderStreamViewController.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/Utility/WPContentSyncHelper.swift b/WordPress/Classes/Utility/WPContentSyncHelper.swift index e8cc95495667..b936097729f4 100644 --- a/WordPress/Classes/Utility/WPContentSyncHelper.swift +++ b/WordPress/Classes/Utility/WPContentSyncHelper.swift @@ -47,8 +47,8 @@ class WPContentSyncHelper: NSObject { } - @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool) -> Bool { - if isSyncing { + @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool, forceSync: Bool = true) -> Bool { + if isSyncing && !forceSync { return false } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 26c9d4ca85b0..3258288b9a4c 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -810,7 +810,7 @@ import WordPressFlux let lastSynced = topic.lastSynced ?? Date(timeIntervalSince1970: 0) let interval = Int( Date().timeIntervalSince(lastSynced)) if canSync() && (interval >= refreshInterval || topic.posts.count == 0) { - syncHelper.syncContentWithUserInteraction(false) + syncHelper.syncContentWithUserInteraction(false, forceSync: true) } else { handleConnectionError() } From 83c2812605e234eea3c1076fcf149953799d43c5 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Thu, 9 Apr 2020 22:30:41 -0500 Subject: [PATCH 140/245] Update ReaderStreamViewController.swift, add syncHelpers dictionary, update syncHelper to computed property to allow syncing more than one topic in the same instance - Update WPContentSyncHelper.swift, remove parameter forceSync from method syncContentWithUserInteraction --- .../Classes/Utility/WPContentSyncHelper.swift | 4 +- .../Reader/ReaderStreamViewController.swift | 61 ++++++++++++------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/WordPress/Classes/Utility/WPContentSyncHelper.swift b/WordPress/Classes/Utility/WPContentSyncHelper.swift index b936097729f4..e8cc95495667 100644 --- a/WordPress/Classes/Utility/WPContentSyncHelper.swift +++ b/WordPress/Classes/Utility/WPContentSyncHelper.swift @@ -47,8 +47,8 @@ class WPContentSyncHelper: NSObject { } - @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool, forceSync: Bool = true) -> Bool { - if isSyncing && !forceSync { + @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool) -> Bool { + if isSyncing { return false } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 3258288b9a4c..f34f6d4e7df9 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -30,7 +30,26 @@ import WordPressFlux return tableViewController.tableView } - private var syncHelper: WPContentSyncHelper! + private var syncHelpers: [ReaderAbstractTopic: WPContentSyncHelper] = [:] + + private var syncHelper: WPContentSyncHelper? { + guard let topic = readerTopic else { + return nil + } + syncHelpers.forEach { + $0.value.delegate = nil + } + + let currentHelper = syncHelpers[topic] ?? WPContentSyncHelper() + + if syncHelpers[topic] == nil { + syncHelpers[topic] = currentHelper + } + + currentHelper.delegate = self + return currentHelper + } + private var resultsStatusView = NoResultsViewController.controller() private lazy var footerView: PostListFooterView = { @@ -115,6 +134,9 @@ import WordPressFlux if readerTopic != nil && readerTopic != oldValue { if didSetupView { configureControllerForTopic() + if let syncHelper = syncHelper, syncHelper.isSyncing, !isShowingResultStatusView { + displayLoadingView() + } } // Discard the siteID (if there was one) now that we have a good topic siteID = nil @@ -243,7 +265,6 @@ import WordPressFlux setupTableView() setupFooterView() setupContentHandler() - setupSyncHelper() setupResultsStatusView() observeNetworkStatus() @@ -408,11 +429,6 @@ import WordPressFlux content.initializeContent(tableView: tableView, delegate: self) } - private func setupSyncHelper() { - syncHelper = WPContentSyncHelper() - syncHelper.delegate = self - } - private func setupResultsStatusView() { resultsStatusView.delegate = self } @@ -506,7 +522,7 @@ import WordPressFlux let count = content.contentCount // Make sure we're showing the no results view if appropriate - if !syncHelper.isSyncing && count == 0 { + if let syncHelper = syncHelper, !syncHelper.isSyncing && count == 0 { displayNoResultsView() } @@ -724,7 +740,7 @@ import WordPressFlux return } - syncHelper.syncContentWithUserInteraction(true) + syncHelper?.syncContentWithUserInteraction(true) } @@ -810,7 +826,7 @@ import WordPressFlux let lastSynced = topic.lastSynced ?? Date(timeIntervalSince1970: 0) let interval = Int( Date().timeIntervalSince(lastSynced)) if canSync() && (interval >= refreshInterval || topic.posts.count == 0) { - syncHelper.syncContentWithUserInteraction(false, forceSync: true) + syncHelper?.syncContentWithUserInteraction(false) } else { handleConnectionError() } @@ -850,7 +866,7 @@ import WordPressFlux return } - if syncHelper.isSyncing { + if let syncHelper = syncHelper, syncHelper.isSyncing { let alertTitle = NSLocalizedString("Busy", comment: "Title of a prompt letting the user know that they must wait until the current aciton completes.") let alertMessage = NSLocalizedString("Please wait til the current fetch completes.", comment: "Asks the usre to wait until the currently running fetch request completes.") let cancelTitle = NSLocalizedString("OK", comment: "Title of a button that dismisses a prompt") @@ -864,7 +880,7 @@ import WordPressFlux } indexPathForGapMarker = indexPath syncIsFillingGap = true - syncHelper.syncContentWithUserInteraction(true) + syncHelper?.syncContentWithUserInteraction(true) } @@ -1122,7 +1138,7 @@ import WordPressFlux let service = ReaderTopicService(managedObjectContext: topic.managedObjectContext!) service.toggleFollowing(forTag: topic, success: { [weak self] in - self?.syncHelper.syncContent() + self?.syncHelper?.syncContent() }, failure: { [weak self] (error: Error?) in generator.notificationOccurred(.error) self?.updateStreamHeaderIfNeeded() @@ -1150,7 +1166,7 @@ import WordPressFlux let service = ReaderTopicService(managedObjectContext: topic.managedObjectContext!) service.toggleFollowing(forSite: topic, success: { [weak self] in - self?.syncHelper.syncContent() + self?.syncHelper?.syncContent() if toFollow { self?.dispatchSubscribingNotificationNotice(with: siteTitle, siteID: siteID) } @@ -1217,7 +1233,11 @@ extension ReaderStreamViewController: NewsManagerDelegate { extension ReaderStreamViewController: WPContentSyncHelperDelegate { func syncHelper(_ syncHelper: WPContentSyncHelper, syncContentWithUserInteraction userInteraction: Bool, success: ((_ hasMore: Bool) -> Void)?, failure: ((_ error: NSError) -> Void)?) { - displayLoadingViewIfNeeded() + guard content.isEmpty else { + return + } + displayLoadingView() + if syncIsFillingGap { syncItemsForGap(success, failure: failure) } else { @@ -1321,7 +1341,7 @@ extension ReaderStreamViewController: WPTableViewHandlerDelegate { func tableViewHandlerDidRefreshTableViewPreservingOffset(_ tableViewHandler: WPTableViewHandler) { hideResultsStatus() if tableViewHandler.resultsController.fetchedObjects?.count == 0 { - if syncHelper.isSyncing { + if let syncHelper = syncHelper, syncHelper.isSyncing { return } displayNoResultsView() @@ -1407,7 +1427,7 @@ extension ReaderStreamViewController: WPTableViewHandlerDelegate { // - there is more content, // - when we are not alrady syncing // - when we are not waiting for scrolling to end to cleanup and refresh the list - if syncHelper.hasMoreContent && !syncHelper.isSyncing && !cleanupAndRefreshAfterScrolling { + if let syncHelper = syncHelper, syncHelper.hasMoreContent && !syncHelper.isSyncing && !cleanupAndRefreshAfterScrolling { syncHelper.syncMoreContent() } } @@ -1527,11 +1547,7 @@ private extension ReaderStreamViewController { displayResultsStatus() } - func displayLoadingViewIfNeeded() { - if content.contentCount > 0 { - return - } - + private func displayLoadingView() { tableView.tableHeaderView?.isHidden = true configureResultsStatus(title: ResultsStatusText.fetchingPostsTitle, accessoryView: NoResultsViewController.loadingAccessoryView()) displayResultsStatus() @@ -1576,6 +1592,7 @@ private extension ReaderStreamViewController { func displayResultsStatus() { resultsStatusView.removeFromView() + tableViewController.addChild(resultsStatusView) tableView.insertSubview(resultsStatusView.view, belowSubview: refreshControl) resultsStatusView.view.frame = tableView.frame resultsStatusView.didMove(toParent: tableViewController) From 208f747e204ceb8af7b0657970071c735c54a40c Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Thu, 9 Apr 2020 23:10:45 -0500 Subject: [PATCH 141/245] Update ReaderStreamViewController.swift, move delegate assignment to syncHelper in readerTopic, so that it gets reassigned only when the topic chahges --- .../Reader/ReaderStreamViewController.swift | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index f34f6d4e7df9..5ad36e301935 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -36,17 +36,11 @@ import WordPressFlux guard let topic = readerTopic else { return nil } - syncHelpers.forEach { - $0.value.delegate = nil - } - let currentHelper = syncHelpers[topic] ?? WPContentSyncHelper() if syncHelpers[topic] == nil { syncHelpers[topic] = currentHelper } - - currentHelper.delegate = self return currentHelper } @@ -124,7 +118,11 @@ import WordPressFlux /// The topic can be nil while a site or tag topic is being fetched, hence, optional. @objc var readerTopic: ReaderAbstractTopic? { didSet { - oldValue?.inUse = false + if let oldValue = oldValue { + oldValue.inUse = false + syncHelpers[oldValue]?.delegate = nil + } + syncHelper?.delegate = self if let newTopic = readerTopic { newTopic.inUse = true From a3d486541c733c5921f5583be164371bd522b8ce Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Fri, 10 Apr 2020 13:11:32 +0200 Subject: [PATCH 142/245] Bump version number --- config/Version.internal.xcconfig | 2 +- config/Version.public.xcconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/Version.internal.xcconfig b/config/Version.internal.xcconfig index 35885f89d5da..007bbd02e834 100644 --- a/config/Version.internal.xcconfig +++ b/config/Version.internal.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=14.6 // Internal long version example: VERSION_LONG=9.9.0.20180423 -VERSION_LONG=14.6.0.20200406 +VERSION_LONG=14.6.0.20200410 diff --git a/config/Version.public.xcconfig b/config/Version.public.xcconfig index 0c85c8995b22..a65b8d686918 100644 --- a/config/Version.public.xcconfig +++ b/config/Version.public.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=14.6 // Public long version example: VERSION_LONG=9.9.0.0 -VERSION_LONG=14.6.0.0 +VERSION_LONG=14.6.0.1 From e14f888ab7efd7386d71d18643332c24a680680d Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 10 Apr 2020 12:32:22 -0600 Subject: [PATCH 143/245] Constraint Quick Actions Max Width --- .../Blog Details/Detail Header/NewBlogDetailHeaderView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift index 114b271481ac..5e4f4ef4db63 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift @@ -125,9 +125,11 @@ class NewBlogDetailHeaderView: UIView { let edgeConstraints = [ leadingSafeAreaConstraint, - stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor), + stackView.trailingAnchor.constraint(lessThanOrEqualTo: layoutMarginsGuide.trailingAnchor), stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor, constant: Constants.minimumSideSpacing), stackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.interSectionSpacing), + stackView.centerXAnchor.constraint(equalTo: layoutMarginsGuide.centerXAnchor), + stackView.widthAnchor.constraint(lessThanOrEqualToConstant: 500), buttonsStackView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: Constants.interSectionSpacing), buttonsStackView.centerXAnchor.constraint(equalTo: stackView.centerXAnchor), bottomConstraint From 3a735c0c858971046d936c48716e59b08de6474a Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 10 Apr 2020 14:22:48 -0500 Subject: [PATCH 144/245] Update ReaderStreamViewController.swift, fix wrong check in syncContentWithUserInteraction --- .../ViewRelated/Reader/ReaderStreamViewController.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 5ad36e301935..3566876c5528 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -1231,10 +1231,9 @@ extension ReaderStreamViewController: NewsManagerDelegate { extension ReaderStreamViewController: WPContentSyncHelperDelegate { func syncHelper(_ syncHelper: WPContentSyncHelper, syncContentWithUserInteraction userInteraction: Bool, success: ((_ hasMore: Bool) -> Void)?, failure: ((_ error: NSError) -> Void)?) { - guard content.isEmpty else { - return + if content.isEmpty { + displayLoadingView() } - displayLoadingView() if syncIsFillingGap { syncItemsForGap(success, failure: failure) From 044ed63a524041f1cb2bfbe3b86bf79349cad8a5 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 10 Apr 2020 14:25:25 -0500 Subject: [PATCH 145/245] Update FeatureFlag.swift, reverted newReaderNavigation feature flag back to false --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 12f279e576e5..5f53330e1b44 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] + return false } } } From c27564d956327d0a093a8c928adc6ef62a911b5c Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 10 Apr 2020 14:46:48 -0500 Subject: [PATCH 146/245] Update WPContentSyncHelper.swift, fixed forceSync default value in syncContentWithUserInteraction(_:, _:) method - Update ReaderStreamViewController.swift, set forceSync to true only if FeatureFlag.newReaderNavigation is enabled, in syncIfAppropriate() method --- WordPress/Classes/Utility/WPContentSyncHelper.swift | 2 +- .../Classes/ViewRelated/Reader/ReaderStreamViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/Utility/WPContentSyncHelper.swift b/WordPress/Classes/Utility/WPContentSyncHelper.swift index b936097729f4..7a8e074ea8d8 100644 --- a/WordPress/Classes/Utility/WPContentSyncHelper.swift +++ b/WordPress/Classes/Utility/WPContentSyncHelper.swift @@ -47,7 +47,7 @@ class WPContentSyncHelper: NSObject { } - @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool, forceSync: Bool = true) -> Bool { + @objc @discardableResult func syncContentWithUserInteraction(_ userInteraction: Bool, forceSync: Bool = false) -> Bool { if isSyncing && !forceSync { return false } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 3258288b9a4c..e6b3f528deef 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -810,7 +810,7 @@ import WordPressFlux let lastSynced = topic.lastSynced ?? Date(timeIntervalSince1970: 0) let interval = Int( Date().timeIntervalSince(lastSynced)) if canSync() && (interval >= refreshInterval || topic.posts.count == 0) { - syncHelper.syncContentWithUserInteraction(false, forceSync: true) + syncHelper.syncContentWithUserInteraction(false, forceSync: FeatureFlag.newReaderNavigation.enabled) } else { handleConnectionError() } From a2ff8b5abf87b15d831e7bec1dca82ee77dccbe5 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 10 Apr 2020 14:24:34 -0600 Subject: [PATCH 147/245] 13581: Create Filter Sheet This adds the Create Filter Sheet control --- .../Reader/Filter/FilterProvider.swift | 165 ++++++++++++++++++ .../Reader/Filter/FilterSheetView.swift | 143 +++++++++++++++ .../Filter/FilterSheetViewController.swift | 26 +++ .../Reader/Filter/FilterTableData.swift | 50 ++++++ .../Reader/Tab Navigation/ReaderTabView.swift | 12 +- .../ReaderTabViewController.swift | 9 + .../Tab Navigation/ReaderTabViewModel.swift | 11 +- WordPress/WordPress.xcodeproj/project.pbxproj | 28 ++- 8 files changed, 434 insertions(+), 10 deletions(-) create mode 100644 WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift create mode 100644 WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift create mode 100644 WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift create mode 100644 WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift new file mode 100644 index 000000000000..b8c2c42ee627 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift @@ -0,0 +1,165 @@ +import WordPressFlux + +class FilterProvider: Observable, FilterTabBarItem { + + enum State { + case loading + case ready([TableDataItem]) + case error(Error) + + var isReady: Bool { + switch self { + case .ready: + return true + case .error, .loading: + return false + } + } + } + + var title: String { + return titleFunc(state) + } + + var state: State = .loading { + didSet { + emitChange() + } + } + + var items: [TableDataItem] { + switch state { + case .loading, .error: + return [] + case .ready(let items): + return items + } + } + + let accessibilityIdentifier: String + + let cellClass: UITableViewCell.Type + let reuseIdentifier: String + + private let titleFunc: (State?) -> String + + let changeDispatcher = Dispatcher() + + init(title: @escaping (State?) -> String, + accessibilityIdentifier: String, + cellClass: UITableViewCell.Type, + reuseIdentifier: String, + provider: (@escaping (Result<[TableDataItem], Error>) -> Void) -> Void) { + + titleFunc = title + self.accessibilityIdentifier = accessibilityIdentifier + self.cellClass = cellClass + self.reuseIdentifier = reuseIdentifier + + provider() { [weak self] result in + switch result { + case .success(let items): + self?.state = .ready(items) + case .failure(let error): + self?.state = .error(error) + } + } + } +} + +extension ReaderSiteTopic { + + static func filterProvider() -> FilterProvider { + let titleFunction: (FilterProvider.State?) -> String = { state in + switch state { + case .loading, .error, .none: + return NSLocalizedString("Sites", comment: "Sites Filter Tab Title") + case .ready(let items): + return String(format: NSLocalizedString("Sites (%lu)", comment: "Sites Filter Tab Title with Count"), items.count) + } + } + return FilterProvider(title: titleFunction, + accessibilityIdentifier: "SitesFilterTab", + cellClass: SiteTableViewCell.self, + reuseIdentifier: "Sites", + provider: tableProvider) + } + + private static func tableProvider(completion: @escaping (Result<[TableDataItem], Error>) -> Void) { + fetchFollowedSites(completion: { result in + let itemResult = result.map { sites in + sites.map { topic in + return TableDataItem(topic: topic, configure: { cell in + cell.textLabel?.text = topic.title + cell.detailTextLabel?.text = topic.siteURL + }) + } + } + completion(itemResult) + }) + } + + private static func fetchFollowedSites(completion: @escaping (Result<[ReaderSiteTopic], Error>) -> Void) { + let siteService = ReaderTopicService(managedObjectContext: ContextManager.sharedInstance().mainContext) + + siteService.fetchFollowedSites(success: { + completion(.success(siteService.allSiteTopics())) + }, failure: { error in + let unknownRestAPIError = NSError(domain: WordPressComRestApiErrorDomain, code: -1, userInfo: nil) + completion(.failure(error ?? unknownRestAPIError)) + DDLogError("Could not sync sites: \(String(describing: error))") + }) + } +} + +extension ReaderTagTopic { + + static func filterProvider() -> FilterProvider { + let titleFunction: (FilterProvider.State?) -> String = { state in + switch state { + case .loading, .error, .none: + return NSLocalizedString("Tags", comment: "Tags Filter Tab Title") + case .ready(let items): + return String(format: NSLocalizedString("Tags (%lu)", comment: "Tags Filter Tab Title with Count"), items.count) + } + } + return FilterProvider(title: titleFunction, + accessibilityIdentifier: "TagsFilterTab", + cellClass: UITableViewCell.self, + reuseIdentifier: "Tags", + provider: tableProvider) + } + + private static func tableProvider(completion: @escaping (Result<[TableDataItem], Error>) -> Void) { + fetchFollowedTags(completion: { result in + let itemResult = result.map { tags in + tags.map { topic in + return TableDataItem(topic: topic, configure: { (cell) in + cell.textLabel?.text = topic.slug + }) + } + } + completion(itemResult) + }) + } + + private static var tagsFetchRequest: NSFetchRequest { + let fetchRequest = NSFetchRequest(entityName: "ReaderTagTopic") + fetchRequest.predicate = NSPredicate(format: "following == %@ AND showInMenu == YES AND type == 'tag'", + NSNumber(value: ReaderHelpers.isLoggedIn())) + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare))] + return fetchRequest + } + + private static func fetchFollowedTags(completion: @escaping (Result<[ReaderTagTopic], Error>) -> Void) { + do { + guard let topics = try ContextManager.sharedInstance().mainContext.fetch(tagsFetchRequest) as? [ReaderTagTopic] else { + return + } + completion(.success(topics)) + } catch { + DDLogError("There was a problem fetching followed tags." + error.localizedDescription) + completion(.failure(error)) + } + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift new file mode 100644 index 000000000000..4bd91dd02cc3 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift @@ -0,0 +1,143 @@ +import WordPressFlux + +class FilterSheetView: UIView { + + enum Constants { + enum Header { + static let spacing: CGFloat = 16 + static let insets: UIEdgeInsets = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18) + static let title = NSLocalizedString("Following", comment: "Title for Reader Filter Sheet") + static let font = WPStyleGuide.fontForTextStyle(.headline) + } + } + + // MARK: View Setup + + lazy var tableView: UITableView = { + let tableView = UITableView() + tableView.tableFooterView = UIView() // To hide the separators for empty cells + tableView.delegate = self + return tableView + }() + + lazy var ghostableTableView: UITableView = { + let ghostTV = UITableView() + ghostTV.isScrollEnabled = false + return ghostTV + }() + + lazy var filterTabBar: FilterTabBar = { + let tabBar = FilterTabBar() + WPStyleGuide.configureFilterTabBar(tabBar) + tabBar.tabSizingStyle = .equalWidths + tabBar.addTarget(self, action: #selector(FilterSheetView.changedTab(_:)), for: .valueChanged) + return tabBar + }() + + lazy var headerLabelView: UIView = { + let labelView = UIView() + let label = UILabel() + label.font = Constants.Header.font + label.text = Constants.Header.title + label.translatesAutoresizingMaskIntoConstraints = false + labelView.addSubview(label) + labelView.pinSubviewToAllEdges(label, insets: Constants.Header.insets) + return labelView + }() + + lazy var stackView: UIStackView = { + let stack = UIStackView(arrangedSubviews: [ + headerLabelView, + filterTabBar, + tableView, + ghostableTableView + ]) + + stack.setCustomSpacing(Constants.Header.spacing, after: headerLabelView) + stack.axis = .vertical + stack.translatesAutoresizingMaskIntoConstraints = false + return stack + }() + + // MARK: Properties + + private var subscriptions: [Receipt]? + private var changedFilter: (ReaderAbstractTopic) -> Void + private var dataSource: FilterTableViewDataSource? { + didSet { + tableView.dataSource = dataSource + tableView.reloadData() + } + } + + private var selectedFilter: FilterProvider? { + set { + if let filter = newValue { + dataSource = FilterTableViewDataSource(data: filter.items, reuseIdentifier: filter.reuseIdentifier) + if filter.state.isReady == false { + tableView.isHidden = true + updateGhostableTableViewOptions(cellClass: filter.cellClass, identifier: filter.reuseIdentifier) + } else { + ghostableTableView.stopGhostAnimation() + ghostableTableView.isHidden = true + tableView.isHidden = false + } + } + } + get { + return filterTabBar.items[filterTabBar.selectedIndex] as? FilterProvider + } + } + + // MARK: Methods + + init(filters: [FilterProvider], changedFilter: @escaping (ReaderAbstractTopic) -> Void) { + self.changedFilter = changedFilter + super.init(frame: .zero) + + filterTabBar.items = filters + filters.forEach { filter in + tableView.register(filter.cellClass, forCellReuseIdentifier: filter.reuseIdentifier) + } + selectedFilter = filters.first + + addSubview(stackView) + pinSubviewToAllEdges(stackView) + + subscriptions = filters.map() { filter in + filter.onChange() { [weak self] in + if self?.selectedFilter?.accessibilityIdentifier == filter.accessibilityIdentifier { + self?.selectedFilter = filter + } + self?.filterTabBar.items = filters + } + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func updateGhostableTableViewOptions(cellClass: UITableViewCell.Type, identifier: String) { + ghostableTableView.register(cellClass, forCellReuseIdentifier: identifier) + let ghostOptions = GhostOptions(displaysSectionHeader: false, reuseIdentifier: identifier, rowsPerSection: [15]) + let style = GhostStyle(beatDuration: GhostStyle.Defaults.beatDuration, + beatStartColor: .placeholderElement, + beatEndColor: .placeholderElementFaded) + ghostableTableView.removeGhostContent() + ghostableTableView.isHidden = false + ghostableTableView.displayGhostContent(options: ghostOptions, style: style) + } + + @objc func changedTab(_ sender: FilterTabBar) { + selectedFilter = filterTabBar.items[sender.selectedIndex] as? FilterProvider + } +} + +extension FilterSheetView: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let topic = dataSource?.data[indexPath.row].topic { + changedFilter(topic) + } + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift new file mode 100644 index 000000000000..7862a9b23bf3 --- /dev/null +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift @@ -0,0 +1,26 @@ +class FilterSheetViewController: UIViewController { + + private let filters: [FilterProvider] + private let changedFilter: (ReaderAbstractTopic) -> Void + + //TODO: Make changedFilter generic + init(filters: [FilterProvider], changedFilter: @escaping (ReaderAbstractTopic) -> Void) { + self.filters = filters + self.changedFilter = changedFilter + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + view = FilterSheetView(filters: filters, changedFilter: changedFilter) + } +} + +extension FilterSheetViewController: DrawerPresentable { + var scrollableView: UIScrollView? { + return (view as? FilterSheetView)?.tableView + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift new file mode 100644 index 000000000000..b19e18a75ced --- /dev/null +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift @@ -0,0 +1,50 @@ +struct TableDataItem { + let topic: ReaderAbstractTopic + let configure: (UITableViewCell) -> Void +} + +class FilterTableViewDataSource: NSObject, UITableViewDataSource { + + let data: [TableDataItem] + private let reuseIdentifier: String + + init(data: [TableDataItem], reuseIdentifier: String) { + self.data = data + self.reuseIdentifier = reuseIdentifier + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return data.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let item = data[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) + + item.configure(cell) + + return cell + } +} + +class SiteTableViewCell: UITableViewCell, GhostableView { + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) + detailTextLabel?.textColor = UIColor.systemGray + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func ghostAnimationWillStart() { + contentView.subviews.forEach { view in + view.isGhostableDisabled = true + } + textLabel?.text = "TEST LABEL Text Label" + textLabel?.isGhostableDisabled = false + detailTextLabel?.text = "TEST LABEL sdflsjlwe lsdfjsldjsl sidjflsidj" + detailTextLabel?.isGhostableDisabled = false + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index be7baf874c5d..eb4314ce71b2 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -191,16 +191,20 @@ extension ReaderTabView { guard filterButton.titleLabel?.text == "Filter" else { return } - setFilterButtonTitle("Phoebe's Photos") - resetFilterButton.isHidden = false - viewModel.presentFilter() + viewModel.presentFilter() { [weak self] topic in + if let topic = topic { + self?.resetFilterButton.isHidden = false + self?.setFilterButtonTitle(topic.title) + self?.viewModel.tabSelectionCallback?(topic) + } + } } /// Reset filter button @objc private func didTapResetFilterButton() { setFilterButtonTitle(Appearance.defaultFilterButtonTitle) resetFilterButton.isHidden = true - viewModel.resetFilter() + viewModel.resetFilter(selectedItem: tabBar.items[tabBar.selectedIndex]) } @objc private func didTapSettingsButton() { diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift index 22a9467adc7e..c64ac1f53721 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift @@ -7,6 +7,15 @@ class ReaderTabViewController: UIViewController { init(viewModel: ReaderTabViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) + self.viewModel.filterTapped = { [weak self] completion in + guard let self = self else { return } + let viewController = FilterSheetViewController(filters: [ReaderSiteTopic.filterProvider(), ReaderTagTopic.filterProvider()], changedFilter: { [weak self] topic in + completion(topic) + self?.dismiss(animated: true, completion: nil) + }) + let bottomSheet = BottomSheetViewController(childViewController: viewController) + bottomSheet.show(from: self, sourceView: self.view) + } self.title = NSLocalizedString("Reader", comment: "The default title of the Reader") setupSearchButton() } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 86ba10d80a6c..d934b9bf6396 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -2,6 +2,7 @@ class ReaderTabViewModel { var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? + var filterTapped: ((@escaping (ReaderAbstractTopic?) -> Void) -> Void)? init() { addNotificationsObservers() @@ -18,9 +19,15 @@ class ReaderTabViewModel { // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } - func presentFilter() { } + func presentFilter(completion: @escaping (ReaderAbstractTopic?) -> Void) { + filterTapped?(completion) + } - func resetFilter() { } + func resetFilter(selectedItem: FilterTabBarItem) { + if let topic = (selectedItem as? ReaderTabItem)?.topic { + tabSelectionCallback?(topic) + } + } func presentSettings() { } } diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index e3477b3fb531..f958761c099c 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1026,9 +1026,7 @@ 83418AAA11C9FA6E00ACF00C /* Comment.m in Sources */ = {isa = PBXBuildFile; fileRef = 83418AA911C9FA6E00ACF00C /* Comment.m */; }; 834CE7341256D0DE0046A4A3 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 834CE7331256D0DE0046A4A3 /* CFNetwork.framework */; }; 8350E49611D2C71E00A7B073 /* Media.m in Sources */ = {isa = PBXBuildFile; fileRef = 8350E49511D2C71E00A7B073 /* Media.m */; }; - 8355D67E11D13EAD00A61362 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8355D67D11D13EAD00A61362 /* MobileCoreServices.framework */; }; 8355D7D911D260AA00A61362 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8355D7D811D260AA00A61362 /* CoreData.framework */; }; - 835E2403126E66E50085940B /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 835E2402126E66E50085940B /* AssetsLibrary.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 8370D10A11FA499A009D650F /* WPTableViewActivityCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8370D10911FA499A009D650F /* WPTableViewActivityCell.m */; }; 83F3E26011275E07004CD686 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83F3E25F11275E07004CD686 /* MapKit.framework */; }; 83F3E2D311276371004CD686 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83F3E2D211276371004CD686 /* CoreLocation.framework */; }; @@ -2078,6 +2076,10 @@ F5E032E82408D537003AF350 /* BottomSheetPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E032E52408D537003AF350 /* BottomSheetPresentationController.swift */; }; F5E032EA2409C291003AF350 /* BottomSheetAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E032E92409C291003AF350 /* BottomSheetAnimationController.swift */; }; F5E032EC240D49FF003AF350 /* ActionSheetComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E032EB240D49FF003AF350 /* ActionSheetComponent.swift */; }; + F5E29036243E4F5F00C19CA5 /* FilterProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E29035243E4F5F00C19CA5 /* FilterProvider.swift */; }; + F5E29038243FAB0300C19CA5 /* FilterTableData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E29037243FAB0300C19CA5 /* FilterTableData.swift */; }; + F5E63129243BC8190088229D /* FilterSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E63128243BC8190088229D /* FilterSheetView.swift */; }; + F5E6312B243BC83E0088229D /* FilterSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5E6312A243BC83E0088229D /* FilterSheetViewController.swift */; }; F5EF481723ABCAD8004C3532 /* MainShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74337EDC20054D5500777997 /* MainShareViewController.swift */; }; F5EF481823ABCAE0004C3532 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 740C7C4E202F4CD6001C31B0 /* MainInterface.storyboard */; }; F928EDA3226140620030D451 /* WPCrashLoggingProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F928EDA2226140620030D451 /* WPCrashLoggingProvider.swift */; }; @@ -4668,6 +4670,10 @@ F5E032E52408D537003AF350 /* BottomSheetPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomSheetPresentationController.swift; sourceTree = ""; }; F5E032E92409C291003AF350 /* BottomSheetAnimationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetAnimationController.swift; sourceTree = ""; }; F5E032EB240D49FF003AF350 /* ActionSheetComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetComponent.swift; sourceTree = ""; }; + F5E29035243E4F5F00C19CA5 /* FilterProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterProvider.swift; sourceTree = ""; }; + F5E29037243FAB0300C19CA5 /* FilterTableData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterTableData.swift; sourceTree = ""; }; + F5E63128243BC8190088229D /* FilterSheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterSheetView.swift; sourceTree = ""; }; + F5E6312A243BC83E0088229D /* FilterSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterSheetViewController.swift; sourceTree = ""; }; F7E3CC306AECBBCB71D2E19C /* Pods_WordPressDraftActionExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WordPressDraftActionExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F928EDA2226140620030D451 /* WPCrashLoggingProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPCrashLoggingProvider.swift; sourceTree = ""; }; F93735F022D534FE00A3C312 /* LoggingURLRedactor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoggingURLRedactor.swift; sourceTree = ""; }; @@ -4798,7 +4804,6 @@ FF75933B1BE2423800814D3B /* Photos.framework in Frameworks */, 93E5285619A77BAC003A1A9C /* NotificationCenter.framework in Frameworks */, 93A3F7DE1843F6F00082FEEA /* CoreTelephony.framework in Frameworks */, - 8355D67E11D13EAD00A61362 /* MobileCoreServices.framework in Frameworks */, A01C542E0E24E88400D411F2 /* SystemConfiguration.framework in Frameworks */, 374CB16215B93C0800DD0EBC /* AudioToolbox.framework in Frameworks */, E10B3655158F2D7800419A93 /* CoreGraphics.framework in Frameworks */, @@ -4813,7 +4818,6 @@ 83F3E2D311276371004CD686 /* CoreLocation.framework in Frameworks */, 8355D7D911D260AA00A61362 /* CoreData.framework in Frameworks */, 834CE7341256D0DE0046A4A3 /* CFNetwork.framework in Frameworks */, - 835E2403126E66E50085940B /* AssetsLibrary.framework in Frameworks */, 83043E55126FA31400EC9953 /* MessageUI.framework in Frameworks */, FD3D6D2C1349F5D30061136A /* ImageIO.framework in Frameworks */, B5AA54D51A8E7510003BDD12 /* WebKit.framework in Frameworks */, @@ -9300,6 +9304,7 @@ CCB3A03814C8DD5100D43C3F /* Reader */ = { isa = PBXGroup; children = ( + F597768C243E1E140062BAD1 /* Filter */, 5D1D04731B7A50B100CDE646 /* Reader.storyboard */, 5D5A6E901B613C1800DAF819 /* Cards */, 5D08B8FD19647C0800D5B381 /* Controllers */, @@ -10085,6 +10090,17 @@ path = Scheduling; sourceTree = ""; }; + F597768C243E1E140062BAD1 /* Filter */ = { + isa = PBXGroup; + children = ( + F5E63128243BC8190088229D /* FilterSheetView.swift */, + F5E6312A243BC83E0088229D /* FilterSheetViewController.swift */, + F5E29035243E4F5F00C19CA5 /* FilterProvider.swift */, + F5E29037243FAB0300C19CA5 /* FilterTableData.swift */, + ); + path = Filter; + sourceTree = ""; + }; F5D0A64C23CC157100B20D27 /* Preview */ = { isa = PBXGroup; children = ( @@ -11825,6 +11841,7 @@ 313AE4A019E3F20400AAFABE /* CommentViewController.m in Sources */, 7E3E7A6620E44F200075D159 /* HeaderContentGroup.swift in Sources */, B5015C581D4FDBB300C9449E /* NotificationActionsService.swift in Sources */, + F5E63129243BC8190088229D /* FilterSheetView.swift in Sources */, A0E293F10E21027E00C6919C /* WPAddPostCategoryViewController.m in Sources */, E6BDEA731CE4824300682885 /* ReaderSearchTopic.swift in Sources */, 9A8ECE132254A3260043C8DA /* JetpackInstallError+Blocking.swift in Sources */, @@ -12064,6 +12081,7 @@ E166FA1B1BB0656B00374B5B /* PeopleCellViewModel.swift in Sources */, 73CE3E0E21F7F9D3007C9C85 /* TableViewOffsetCoordinator.swift in Sources */, 436D56292117312700CEAA33 /* RegisterDomainDetailsViewController.swift in Sources */, + F5E29036243E4F5F00C19CA5 /* FilterProvider.swift in Sources */, 027AC51D227896540033E56E /* DomainCreditEligibilityChecker.swift in Sources */, 83FEFC7611FF6C5A0078B462 /* SiteSettingsViewController.m in Sources */, 91DCE84421A6A7840062F134 /* PostEditor+BlogPicker.swift in Sources */, @@ -12084,6 +12102,7 @@ 74EFB5C8208674250070BD4E /* BlogListViewController+Activity.swift in Sources */, 738B9A5721B85CF20005062B /* TableDataCoordinator.swift in Sources */, B541276B1C0F7D610015CA80 /* SettingsMultiTextViewController.m in Sources */, + F5E6312B243BC83E0088229D /* FilterSheetViewController.swift in Sources */, E6F2788021BC1A4A008B4DB5 /* Plan.swift in Sources */, B5AC00681BE3C4E100F8E7C3 /* DiscussionSettingsViewController.swift in Sources */, D816C1F620E0896F00C4D82F /* TrashComment.swift in Sources */, @@ -12414,6 +12433,7 @@ E6A2158E1D10627500DE5270 /* ReaderMenuViewModel.swift in Sources */, 73C8F06021BEED9100DDDF7E /* SiteAssemblyStep.swift in Sources */, 82C420761FE44BD900CFB15B /* SiteSettingsViewController+Swift.swift in Sources */, + F5E29038243FAB0300C19CA5 /* FilterTableData.swift in Sources */, E6A3384C1BB08E3F00371587 /* ReaderGapMarker.m in Sources */, D8281CF1212AB34C00D09098 /* NewsStats.swift in Sources */, E1CFC1571E0AC8FF001DF9E9 /* Pattern.swift in Sources */, From c7cdce30bd0a3724e3f211b41810593216734e90 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 10 Apr 2020 16:59:12 -0600 Subject: [PATCH 148/245] Fix popover presentation --- .../Bottom Sheet/BottomSheetViewController.swift | 14 ++++++++++++-- .../Reader/Tab Navigation/ReaderTabView.swift | 2 +- .../Tab Navigation/ReaderTabViewController.swift | 4 ++-- .../Reader/Tab Navigation/ReaderTabViewModel.swift | 6 +++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index d33b3c20d4ab..095f045f2aa5 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -5,7 +5,7 @@ class BottomSheetViewController: UIViewController { static let gripHeight: CGFloat = 5 static let cornerRadius: CGFloat = 8 static let buttonSpacing: CGFloat = 8 - static let additionalSafeAreaInsetsRegular: UIEdgeInsets = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0) + static let additionalSafeAreaInsetsRegular: UIEdgeInsets = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0) static let minimumWidth: CGFloat = 300 enum Header { @@ -34,9 +34,10 @@ class BottomSheetViewController: UIViewController { super.init(nibName: nil, bundle: nil) } - func show(from presenting: UIViewController, sourceView: UIView? = nil) { + func show(from presenting: UIViewController, sourceView: UIView? = nil, arrowDirections: UIPopoverArrowDirection = .any) { if UIDevice.isPad() { modalPresentationStyle = .popover + popoverPresentationController?.permittedArrowDirections = arrowDirections popoverPresentationController?.sourceView = sourceView ?? UIView() popoverPresentationController?.sourceRect = sourceView?.bounds ?? .zero } else { @@ -107,6 +108,15 @@ class BottomSheetViewController: UIViewController { refreshForTraits() } + override var preferredContentSize: CGSize { + set { + childViewController?.preferredContentSize = newValue + } + get { + return childViewController?.preferredContentSize ?? super.preferredContentSize + } + } + private func refreshForTraits() { if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { gripButton.isHidden = true diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index eb4314ce71b2..535ed3dc8c11 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -191,7 +191,7 @@ extension ReaderTabView { guard filterButton.titleLabel?.text == "Filter" else { return } - viewModel.presentFilter() { [weak self] topic in + viewModel.presentFilter(from: filterButton) { [weak self] topic in if let topic = topic { self?.resetFilterButton.isHidden = false self?.setFilterButtonTitle(topic.title) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift index c64ac1f53721..6285a7c380a0 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift @@ -7,14 +7,14 @@ class ReaderTabViewController: UIViewController { init(viewModel: ReaderTabViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) - self.viewModel.filterTapped = { [weak self] completion in + self.viewModel.filterTapped = { [weak self] (fromView, completion) in guard let self = self else { return } let viewController = FilterSheetViewController(filters: [ReaderSiteTopic.filterProvider(), ReaderTagTopic.filterProvider()], changedFilter: { [weak self] topic in completion(topic) self?.dismiss(animated: true, completion: nil) }) let bottomSheet = BottomSheetViewController(childViewController: viewController) - bottomSheet.show(from: self, sourceView: self.view) + bottomSheet.show(from: self, sourceView: fromView, arrowDirections: .up) } self.title = NSLocalizedString("Reader", comment: "The default title of the Reader") setupSearchButton() diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index d934b9bf6396..03cbfb2f8d7f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -2,7 +2,7 @@ class ReaderTabViewModel { var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? - var filterTapped: ((@escaping (ReaderAbstractTopic?) -> Void) -> Void)? + var filterTapped: ((UIView, @escaping (ReaderAbstractTopic?) -> Void) -> Void)? init() { addNotificationsObservers() @@ -19,8 +19,8 @@ class ReaderTabViewModel { // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } - func presentFilter(completion: @escaping (ReaderAbstractTopic?) -> Void) { - filterTapped?(completion) + func presentFilter(from: UIView, completion: @escaping (ReaderAbstractTopic?) -> Void) { + filterTapped?(from, completion) } func resetFilter(selectedItem: FilterTabBarItem) { From e6b1fbc03d5f18fa4d502c18b9815319c417806c Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Fri, 10 Apr 2020 19:45:53 -0500 Subject: [PATCH 149/245] Update ReaderStreamViewController.swift, display loading view in readerTopic didSet only if the content is empty --- .../Reader/ReaderStreamViewController.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 3566876c5528..4afd95541501 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -133,7 +133,7 @@ import WordPressFlux if didSetupView { configureControllerForTopic() if let syncHelper = syncHelper, syncHelper.isSyncing, !isShowingResultStatusView { - displayLoadingView() + displayLoadingViewIfNeeded() } } // Discard the siteID (if there was one) now that we have a good topic @@ -1231,10 +1231,7 @@ extension ReaderStreamViewController: NewsManagerDelegate { extension ReaderStreamViewController: WPContentSyncHelperDelegate { func syncHelper(_ syncHelper: WPContentSyncHelper, syncContentWithUserInteraction userInteraction: Bool, success: ((_ hasMore: Bool) -> Void)?, failure: ((_ error: NSError) -> Void)?) { - if content.isEmpty { - displayLoadingView() - } - + displayLoadingViewIfNeeded() if syncIsFillingGap { syncItemsForGap(success, failure: failure) } else { @@ -1544,7 +1541,11 @@ private extension ReaderStreamViewController { displayResultsStatus() } - private func displayLoadingView() { + func displayLoadingViewIfNeeded() { + if content.contentCount > 0 { + return + } + tableView.tableHeaderView?.isHidden = true configureResultsStatus(title: ResultsStatusText.fetchingPostsTitle, accessoryView: NoResultsViewController.loadingAccessoryView()) displayResultsStatus() From e169ed5fa3334c705ef662fc82c6d61ef5052f72 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 12:25:31 -0300 Subject: [PATCH 150/245] Remove unused var --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 38bbfde7b618..9d4493632932 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -55,8 +55,6 @@ extension PostEditor where Self: UIViewController { return } - let isPage = post is Page - let publishBlock = { [unowned self] in if action == .saveAsDraft { self.post.status = .draft From 60d37212c05f870273eca16829980bbc14b73462 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Mon, 13 Apr 2020 10:59:24 -0600 Subject: [PATCH 151/245] Adjust maximum quick actions width from feedback --- .../Detail Header/NewBlogDetailHeaderView.swift | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift index 5e4f4ef4db63..666907ea2340 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift @@ -104,12 +104,6 @@ class NewBlogDetailHeaderView: UIView { stackView.setCustomSpacing(Constants.spacingBelowIcon, after: siteIconView) stackView.setCustomSpacing(Constants.spacingBelowTitle, after: titleLabel) - /// Constraints for larger widths with extra padding (iPhone portrait) - let extraPaddingSideConstraints = [ - buttonsStackView.trailingAnchor.constraint(greaterThanOrEqualTo: stackView.trailingAnchor, constant: -Constants.buttonsSidePadding), - buttonsStackView.leadingAnchor.constraint(lessThanOrEqualTo: stackView.leadingAnchor, constant: Constants.buttonsSidePadding) - ] - /// Constraints for constrained widths (iPad portrait) let minimumPaddingSideConstraints = [ buttonsStackView.leadingAnchor.constraint(greaterThanOrEqualTo: stackView.leadingAnchor, constant: 0), @@ -129,13 +123,13 @@ class NewBlogDetailHeaderView: UIView { stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor, constant: Constants.minimumSideSpacing), stackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.interSectionSpacing), stackView.centerXAnchor.constraint(equalTo: layoutMarginsGuide.centerXAnchor), - stackView.widthAnchor.constraint(lessThanOrEqualToConstant: 500), + buttonsStackView.widthAnchor.constraint(equalToConstant: 320), buttonsStackView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: Constants.interSectionSpacing), buttonsStackView.centerXAnchor.constraint(equalTo: stackView.centerXAnchor), bottomConstraint ] - NSLayoutConstraint.activate(extraPaddingSideConstraints + minimumPaddingSideConstraints + edgeConstraints) + NSLayoutConstraint.activate(minimumPaddingSideConstraints + edgeConstraints) } override init(frame: CGRect) { From aef1e701bd999ac50d753b5c2ae01c9be2e0a9d5 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Mon, 13 Apr 2020 11:00:37 -0600 Subject: [PATCH 152/245] Enable Reader feature flags for internal builds --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 5f53330e1b44..12f279e576e5 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return false + return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] } } } From f817995eb864cc42925e0944a816d40b71f24964 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 11:10:50 -0300 Subject: [PATCH 153/245] Add the option to customise header spacing --- .../Bottom Sheet/BottomSheetViewController.swift | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index d33b3c20d4ab..6e18d21fc1e0 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -27,10 +27,14 @@ class BottomSheetViewController: UIViewController { } } + private var customHeaderSpacing: CGFloat? + private weak var childViewController: DrawerPresentableViewController? - init(childViewController: DrawerPresentableViewController) { + init(childViewController: DrawerPresentableViewController, + customHeaderSpacing: CGFloat? = nil) { self.childViewController = childViewController + self.customHeaderSpacing = customHeaderSpacing super.init(nibName: nil, bundle: nil) } @@ -58,6 +62,8 @@ class BottomSheetViewController: UIViewController { return button }() + private var stackView: UIStackView! + @objc func buttonPressed() { dismiss(animated: true, completion: nil) } @@ -84,12 +90,12 @@ class BottomSheetViewController: UIViewController { addChild(childViewController) - let stackView = UIStackView(arrangedSubviews: [ + stackView = UIStackView(arrangedSubviews: [ gripButton, childViewController.view ]) - stackView.setCustomSpacing(Constants.Header.spacing, after: gripButton) + stackView.setCustomSpacing(customHeaderSpacing ?? Constants.Header.spacing, after: gripButton) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical @@ -147,6 +153,10 @@ extension BottomSheetViewController: UIViewControllerTransitioningDelegate { // MARK: - DrawerDelegate extension BottomSheetViewController: DrawerPresentable { + var allowsUserTransition: Bool { + return childViewController?.allowsUserTransition ?? true + } + var compactWidth: DrawerWidth { childViewController?.compactWidth ?? .percentage(0.66) } From bef7fd8da73d81d3dda6868a8729f14988a875cf Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 11:10:58 -0300 Subject: [PATCH 154/245] Set Header spacing to zero --- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 9d4493632932..12a679bca205 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -136,7 +136,7 @@ extension PostEditor where Self: UIViewController { publishAction() } let prepublishingNavigationController = PrepublishingNavigationController(rootViewController: prepublishing) - let bottomSheet = BottomSheetViewController(childViewController: prepublishingNavigationController) + let bottomSheet = BottomSheetViewController(childViewController: prepublishingNavigationController, customHeaderSpacing: 0) bottomSheet.show(from: self, sourceView: navigationBarManager.publishButton) } From a2bb41142b32b0da860bd346801b83e7f80ed1db Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 11:11:45 -0300 Subject: [PATCH 155/245] Sets allowsUserTransition to false and enable scroll in tableView The user doesn't need to increase the size of the Nudges view manually. --- .../PrepublishingNavigationController.swift | 4 ++++ .../ViewRelated/Post/PrepublishingViewController.swift | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 9029b58590d8..db206000d1ae 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -19,6 +19,10 @@ class PrepublishingNavigationController: LightNavigationController { // MARK: - DrawerPresentable extension PrepublishingNavigationController: DrawerPresentable { + var allowsUserTransition: Bool { + return false + } + var expandedHeight: DrawerHeight { return .topMargin(20) } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index a610a3bd3d02..9fb00b85e06f 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -63,8 +63,6 @@ class PrepublishingViewController: UITableViewController { setupPublishButton() announcePublishButton() - - tableView.isScrollEnabled = false } override func viewWillAppear(_ animated: Bool) { From 507290c5a47b518a9c16e99742fbbd73b947ab33 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 11:47:17 -0300 Subject: [PATCH 156/245] Remove trailing whitespace --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index db206000d1ae..3c959e889bae 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -22,7 +22,7 @@ extension PrepublishingNavigationController: DrawerPresentable { var allowsUserTransition: Bool { return false } - + var expandedHeight: DrawerHeight { return .topMargin(20) } From 5eb41feeda1fb25049d62bf2df9f0d23bb6c6cae Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Mon, 13 Apr 2020 11:47:19 -0600 Subject: [PATCH 157/245] Address PR feedback --- .../Reader/Filter/FilterSheetView.swift | 1 + .../Reader/Tab Navigation/ReaderTabView.swift | 4 ---- .../Tab Navigation/ReaderTabViewModel.swift | 18 ++++++++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift index 4bd91dd02cc3..05dfbfbcaa3b 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift @@ -16,6 +16,7 @@ class FilterSheetView: UIView { lazy var tableView: UITableView = { let tableView = UITableView() tableView.tableFooterView = UIView() // To hide the separators for empty cells + tableView.separatorStyle = .none tableView.delegate = self return tableView }() diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 535ed3dc8c11..3f5eb1a98d2e 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -187,10 +187,6 @@ extension ReaderTabView { /// Filter button @objc private func didTapFilterButton() { - //TODO: - READERNAV - Remove. This test code is for UI prototyping only - guard filterButton.titleLabel?.text == "Filter" else { - return - } viewModel.presentFilter(from: filterButton) { [weak self] topic in if let topic = topic { self?.resetFilterButton.isHidden = false diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 03cbfb2f8d7f..48319d10fa0c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -2,6 +2,7 @@ class ReaderTabViewModel { var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? + var selectedFilter: ReaderAbstractTopic? var filterTapped: ((UIView, @escaping (ReaderAbstractTopic?) -> Void) -> Void)? init() { @@ -9,21 +10,34 @@ class ReaderTabViewModel { } func showTab(for item: FilterTabBarItem) { + guard let readerItem = item as? ReaderTabItem, let topic = readerItem.topic else { return } - tabSelectionCallback?(topic) + + let selectedTopic: ReaderAbstractTopic + if readerItem.shouldHideButtonsView == false { + selectedTopic = selectedFilter ?? topic + } else { + selectedTopic = topic + } + + tabSelectionCallback?(selectedTopic) } // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } func presentFilter(from: UIView, completion: @escaping (ReaderAbstractTopic?) -> Void) { - filterTapped?(from, completion) + filterTapped?(from, { [weak self] topic in + self?.selectedFilter = topic + completion(topic) + }) } func resetFilter(selectedItem: FilterTabBarItem) { + selectedFilter = nil if let topic = (selectedItem as? ReaderTabItem)?.topic { tabSelectionCallback?(topic) } From 037075851c9e8c613ff349febb6c9a1c83751dea Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Mon, 13 Apr 2020 12:57:03 -0600 Subject: [PATCH 158/245] Some code restructuring --- .../Reader/Tab Navigation/ReaderTabView.swift | 8 +++---- .../ReaderTabViewController.swift | 10 ++++---- .../Tab Navigation/ReaderTabViewModel.swift | 24 +++++++++++++++++-- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 3f5eb1a98d2e..29a32daa5a89 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -187,11 +187,10 @@ extension ReaderTabView { /// Filter button @objc private func didTapFilterButton() { - viewModel.presentFilter(from: filterButton) { [weak self] topic in - if let topic = topic { + viewModel.presentFilter(from: filterButton) { [weak self] title in + if let title = title { self?.resetFilterButton.isHidden = false - self?.setFilterButtonTitle(topic.title) - self?.viewModel.tabSelectionCallback?(topic) + self?.setFilterButtonTitle(title) } } } @@ -208,7 +207,6 @@ extension ReaderTabView { } } - // MARK: - Appearance extension ReaderTabView { diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift index 6285a7c380a0..8f5eae8a361a 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift @@ -9,14 +9,12 @@ class ReaderTabViewController: UIViewController { super.init(nibName: nil, bundle: nil) self.viewModel.filterTapped = { [weak self] (fromView, completion) in guard let self = self else { return } - let viewController = FilterSheetViewController(filters: [ReaderSiteTopic.filterProvider(), ReaderTagTopic.filterProvider()], changedFilter: { [weak self] topic in - completion(topic) + self.viewModel.presentFilter(from: self, sourceView: fromView, completion: { [weak self] title in self?.dismiss(animated: true, completion: nil) + completion(title) }) - let bottomSheet = BottomSheetViewController(childViewController: viewController) - bottomSheet.show(from: self, sourceView: fromView, arrowDirections: .up) } - self.title = NSLocalizedString("Reader", comment: "The default title of the Reader") + title = NSLocalizedString("Reader", comment: "The default title of the Reader") setupSearchButton() } @@ -31,7 +29,7 @@ class ReaderTabViewController: UIViewController { } override func loadView() { - self.view = ReaderTabView(viewModel: viewModel) + view = ReaderTabView(viewModel: viewModel) } } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 48319d10fa0c..c064504319cd 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -29,10 +29,19 @@ class ReaderTabViewModel { // TODO: - READERNAV - Methods to be implemented. Signature will likely change func performSearch() { } - func presentFilter(from: UIView, completion: @escaping (ReaderAbstractTopic?) -> Void) { + func presentFilter(from: UIViewController, sourceView: UIView, completion: @escaping (ReaderAbstractTopic?) -> Void) { + let viewController = makeFilterSheetViewController(completion: completion) + let bottomSheet = BottomSheetViewController(childViewController: viewController) + bottomSheet.show(from: from, sourceView: sourceView, arrowDirections: .up) + } + + func presentFilter(from: UIView, completion: @escaping (String?) -> Void) { filterTapped?(from, { [weak self] topic in self?.selectedFilter = topic - completion(topic) + if let topic = topic { + self?.tabSelectionCallback?(topic) + } + completion(topic?.title) }) } @@ -46,6 +55,17 @@ class ReaderTabViewModel { func presentSettings() { } } +// MARK: - Bottom Sheet + +extension ReaderTabViewModel { + private func makeFilterSheetViewController(completion: @escaping (ReaderAbstractTopic) -> Void) -> FilterSheetViewController { + return FilterSheetViewController(filters: + [ReaderSiteTopic.filterProvider(), + ReaderTagTopic.filterProvider()], + changedFilter: completion) + } +} + // MARK: - Tab Bar extension ReaderTabViewModel { From 367f878181f9609da07d597c022513f32fe093e6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 17:04:14 -0300 Subject: [PATCH 159/245] Fix wrong merge --- WordPress/WordPress.xcodeproj/project.pbxproj | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 6eb8d2baa911..a231584de900 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1052,6 +1052,7 @@ 8B158B2A243CF07F00C66823 /* BottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */; }; 8B1CF00F2433902700578582 /* PasswordAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF00E2433902700578582 /* PasswordAlertController.swift */; }; 8B1CF0112433E61C00578582 /* AbstractPost+TitleForVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */; }; + 8B260D7E2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B260D7D2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift */; }; 8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; }; 8B6BD55024293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */; }; 8B6EA62323FDE50B004BA312 /* PostServiceUploadingList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */; }; @@ -1063,7 +1064,6 @@ 8B939F4323832E5D00ACCB0F /* PostListViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */; }; 8BAD272C241FEF3300E9D105 /* PrepublishingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */; }; 8BAD53D6241922B900230F4B /* WPAnalyticsEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */; }; - 8BB2768424323A94002D2BEC /* PostVisibilitySelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB2768324323A94002D2BEC /* PostVisibilitySelectorViewController.swift */; }; 8BC12F72231FEBA1004DDA72 /* PostCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */; }; 8BC12F7523201917004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */; }; 8BC12F7723201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC12F7623201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift */; }; @@ -3449,6 +3449,7 @@ 8B158B29243CF07F00C66823 /* BottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetViewController.swift; sourceTree = ""; }; 8B1CF00E2433902700578582 /* PasswordAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordAlertController.swift; sourceTree = ""; }; 8B1CF0102433E61C00578582 /* AbstractPost+TitleForVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AbstractPost+TitleForVisibility.swift"; sourceTree = ""; }; + 8B260D7D2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostVisibilitySelectorViewController.swift; sourceTree = ""; }; 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = ""; }; 8B6BD54F24293FBE00DB8F28 /* PrepublishingNudgesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingNudgesViewControllerTests.swift; sourceTree = ""; }; 8B6EA62223FDE50B004BA312 /* PostServiceUploadingList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostServiceUploadingList.swift; sourceTree = ""; }; @@ -3460,7 +3461,6 @@ 8B939F4223832E5D00ACCB0F /* PostListViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostListViewControllerTests.swift; sourceTree = ""; }; 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrepublishingViewController.swift; sourceTree = ""; }; 8BAD53D5241922B900230F4B /* WPAnalyticsEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WPAnalyticsEvent.swift; sourceTree = ""; }; - 8BB2768324323A94002D2BEC /* PostVisibilitySelectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostVisibilitySelectorViewController.swift; sourceTree = ""; }; 8BC12F71231FEBA1004DDA72 /* PostCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostCoordinatorTests.swift; sourceTree = ""; }; 8BC12F732320181E004DDA72 /* PostService+MarkAsFailedAndDraftIfNeeded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostService+MarkAsFailedAndDraftIfNeeded.swift"; sourceTree = ""; }; 8BC12F7623201B86004DDA72 /* PostService+MarkAsFailedAndDraftIfNeededTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostService+MarkAsFailedAndDraftIfNeededTests.swift"; sourceTree = ""; }; @@ -5469,6 +5469,7 @@ E16273E21B2AD89A00088AF7 /* MIGRATIONS.md */, FF37F90822385C9F00AFA3DB /* RELEASE-NOTES.txt */, B565D41C3DB27630CD503F9A /* Pods */, + 8B260D7C2444FB980010F756 /* Recovered References */, ); name = CustomTemplate; sourceTree = ""; @@ -7585,6 +7586,13 @@ path = "Bottom Sheet"; sourceTree = ""; }; + 8B260D7C2444FB980010F756 /* Recovered References */ = { + isa = PBXGroup; + children = ( + ); + name = "Recovered References"; + sourceTree = ""; + }; 8B7623352384372200AB3EE7 /* Pages */ = { isa = PBXGroup; children = ( @@ -8412,6 +8420,7 @@ ACBAB5FC0E121C7300F38795 /* PostSettingsViewController.h */, ACBAB5FD0E121C7300F38795 /* PostSettingsViewController.m */, FFEECFFB2084DE2B009B8CDB /* PostSettingsViewController+FeaturedImageUpload.swift */, + 8B260D7D2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift */, 593F26601CAB00CA00F14073 /* PostSharingController.swift */, E155EC711E9B7DCE009D7F63 /* PostTagPickerViewController.swift */, 8BAD272B241FEF3300E9D105 /* PrepublishingViewController.swift */, @@ -12792,7 +12801,6 @@ 988AC37522F10DD900BC1433 /* FileDownloadsStatsRecordValue+CoreDataProperties.swift in Sources */, E1A03EE217422DCF0085D192 /* BlogToAccount.m in Sources */, 436D55DF210F866900CEAA33 /* StoryboardLoadable.swift in Sources */, - 8BB2768424323A94002D2BEC /* PostVisibilitySelectorViewController.swift in Sources */, D8212CC320AA7F57008E8AE8 /* ReaderBlockSiteAction.swift in Sources */, 5D44EB381986D8BA008B7175 /* ReaderSiteService.m in Sources */, B518E1651CCAA19200ADFE75 /* Blog+Capabilities.swift in Sources */, @@ -12868,6 +12876,7 @@ E16FB7E11F8B5D7D0004DD9F /* WebViewControllerConfiguration.swift in Sources */, 98B3FA8421C05BDC00148DD4 /* ViewMoreRow.swift in Sources */, D816B8BE2112CC000052CE4D /* NewsItem.swift in Sources */, + 8B260D7E2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift in Sources */, B5416D011C17693B00006DD8 /* UIApplication+Helpers.m in Sources */, 731E88CA21C9A10B0055C014 /* ErrorStateView.swift in Sources */, 08D345501CD7F50900358E8C /* MenusSelectionDetailView.m in Sources */, From 7c92c2292115c35315ef54a07df4a68fe840fa1a Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 13 Apr 2020 16:57:54 -0500 Subject: [PATCH 160/245] Add Saved Posts tab to the new Reader - Update ReaderPostCellActions.swift, partially merged with ReaderSavedPostsActions.swift - Update ReaderSaveForLater+Analytics.swift, method trackSavedPostNavigation() in ReaderStreamViewController now also handles saved stream - Update ReaderStreamViewController.swift, add isSavedPostsController property to handle saved posts, update configureControllerForTopic(_:), predicateForFetchRequest(), configurePostCardCell(_:, _:), tableView(_:cellForRowAt:), displayNoResultsView() to handle the case of saved posts, add displayNoResultsForSavedPosts() method, add extensions to handle Saved Post Delegate and Undo delegate - Update ReaderStreamViewController+Helper.swift, add extensions to handle No Results for Saved Posts and Undo Cell for Saved Posts --- .../Reader/ReaderPostCellActions.swift | 43 ++++++++++- .../Reader/ReaderSaveForLater+Analytics.swift | 6 +- .../Reader/ReaderSavedPostCellActions.swift | 22 +----- .../ReaderSavedPostsViewController.swift | 4 +- .../ReaderStreamViewController+Helper.swift | 49 ++++++++++++ .../Reader/ReaderStreamViewController.swift | 76 +++++++++++++++---- .../Tab Navigation/ReaderTabViewModel.swift | 10 +-- 7 files changed, 163 insertions(+), 47 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift index 4db51db8efcb..a56e839603f6 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift @@ -8,6 +8,13 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { var isLoggedIn: Bool = false private let visibleConfirmation: Bool + // saved posts + /// Posts that have been removed but not yet discarded + // TODO: - READERNAV - Set this property as private once the old reader class ReaderSavedPostCellActions is removed + var removedPosts = ReaderSaveForLaterRemovedPosts() + + weak var savedPostsDelegate: ReaderSavedPostCellActionsDelegate? + init(context: NSManagedObjectContext, origin: UIViewController, topic: ReaderAbstractTopic? = nil, visibleConfirmation: Bool = true) { self.context = context self.origin = origin @@ -38,10 +45,18 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { } func readerCell(_ cell: ReaderPostCardCell, saveActionForProvider provider: ReaderPostContentProvider) { - guard let post = provider as? ReaderPost else { - return + if let origin = origin as? ReaderStreamViewController, origin.isSavedPostsController { + if let post = provider as? ReaderPost { + removedPosts.add(post) + } + savedPostsDelegate?.willRemove(cell) + + } else { + guard let post = provider as? ReaderPost else { + return + } + toggleSavedForLater(for: post) } - toggleSavedForLater(for: post) } func readerCell(_ cell: ReaderPostCardCell, shareActionForProvider provider: ReaderPostContentProvider, fromView sender: UIView) { @@ -105,6 +120,7 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { func toggleSavedForLater(for post: ReaderPost) { let actionOrigin: ReaderSaveForLaterOrigin + // TODO: - READERNAV - Remove this check once the old reader is removed if origin is ReaderSavedPostsViewController { actionOrigin = .savedStream } else { @@ -171,3 +187,24 @@ enum ReaderActionsVisibility: Equatable { } } } + + +// MARK: - Saved Posts +extension ReaderPostCellActions { + + func postIsRemoved(_ post: ReaderPost) -> Bool { + return removedPosts.contains(post) + } + + func restoreUnsavedPost(_ post: ReaderPost) { + removedPosts.remove(post) + } + + func clearRemovedPosts() { + let allRemovedPosts = removedPosts.all() + for post in allRemovedPosts { + toggleSavedForLater(for: post) + } + removedPosts = ReaderSaveForLaterRemovedPosts() + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift index e8839c0864b7..ee21b574660c 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift @@ -83,6 +83,10 @@ extension ReaderSavedPostsViewController { extension ReaderStreamViewController { func trackSavedPostNavigation() { - WPAppAnalytics.track(.readerSavedPostOpened, withProperties: [ readerSaveForLaterSourceKey: ReaderSaveForLaterOrigin.otherStream.openPostValue ]) + if FeatureFlag.newReaderNavigation.enabled, isSavedPostsController { + WPAppAnalytics.track(.readerSavedPostOpened, withProperties: [ readerSaveForLaterSourceKey: ReaderSaveForLaterOrigin.savedStream.openPostValue ]) + } else { + WPAppAnalytics.track(.readerSavedPostOpened, withProperties: [ readerSaveForLaterSourceKey: ReaderSaveForLaterOrigin.otherStream.openPostValue ]) + } } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostCellActions.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostCellActions.swift index 8bfbbacc0a73..bd6bf8282e61 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostCellActions.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostCellActions.swift @@ -5,31 +5,11 @@ protocol ReaderSavedPostCellActionsDelegate: class { /// Specialises ReaderPostCellActions to provide specific overrides for the ReaderSavedPostsViewController final class ReaderSavedPostCellActions: ReaderPostCellActions { - /// Posts that have been removed but not yet discarded - private var removedPosts = ReaderSaveForLaterRemovedPosts() - - weak var delegate: ReaderSavedPostCellActionsDelegate? override func readerCell(_ cell: ReaderPostCardCell, saveActionForProvider provider: ReaderPostContentProvider) { if let post = provider as? ReaderPost { removedPosts.add(post) } - delegate?.willRemove(cell) - } - - func postIsRemoved(_ post: ReaderPost) -> Bool { - return removedPosts.contains(post) - } - - func restoreUnsavedPost(_ post: ReaderPost) { - removedPosts.remove(post) - } - - func clearRemovedPosts() { - let allRemovedPosts = removedPosts.all() - for post in allRemovedPosts { - toggleSavedForLater(for: post) - } - removedPosts = ReaderSaveForLaterRemovedPosts() + savedPostsDelegate?.willRemove(cell) } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostsViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostsViewController.swift index d0b0b2b6c876..68cec58d9e2b 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostsViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSavedPostsViewController.swift @@ -2,7 +2,7 @@ import UIKit import Gridicons import WordPressShared import WordPressUI - +// TODO: - READERNAV - Remove this file once the new reader is released and stable final class ReaderSavedPostsViewController: UITableViewController { private enum Strings { static let title = NSLocalizedString("Saved Posts", comment: "Title for list of posts saved for later") @@ -105,7 +105,7 @@ final class ReaderSavedPostsViewController: UITableViewController { @objc public func configurePostCardCell(_ cell: UITableViewCell, post: ReaderPost) { if postCellActions == nil { postCellActions = ReaderSavedPostCellActions(context: managedObjectContext(), origin: self, topic: post.topic, visibleConfirmation: false) - postCellActions?.delegate = self + postCellActions?.savedPostsDelegate = self } cellConfiguration.configurePostCardCell(cell, diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index d84ee3b35006..3a93654cbf92 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -131,5 +131,54 @@ extension ReaderStreamViewController { message: NSLocalizedString("No posts have been made recently", comment: "A default message shown whe the reader can find no post to display") ) } +} + + +// MARK: - No Results for saved posts +extension ReaderStreamViewController { + + func configureNoResultsViewForSavedPosts() { + + let noResultsResponse = NoResultsResponse(title: NSLocalizedString("No Saved Posts", + comment: "Message displayed in Reader Saved Posts view if a user hasn't yet saved any posts."), + message: NSLocalizedString("Tap [bookmark-outline] to save a post to your list.", + comment: "A hint displayed in the Saved Posts section of the Reader. The '[bookmark-outline]' placeholder will be replaced by an icon at runtime – please leave that string intact.")) + + var messageText = NSMutableAttributedString(string: noResultsResponse.message) + + // Get attributed string styled for No Results so it gets the correct font attributes added to it. + // The font is used by the attributed string `replace(_:with:)` method below to correctly position the icon. + let styledText = resultsStatusView.applyMessageStyleTo(attributedString: messageText) + messageText = NSMutableAttributedString(attributedString: styledText) + + let icon = UIImage.gridicon(.bookmarkOutline, size: CGSize(width: 18, height: 18)) + messageText.replace("[bookmark-outline]", with: icon) + + resultsStatusView.configure(title: noResultsResponse.title, attributedSubtitle: messageText) + } +} + +// MARK: - Undo cell for saved posts +extension ReaderStreamViewController { + + private enum UndoCell { + static let nibName = "ReaderSavedPostUndoCell" + static let reuseIdentifier = "ReaderUndoCellReuseIdentifier" + static let height: CGFloat = 44 + } + + func setupUndoCell(_ tableView: UITableView) { + let nib = UINib(nibName: UndoCell.nibName, bundle: nil) + tableView.register(nib, forCellReuseIdentifier: UndoCell.reuseIdentifier) + } + + func undoCell(_ tableView: UITableView) -> ReaderSavedPostUndoCell { + return tableView.dequeueReusableCell(withIdentifier: UndoCell.reuseIdentifier) as! ReaderSavedPostUndoCell + } + + func configureUndoCell(_ cell: ReaderSavedPostUndoCell, with post: ReaderPost) { + cell.title.text = post.titleForDisplay() + cell.delegate = self + } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 4afd95541501..e5491a5a1e96 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -44,7 +44,7 @@ import WordPressFlux return currentHelper } - private var resultsStatusView = NoResultsViewController.controller() + private(set) var resultsStatusView = NoResultsViewController.controller() private lazy var footerView: PostListFooterView = { return tableConfiguration.footer() @@ -143,6 +143,16 @@ import WordPressFlux } } + var isSavedPostsController: Bool = false { + didSet { + if !isSavedPostsController && oldValue { + postCellActions?.clearRemovedPosts() + } else if isSavedPostsController { + configureControllerForTopic(synchronize: false) + } + } + } + /// Facilitates sharing of a blog via `ReaderStreamViewController+Sharing.swift`. let sharingController = PostSharingController() @@ -399,6 +409,7 @@ import WordPressFlux add(tableViewController, asChildOf: self) layoutTableView() tableConfiguration.setup(tableView) + setupUndoCell(tableView) } @objc func configureRefreshControl() { @@ -482,7 +493,6 @@ import WordPressFlux /// Configures the controller for the `readerTopic`. This should only be called /// once when the topic is set. private func configureControllerForTopic(synchronize: Bool = true) { - assert(readerTopic != nil, "A reader topic is required") assert(isViewLoaded, "The controller's view must be loaded before displaying the topic") // Enable the view now that we have a topic. @@ -506,7 +516,9 @@ import WordPressFlux hideResultsStatus() recentlyBlockedSitePostObjectIDs.removeAllObjects() updateAndPerformFetchRequest() - configureStreamHeader() + if readerTopic != nil { + configureStreamHeader() + } tableView.setContentOffset(CGPoint.zero, animated: false) content.refresh() refreshTableViewHeaderLayout() @@ -517,10 +529,10 @@ import WordPressFlux bumpStats() - let count = content.contentCount - // Make sure we're showing the no results view if appropriate - if let syncHelper = syncHelper, !syncHelper.isSyncing && count == 0 { + if let syncHelper = syncHelper, !syncHelper.isSyncing, content.isEmpty { + displayNoResultsView() + } else if isSavedPostsController, content.isEmpty { displayNoResultsView() } @@ -1076,7 +1088,9 @@ import WordPressFlux // avoids returning readerPosts that do not belong to a topic (e.g. those // loaded from a notification). We can do this by specifying that self // has to exist within an empty set. - let predicateForNilTopic = NSPredicate(format: "topic = NULL AND SELF in %@", []) + let predicateForNilTopic = isSavedPostsController ? + NSPredicate(format: "isSavedForLater == YES") : + NSPredicate(format: "topic = NULL AND SELF in %@", []) guard let topic = readerTopic else { return predicateForNilTopic @@ -1102,18 +1116,15 @@ import WordPressFlux private func configurePostCardCell(_ cell: UITableViewCell, post: ReaderPost) { - guard let topic = readerTopic else { - return - } - if postCellActions == nil { postCellActions = ReaderPostCellActions(context: managedObjectContext(), origin: self, topic: readerTopic) } postCellActions?.isLoggedIn = isLoggedIn + postCellActions?.savedPostsDelegate = self cellConfiguration.configurePostCardCell(cell, withPost: post, - topic: topic, + topic: readerTopic ?? post.topic, delegate: postCellActions, loggedInActionVisibility: .visible(enabled: isLoggedIn)) } @@ -1404,6 +1415,12 @@ extension ReaderStreamViewController: WPTableViewHandlerDelegate { return cell } + if isSavedPostsController, postCellActions?.postIsRemoved(post) == true { + let cell = undoCell(tableView) + configureUndoCell(cell, with: post) + return cell + } + let cell = tableConfiguration.postCardCell(tableView) configurePostCardCell(cell, post: post) return cell @@ -1487,7 +1504,7 @@ extension ReaderStreamViewController: WPTableViewHandlerDelegate { } - if post.isSavedForLater { + if post.isSavedForLater || isSavedPostsController { trackSavedPostNavigation() } @@ -1555,6 +1572,9 @@ private extension ReaderStreamViewController { // Its possible the topic was deleted before a sync could be completed, // so make certain its not nil. guard let topic = readerTopic else { + if isSavedPostsController { + displayNoResultsForSavedPosts() + } return } @@ -1588,6 +1608,11 @@ private extension ReaderStreamViewController { resultsStatusView.configure(title: title, buttonTitle: buttonTitle, subtitle: subtitle, image: imageName, accessoryView: accessoryView) } + private func displayNoResultsForSavedPosts() { + configureNoResultsViewForSavedPosts() + displayResultsStatus() + } + func displayResultsStatus() { resultsStatusView.removeFromView() tableViewController.addChild(resultsStatusView) @@ -1687,8 +1712,8 @@ extension ReaderStreamViewController: UIViewControllerTransitioningDelegate { // MARK: - Topic Injection extension ReaderStreamViewController { - func setTopic(_ topic: ReaderAbstractTopic) { - guard ReaderHelpers.topicIsDiscover(topic) else { + func setTopic(_ topic: ReaderAbstractTopic?) { + guard let actualTopic = topic, ReaderHelpers.topicIsDiscover(actualTopic) else { readerTopic = topic return } @@ -1697,3 +1722,24 @@ extension ReaderStreamViewController { siteID = ReaderHelpers.discoverSiteID } } + + +// MARK: - Saved Posts Delegate +extension ReaderStreamViewController: ReaderSavedPostCellActionsDelegate { + func willRemove(_ cell: ReaderPostCardCell) { + if let cellIndex = tableView.indexPath(for: cell) { + tableView.reloadRows(at: [cellIndex], with: .fade) + } + } +} + +// MARK: - Undo +extension ReaderStreamViewController: ReaderPostUndoCellDelegate { + func readerCellWillUndo(_ cell: ReaderSavedPostUndoCell) { + if let cellIndex = tableView.indexPath(for: cell), + let post: ReaderPost = content.object(at: cellIndex) { + postCellActions?.restoreUnsavedPost(post) + tableView.reloadRows(at: [cellIndex], with: .fade) + } + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 86ba10d80a6c..0c37f7029dea 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -1,18 +1,17 @@ class ReaderTabViewModel { - var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? + var tabSelectionCallback: ((ReaderAbstractTopic?) -> Void)? init() { addNotificationsObservers() } func showTab(for item: FilterTabBarItem) { - guard let readerItem = item as? ReaderTabItem, - let topic = readerItem.topic else { - return + guard let readerItem = item as? ReaderTabItem else { + return } - tabSelectionCallback?(topic) + tabSelectionCallback?(readerItem.topic) } // TODO: - READERNAV - Methods to be implemented. Signature will likely change @@ -91,6 +90,7 @@ extension ReaderTabViewModel { self.tabSelectionCallback = { [weak controller] topic in controller?.setTopic(topic) + controller?.isSavedPostsController = topic == nil ? true : false } return controller } From 3b64f7247ffe88bb8052689fb99070e5ac856b1a Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 18:59:54 -0300 Subject: [PATCH 161/245] Check presentingViewController.view to avoid crash --- .../System/Action Sheet/DrawerPresentationController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 1dcb6408b870..919f2652c816 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -422,11 +422,12 @@ private extension DrawerPresentationController { guard let scrollView = presentableViewController?.scrollableView, !scrollView.isScrolling, - let presentedView = self.presentedView + let presentedView = self.presentedView, + let presentingView = presentingViewController.view else { return } - let bottom = presentingViewController.view.safeAreaLayoutGuide.layoutFrame.origin.y + let bottom = presentingView.safeAreaLayoutGuide.layoutFrame.origin.y let margin = presentedView.frame.origin.y + bottom scrollView.contentInset.bottom = margin From 550253599f6b6eba8b35955ceaac20f122cf0756 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 13 Apr 2020 17:36:36 -0500 Subject: [PATCH 162/245] Removed postReblogging feature flag --- .../BuildInformation/FeatureFlag.swift | 5 ---- .../Reader/ReaderDetailViewController.swift | 25 +++--------------- .../Reader/ReaderPostCardCell.swift | 26 +++++-------------- 3 files changed, 10 insertions(+), 46 deletions(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 5f53330e1b44..b59a6bd67be0 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -4,7 +4,6 @@ enum FeatureFlag: Int, CaseIterable { case jetpackDisconnect case debugMenu - case postReblogging case unifiedAuth case quickActions case meMove @@ -23,8 +22,6 @@ enum FeatureFlag: Int, CaseIterable { case .debugMenu: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] - case .postReblogging: - return true case .unifiedAuth: return BuildConfiguration.current == .localDeveloper case .quickActions: @@ -57,8 +54,6 @@ extension FeatureFlag: OverrideableFlag { return "Jetpack disconnect" case .debugMenu: return "Debug menu" - case .postReblogging: - return "Post Reblogging" case .unifiedAuth: return "Unified Auth" case .quickActions: diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderDetailViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderDetailViewController.swift index 08c1f4a06c9d..6fe15f64a1fc 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderDetailViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderDetailViewController.swift @@ -557,13 +557,6 @@ open class ReaderDetailViewController: UIViewController, UIViewControllerRestora WPStyleGuide.applyReaderCardTagButtonStyle(tagButton) WPStyleGuide.applyReaderCardActionButtonStyle(commentButton) WPStyleGuide.applyReaderCardActionButtonStyle(likeButton) - if !FeatureFlag.postReblogging.enabled { - // this becomes redundant, as saveForLaterButton does not have a label anymore - // and applyReaderActionButtonStyle() is called by applyReaderSaveForLaterButtonStyle - // which in turn is called by configureSaveForLaterButton. Same considerations for - // reblog button - WPStyleGuide.applyReaderCardActionButtonStyle(saveForLaterButton) - } view.backgroundColor = .listBackground @@ -952,9 +945,7 @@ open class ReaderDetailViewController: UIViewController, UIViewControllerRestora likeButton.isEnabled = ReaderHelpers.isLoggedIn() // as by design spec, only display like counts let likeCount = post?.likeCount()?.intValue ?? 0 - let shortTitle = likeCount > 0 ? "\(likeCount)" : "" - - let title = FeatureFlag.postReblogging.enabled ? shortTitle : post?.likeCountForDisplay() + let title = likeCount > 0 ? "\(likeCount)" : "" let selected = post?.isLiked ?? false let likeImage = UIImage(named: "icon-reader-like") @@ -969,9 +960,6 @@ open class ReaderDetailViewController: UIViewController, UIViewControllerRestora /// Uses the configuration in WPStyleGuide for the reblog button fileprivate func configureReblogButton() { - guard FeatureFlag.postReblogging.enabled else { - return - } reblogButton.isHidden = false WPStyleGuide.applyReaderReblogActionButtonStyle(reblogButton, showTitle: false) } @@ -1052,12 +1040,7 @@ open class ReaderDetailViewController: UIViewController, UIViewControllerRestora fileprivate func configureSaveForLaterButton() { WPStyleGuide.applyReaderSaveForLaterButtonStyle(saveForLaterButton) - if FeatureFlag.postReblogging.enabled { - WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton, showTitle: false) - } else { - WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton) - } - + WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton, showTitle: false) saveForLaterButton.isHidden = false saveForLaterButton.isSelected = post?.isSavedForLater ?? false @@ -1563,9 +1546,7 @@ extension ReaderDetailViewController: Accessible { prepareHeaderForVoiceOver() prepareContentForVoiceOver() prepareActionButtonsForVoiceOver() - if FeatureFlag.postReblogging.enabled { - prepareReblogForVoiceOver() - } + prepareReblogForVoiceOver() NotificationCenter.default.addObserver(self, selector: #selector(setBarsAsVisibleIfVoiceOverIsEnabled), diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPostCardCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPostCardCell.swift index 11dcc36c96d0..3aef302adbbf 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPostCardCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPostCardCell.swift @@ -243,11 +243,7 @@ import Gridicons borderedView.layer.borderWidth = .hairlineBorderWidth WPStyleGuide.applyReaderSaveForLaterButtonStyle(saveForLaterButton) - - if FeatureFlag.postReblogging.enabled { - WPStyleGuide.applyReaderReblogActionButtonStyle(reblogActionButton) - } - + WPStyleGuide.applyReaderReblogActionButtonStyle(reblogActionButton) WPStyleGuide.applyReaderFollowButtonStyle(followButton) WPStyleGuide.applyReaderCardBlogNameStyle(blogNameLabel) WPStyleGuide.applyReaderCardBylineLabelStyle(bylineLabel) @@ -509,8 +505,7 @@ import Gridicons fileprivate var shouldShowReblogActionButton: Bool { // reblog button is hidden if there's no content - guard FeatureFlag.postReblogging.enabled, - let provider = contentProvider, + guard let provider = contentProvider, !provider.isPrivate(), loggedInActionVisibility.isEnabled else { return false @@ -532,12 +527,9 @@ import Gridicons let commentTitle = commentCount > 0 ? String(commentCount) : "" likeActionButton.setTitle(likeTitle, for: .normal) commentActionButton.setTitle(commentTitle, for: .normal) - if FeatureFlag.postReblogging.enabled { - WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton, showTitle: false) - WPStyleGuide.applyReaderReblogActionButtonTitle(reblogActionButton, showTitle: false) - } else { - saveForLaterButton.setTitle("", for: .normal) - } + WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton, showTitle: false) + WPStyleGuide.applyReaderReblogActionButtonTitle(reblogActionButton, showTitle: false) + } else { let likeTitle = WPStyleGuide.likeCountForDisplay(likeCount) let commentTitle = WPStyleGuide.commentCountForDisplay(commentCount) @@ -546,9 +538,7 @@ import Gridicons commentActionButton.setTitle(commentTitle, for: .normal) WPStyleGuide.applyReaderSaveForLaterButtonTitles(saveForLaterButton) - if FeatureFlag.postReblogging.enabled { - WPStyleGuide.applyReaderReblogActionButtonTitle(reblogActionButton) - } + WPStyleGuide.applyReaderReblogActionButtonTitle(reblogActionButton) } } @@ -671,9 +661,7 @@ extension ReaderPostCardCell: Accessible { prepareMenuForVoiceOver() prepareVisitForVoiceOver() prepareFollowButtonForVoiceOver() - if FeatureFlag.postReblogging.enabled { - prepareReblogForVoiceOver() - } + prepareReblogForVoiceOver() } private func prepareCardForVoiceOver() { From 5eb122190fadb820976a215970e34536fc37840c Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 13 Apr 2020 18:33:26 -0500 Subject: [PATCH 163/245] Remove reblog feature flag from unit tests --- .../WordPressTest/ReaderDetailViewControllerTests.swift | 3 --- WordPress/WordPressTest/ReaderPostCardCellTests.swift | 9 --------- 2 files changed, 12 deletions(-) diff --git a/WordPress/WordPressTest/ReaderDetailViewControllerTests.swift b/WordPress/WordPressTest/ReaderDetailViewControllerTests.swift index 284a5e567482..3ba0df521089 100644 --- a/WordPress/WordPressTest/ReaderDetailViewControllerTests.swift +++ b/WordPress/WordPressTest/ReaderDetailViewControllerTests.swift @@ -28,9 +28,6 @@ class ReaderDetailViewControllerTests: XCTestCase { } func testReblogButtonMatchesExpectation() { - guard FeatureFlag.postReblogging.enabled else { - return - } XCTAssertEqual(readerDetailViewController?.getReblogButtonForTesting().accessibilityLabel, TestConstants.reblogLabel, "Incorrect accessibility label: Reblog button") } } diff --git a/WordPress/WordPressTest/ReaderPostCardCellTests.swift b/WordPress/WordPressTest/ReaderPostCardCellTests.swift index 836ee8991be2..106947b4b723 100644 --- a/WordPress/WordPressTest/ReaderPostCardCellTests.swift +++ b/WordPress/WordPressTest/ReaderPostCardCellTests.swift @@ -197,16 +197,10 @@ final class ReaderPostCardCellTests: XCTestCase { } func testReblogActionButtonMatchesExpectation() { - guard FeatureFlag.postReblogging.enabled else { - return - } XCTAssertEqual(cell?.getReblogButtonForTesting().accessibilityLabel, TestConstants.reblogLabel, "Incorrect accessibility label: Reblog button") } func testReblogButtonIsVisible() { - guard FeatureFlag.postReblogging.enabled else { - return - } guard let button = cell?.getReblogButtonForTesting() else { XCTFail("Reblog button not found.") return @@ -215,9 +209,6 @@ final class ReaderPostCardCellTests: XCTestCase { } func testReblogButtonVisibleWithNoLoggedInUser() { - guard FeatureFlag.postReblogging.enabled else { - return - } cell?.loggedInActionVisibility = .visible(enabled: false) cell?.configureCell(mock!) From cb9cd7b3d21361058b628be941f4aaf4d217f021 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 13 Apr 2020 18:45:22 -0500 Subject: [PATCH 164/245] Address changes for PR #13580 --- .../ViewRelated/Reader/ReaderStreamViewController.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 4afd95541501..25fab6719684 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -37,10 +37,7 @@ import WordPressFlux return nil } let currentHelper = syncHelpers[topic] ?? WPContentSyncHelper() - - if syncHelpers[topic] == nil { - syncHelpers[topic] = currentHelper - } + syncHelpers[topic] = currentHelper return currentHelper } From 84231a93e626894c62a325fe4b611cb48a97ce69 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Mon, 13 Apr 2020 20:24:14 -0500 Subject: [PATCH 165/245] disabled feature flag for new reader --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 12f279e576e5..5f53330e1b44 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] + return false } } } From c9469c36c70ff8c1cb25544446f040e6e7baecd6 Mon Sep 17 00:00:00 2001 From: James Frost Date: Tue, 14 Apr 2020 14:59:12 +0100 Subject: [PATCH 166/245] Update WPAuthenticator pod reference --- Podfile | 6 +++--- Podfile.lock | 15 ++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Podfile b/Podfile index 6c3e05450e68..3b4294b8f778 100644 --- a/Podfile +++ b/Podfile @@ -185,11 +185,11 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' +# pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' # While in PR - # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' + pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'try/switch-primary-button' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' - # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' +# pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index d3be74f6258d..accc04c2fa61 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -376,7 +376,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.13.0-beta.1): + - WordPressAuthenticator (1.13.0-beta.2): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (~> 1.13.0-beta.1) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `try/switch-primary-button`) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,7 +527,6 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS - - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -613,6 +612,9 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :branch: try/switch-primary-button + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -626,6 +628,9 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :commit: f37763a0f2514470d67c92ce16886dc2ef764564 + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -697,7 +702,7 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: b64a15c023570a85ffa748766fd3e7469eac9449 + WordPressAuthenticator: 693ff4ee341e1cf9acb6d1fb53c5372ab6efb10f WordPressKit: dde0a214279fb70d7150b69ae90c7224c18fe2d0 WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 @@ -714,6 +719,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 082f5addde6658b17532f09619ce370f79441e6b +PODFILE CHECKSUM: e2f1b1175d2f4e236ee24220675954da95d62d12 COCOAPODS: 1.8.4 From 98366957903c7e4f2f9c3bfb0ffed86d0a9eb12a Mon Sep 17 00:00:00 2001 From: James Frost Date: Tue, 14 Apr 2020 15:55:48 +0100 Subject: [PATCH 167/245] Updated release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d5359dc1cd61..4815fc4cccd6 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,6 +3,7 @@ * [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad * [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. +* Updated the appearance of the login and signup buttons to make signup more prominent. 14.6 ----- From ed552e069fa60324ce0ead1db3ac6e5997c52e6a Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 14 Apr 2020 13:44:45 -0500 Subject: [PATCH 168/245] Point podfile to feature branch for Authenticator --- Podfile | 4 ++-- Podfile.lock | 15 ++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Podfile b/Podfile index 6c3e05450e68..f375f9fa147d 100644 --- a/Podfile +++ b/Podfile @@ -185,9 +185,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' + #pod 'WordPressAuthenticator', '~> 1.13.0-beta.3' # While in PR - # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' + pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/239-remove-showURLUsernamePassword' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index d3be74f6258d..919091630746 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -376,7 +376,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.13.0-beta.1): + - WordPressAuthenticator (1.13.0-beta.3): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (~> 1.13.0-beta.1) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/239-remove-showURLUsernamePassword`) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,7 +527,6 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS - - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -613,6 +612,9 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :branch: issue/239-remove-showURLUsernamePassword + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -626,6 +628,9 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :commit: 9a1cdfce612c96623bdf7680cc493d405f295e3a + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -697,7 +702,7 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: b64a15c023570a85ffa748766fd3e7469eac9449 + WordPressAuthenticator: 6aa4deec9a328c354ea08a1d1a60f1ca19cb8279 WordPressKit: dde0a214279fb70d7150b69ae90c7224c18fe2d0 WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 @@ -714,6 +719,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 082f5addde6658b17532f09619ce370f79441e6b +PODFILE CHECKSUM: 4573a5308667afd305404b2277ef0c2d7bd55613 COCOAPODS: 1.8.4 From 72d5200ca6b4380beae6c13c4fb6db35380c9890 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 14 Apr 2020 14:19:05 -0500 Subject: [PATCH 169/245] Add an internal testing note. --- RELEASE-NOTES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d5359dc1cd61..8d5b717b3e35 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,8 +1,9 @@ 14.7 ----- -* [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad +* [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. +* [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. 14.6 ----- From ca10d6b7ebbc4600c1e18992dab240364ce48da2 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 14 Apr 2020 13:55:01 -0600 Subject: [PATCH 170/245] Adjust filter buttons, landscape sheet, and fixes --- .../Reader/Filter/FilterSheetView.swift | 7 +++--- .../Filter/FilterSheetViewController.swift | 8 +++++++ .../Reader/Tab Navigation/ReaderTabView.swift | 24 ++++++++++++++----- .../DrawerPresentationController.swift | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift index 05dfbfbcaa3b..e164335cdf46 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift @@ -22,9 +22,10 @@ class FilterSheetView: UIView { }() lazy var ghostableTableView: UITableView = { - let ghostTV = UITableView() - ghostTV.isScrollEnabled = false - return ghostTV + let tableView = UITableView() + tableView.isScrollEnabled = false + tableView.separatorStyle = .none + return tableView }() lazy var filterTabBar: FilterTabBar = { diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift index 7862a9b23bf3..368c81724973 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetViewController.swift @@ -23,4 +23,12 @@ extension FilterSheetViewController: DrawerPresentable { var scrollableView: UIScrollView? { return (view as? FilterSheetView)?.tableView } + + var collapsedHeight: DrawerHeight { + if traitCollection.verticalSizeClass == .compact { + return .maxHeight + } else { + return .contentHeight(0) + } + } } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 29a32daa5a89..4b0b41ed346c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -51,8 +51,8 @@ extension ReaderTabView { setupButtonsView() setupFilterButton() setupResetFilterButton() - setupDivider(verticalDivider) - setupDivider(horizontalDivider) + setupVerticalDivider(verticalDivider) + setupHorizontalDivider(horizontalDivider) setupSettingsButton() activateConstraints() } @@ -94,7 +94,7 @@ extension ReaderTabView { buttonsStackView.translatesAutoresizingMaskIntoConstraints = false buttonsStackView.isLayoutMarginsRelativeArrangement = true buttonsStackView.axis = .horizontal - buttonsStackView.alignment = .center + buttonsStackView.alignment = .fill buttonsStackView.addArrangedSubview(filterButton) buttonsStackView.addArrangedSubview(resetFilterButton) let spacer = UIView() @@ -123,7 +123,21 @@ extension ReaderTabView { resetFilterButton.isHidden = true } - private func setupDivider(_ divider: UIView) { + private func setupVerticalDivider(_ divider: UIView) { + divider.translatesAutoresizingMaskIntoConstraints = false + let dividerView = UIView() + dividerView.translatesAutoresizingMaskIntoConstraints = false + dividerView.backgroundColor = Appearance.dividerColor + divider.addSubview(dividerView) + NSLayoutConstraint.activate([ + dividerView.centerYAnchor.constraint(equalTo: divider.centerYAnchor), + dividerView.heightAnchor.constraint(equalTo: divider.heightAnchor, multiplier: Appearance.verticalDividerHeightMultiplier), + dividerView.leadingAnchor.constraint(equalTo: divider.leadingAnchor), + dividerView.trailingAnchor.constraint(equalTo: divider.trailingAnchor) + ]) + } + + private func setupHorizontalDivider(_ divider: UIView) { divider.translatesAutoresizingMaskIntoConstraints = false divider.backgroundColor = Appearance.dividerColor } @@ -157,8 +171,6 @@ extension ReaderTabView { buttonsStackView.heightAnchor.constraint(equalToConstant: Appearance.barHeight), resetFilterButton.widthAnchor.constraint(equalToConstant: Appearance.resetButtonWidth), verticalDivider.widthAnchor.constraint(equalToConstant: Appearance.dividerWidth), - verticalDivider.heightAnchor.constraint(equalTo: buttonsStackView.heightAnchor, - multiplier: Appearance.verticalDividerHeightMultiplier), horizontalDivider.heightAnchor.constraint(equalToConstant: Appearance.dividerWidth), horizontalDivider.widthAnchor.constraint(equalTo: mainStackView.widthAnchor), settingsButton.widthAnchor.constraint(equalToConstant: Appearance.settingsButtonWidth) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 256dbe75274b..aed33c73b062 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -13,7 +13,7 @@ public enum DrawerHeight { // Height is based on the specified margin from the top of the screen case topMargin(CGFloat) - // Height will be equal to the the content height value + // Height will be equal to the the content height value. A height of 0 will use the calculated height. case contentHeight(CGFloat) } From 24582cff1e25c7bf5fe8287af5e4f3831ba05b48 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 15:27:39 -0500 Subject: [PATCH 171/245] Update analytics and alerts for saved posts in the new Reader - Update ReaderPostCellActions.swift, refactor toggleSaveForLater() in order to display the alert only if it's not a saved posts feed - Update ReaderStreamViewController+Helper.swift, add trackSavedListAccessed() method --- .../Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- .../ViewRelated/Reader/ReaderPostCellActions.swift | 9 +++++++-- .../Reader/ReaderSaveForLater+Analytics.swift | 6 +++--- .../Reader/ReaderStreamViewController+Helper.swift | 8 ++++++++ .../Reader/ReaderStreamViewController.swift | 10 +++++++--- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 5f53330e1b44..12f279e576e5 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return false + return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] } } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift index a56e839603f6..ef6bfa78f621 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift @@ -121,19 +121,24 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { func toggleSavedForLater(for post: ReaderPost) { let actionOrigin: ReaderSaveForLaterOrigin // TODO: - READERNAV - Remove this check once the old reader is removed + var presentSavedPostAlert = visibleConfirmation if origin is ReaderSavedPostsViewController { actionOrigin = .savedStream + } else if let origin = origin as? ReaderStreamViewController, origin.isSavedPostsController, FeatureFlag.newReaderNavigation.enabled { + actionOrigin = .savedStream + presentSavedPostAlert = false + } else { actionOrigin = .otherStream } if !post.isSavedForLater { - if let origin = origin as? UIViewController & UIViewControllerTransitioningDelegate { + if let origin = origin as? ReaderStreamViewController, !origin.isSavedPostsController { FancyAlertViewController.presentReaderSavedPostsAlertControllerIfNecessary(from: origin) } } - ReaderSaveForLaterAction(visibleConfirmation: visibleConfirmation).execute(with: post, context: context, origin: actionOrigin) + ReaderSaveForLaterAction(visibleConfirmation: presentSavedPostAlert).execute(with: post, context: context, origin: actionOrigin) } fileprivate func visitSiteForPost(_ post: ReaderPost) { diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift index ee21b574660c..943faf3f7293 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift @@ -6,7 +6,7 @@ enum ReaderSaveForLaterOrigin { case postDetail case readerMenu - fileprivate var saveActionValue: String { + var saveActionValue: String { switch self { case .savedStream: return "saved_post_list" @@ -19,7 +19,7 @@ enum ReaderSaveForLaterOrigin { } } - fileprivate var openPostValue: String { + var openPostValue: String { switch self { case .savedStream: return "saved_post_list" @@ -32,7 +32,7 @@ enum ReaderSaveForLaterOrigin { } } - fileprivate var viewAllPostsValue: String { + var viewAllPostsValue: String { switch self { case .savedStream: return "post_list_saved_post_notice" diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index 3a93654cbf92..dd2447d228c1 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -182,3 +182,11 @@ extension ReaderStreamViewController { cell.delegate = self } } + + +// MARK: - Tracks +extension ReaderStreamViewController { + func trackSavedListAccessed() { + WPAppAnalytics.track(.readerSavedListViewed, withProperties: ["source": ReaderSaveForLaterOrigin.readerMenu.viewAllPostsValue]) + } +} diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index abdde648a3dd..5d79eeb448f3 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -141,11 +141,15 @@ import WordPressFlux } var isSavedPostsController: Bool = false { - didSet { - if !isSavedPostsController && oldValue { + willSet { + if isSavedPostsController && !newValue { postCellActions?.clearRemovedPosts() - } else if isSavedPostsController { + } + } + didSet { + if isSavedPostsController { configureControllerForTopic(synchronize: false) + trackSavedListAccessed() } } } From 83377b94f6f5d2dfe7a4885e866946d5706c38fa Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 15:40:14 -0500 Subject: [PATCH 172/245] removed whitespace in ReaderStreamViewController+Helper.swift --- .../ViewRelated/Reader/ReaderStreamViewController+Helper.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift index dd2447d228c1..e24b32c9081e 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController+Helper.swift @@ -136,7 +136,7 @@ extension ReaderStreamViewController { // MARK: - No Results for saved posts extension ReaderStreamViewController { - + func configureNoResultsViewForSavedPosts() { let noResultsResponse = NoResultsResponse(title: NSLocalizedString("No Saved Posts", From fc431e8ba51d3641482abd1e7b0a4460ce1c9a4d Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 17:36:31 -0300 Subject: [PATCH 173/245] Remove additionalSafeAreaInsetsRegular This should be defined in the child view controller --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 6e18d21fc1e0..91bcfa32b435 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -5,7 +5,6 @@ class BottomSheetViewController: UIViewController { static let gripHeight: CGFloat = 5 static let cornerRadius: CGFloat = 8 static let buttonSpacing: CGFloat = 8 - static let additionalSafeAreaInsetsRegular: UIEdgeInsets = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0) static let minimumWidth: CGFloat = 300 enum Header { @@ -116,10 +115,8 @@ class BottomSheetViewController: UIViewController { private func refreshForTraits() { if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { gripButton.isHidden = true - additionalSafeAreaInsets = Constants.additionalSafeAreaInsetsRegular } else { gripButton.isHidden = false - additionalSafeAreaInsets = .zero } } From cd2a5983d5de7e02bab8b445dce78ad2ef450ef6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Mon, 13 Apr 2020 17:36:41 -0300 Subject: [PATCH 174/245] Change the iPad height --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 3c959e889bae..2c415bb2fb46 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -11,7 +11,7 @@ class PrepublishingNavigationController: LightNavigationController { } private enum Constants { - static let height: CGFloat = 300 + static let height: CGFloat = 280 } } From 3adb5227984a5e81125c580af66b992182c85ee0 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 14 Apr 2020 15:38:14 -0300 Subject: [PATCH 175/245] Change nudges margins to match 16pt --- .../PrepublishingHeaderView.swift | 2 +- .../PrepublishingHeaderView.xib | 15 +++++------ .../PrepublishingNavigationController.swift | 3 ++- .../Post/PrepublishingViewController.swift | 25 ++++++++++++++++--- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index cf5aa273c859..ef74b56632c7 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -71,7 +71,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { private enum Constants { static let backButtonSize = CGSize(width: 28, height: 28) - static let leftRightInset: CGFloat = 20 + static let leftRightInset: CGFloat = 16 static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") static let close = NSLocalizedString("Close", comment: "Voiceover accessibility label informing the user that this button dismiss the current view") static let doubleTapToDismiss = NSLocalizedString("Double tap to dismiss", comment: "Voiceover accessibility hint informing the user they can double tap a modal alert to dismiss it") diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib index c9be0c2a39f0..6a3711acbe56 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.xib @@ -15,7 +15,7 @@ - + @@ -58,19 +58,19 @@ - + - + - From 5d3c82b422c17a265b82eacb9072370271c00adf Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 14 Apr 2020 16:39:32 -0300 Subject: [PATCH 177/245] Change the height for regular devices (non iPad) --- .../Prepublishing Nudge/PrepublishingNavigationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index 6619fb4b09ed..d2cb862fa743 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -11,7 +11,7 @@ class PrepublishingNavigationController: LightNavigationController { } private enum Constants { - static let height: CGFloat = 280 + static let height: CGFloat = 290 static let iPadHeight: CGFloat = 270 } } From dac614dea8bae74a8641c91d2bfa5fd24c3063f4 Mon Sep 17 00:00:00 2001 From: Sergio Estevao Date: Tue, 14 Apr 2020 22:14:48 +0100 Subject: [PATCH 178/245] Show standard notice for network errors on the Media Library We are also disabling the default error message displayed by the WPMediaPicker and not showing any message and use the no view screen when media is empty. --- .../ViewRelated/Media/MediaLibraryViewController.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Media/MediaLibraryViewController.swift b/WordPress/Classes/ViewRelated/Media/MediaLibraryViewController.swift index 9e0b8af96d13..079090752e84 100644 --- a/WordPress/Classes/ViewRelated/Media/MediaLibraryViewController.swift +++ b/WordPress/Classes/ViewRelated/Media/MediaLibraryViewController.swift @@ -595,6 +595,15 @@ extension MediaLibraryViewController: WPMediaPickerViewControllerDelegate { updateViewState(for: pickerDataSource.numberOfAssets()) } + + func mediaPickerController(_ picker: WPMediaPickerViewController, handleError error: Error) -> Bool { + let nserror = error as NSError + if let mediaLibrary = self.blog.media, !mediaLibrary.isEmpty { + let title = NSLocalizedString("Unable to Sync", comment: "Title of error prompt shown when a sync the user initiated fails.") + WPError.showNetworkingNotice(title: title, error: nserror) + } + return true + } } // MARK: - State restoration From c7a70992a70cf1003cb7681525b3cebef71ec950 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 17:04:53 -0500 Subject: [PATCH 179/245] Add the search function to the new Reader --- .../Reader/Tab Navigation/ReaderTabViewController.swift | 7 ++++--- .../Reader/Tab Navigation/ReaderTabViewModel.swift | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift index 22a9467adc7e..2396e9e9ee85 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift @@ -26,10 +26,11 @@ class ReaderTabViewController: UIViewController { } } -// MARK: - Actions +// MARK: - Search extension ReaderTabViewController { - /// Search button + @objc private func didTapSearchButton() { - viewModel.performSearch() + let searchController = ReaderSearchViewController.controller() + navigationController?.pushViewController(searchController, animated: true) } } diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 0c37f7029dea..242d4b45e10c 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -15,8 +15,6 @@ class ReaderTabViewModel { } // TODO: - READERNAV - Methods to be implemented. Signature will likely change - func performSearch() { } - func presentFilter() { } func resetFilter() { } From 14c7f8dfef5b4169774e3c77dd7e984fc0975852 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 18:29:55 -0500 Subject: [PATCH 180/245] Add navigation to saved posts when tapping on view all on the toast, in the new Reader --- .../Reader/Tab Navigation/ReaderTabView.swift | 10 +++++++ .../ReaderTabViewController.swift | 11 ++++++++ .../ViewRelated/System/WPTabBarController.m | 28 ++++++++++++------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index be7baf874c5d..a1badb151aea 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -185,6 +185,16 @@ extension ReaderTabView { } } + func switchToSavedPosts() { + guard let index = tabBar.items.firstIndex(where: { + $0.title == "Saved" + }) else { + return + } + tabBar.setSelectedIndex(index) + selectedTabDidChange(tabBar) + } + /// Filter button @objc private func didTapFilterButton() { //TODO: - READERNAV - Remove. This test code is for UI prototyping only diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift index 2396e9e9ee85..034160cc6db9 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewController.swift @@ -34,3 +34,14 @@ extension ReaderTabViewController { navigationController?.pushViewController(searchController, animated: true) } } + + +// MARK: - Tab Switching +extension ReaderTabViewController { + @objc func navigateToSavedPosts() { + guard let readerTabView = view as? ReaderTabView else { + return + } + readerTabView.switchToSavedPosts() + } +} diff --git a/WordPress/Classes/ViewRelated/System/WPTabBarController.m b/WordPress/Classes/ViewRelated/System/WPTabBarController.m index d737b3a276bc..702ce49e4e25 100644 --- a/WordPress/Classes/ViewRelated/System/WPTabBarController.m +++ b/WordPress/Classes/ViewRelated/System/WPTabBarController.m @@ -61,6 +61,7 @@ @interface WPTabBarController () Date: Tue, 14 Apr 2020 20:34:00 -0300 Subject: [PATCH 181/245] Fix iPad with iOS 12 height issues --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 9 +++++++++ .../PrepublishingNavigationController.swift | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 91bcfa32b435..08d7411b3161 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -112,6 +112,15 @@ class BottomSheetViewController: UIViewController { refreshForTraits() } + override var preferredContentSize: CGSize { + set { + childViewController?.preferredContentSize = newValue + } + get { + return childViewController?.preferredContentSize ?? super.preferredContentSize + } + } + private func refreshForTraits() { if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { gripButton.isHidden = true diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift index d2cb862fa743..6e516d9c5682 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingNavigationController.swift @@ -6,13 +6,13 @@ class PrepublishingNavigationController: LightNavigationController { // Set the height for iPad if UIDevice.isPad() { - view.heightAnchor.constraint(equalToConstant: Constants.iPadHeight).isActive = true + preferredContentSize = Constants.iPadPreferredContentSize } } private enum Constants { static let height: CGFloat = 290 - static let iPadHeight: CGFloat = 270 + static let iPadPreferredContentSize = CGSize(width: 300, height: 240) } } From 551099ad7e3ecc1625e636193d4d556b49e389fe Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 14 Apr 2020 21:14:05 -0300 Subject: [PATCH 182/245] Prevent the BottomSheet from resizing itself --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index 08d7411b3161..a6e7dfd548f1 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -129,11 +129,6 @@ class BottomSheetViewController: UIViewController { } } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - return preferredContentSize = CGSize(width: Constants.minimumWidth, height: view.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height) - } - @objc func keyboardWillShow(_ notification: NSNotification) { self.presentedVC?.transition(to: .expanded) } From 70539fd0bf9b0275b0f3ef4721a6034c15071bdf Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Tue, 14 Apr 2020 21:14:25 -0300 Subject: [PATCH 183/245] Only show navigation bar if presenting a new VC --- .../ViewRelated/Post/PrepublishingViewController.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 6b898f35c7e1..c926867b4726 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -73,7 +73,10 @@ class PrepublishingViewController: UITableViewController { override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - navigationController?.setNavigationBarHidden(false, animated: animated) + let isPresentingAViewController = navigationController?.viewControllers.count ?? 0 > 1 + if isPresentingAViewController { + navigationController?.setNavigationBarHidden(false, animated: animated) + } } override func numberOfSections(in tableView: UITableView) -> Int { From 2cb62df131b5df63972f6dcd79aa0361fdf47b2c Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Tue, 14 Apr 2020 20:06:14 -0600 Subject: [PATCH 184/245] Allow width constraint to break in compact Width won't fit in compact so it can break in that scenario --- .../Detail Header/NewBlogDetailHeaderView.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift index 666907ea2340..2483345efe45 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blog Details/Detail Header/NewBlogDetailHeaderView.swift @@ -113,20 +113,18 @@ class NewBlogDetailHeaderView: UIView { let bottomConstraint = buttonsStackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -Constants.buttonsBottomPadding) bottomConstraint.priority = UILayoutPriority(999) // Allow to break so encapsulated height (on initial table view load) doesn't spew warnings - /// If we are able to attach to the safe area's leading edge, we should, otherwise it can break - let leadingSafeAreaConstraint = stackView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor) - leadingSafeAreaConstraint.priority = .defaultHigh + let widthConstraint = buttonsStackView.widthAnchor.constraint(equalToConstant: 320) + widthConstraint.priority = .defaultHigh let edgeConstraints = [ - leadingSafeAreaConstraint, stackView.trailingAnchor.constraint(lessThanOrEqualTo: layoutMarginsGuide.trailingAnchor), stackView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor, constant: Constants.minimumSideSpacing), stackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.interSectionSpacing), stackView.centerXAnchor.constraint(equalTo: layoutMarginsGuide.centerXAnchor), - buttonsStackView.widthAnchor.constraint(equalToConstant: 320), buttonsStackView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: Constants.interSectionSpacing), buttonsStackView.centerXAnchor.constraint(equalTo: stackView.centerXAnchor), - bottomConstraint + bottomConstraint, + widthConstraint ] NSLayoutConstraint.activate(minimumPaddingSideConstraints + edgeConstraints) From f9d96907cbba2a6053fec2d16b08f29dbd896882 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 22:18:30 -0500 Subject: [PATCH 185/245] Update ReaderStreamViewController.swift, refactor configureControllerForTopic() in order to reset the header when switching to saved posts --- .../Classes/ViewRelated/Reader/ReaderStreamViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 5d79eeb448f3..5ba70cc0761b 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -519,6 +519,8 @@ import WordPressFlux updateAndPerformFetchRequest() if readerTopic != nil { configureStreamHeader() + } else { + tableView.tableHeaderView = nil } tableView.setContentOffset(CGPoint.zero, animated: false) content.refresh() From 8244e6d2b26f769adea69843d25193fd4cb1e0fd Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Tue, 14 Apr 2020 23:02:01 -0500 Subject: [PATCH 186/245] Update WPTabBarController.m, reinitialize readerTabBarViewController when the default account changes --- WordPress/Classes/ViewRelated/System/WPTabBarController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/Classes/ViewRelated/System/WPTabBarController.m b/WordPress/Classes/ViewRelated/System/WPTabBarController.m index 702ce49e4e25..1dfbad246d83 100644 --- a/WordPress/Classes/ViewRelated/System/WPTabBarController.m +++ b/WordPress/Classes/ViewRelated/System/WPTabBarController.m @@ -923,6 +923,7 @@ - (void)defaultAccountDidChange:(NSNotification *)notification [self.meNavigationController popToRootViewControllerAnimated:NO]; [self.notificationsNavigationController popToRootViewControllerAnimated:NO]; } + self.readerTabViewController = nil; } - (void)signinDidFinish:(NSNotification *)notification From 55930ab6a31c9d2c9d9e0d0599beadca43164611 Mon Sep 17 00:00:00 2001 From: James Frost Date: Wed, 15 Apr 2020 09:15:37 +0100 Subject: [PATCH 187/245] Bumped WPAuthenticator pod version --- Podfile | 4 ++-- Podfile.lock | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Podfile b/Podfile index 3b4294b8f778..d973948d9285 100644 --- a/Podfile +++ b/Podfile @@ -185,9 +185,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' -# pod 'WordPressAuthenticator', '~> 1.13.0-beta.1' + pod 'WordPressAuthenticator', '~> 1.13.0-beta.2' # While in PR - pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'try/switch-primary-button' +# pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'try/switch-primary-button' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index accc04c2fa61..ba7cd64fce48 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `try/switch-primary-button`) + - WordPressAuthenticator (~> 1.13.0-beta.2) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,6 +527,7 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS + - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -612,9 +613,6 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :branch: try/switch-primary-button - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -628,9 +626,6 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :commit: f37763a0f2514470d67c92ce16886dc2ef764564 - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -719,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: e2f1b1175d2f4e236ee24220675954da95d62d12 +PODFILE CHECKSUM: d4b871b14b78129b9c99ba51d55b4442c8655acc COCOAPODS: 1.8.4 From a312fab7774ab8d16328c73cd143ac709e78e84b Mon Sep 17 00:00:00 2001 From: Sergio Estevao Date: Wed, 15 Apr 2020 11:02:03 +0100 Subject: [PATCH 188/245] Insert caption when available on the media library. --- .../ViewControllers/AztecPostViewController.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift b/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift index 8326b364d7bb..df4d67cce11d 100644 --- a/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift +++ b/WordPress/Classes/ViewRelated/Aztec/ViewControllers/AztecPostViewController.swift @@ -2438,14 +2438,16 @@ extension AztecPostViewController { } } - private func insertImageAttachment(with url: URL = Constants.placeholderMediaLink) -> ImageAttachment { + private func insertImageAttachment(with url: URL = Constants.placeholderMediaLink, caption: String? = nil) -> ImageAttachment { let attachment = richTextView.replaceWithImage(at: self.richTextView.selectedRange, sourceURL: url, placeHolderImage: Assets.defaultMissingImage) attachment.size = .full if url.isGif { attachment.badgeTitle = Constants.mediaGIFBadgeTitle } - + if let caption = caption { + richTextView.replaceCaption(for: attachment, with: NSAttributedString(string: caption)) + } return attachment } @@ -2519,7 +2521,7 @@ extension AztecPostViewController { } switch media.mediaType { case .image: - let attachment = insertImageAttachment(with: remoteURL) + let attachment = insertImageAttachment(with: remoteURL, caption: media.caption) attachment.alt = media.alt WPAppAnalytics.track(.editorAddedPhotoViaWPMediaLibrary, withProperties: WPAppAnalytics.properties(for: media, selectionMethod: mediaSelectionMethod), with: post) case .video: @@ -2549,7 +2551,7 @@ extension AztecPostViewController { } var attachment: MediaAttachment? if media.mediaType == .image { - attachment = insertImageAttachment(with: tempMediaURL) + attachment = insertImageAttachment(with: tempMediaURL, caption: media.caption) } else if media.mediaType == .video, let remoteURLStr = media.remoteURL, let remoteURL = URL(string: remoteURLStr) { From 1244e9740cf04128d59b9d3d5636dcce0783e038 Mon Sep 17 00:00:00 2001 From: Sergio Estevao Date: Wed, 15 Apr 2020 14:10:51 +0100 Subject: [PATCH 189/245] Send media caption information to Gutenberg. --- Podfile | 2 +- Podfile.lock | 138 +++++++++--------- .../GutenbergMediaInserterHelper.swift | 2 +- 3 files changed, 71 insertions(+), 71 deletions(-) diff --git a/Podfile b/Podfile index 6c3e05450e68..8388754bee5c 100644 --- a/Podfile +++ b/Podfile @@ -149,7 +149,7 @@ target 'WordPress' do ## Gutenberg (React Native) ## ===================== ## - gutenberg :tag => 'v1.25.0' + gutenberg :commit => 'fd4121aa35feee53b2ddba886251999ed8e15229' ## Third party libraries ## ===================== diff --git a/Podfile.lock b/Podfile.lock index d3be74f6258d..71e3555bcff0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -429,15 +429,15 @@ DEPENDENCIES: - Charts (~> 3.2.2) - CocoaLumberjack (= 3.5.2) - Down (~> 0.6.6) - - FBLazyVector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json`) - - FBReactNativeSpec (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json`) - - Folly (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json`) + - FBLazyVector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json`) + - FBReactNativeSpec (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json`) + - Folly (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json`) - FormatterKit/TimeIntervalFormatter (= 1.8.2) - FSInteractiveMap (from `https://github.com/wordpress-mobile/FSInteractiveMap.git`, tag `0.2.0`) - Gifu (= 3.2.0) - - glog (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json`) + - glog (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json`) - Gridicons (~> 1.0.1) - - Gutenberg (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.25.0`) + - Gutenberg (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, commit `fd4121aa35feee53b2ddba886251999ed8e15229`) - JTAppleCalendar (~> 8.0.2) - MediaEditor (~> 1.0.1) - MRProgress (= 0.8.3) @@ -447,34 +447,34 @@ DEPENDENCIES: - OCMock (= 3.4.3) - OHHTTPStubs (= 6.1.0) - OHHTTPStubs/Swift (= 6.1.0) - - RCTRequired (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json`) - - RCTTypeSafety (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json`) + - RCTRequired (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json`) + - RCTTypeSafety (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json`) - Reachability (= 3.2) - - React (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json`) - - React-Core (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json`) - - React-CoreModules (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json`) - - React-cxxreact (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json`) - - React-jsi (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json`) - - React-jsiexecutor (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json`) - - React-jsinspector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json`) - - react-native-keyboard-aware-scroll-view (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json`) - - react-native-linear-gradient (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json`) - - react-native-safe-area (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json`) - - react-native-slider (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json`) - - react-native-video (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json`) - - React-RCTActionSheet (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json`) - - React-RCTAnimation (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json`) - - React-RCTBlob (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json`) - - React-RCTImage (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json`) - - React-RCTLinking (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json`) - - React-RCTNetwork (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json`) - - React-RCTSettings (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json`) - - React-RCTText (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json`) - - React-RCTVibration (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json`) - - ReactCommon (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json`) - - ReactNativeDarkMode (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json`) - - RNSVG (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json`) - - RNTAztecView (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.25.0`) + - React (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json`) + - React-Core (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json`) + - React-CoreModules (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json`) + - React-cxxreact (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json`) + - React-jsi (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json`) + - React-jsiexecutor (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json`) + - React-jsinspector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json`) + - react-native-keyboard-aware-scroll-view (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json`) + - react-native-linear-gradient (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json`) + - react-native-safe-area (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json`) + - react-native-slider (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json`) + - react-native-video (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json`) + - React-RCTActionSheet (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json`) + - React-RCTAnimation (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json`) + - React-RCTBlob (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json`) + - React-RCTImage (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json`) + - React-RCTLinking (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json`) + - React-RCTNetwork (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json`) + - React-RCTSettings (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json`) + - React-RCTText (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json`) + - React-RCTVibration (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json`) + - ReactCommon (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json`) + - ReactNativeDarkMode (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json`) + - RNSVG (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json`) + - RNTAztecView (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, commit `fd4121aa35feee53b2ddba886251999ed8e15229`) - SimulatorStatusMagic - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) @@ -485,7 +485,7 @@ DEPENDENCIES: - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.3-beta.1) - WPMediaPicker (~> 1.6.1) - - Yoga (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json`) + - Yoga (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json`) - ZendeskSupportSDK (= 5.0.0) - ZIPFoundation (~> 0.9.8) @@ -545,87 +545,87 @@ SPEC REPOS: EXTERNAL SOURCES: FBLazyVector: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json FBReactNativeSpec: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json Folly: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json FSInteractiveMap: :git: https://github.com/wordpress-mobile/FSInteractiveMap.git :tag: 0.2.0 glog: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json Gutenberg: + :commit: fd4121aa35feee53b2ddba886251999ed8e15229 :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 RCTRequired: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json RCTTypeSafety: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json React: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json React-Core: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json React-CoreModules: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json React-cxxreact: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json React-jsi: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json React-jsiexecutor: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json React-jsinspector: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json react-native-keyboard-aware-scroll-view: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json react-native-linear-gradient: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json react-native-safe-area: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json react-native-slider: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json react-native-video: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json React-RCTActionSheet: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json React-RCTAnimation: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json React-RCTBlob: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json React-RCTImage: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json React-RCTLinking: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json React-RCTNetwork: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json React-RCTSettings: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json React-RCTText: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json React-RCTVibration: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json ReactCommon: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json ReactNativeDarkMode: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json RNSVG: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json RNTAztecView: + :commit: fd4121aa35feee53b2ddba886251999ed8e15229 :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 Yoga: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/fd4121aa35feee53b2ddba886251999ed8e15229/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json CHECKOUT OPTIONS: FSInteractiveMap: :git: https://github.com/wordpress-mobile/FSInteractiveMap.git :tag: 0.2.0 Gutenberg: + :commit: fd4121aa35feee53b2ddba886251999ed8e15229 :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 RNTAztecView: + :commit: fd4121aa35feee53b2ddba886251999ed8e15229 :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -714,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 082f5addde6658b17532f09619ce370f79441e6b +PODFILE CHECKSUM: bea8a3ea967a9a59f87e198eebd2464b918fdc14 COCOAPODS: 1.8.4 diff --git a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergMediaInserterHelper.swift b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergMediaInserterHelper.swift index e9bea690f9af..14fe50ac55cf 100644 --- a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergMediaInserterHelper.swift +++ b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergMediaInserterHelper.swift @@ -29,7 +29,7 @@ class GutenbergMediaInserterHelper: NSObject { func insertFromSiteMediaLibrary(media: [Media], callback: @escaping MediaPickerDidPickMediaCallback) { let formattedMedia = media.map { item in - return MediaInfo(id: item.mediaID?.int32Value, url: item.remoteURL, type: item.mediaTypeString) + return MediaInfo(id: item.mediaID?.int32Value, url: item.remoteURL, type: item.mediaTypeString, caption: item.caption) } callback(formattedMedia) } From e3559bb12353c2201f8d60128f7b6c580db0e822 Mon Sep 17 00:00:00 2001 From: Sergio Estevao Date: Wed, 15 Apr 2020 14:17:36 +0100 Subject: [PATCH 190/245] Update release notes. --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d5359dc1cd61..d78fbdcdb0a0 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,6 +3,7 @@ * [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad * [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. +* Classic and Block editor: Prefill caption for image blocks when available on the Media library. 14.6 ----- From 800362b3eabe4fad3acc966d6f7fe06f25b5a2bb Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 15 Apr 2020 09:42:24 -0500 Subject: [PATCH 191/245] Point podfile to latest Auth release --- Podfile | 4 ++-- Podfile.lock | 11 +++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Podfile b/Podfile index 4e6b021814e4..3e14318ba542 100644 --- a/Podfile +++ b/Podfile @@ -185,9 +185,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - #pod 'WordPressAuthenticator', '~> 1.13.0-beta.3' + pod 'WordPressAuthenticator', '~> 1.13.0-beta.3' # While in PR - pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/239-remove-showURLUsernamePassword' + # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index 919091630746..bb767f34b9cc 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/239-remove-showURLUsernamePassword`) + - WordPressAuthenticator (~> 1.13.0-beta.3) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,6 +527,7 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS + - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -612,9 +613,6 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :branch: issue/239-remove-showURLUsernamePassword - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -628,9 +626,6 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 - WordPressAuthenticator: - :commit: 9a1cdfce612c96623bdf7680cc493d405f295e3a - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -719,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 4573a5308667afd305404b2277ef0c2d7bd55613 +PODFILE CHECKSUM: 318b388b9de5b3025ac2de8fe4119edf6ce8a261 COCOAPODS: 1.8.4 From 47290b3e9fd9204ffc6594b69630050381fb7698 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 15 Apr 2020 11:01:14 -0500 Subject: [PATCH 192/245] Prevent toast to be shown on the Saved tab, in the new Reader - Update ReaderPostCellActions.swift, expose visibleAction in order to change it when ReaderStreamViewController is showing Saved posts --- .../Reader/ReaderPostCellActions.swift | 17 ++++++++++++----- .../Reader/ReaderSaveForLaterAction.swift | 2 +- .../Reader/ReaderStreamViewController.swift | 3 +++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift index ef6bfa78f621..4ae1b1bbf25b 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift @@ -6,7 +6,13 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { var imageRequestAuthToken: String? = nil var isLoggedIn: Bool = false - private let visibleConfirmation: Bool + var visibleConfirmation: Bool { + didSet { + saveForLaterAction?.visibleConfirmation = visibleConfirmation + } + } + + private weak var saveForLaterAction: ReaderSaveForLaterAction? // saved posts /// Posts that have been removed but not yet discarded @@ -120,13 +126,11 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { func toggleSavedForLater(for post: ReaderPost) { let actionOrigin: ReaderSaveForLaterOrigin - // TODO: - READERNAV - Remove this check once the old reader is removed - var presentSavedPostAlert = visibleConfirmation + // TODO: - READERNAV - Update this check once the old reader is removed if origin is ReaderSavedPostsViewController { actionOrigin = .savedStream } else if let origin = origin as? ReaderStreamViewController, origin.isSavedPostsController, FeatureFlag.newReaderNavigation.enabled { actionOrigin = .savedStream - presentSavedPostAlert = false } else { actionOrigin = .otherStream @@ -138,7 +142,10 @@ class ReaderPostCellActions: NSObject, ReaderPostCellDelegate { } } - ReaderSaveForLaterAction(visibleConfirmation: presentSavedPostAlert).execute(with: post, context: context, origin: actionOrigin) + let saveAction = ReaderSaveForLaterAction(visibleConfirmation: visibleConfirmation) + + saveAction.execute(with: post, context: context, origin: actionOrigin) + saveForLaterAction = saveAction } fileprivate func visitSiteForPost(_ post: ReaderPost) { diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLaterAction.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLaterAction.swift index ea679a20596d..f8a2e015f551 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLaterAction.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLaterAction.swift @@ -11,7 +11,7 @@ final class ReaderSaveForLaterAction { static let removeFromSavedError = NSLocalizedString("Could not remove post from Saved for Later", comment: "Title of a prompt.") } - private let visibleConfirmation: Bool + var visibleConfirmation: Bool init(visibleConfirmation: Bool = false) { self.visibleConfirmation = visibleConfirmation diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 5ba70cc0761b..6c9fec07b9ce 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -150,6 +150,9 @@ import WordPressFlux if isSavedPostsController { configureControllerForTopic(synchronize: false) trackSavedListAccessed() + postCellActions?.visibleConfirmation = false + } else { + postCellActions?.visibleConfirmation = true } } } From 6c778489422d3d546a98bd7d4c185d9a35d54b7c Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 15 Apr 2020 11:51:07 -0500 Subject: [PATCH 193/245] Point podfile to latest feature branch for Auth --- Podfile | 6 +++--- Podfile.lock | 15 ++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Podfile b/Podfile index 3e14318ba542..023f56a84e4f 100644 --- a/Podfile +++ b/Podfile @@ -185,11 +185,11 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - pod 'WordPressAuthenticator', '~> 1.13.0-beta.3' + #pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' # While in PR - # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' + pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/241-remove-showSelfHostedLogin' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' -# pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' + # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index bb767f34b9cc..a50fb27925eb 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -376,7 +376,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.13.0-beta.3): + - WordPressAuthenticator (1.13.0-beta.4): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (~> 1.13.0-beta.3) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/241-remove-showSelfHostedLogin`) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,7 +527,6 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS - - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -613,6 +612,9 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :branch: issue/241-remove-showSelfHostedLogin + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -626,6 +628,9 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 + WordPressAuthenticator: + :commit: 76b7c675cceea0d584926c36e76d52fbfbcac35d + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -697,7 +702,7 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: 6aa4deec9a328c354ea08a1d1a60f1ca19cb8279 + WordPressAuthenticator: d55a86bb181478bb536b3fc8a9dd4eaa7f6bc3e0 WordPressKit: dde0a214279fb70d7150b69ae90c7224c18fe2d0 WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 @@ -714,6 +719,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 318b388b9de5b3025ac2de8fe4119edf6ce8a261 +PODFILE CHECKSUM: 9e32738377b235652f937d84e0cef4121741abda COCOAPODS: 1.8.4 From 7b15ebb45600851c49ed94438f7fbb93efab0e72 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 15 Apr 2020 12:04:34 -0500 Subject: [PATCH 194/245] Add an internal release note --- RELEASE-NOTES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 572518883e2a..b6d4ab8a9dd7 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,8 +3,9 @@ * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad * [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. -* [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. +* [internal] the "login by email" flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. +* [internal] the navigation to the "login by site address" flow has code changes that can cause regressions. See https://git.io/JfvP9 for testing details. 14.6 ----- From e96d71b0c41f74aa4916cd97255b1e6e58b7c27b Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Wed, 15 Apr 2020 12:24:29 -0600 Subject: [PATCH 195/245] Replace placeholder text with character width --- .../ViewRelated/Reader/Filter/FilterTableData.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift index b19e18a75ced..04d735fe26db 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterTableData.swift @@ -29,6 +29,11 @@ class FilterTableViewDataSource: NSObject, UITableViewDataSource { class SiteTableViewCell: UITableViewCell, GhostableView { + enum Constants { + static let textLabelCharacterWidth = 40 // Number of characters in text label + static let detailLabelCharacterWidth = 80 // Number of characters in detail label + } + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: .subtitle, reuseIdentifier: reuseIdentifier) detailTextLabel?.textColor = UIColor.systemGray @@ -42,9 +47,9 @@ class SiteTableViewCell: UITableViewCell, GhostableView { contentView.subviews.forEach { view in view.isGhostableDisabled = true } - textLabel?.text = "TEST LABEL Text Label" + textLabel?.text = String(repeating: " ", count: Constants.textLabelCharacterWidth) textLabel?.isGhostableDisabled = false - detailTextLabel?.text = "TEST LABEL sdflsjlwe lsdfjsldjsl sidjflsidj" + detailTextLabel?.text = String(repeating: " ", count: Constants.detailLabelCharacterWidth) detailTextLabel?.isGhostableDisabled = false } } From de1b872f75f11397fa04d4285d12a393335bbbcd Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Wed, 15 Apr 2020 12:48:01 -0600 Subject: [PATCH 196/245] Adjust font + filter based on design feedback --- .../ViewRelated/Reader/Filter/FilterSheetView.swift | 1 + .../ViewRelated/Reader/Tab Navigation/ReaderTabView.swift | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift index e164335cdf46..720f4e9ee4f6 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterSheetView.swift @@ -23,6 +23,7 @@ class FilterSheetView: UIView { lazy var ghostableTableView: UITableView = { let tableView = UITableView() + tableView.allowsSelection = false tableView.isScrollEnabled = false tableView.separatorStyle = .none return tableView diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index 4b0b41ed346c..41c76a396734 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -97,8 +97,6 @@ extension ReaderTabView { buttonsStackView.alignment = .fill buttonsStackView.addArrangedSubview(filterButton) buttonsStackView.addArrangedSubview(resetFilterButton) - let spacer = UIView() - buttonsStackView.addArrangedSubview(spacer) buttonsStackView.addArrangedSubview(verticalDivider) buttonsStackView.addArrangedSubview(settingsButton) } @@ -108,6 +106,7 @@ extension ReaderTabView { filterButton.contentEdgeInsets = Appearance.filterButtonInsets filterButton.imageEdgeInsets = Appearance.filterButtonimageInsets filterButton.titleEdgeInsets = Appearance.filterButtonTitleInsets + filterButton.contentHorizontalAlignment = .leading filterButton.titleLabel?.font = Appearance.filterButtonFont WPStyleGuide.applyReaderFilterButtonStyle(filterButton) @@ -229,9 +228,9 @@ extension ReaderTabView { static let defaultFilterButtonTitle = NSLocalizedString("Filter", comment: "Title of the filter button in the Reader") static let filterButtonMaxFontSize: CGFloat = 28.0 - static let filterButtonFont = WPStyleGuide.fontForTextStyle(.headline, fontWeight: .semibold) + static let filterButtonFont = WPStyleGuide.fontForTextStyle(.headline, fontWeight: .regular) static let filterButtonInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0) - static let filterButtonimageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + static let filterButtonimageInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0) static let filterButtonTitleInsets = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0) static let resetButtonWidth: CGFloat = 32 From e846bd442e276b25ad7a4c0173609ef0580d51c2 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 15 Apr 2020 17:23:55 -0300 Subject: [PATCH 197/245] Add editor_post_publish_tapped event --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 6 +++--- WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift | 2 ++ .../ViewRelated/Post/PrepublishingViewController.swift | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index 987381c985a1..476e02e1b2a7 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -8,7 +8,7 @@ import Foundation case createSheetShown // Prepublishing Nudges - case prepublishingTagsAdded + case editorPostPublishTap /// A String that represents the event var value: String { @@ -21,8 +21,8 @@ import Foundation return "editor_page_created" case .createSheetShown: return "create_sheet_shown" - case .prepublishingTagsAdded: - return "prepublishing_tags_added" + case .editorPostPublishTap: + return "editor_post_publish_tapped" } } diff --git a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift index 12a679bca205..d82119dc73dd 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditor+Publish.swift @@ -98,6 +98,8 @@ extension PostEditor where Self: UIViewController { if action.isAsync, let postStatus = self.post.original?.status ?? self.post.status, ![.publish, .publishPrivate].contains(postStatus) { + WPAnalytics.track(.editorPostPublishTap) + // Only display confirmation alert for unpublished posts displayPublishConfirmationAlert(for: action, onPublish: publishBlock) } else { diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index c926867b4726..8bceb9ee7df3 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -147,9 +147,9 @@ class PrepublishingViewController: UITableViewController { let tagPickerViewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) tagPickerViewController.onValueChanged = { [weak self] tags in - if !tags.isEmpty { - WPAnalytics.track(.prepublishingTagsAdded) - } +// if !tags.isEmpty { +// WPAnalytics.track(.prepublishingTagsAdded) +// } self?.post.tags = tags self?.reloadData() From e2319266ac9c687274465280518ee0f570f471ea Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 15 Apr 2020 17:36:40 -0300 Subject: [PATCH 198/245] Add editor_post_scheduled event --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 3 +++ .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 1 + .../Post/Scheduling/PublishSettingsViewController.swift | 1 + 3 files changed, 5 insertions(+) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index 476e02e1b2a7..083e74a7de10 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -9,6 +9,7 @@ import Foundation // Prepublishing Nudges case editorPostPublishTap + case editorPostScheduled /// A String that represents the event var value: String { @@ -23,6 +24,8 @@ import Foundation return "create_sheet_shown" case .editorPostPublishTap: return "editor_post_publish_tapped" + case .editorPostScheduled: + return "editor_post_scheduled" } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 8bceb9ee7df3..52980cba0376 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -194,6 +194,7 @@ class PrepublishingViewController: UITableViewController { sourceView: tableView.cellForRow(at: indexPath)?.contentView, viewModel: publishSettingsViewModel, updated: { [weak self] date in + WPAnalytics.track(.editorPostScheduled, properties: ["via": "prepublishing_nudges"]) self?.publishSettingsViewModel.setDate(date) self?.reloadData() self?.updatePublishButtonLabel() diff --git a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift index a9e3b6231916..e75ef7508b0a 100644 --- a/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/Scheduling/PublishSettingsViewController.swift @@ -202,6 +202,7 @@ private struct DateAndTimeRow: ImmuTableRow { dateFormatter: model.dateFormatter, dateTimeFormatter: model.dateTimeFormatter, updated: { [weak self] date in + WPAnalytics.track(.editorPostScheduled, properties: ["via": "settings"]) self?.viewModel.setDate(date) NotificationCenter.default.post(name: Foundation.Notification.Name(rawValue: ImmuTableViewController.modelChangedNotification), object: nil) } From 641470d6118b778861e726b8db0289e4725031ee Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 15 Apr 2020 17:56:51 -0300 Subject: [PATCH 199/245] Add editor_post_visibility_changed event --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 3 +++ .../Classes/ViewRelated/Post/PostSettingsViewController.m | 1 + .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 2 ++ 3 files changed, 6 insertions(+) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index 083e74a7de10..d8bf1c29851f 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -10,6 +10,7 @@ import Foundation // Prepublishing Nudges case editorPostPublishTap case editorPostScheduled + case editorPostVisibilityChanged /// A String that represents the event var value: String { @@ -26,6 +27,8 @@ import Foundation return "editor_post_publish_tapped" case .editorPostScheduled: return "editor_post_scheduled" + case .editorPostVisibilityChanged: + return "editor_post_visibility_changed" } } diff --git a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m index b6deff1d95d3..0b9dc74d09c4 100644 --- a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m +++ b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m @@ -1037,6 +1037,7 @@ - (void)showPostVisibilitySelector PostVisibilitySelectorViewController *vc = [[PostVisibilitySelectorViewController alloc] init:self.apost]; __weak PostVisibilitySelectorViewController *weakVc = vc; vc.completion = ^(NSString *visibility) { + [WPAnalytics trackEvent:WPAnalyticsEventEditorPostVisibilityChanged properties:@{@"via": @"settings"}]; [weakVc dismiss]; [self.tableView reloadData]; }; diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 52980cba0376..1e06621696f8 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -170,6 +170,8 @@ class PrepublishingViewController: UITableViewController { visbilitySelectorViewController.completion = { [weak self] option in self?.reloadData() + WPAnalytics.track(.editorPostVisibilityChanged, properties: ["via": "prepublishing_nudges"]) + // If tue user selects password protected, prompt for a password if option == AbstractPost.passwordProtectedLabel { self?.showPasswordAlert() From dd34cdc388c5904dad8f899f056be86d3e5bc764 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 15 Apr 2020 18:10:42 -0300 Subject: [PATCH 200/245] Add editor_post_tags_added event --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 3 +++ .../Classes/ViewRelated/Post/PostSettingsViewController.m | 2 +- .../ViewRelated/Post/PrepublishingViewController.swift | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index d8bf1c29851f..bcf7de245e4d 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -11,6 +11,7 @@ import Foundation case editorPostPublishTap case editorPostScheduled case editorPostVisibilityChanged + case editorPostTagsAdded /// A String that represents the event var value: String { @@ -29,6 +30,8 @@ import Foundation return "editor_post_scheduled" case .editorPostVisibilityChanged: return "editor_post_visibility_changed" + case .editorPostTagsAdded: + return "editor_post_tags_added" } } diff --git a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m index 0b9dc74d09c4..3110b0c82d8b 100644 --- a/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m +++ b/WordPress/Classes/ViewRelated/Post/PostSettingsViewController.m @@ -1256,7 +1256,7 @@ - (void)showTagsPicker tagsPicker.onValueChanged = ^(NSString * _Nonnull value) { if (!value.isEmpty) { - [WPAnalytics track:WPAnalyticsStatPostSettingsTagsAdded]; + [WPAnalytics trackEvent:WPAnalyticsEventEditorPostTagsAdded properties:@{@"via": @"settings"}]; } self.post.tags = value; diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index 1e06621696f8..d4eb9f1e6b70 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -147,9 +147,9 @@ class PrepublishingViewController: UITableViewController { let tagPickerViewController = PostTagPickerViewController(tags: post.tags ?? "", blog: post.blog) tagPickerViewController.onValueChanged = { [weak self] tags in -// if !tags.isEmpty { -// WPAnalytics.track(.prepublishingTagsAdded) -// } + if !tags.isEmpty { + WPAnalytics.track(.editorPostTagsAdded, properties: ["via": "prepublishing_nudges"]) + } self?.post.tags = tags self?.reloadData() From f4a61d4d270d31345c4ef7b3829563184e61e78d Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Wed, 15 Apr 2020 18:14:04 -0300 Subject: [PATCH 201/245] Add editor_post_publish_now_tapped event --- WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift | 3 +++ .../Classes/ViewRelated/Post/PrepublishingViewController.swift | 1 + 2 files changed, 4 insertions(+) diff --git a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift index bcf7de245e4d..4bdda7f03178 100644 --- a/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift +++ b/WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift @@ -12,6 +12,7 @@ import Foundation case editorPostScheduled case editorPostVisibilityChanged case editorPostTagsAdded + case editorPostPublishNowTapped /// A String that represents the event var value: String { @@ -32,6 +33,8 @@ import Foundation return "editor_post_visibility_changed" case .editorPostTagsAdded: return "editor_post_tags_added" + case .editorPostPublishNowTapped: + return "editor_post_publish_now_tapped" } } diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index d4eb9f1e6b70..b46146562f47 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -243,6 +243,7 @@ class PrepublishingViewController: UITableViewController { @objc func publish(_ sender: UIButton) { navigationController?.dismiss(animated: true) { + WPAnalytics.track(.editorPostPublishNowTapped) self.completion(self.post) } } From 6a8073ba08447ab7d95209bbe4792115d5ab212a Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 15 Apr 2020 16:57:40 -0500 Subject: [PATCH 202/245] Changes for PR #13897 --- .../Classes/ViewRelated/Reader/ReaderPostCellActions.swift | 5 +---- .../ViewRelated/Reader/ReaderSaveForLater+Analytics.swift | 5 +++-- .../ViewRelated/Reader/ReaderStreamViewController.swift | 4 +--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift index 4ae1b1bbf25b..82da023c5239 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPostCellActions.swift @@ -213,10 +213,7 @@ extension ReaderPostCellActions { } func clearRemovedPosts() { - let allRemovedPosts = removedPosts.all() - for post in allRemovedPosts { - toggleSavedForLater(for: post) - } + removedPosts.all().forEach({ toggleSavedForLater(for: $0) }) removedPosts = ReaderSaveForLaterRemovedPosts() } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift index 943faf3f7293..26167760a239 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderSaveForLater+Analytics.swift @@ -6,7 +6,7 @@ enum ReaderSaveForLaterOrigin { case postDetail case readerMenu - var saveActionValue: String { + fileprivate var saveActionValue: String { switch self { case .savedStream: return "saved_post_list" @@ -19,7 +19,7 @@ enum ReaderSaveForLaterOrigin { } } - var openPostValue: String { + fileprivate var openPostValue: String { switch self { case .savedStream: return "saved_post_list" @@ -32,6 +32,7 @@ enum ReaderSaveForLaterOrigin { } } + // TODO: - READERNAV - Refactor this and ReaderStreamViewController+Helper once the old reader is removed var viewAllPostsValue: String { switch self { case .savedStream: diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift index 6c9fec07b9ce..415a1d016ff1 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift @@ -150,10 +150,8 @@ import WordPressFlux if isSavedPostsController { configureControllerForTopic(synchronize: false) trackSavedListAccessed() - postCellActions?.visibleConfirmation = false - } else { - postCellActions?.visibleConfirmation = true } + postCellActions?.visibleConfirmation = !isSavedPostsController } } From 3c7476d8ce1452cd614157d9a1c945e2ce620030 Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Wed, 15 Apr 2020 17:02:51 -0500 Subject: [PATCH 203/245] Update ReaderTabViewModel.swift, simplified condition in makeChildViewController(_:) --- .../ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 242d4b45e10c..e47d93943ce8 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -88,7 +88,7 @@ extension ReaderTabViewModel { self.tabSelectionCallback = { [weak controller] topic in controller?.setTopic(topic) - controller?.isSavedPostsController = topic == nil ? true : false + controller?.isSavedPostsController = (topic == nil) } return controller } From 388c475c5ad30f8453da44563aec7d3b2a447412 Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Wed, 15 Apr 2020 19:15:44 -0300 Subject: [PATCH 204/245] Fixes some issues with GIF images in the reader. --- .../Utility/Media/GIFPlaybackStrategy.swift | 6 ++-- .../Views/WPRichText/WPRichContentView.swift | 31 ++++++------------- .../Views/WPRichText/WPRichTextImage.swift | 14 ++++----- .../WPRichText/WPTextAttachmentManager.swift | 8 ++--- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/WordPress/Classes/Utility/Media/GIFPlaybackStrategy.swift b/WordPress/Classes/Utility/Media/GIFPlaybackStrategy.swift index 68f93387316f..f78baad37d0a 100644 --- a/WordPress/Classes/Utility/Media/GIFPlaybackStrategy.swift +++ b/WordPress/Classes/Utility/Media/GIFPlaybackStrategy.swift @@ -54,18 +54,18 @@ extension GIFPlaybackStrategy { class SmallGIFPlaybackStrategy: GIFPlaybackStrategy { var maxSize = 8_000_000 // in MB - var frameBufferCount = 25 + var frameBufferCount = 50 var gifStrategy: GIFStrategy = .smallGIFs } class MediumGIFPlaybackStrategy: GIFPlaybackStrategy { var maxSize = 20_000_000 // in MB - var frameBufferCount = 50 + var frameBufferCount = 150 var gifStrategy: GIFStrategy = .mediumGIFs } class LargeGIFPlaybackStrategy: GIFPlaybackStrategy { var maxSize = 50_000_000 // in MB - var frameBufferCount = 60 + var frameBufferCount = 300 var gifStrategy: GIFStrategy = .largeGIFs } diff --git a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift index bb63e5ebead9..0a9e180d0299 100644 --- a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift +++ b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift @@ -16,10 +16,6 @@ import WordPressShared /// class WPRichContentView: UITextView { - /// Used to keep references to image attachments. - /// - var mediaArray = [RichMedia]() - /// Manages the layout and positioning of text attachments. /// @objc lazy var attachmentManager: WPTextAttachmentManager = { @@ -339,30 +335,22 @@ extension WPRichContentView: WPTextAttachmentManagerDelegate { attachment.maxSize = CGSize(width: finalSize.width, height: finalSize.height) } - let index = mediaArray.count - let indexPath = IndexPath(row: index, section: 1) weak var weakImage = image - image.loadImage(from: mediaHost, preferedSize: finalSize, indexPath: indexPath, onSuccess: { [weak self] indexPath in - guard - let richMedia = self?.mediaArray[indexPath.row], - let img = weakImage - else { + image.loadImage(from: mediaHost, preferedSize: finalSize, onSuccess: { [weak self] in + guard let img = weakImage else { return } - richMedia.attachment.maxSize = img.contentSize() + attachment.maxSize = img.contentSize() if isUsingTemporaryLayoutDimensions { self?.layoutAttachmentViews() } - }, onError: { (indexPath, error) in + }, onError: { (error) in DDLogError("\(String(describing: error))") }) - let media = RichMedia(image: image, attachment: attachment) - mediaArray.append(media) - return image } @@ -415,12 +403,13 @@ extension WPRichContentView: WPTextAttachmentManagerDelegate { /// - Returns: An NSRange optional. /// func attachmentRangeForRichTextImage(_ richTextImage: WPRichTextImage) -> NSRange? { - for item in mediaArray { - if item.image == richTextImage { - return rangeOfAttachment(item.attachment) - } + guard let match = attachmentManager.attachmentViews.first( where: { (_, value) -> Bool in + return value.view == richTextImage + }) else { + return nil } - return nil + + return rangeOfAttachment(match.key) } diff --git a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichTextImage.swift b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichTextImage.swift index 07683433c471..a3abf568b502 100644 --- a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichTextImage.swift +++ b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichTextImage.swift @@ -10,7 +10,7 @@ open class WPRichTextImage: UIControl, WPRichTextMediaAttachment { @objc fileprivate(set) var imageView: CachedAnimatedImageView fileprivate lazy var imageLoader: ImageLoader = { - let imageLoader = ImageLoader(imageView: imageView, gifStrategy: .smallGIFs) + let imageLoader = ImageLoader(imageView: imageView, gifStrategy: .largeGIFs) imageLoader.photonQuality = Constants.readerPhotonQuality return imageLoader }() @@ -73,25 +73,23 @@ open class WPRichTextImage: UIControl, WPRichTextMediaAttachment { /// - Parameters: /// - host: The host for the media. /// - preferedSize: The prefered size of the image to load. - /// - indexPath: The IndexPath where this view is located — returned as a param in success and error blocks. /// - onSuccess: A closure to be called if the image was loaded successfully. /// - onError: A closure to be called if there was an error loading the image. func loadImage(from host: MediaHost, preferedSize size: CGSize = .zero, - indexPath: IndexPath, - onSuccess: ((IndexPath) -> Void)?, - onError: ((IndexPath, Error?) -> Void)?) { + onSuccess: (() -> Void)?, + onError: ((Error?) -> Void)?) { guard let contentURL = self.contentURL else { - onError?(indexPath, nil) + onError?(nil) return } let successHandler: (() -> Void)? = { - onSuccess?(indexPath) + onSuccess?() } let errorHandler: ((Error?) -> Void)? = { error in - onError?(indexPath, error) + onError?(error) } imageLoader.loadImage(with: contentURL, from: host, preferredSize: size, placeholder: nil, success: successHandler, error: errorHandler) diff --git a/WordPress/Classes/ViewRelated/Views/WPRichText/WPTextAttachmentManager.swift b/WordPress/Classes/ViewRelated/Views/WPRichText/WPTextAttachmentManager.swift index 11bc5eea3398..28b0f1e76487 100644 --- a/WordPress/Classes/ViewRelated/Views/WPRichText/WPTextAttachmentManager.swift +++ b/WordPress/Classes/ViewRelated/Views/WPRichText/WPTextAttachmentManager.swift @@ -6,7 +6,7 @@ import UIKit /// @objc open class WPTextAttachmentManager: NSObject { @objc open var attachments = [WPTextAttachment]() - var attachmentViews = [String: WPTextAttachmentView]() + var attachmentViews = [WPTextAttachment: WPTextAttachmentView]() @objc open weak var delegate: WPTextAttachmentManagerDelegate? @objc fileprivate(set) open weak var textView: UITextView? @objc let layoutManager: NSLayoutManager @@ -40,7 +40,7 @@ import UIKit /// - Returns: A UIView optional /// @objc open func viewForAttachment(_ attachment: WPTextAttachment) -> UIView? { - return attachmentViews[attachment.identifier]?.view + return attachmentViews[attachment]?.view } @@ -88,7 +88,7 @@ import UIKit // Make sure attachments are correctly laid out. attachmentsAndRanges.forEach { (attachment, range) in - guard let attachmentView = attachmentViews[attachment.identifier] else { + guard let attachmentView = attachmentViews[attachment] else { return } @@ -125,7 +125,7 @@ import UIKit self.attachments.append(attachment) if let view = self.delegate?.attachmentManager(self, viewForAttachment: attachment) { - self.attachmentViews[attachment.identifier] = WPTextAttachmentView(view: view, identifier: attachment.identifier, exclusionPath: nil) + self.attachmentViews[attachment] = WPTextAttachmentView(view: view, identifier: attachment.identifier, exclusionPath: nil) self.textView?.addSubview(view) } }) From 6d6398c4a30298de5dceaf8b157fc9c15e1214e4 Mon Sep 17 00:00:00 2001 From: Diego Rey Mendez Date: Wed, 15 Apr 2020 19:23:39 -0300 Subject: [PATCH 205/245] rake lint:autocorrect --- .../ViewRelated/Views/WPRichText/WPRichContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift index 0a9e180d0299..599b2e8d6d6c 100644 --- a/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift +++ b/WordPress/Classes/ViewRelated/Views/WPRichText/WPRichContentView.swift @@ -408,7 +408,7 @@ extension WPRichContentView: WPTextAttachmentManagerDelegate { }) else { return nil } - + return rangeOfAttachment(match.key) } From f70c3c9b03c33a3c0db7fea857fe8ded2ee68903 Mon Sep 17 00:00:00 2001 From: Gibson Tang Date: Thu, 16 Apr 2020 14:14:26 +0800 Subject: [PATCH 206/245] updated code to properly fix the issue. Used similar logic to https://github.com/wordpress-mobile/WordPress-iOS/pull/11982/files#diff-e4e933c9231a33298a313cd81b9167db --- .../Stats/Period Stats/Overview/OverviewCell.swift | 4 ++-- .../Stats/Shared Views/Post Stats/PostStatsViewModel.swift | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift b/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift index 9956c17baa81..472a1048aab8 100644 --- a/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift +++ b/WordPress/Classes/ViewRelated/Stats/Period Stats/Overview/OverviewCell.swift @@ -69,8 +69,8 @@ struct OverviewTabData: FilterTabBarItem { StatsPeriodHelper().dateAvailableAfterDate(date, period: period) == false { return .neutral(.shade40) } - return WPStyleGuide.grey() - //return difference < 0 ? WPStyleGuide.Stats.negativeColor : WPStyleGuide.Stats.positiveColor + + return difference < 0 ? WPStyleGuide.Stats.negativeColor : WPStyleGuide.Stats.positiveColor } var title: String { diff --git a/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift b/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift index 393eec6b1b73..0a8d4e90535c 100644 --- a/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift +++ b/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift @@ -127,7 +127,10 @@ private extension PostStatsViewModel { let overviewData = OverviewTabData(tabTitle: StatSection.periodOverviewViews.tabTitle, tabData: dayData.viewCount, difference: dayData.difference, - differencePercent: dayData.percentage) + differencePercent: dayData.percentage, + date: self.selectedDate, + period: .day + ) let chart = PostChart(postViews: lastTwoWeeks) From 02426df5a7d1f0acf61bbf8437c762eaa318c154 Mon Sep 17 00:00:00 2001 From: Rachel McR Date: Thu, 16 Apr 2020 11:11:55 +0100 Subject: [PATCH 207/245] Testing: Use Fastlane for CI test runs with retries (#13810) * Use Fastlane for CI test runs with retries --- .circleci/config.yml | 38 +++++++++++-------------- Gemfile.lock | 9 ++++++ Scripts/fastlane/Fastfile | 56 +++++++++++++++++++++++++++++-------- Scripts/fastlane/Pluginfile | 1 + 4 files changed, 71 insertions(+), 33 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 42567f24450a..23907c5bf015 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,19 +20,6 @@ commands: echo $PATH fi - save-xcresult: - steps: - - run: - name: Zip xcresult - command: | - mkdir testresults - zip -r testresults/xcresult.zip test-without-building.xcresult - when: on_fail # Zips the .xcresult file when tests fail, so it can be saved - - store_artifacts: - name: Save xcresult - path: testresults - destination: logs - jobs: Build Tests: executor: @@ -51,23 +38,28 @@ jobs: paths: - DerivedData/Build/Products - Pods/WordPressMocks + - vendor/bundle Unit Tests: executor: name: ios/default xcode-version: "11.2.1" steps: - fix-path + - git/shallow-checkout - ios/boot-simulator: xcode-version: "11.2.1" device: iPhone 11 - attach_workspace: at: ./ + - run: + name: Prepare Bundle + command: bundle --path vendor/bundle - ios/wait-for-simulator - - ios/xcodebuild: - command: test-without-building - arguments: -xctestrun DerivedData/Build/Products/WordPress_WordPressUnitTests_iphonesimulator13.2-x86_64.xctestrun -destination "platform=iOS Simulator,id=$SIMULATOR_UDID" -resultBundlePath test-without-building.xcresult + - run: + name: Run Unit Tests + working_directory: Scripts + command: bundle exec fastlane test_without_building xctestrun:DerivedData/Build/Products/WordPress_WordPressUnitTests_iphonesimulator13.2-x86_64.xctestrun destination:"platform=iOS Simulator,id=$SIMULATOR_UDID" try_count:3 - ios/save-xcodebuild-artifacts - - save-xcresult UI Tests: parameters: device: @@ -81,21 +73,25 @@ jobs: xcode-version: "11.2.1" steps: - fix-path + - git/shallow-checkout - ios/boot-simulator: xcode-version: "11.2.1" device: << parameters.device >> - attach_workspace: at: ./ + - run: + name: Prepare Bundle + command: bundle --path vendor/bundle - run: name: Run mocks command: ./Pods/WordPressMocks/scripts/start.sh 8282 background: true - ios/wait-for-simulator - - ios/xcodebuild: - command: test-without-building - arguments: -xctestrun DerivedData/Build/Products/WordPress_WordPressUITests_iphonesimulator13.2-x86_64.xctestrun -destination "platform=iOS Simulator,id=$SIMULATOR_UDID" -resultBundlePath test-without-building.xcresult + - run: + name: Run UI Tests + working_directory: Scripts + command: bundle exec fastlane test_without_building xctestrun:DerivedData/Build/Products/WordPress_WordPressUITests_iphonesimulator13.2-x86_64.xctestrun destination:"platform=iOS Simulator,id=$SIMULATOR_UDID" try_count:3 - ios/save-xcodebuild-artifacts - - save-xcresult - when: condition: << parameters.post-to-slack >> steps: diff --git a/Gemfile.lock b/Gemfile.lock index 0ca1c7c09bb2..86224c23dd0f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,6 +81,7 @@ GEM cocoapods-try (1.1.0) colored (1.2) colored2 (3.1.2) + colorize (0.8.1) commander-fastlane (4.4.6) highline (~> 1.7.2) commonmarker (0.20.1) @@ -144,6 +145,12 @@ GEM xcpretty-travis-formatter (>= 0.0.3) fastlane-plugin-appcenter (1.7.1) fastlane-plugin-sentry (1.6.0) + fastlane-plugin-test_center (3.10.1) + colorize + json + plist + xcodeproj + xctest_list (>= 1.1.8) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -270,6 +277,7 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.0) xcpretty (~> 0.2, >= 0.0.7) + xctest_list (1.1.8) PLATFORMS ruby @@ -281,6 +289,7 @@ DEPENDENCIES fastlane (= 2.143.0)! fastlane-plugin-appcenter (= 1.7.1) fastlane-plugin-sentry + fastlane-plugin-test_center fastlane-plugin-wpmreleasetoolkit! octokit (~> 4.0)! rake! diff --git a/Scripts/fastlane/Fastfile b/Scripts/fastlane/Fastfile index 1e3172768d55..f859af2bf9d4 100644 --- a/Scripts/fastlane/Fastfile +++ b/Scripts/fastlane/Fastfile @@ -15,19 +15,22 @@ def get_required_env(key) ENV[key] end -before_all do - # Check that the env files exist - unless is_ci || File.file?(USER_ENV_FILE_PATH) - UI.user_error!("~/.wpios-env.default not found: Please copy env/user.env-example to #{USER_ENV_FILE_PATH} and fill in the values") - end - unless File.file?(PROJECT_ENV_FILE_PATH) - UI.user_error!("project.env not found: Make sure your configuration is up to date with `rake dependencies`") - end +before_all do |lane| + # Skip these checks/steps for test lane (not needed for testing) + unless lane == :test_without_building + # Check that the env files exist + unless is_ci || File.file?(USER_ENV_FILE_PATH) + UI.user_error!("~/.wpios-env.default not found: Please copy env/user.env-example to #{USER_ENV_FILE_PATH} and fill in the values") + end + unless File.file?(PROJECT_ENV_FILE_PATH) + UI.user_error!("project.env not found: Make sure your configuration is up to date with `rake dependencies`") + end - # This allows code signing to work on CircleCI - # It is skipped if this isn't running on CI - # See https://circleci.com/docs/2.0/ios-codesigning/ - setup_circle_ci + # This allows code signing to work on CircleCI + # It is skipped if this isn't running on CI + # See https://circleci.com/docs/2.0/ios-codesigning/ + setup_circle_ci + end end platform :ios do @@ -483,6 +486,35 @@ import "./ScreenshotFastfile" "org.wordpress.WordPressThisWeekWidget"]) end +######################################################################## +# Test Lanes +######################################################################## + ##################################################################################### + # test_without_building + # ----------------------------------------------------------------------------------- + # This lane runs tests without building the app. + # It requires a prebuilt xctestrun file and simulator destination where the tests will be run. + # ----------------------------------------------------------------------------------- + # Usage: + # bundle exec fastlane test_without_building [xctestrun:] [destination:] [try_count:] + # + # Example: + # bundle exec fastlane test_without_building xctestrun:WordPress_WordPressUITests_iphonesimulator13.2-x86_64.xctestrun destination:"platform=iOS Simulator,id=$SIMULATOR_UDID" try_count:3 + ##################################################################################### + desc "Run tests without building" + lane :test_without_building do | options | + multi_scan( + workspace: "../WordPress.xcworkspace", + scheme: "WordPress", + test_without_building: true, + xctestrun: "../#{options[:xctestrun]}", + destination: options[:destination], + try_count: options[:try_count], + output_directory: "../build/results", + result_bundle: true + ) + end + ######################################################################## # Helper Lanes ######################################################################## diff --git a/Scripts/fastlane/Pluginfile b/Scripts/fastlane/Pluginfile index 9d4d40aa834e..7d79f8b17356 100644 --- a/Scripts/fastlane/Pluginfile +++ b/Scripts/fastlane/Pluginfile @@ -9,3 +9,4 @@ end gem 'fastlane-plugin-wpmreleasetoolkit', git: 'https://github.com/wordpress-mobile/release-toolkit', tag: '0.9.1' gem 'fastlane-plugin-sentry' gem 'fastlane-plugin-appcenter', '1.7.1' +gem 'fastlane-plugin-test_center' From c049e5f4548256b8618ed5c11232be680d4170b8 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 09:41:39 -0300 Subject: [PATCH 208/245] Extract via: prepublishing to it's own constant --- .../ViewRelated/Post/PrepublishingViewController.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index b46146562f47..a84e2b561cfb 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -148,7 +148,7 @@ class PrepublishingViewController: UITableViewController { tagPickerViewController.onValueChanged = { [weak self] tags in if !tags.isEmpty { - WPAnalytics.track(.editorPostTagsAdded, properties: ["via": "prepublishing_nudges"]) + WPAnalytics.track(.editorPostTagsAdded, properties: Constants.analyticsDefaultProperty) } self?.post.tags = tags @@ -170,7 +170,7 @@ class PrepublishingViewController: UITableViewController { visbilitySelectorViewController.completion = { [weak self] option in self?.reloadData() - WPAnalytics.track(.editorPostVisibilityChanged, properties: ["via": "prepublishing_nudges"]) + WPAnalytics.track(.editorPostVisibilityChanged, properties: Constants.analyticsDefaultProperty) // If tue user selects password protected, prompt for a password if option == AbstractPost.passwordProtectedLabel { @@ -196,7 +196,7 @@ class PrepublishingViewController: UITableViewController { sourceView: tableView.cellForRow(at: indexPath)?.contentView, viewModel: publishSettingsViewModel, updated: { [weak self] date in - WPAnalytics.track(.editorPostScheduled, properties: ["via": "prepublishing_nudges"]) + WPAnalytics.track(.editorPostScheduled, properties: Constants.analyticsDefaultProperty) self?.publishSettingsViewModel.setDate(date) self?.reloadData() self?.updatePublishButtonLabel() @@ -298,6 +298,7 @@ class PrepublishingViewController: UITableViewController { static let publishNow = NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post") static let scheduleNow = NSLocalizedString("Schedule Now", comment: "Label for the button that schedules the post") static let headerHeight: CGFloat = 70 + static let analyticsDefaultProperty = ["via": "prepublishing_nudges"] } } From 6a2cb233ea0a681172562266ecc8f24accdab971 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Thu, 16 Apr 2020 15:32:39 +0200 Subject: [PATCH 209/245] Update release-toolkit --- Gemfile.lock | 8 ++++---- Scripts/fastlane/Pluginfile | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 86224c23dd0f..4dbbc0c452e3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,9 @@ GIT remote: https://github.com/wordpress-mobile/release-toolkit - revision: d00351ee4e04d8a5f3305116dab017b2c389b1cf - tag: 0.9.1 + revision: e426345db3afc839ee463ec1ce8432f584880957 + tag: 0.9.2 specs: - fastlane-plugin-wpmreleasetoolkit (0.9.1) + fastlane-plugin-wpmreleasetoolkit (0.9.2) activesupport (~> 4) chroma (= 0.2.0) diffy (~> 3.3) @@ -213,7 +213,7 @@ GEM mini_portile2 (~> 2.4.0) octokit (4.14.0) sawyer (~> 0.8.0, >= 0.5.3) - oj (3.10.5) + oj (3.10.6) optimist (3.0.0) options (2.3.2) os (1.0.1) diff --git a/Scripts/fastlane/Pluginfile b/Scripts/fastlane/Pluginfile index 7d79f8b17356..ec2af469ba06 100644 --- a/Scripts/fastlane/Pluginfile +++ b/Scripts/fastlane/Pluginfile @@ -6,7 +6,7 @@ group :screenshots, optional: true do gem 'rmagick', '~> 3.2.0' end -gem 'fastlane-plugin-wpmreleasetoolkit', git: 'https://github.com/wordpress-mobile/release-toolkit', tag: '0.9.1' +gem 'fastlane-plugin-wpmreleasetoolkit', git: 'https://github.com/wordpress-mobile/release-toolkit', tag: '0.9.2' gem 'fastlane-plugin-sentry' gem 'fastlane-plugin-appcenter', '1.7.1' gem 'fastlane-plugin-test_center' From 0bbef0e6b11af63d5571cc671eaaa19c24267d2e Mon Sep 17 00:00:00 2001 From: Pinar Olguc Date: Thu, 16 Apr 2020 17:00:26 +0300 Subject: [PATCH 210/245] Gutenberg: update to v1.26.0 (#13878) * Point gutenberg hash to release/1.26.0 * Update release notes * Update release notes * Update gutenberg ref * Point gutenberg to v1.26.0 --- Podfile | 2 +- Podfile.lock | 146 +++++++++++++++++++++++----------------------- RELEASE-NOTES.txt | 5 ++ 3 files changed, 79 insertions(+), 74 deletions(-) diff --git a/Podfile b/Podfile index 3e14318ba542..b9283a5a3ebe 100644 --- a/Podfile +++ b/Podfile @@ -149,7 +149,7 @@ target 'WordPress' do ## Gutenberg (React Native) ## ===================== ## - gutenberg :tag => 'v1.25.0' + gutenberg :tag => 'v1.26.0' ## Third party libraries ## ===================== diff --git a/Podfile.lock b/Podfile.lock index bb767f34b9cc..772ef8d09474 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -67,7 +67,7 @@ PODS: - "GoogleToolboxForMac/NSString+URLArguments (2.2.2)" - Gridicons (1.0.1) - GTMSessionFetcher/Core (1.3.1) - - Gutenberg (1.25.0): + - Gutenberg (1.26.0): - React (= 0.61.5) - React-CoreModules (= 0.61.5) - React-RCTImage (= 0.61.5) @@ -361,7 +361,7 @@ PODS: - React - RNSVG (9.13.6-gb): - React - - RNTAztecView (1.25.0): + - RNTAztecView (1.26.0): - React-Core - WordPress-Aztec-iOS (~> 1.17.1) - Sentry (4.5.0): @@ -429,15 +429,15 @@ DEPENDENCIES: - Charts (~> 3.2.2) - CocoaLumberjack (= 3.5.2) - Down (~> 0.6.6) - - FBLazyVector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json`) - - FBReactNativeSpec (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json`) - - Folly (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json`) + - FBLazyVector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json`) + - FBReactNativeSpec (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json`) + - Folly (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json`) - FormatterKit/TimeIntervalFormatter (= 1.8.2) - FSInteractiveMap (from `https://github.com/wordpress-mobile/FSInteractiveMap.git`, tag `0.2.0`) - Gifu (= 3.2.0) - - glog (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json`) + - glog (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json`) - Gridicons (~> 1.0.1) - - Gutenberg (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.25.0`) + - Gutenberg (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.26.0`) - JTAppleCalendar (~> 8.0.2) - MediaEditor (~> 1.0.1) - MRProgress (= 0.8.3) @@ -447,34 +447,34 @@ DEPENDENCIES: - OCMock (= 3.4.3) - OHHTTPStubs (= 6.1.0) - OHHTTPStubs/Swift (= 6.1.0) - - RCTRequired (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json`) - - RCTTypeSafety (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json`) + - RCTRequired (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json`) + - RCTTypeSafety (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json`) - Reachability (= 3.2) - - React (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json`) - - React-Core (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json`) - - React-CoreModules (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json`) - - React-cxxreact (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json`) - - React-jsi (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json`) - - React-jsiexecutor (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json`) - - React-jsinspector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json`) - - react-native-keyboard-aware-scroll-view (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json`) - - react-native-linear-gradient (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json`) - - react-native-safe-area (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json`) - - react-native-slider (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json`) - - react-native-video (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json`) - - React-RCTActionSheet (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json`) - - React-RCTAnimation (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json`) - - React-RCTBlob (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json`) - - React-RCTImage (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json`) - - React-RCTLinking (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json`) - - React-RCTNetwork (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json`) - - React-RCTSettings (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json`) - - React-RCTText (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json`) - - React-RCTVibration (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json`) - - ReactCommon (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json`) - - ReactNativeDarkMode (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json`) - - RNSVG (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json`) - - RNTAztecView (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.25.0`) + - React (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json`) + - React-Core (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json`) + - React-CoreModules (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json`) + - React-cxxreact (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json`) + - React-jsi (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json`) + - React-jsiexecutor (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json`) + - React-jsinspector (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json`) + - react-native-keyboard-aware-scroll-view (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json`) + - react-native-linear-gradient (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json`) + - react-native-safe-area (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json`) + - react-native-slider (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json`) + - react-native-video (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json`) + - React-RCTActionSheet (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json`) + - React-RCTAnimation (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json`) + - React-RCTBlob (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json`) + - React-RCTImage (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json`) + - React-RCTLinking (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json`) + - React-RCTNetwork (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json`) + - React-RCTSettings (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json`) + - React-RCTText (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json`) + - React-RCTVibration (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json`) + - ReactCommon (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json`) + - ReactNativeDarkMode (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json`) + - RNSVG (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json`) + - RNTAztecView (from `http://github.com/wordpress-mobile/gutenberg-mobile/`, tag `v1.26.0`) - SimulatorStatusMagic - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) @@ -485,7 +485,7 @@ DEPENDENCIES: - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.3-beta.1) - WPMediaPicker (~> 1.6.1) - - Yoga (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json`) + - Yoga (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json`) - ZendeskSupportSDK (= 5.0.0) - ZIPFoundation (~> 0.9.8) @@ -545,76 +545,76 @@ SPEC REPOS: EXTERNAL SOURCES: FBLazyVector: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/FBLazyVector.podspec.json FBReactNativeSpec: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/FBReactNativeSpec.podspec.json Folly: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Folly.podspec.json FSInteractiveMap: :git: https://github.com/wordpress-mobile/FSInteractiveMap.git :tag: 0.2.0 glog: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/glog.podspec.json Gutenberg: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 + :tag: v1.26.0 RCTRequired: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RCTRequired.podspec.json RCTTypeSafety: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RCTTypeSafety.podspec.json React: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React.podspec.json React-Core: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-Core.podspec.json React-CoreModules: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-CoreModules.podspec.json React-cxxreact: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-cxxreact.podspec.json React-jsi: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsi.podspec.json React-jsiexecutor: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsiexecutor.podspec.json React-jsinspector: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-jsinspector.podspec.json react-native-keyboard-aware-scroll-view: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-keyboard-aware-scroll-view.podspec.json react-native-linear-gradient: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-linear-gradient.podspec.json react-native-safe-area: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-safe-area.podspec.json react-native-slider: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-slider.podspec.json react-native-video: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/react-native-video.podspec.json React-RCTActionSheet: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTActionSheet.podspec.json React-RCTAnimation: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTAnimation.podspec.json React-RCTBlob: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTBlob.podspec.json React-RCTImage: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTImage.podspec.json React-RCTLinking: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTLinking.podspec.json React-RCTNetwork: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTNetwork.podspec.json React-RCTSettings: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTSettings.podspec.json React-RCTText: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTText.podspec.json React-RCTVibration: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/React-RCTVibration.podspec.json ReactCommon: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/ReactCommon.podspec.json ReactNativeDarkMode: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/ReactNativeDarkMode.podspec.json RNSVG: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/RNSVG.podspec.json RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 + :tag: v1.26.0 Yoga: - :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.25.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json + :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json CHECKOUT OPTIONS: FSInteractiveMap: @@ -622,10 +622,10 @@ CHECKOUT OPTIONS: :tag: 0.2.0 Gutenberg: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 + :tag: v1.26.0 RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ - :tag: v1.25.0 + :tag: v1.26.0 SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -650,7 +650,7 @@ SPEC CHECKSUMS: GoogleToolboxForMac: 800648f8b3127618c1b59c7f97684427630c5ea3 Gridicons: 8e19276b20bb15d1fda1d4d0db96d066d170135b GTMSessionFetcher: cea130bbfe5a7edc8d06d3f0d17288c32ffe9925 - Gutenberg: 401db7abdfa9411d767f9a7d77fbaa57a53f85cf + Gutenberg: 26ae066818c65566ac0d8ce51cfc8a20b66db55c JTAppleCalendar: 932cadea40b1051beab10f67843451d48ba16c99 lottie-ios: 85ce835dd8c53e02509f20729fc7d6a4e6645a0a MediaEditor: 7296cd01d7a0548fb2bc909aa72153b376a56a61 @@ -687,7 +687,7 @@ SPEC CHECKSUMS: ReactCommon: 48926fc48fcd7c8a629860049ffba9c23b4005dc ReactNativeDarkMode: f61376360c5d983907e5c316e8e1c853a8c2f348 RNSVG: 68a534a5db06dcbdaebfd5079349191598caef7b - RNTAztecView: 3fb0f122cea9b3bcf502da8380de5cd552d43585 + RNTAztecView: 65e1984620590339bb1bcced6f5e914cba8df2f5 Sentry: ab6c209f23700d1460691dbc90e19ed0a05d496b SimulatorStatusMagic: 28d4a9d1a500ac7cea0b2b5a43c1c6ddb40ba56c Sodium: 63c0ca312a932e6da481689537d4b35568841bdc @@ -714,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 318b388b9de5b3025ac2de8fe4119edf6ce8a261 +PODFILE CHECKSUM: 61b6726442abda57851554ace7951222138702d8 COCOAPODS: 1.8.4 diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 572518883e2a..60563abe3418 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -3,6 +3,11 @@ * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad * [internal] the signup flow using email has code changes that can cause regressions. See https://git.io/JvALZ for testing details. * [internal] Notifications tab should pop to the root of the navigation stack when tapping on the tab from within a notification detail screen. See https://git.io/Jvxka for testing details. +* Block editor: Disable ripple effect in all BottomSheet's controls. +* Block editor: New block: Columns +* Block editor: New starter page template: Blog +* Block editor: Make Starter Page Template picker buttons visible only when the screen height is enough +* Block editor: Fix a bug which caused to show URL settings modal randomly when changing the device orientation multiple times during the time Starter Page Template Preview is open * [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. From c9e1c42c9336766fc2644d1fac6e5df4ffbf466b Mon Sep 17 00:00:00 2001 From: Giorgio Ruscigno Date: Thu, 16 Apr 2020 11:23:33 -0500 Subject: [PATCH 211/245] Revert new reader feature flag back to false --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 12f279e576e5..5f53330e1b44 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -34,7 +34,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] + return false } } } From 376bd44f5ac6144138be37a7c624e37d5dd1f97b Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 16 Apr 2020 12:05:56 -0500 Subject: [PATCH 212/245] Update podfile.lock hash so that it will pull the latest commits from the Auth branch --- Podfile | 2 +- Podfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Podfile b/Podfile index 023f56a84e4f..06636312f4ad 100644 --- a/Podfile +++ b/Podfile @@ -189,7 +189,7 @@ target 'WordPress' do # While in PR pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/241-remove-showSelfHostedLogin' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' - # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' + #pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index a50fb27925eb..13bd9d36fba8 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -629,7 +629,7 @@ CHECKOUT OPTIONS: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.25.0 WordPressAuthenticator: - :commit: 76b7c675cceea0d584926c36e76d52fbfbcac35d + :commit: 7cf66f06c24a9443ec8d4b08c1c3ce79dd92101f :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: @@ -719,6 +719,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 9e32738377b235652f937d84e0cef4121741abda +PODFILE CHECKSUM: deac68aa15ef9d8eafc5c5b398404ca76be0be90 COCOAPODS: 1.8.4 From 79a93e6cf7b9ba496e738290458b0307cad7f1a5 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 14:50:03 -0300 Subject: [PATCH 213/245] Remove the "..." from the button --- WordPress/Classes/ViewRelated/Post/PostEditorState.swift | 6 +++--- .../WordPressUITests/Screens/Editor/AztecEditorScreen.swift | 2 +- .../WordPressUITests/Screens/Editor/BlockEditorScreen.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostEditorState.swift b/WordPress/Classes/ViewRelated/Post/PostEditorState.swift index 9bbf501fef83..de5b2d0d2c04 100644 --- a/WordPress/Classes/ViewRelated/Post/PostEditorState.swift +++ b/WordPress/Classes/ViewRelated/Post/PostEditorState.swift @@ -35,7 +35,7 @@ public enum PostEditorAction { var publishActionLabel: String { switch self { case .publish: - return "\(NSLocalizedString("Publish", comment: "Label for the publish (verb) button. Tapping publishes a draft post."))..." + return NSLocalizedString("Publish", comment: "Label for the publish (verb) button. Tapping publishes a draft post.") case .publishNow: return NSLocalizedString("Publish Now", comment: "Title of button allowing the user to immediately publish the post they are editing.") case .save: @@ -43,9 +43,9 @@ public enum PostEditorAction { case .saveAsDraft: return NSLocalizedString("Save as Draft", comment: "Title of button allowing users to change the status of the post they are currently editing to Draft.") case .schedule: - return "\(NSLocalizedString("Schedule", comment: "Schedule button, this is what the Publish button changes to in the Post Editor if the post has been scheduled for posting later."))..." + return NSLocalizedString("Schedule", comment: "Schedule button, this is what the Publish button changes to in the Post Editor if the post has been scheduled for posting later.") case .submitForReview: - return "\(NSLocalizedString("Submit for Review", comment: "Submit for review button label (saving content, ex: Post, Page, Comment)."))..." + return NSLocalizedString("Submit for Review", comment: "Submit for review button label (saving content, ex: Post, Page, Comment).") case .update: return NSLocalizedString("Update", comment: "Update button label (saving content, ex: Post, Page, Comment).") } diff --git a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift index 8c65e5e4cbfd..eb65711cacea 100644 --- a/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/AztecEditorScreen.swift @@ -18,7 +18,7 @@ class AztecEditorScreen: BaseScreen { private var htmlTextField = "aztec-html-text-view" let editorCloseButton = XCUIApplication().navigationBars["Azctec Editor Navigation Bar"].buttons["Close"] - let publishButton = XCUIApplication().buttons["Publish..."] + let publishButton = XCUIApplication().buttons["Publish"] let publishNowButton = XCUIApplication().buttons["Publish Now"] let moreButton = XCUIApplication().buttons["more_post_options"] let uploadProgressBar = XCUIApplication().progressIndicators["Progress"] diff --git a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift index 45e78bcdf8b5..3fb00537545e 100644 --- a/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift +++ b/WordPress/WordPressUITests/Screens/Editor/BlockEditorScreen.swift @@ -6,7 +6,7 @@ class BlockEditorScreen: BaseScreen { // Navigation bar let editorNavBar = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"] let editorCloseButton = XCUIApplication().navigationBars["Gutenberg Editor Navigation Bar"].buttons["Close"] - let publishButton = XCUIApplication().buttons["Publish..."] + let publishButton = XCUIApplication().buttons["Publish"] let publishNowButton = XCUIApplication().buttons["Publish Now"] let moreButton = XCUIApplication().buttons["more_post_options"] From 0c7325faf6ae44966db2f4962d5cc305e1e34ffa Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 16 Apr 2020 15:18:55 -0500 Subject: [PATCH 214/245] Point podfile to latest published release of Authenticator --- Podfile | 6 +++--- Podfile.lock | 11 +++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Podfile b/Podfile index cf80f72692d0..5e70cafa4512 100644 --- a/Podfile +++ b/Podfile @@ -185,11 +185,11 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - #pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' + pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' # While in PR - pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/241-remove-showSelfHostedLogin' + # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' - #pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' + # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' pod 'MediaEditor', '~> 1.0.1' # pod 'MediaEditor', :git => 'https://github.com/wordpress-mobile/MediaEditor-iOS.git', :commit => 'a4178ed9b0f3622faafb41dd12503e26c5523a32' diff --git a/Podfile.lock b/Podfile.lock index f72a4aed5fa0..e6f013c9bb2b 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -479,7 +479,7 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/241-remove-showSelfHostedLogin`) + - WordPressAuthenticator (~> 1.13.0-beta.4) - WordPressKit (~> 4.7.1-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) @@ -527,6 +527,7 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS + - WordPressAuthenticator - WordPressKit - WordPressMocks - WordPressShared @@ -612,9 +613,6 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 - WordPressAuthenticator: - :branch: issue/241-remove-showSelfHostedLogin - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -628,9 +626,6 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 - WordPressAuthenticator: - :commit: 7cf66f06c24a9443ec8d4b08c1c3ce79dd92101f - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -719,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 61b6726442abda57851554ace7951222138702d8 +PODFILE CHECKSUM: f9691a3d2482bd52ab6eff1111a8b5fd201388f7 COCOAPODS: 1.8.4 From 05db5146d28dcdcd93bdc136bed9aa7c710ce3a2 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 18:09:01 -0300 Subject: [PATCH 215/245] Dismiss the bottom sheet when using the Z gesture --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index a6e7dfd548f1..0da16fbadcad 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -121,6 +121,11 @@ class BottomSheetViewController: UIViewController { } } + override func accessibilityPerformEscape() -> Bool { + dismiss(animated: true, completion: nil) + return true + } + private func refreshForTraits() { if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { gripButton.isHidden = true From 9ca9efba236241a24d7c0c6aff37472c6f462f72 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 18:09:15 -0300 Subject: [PATCH 216/245] Add label and "Done" button in Tag Picker --- .../Post/PostTagPickerViewController.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift index 5e8fdca9577f..faaf6256a649 100644 --- a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift @@ -25,6 +25,7 @@ class PostTagPickerViewController: UIViewController { fileprivate let textView = UITextView() private let textViewContainer = UIView() fileprivate let tableView = UITableView(frame: .zero, style: .grouped) + private let descriptionLabel = UILabel() fileprivate var dataSource: PostTagPickerDataSource = LoadingDataSource() { didSet { tableView.dataSource = dataSource @@ -67,17 +68,28 @@ class PostTagPickerViewController: UIViewController { textViewContainer.addSubview(textView) view.addSubview(textViewContainer) + descriptionLabel.text = NSLocalizedString("Tags help tell readers what a post is about. Separate different tags with commas.", comment: "Label explaining why users might want to add tags.") + descriptionLabel.numberOfLines = 0 + WPStyleGuide.configureLabelForRegularFontStyle(descriptionLabel) + descriptionLabel.textColor = .textSubtle + view.addSubview(descriptionLabel) + textView.translatesAutoresizingMaskIntoConstraints = false textViewContainer.translatesAutoresizingMaskIntoConstraints = false tableView.translatesAutoresizingMaskIntoConstraints = false + descriptionLabel.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ + descriptionLabel.topAnchor.constraint(equalTo: view.readableContentGuide.topAnchor, constant: 10), + descriptionLabel.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), + descriptionLabel.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), + textView.topAnchor.constraint(equalTo: textViewContainer.topAnchor), textView.bottomAnchor.constraint(equalTo: textViewContainer.bottomAnchor), textView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), textView.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), - textViewContainer.topAnchor.constraint(equalTo: view.topAnchor, constant: 35), + textViewContainer.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 10), textViewContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: -1), textViewContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 1), textViewContainer.bottomAnchor.constraint(equalTo: tableView.topAnchor), @@ -93,6 +105,9 @@ class PostTagPickerViewController: UIViewController { textViewContainer.layer.masksToBounds = false keyboardObserver.tableView = tableView + + let doneButton = UIBarButtonItem(title: NSLocalizedString("Done", comment: "Done button title"), style: .plain, target: self, action: #selector(doneButtonPressed)) + navigationItem.setRightBarButton(doneButton, animated: false) } override func viewWillAppear(_ animated: Bool) { @@ -127,6 +142,10 @@ class PostTagPickerViewController: UIViewController { } } + @objc func doneButtonPressed() { + navigationController?.popViewController(animated: true) + } + fileprivate func reloadTableData() { tableView.reloadData() } From 29afd27fd4c1bb3541bd5b8c8f2e4f9aeda11f32 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 18:09:26 -0300 Subject: [PATCH 217/245] Add 4pt radius on blog image --- .../Post/Prepublishing Nudge/PrepublishingHeaderView.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift index ef74b56632c7..a3a089459efb 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PrepublishingHeaderView.swift @@ -42,6 +42,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { configureBackButton() configurePublishingToLabel() configureBlogTitleLabel() + configureBlogImage() configureSeparator() } @@ -61,6 +62,11 @@ class PrepublishingHeaderView: UIView, NibLoadable { publishingToLabel.textColor = WPStyleGuide.TableViewHeaderDetailView.titleColor } + private func configureBlogImage() { + blogImageView.layer.cornerRadius = Constants.imageRadius + blogImageView.clipsToBounds = true + } + private func configureBlogTitleLabel() { WPStyleGuide.applyPostTitleStyle(blogTitleLabel) } @@ -71,6 +77,7 @@ class PrepublishingHeaderView: UIView, NibLoadable { private enum Constants { static let backButtonSize = CGSize(width: 28, height: 28) + static let imageRadius: CGFloat = 4 static let leftRightInset: CGFloat = 16 static let title = NSLocalizedString("Publishing To", comment: "Label that describes in which blog the user is publishing to") static let close = NSLocalizedString("Close", comment: "Voiceover accessibility label informing the user that this button dismiss the current view") From 41102f42783595aa5f77022eb6a4cfb5f7c3e4da Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 18:10:13 -0300 Subject: [PATCH 218/245] Change label to "Enter password" --- .../Post/Prepublishing Nudge/PasswordAlertController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift index 19077b9fa245..daed4debdad7 100644 --- a/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift +++ b/WordPress/Classes/ViewRelated/Post/Prepublishing Nudge/PasswordAlertController.swift @@ -63,7 +63,7 @@ class PasswordAlertController { private enum Constants { static let alertSubmit = NSLocalizedString("OK", comment: "Submit button on prompt for user information.") static let alertCancel = NSLocalizedString("Cancel", comment: "Cancel prompt for user information.") - static let postPassword = NSLocalizedString("Post Password", comment: "Placeholder of a field to type a password to protect the post.") + static let postPassword = NSLocalizedString("Enter password", comment: "Placeholder of a field to type a password to protect the post.") static let passwordMessage = NSLocalizedString("Enter a password to protect this post", comment: "Message explaining why the user might enter a password.") } From acc6127a456e7cde3a5ad4b0f92e135a4c488930 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Thu, 16 Apr 2020 18:18:41 -0300 Subject: [PATCH 219/245] Change label based if the post is scheduled or not --- .../ViewRelated/Post/PrepublishingViewController.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift index a84e2b561cfb..863680330a0b 100644 --- a/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PrepublishingViewController.swift @@ -31,7 +31,7 @@ class PrepublishingViewController: UITableViewController { private let completion: (AbstractPost) -> () private let options: [PrepublishingOption] = [ - PrepublishingOption(id: .schedule, title: NSLocalizedString("Publish", comment: "Label for Publish")), + PrepublishingOption(id: .schedule, title: Constants.publishLabel), PrepublishingOption(id: .visibility, title: NSLocalizedString("Visibility", comment: "Label for Visibility")), PrepublishingOption(id: .tags, title: NSLocalizedString("Tags", comment: "Label for Tags")) ] @@ -186,6 +186,7 @@ class PrepublishingViewController: UITableViewController { // MARK: - Schedule func configureScheduleCell(_ cell: WPTableViewCell) { + cell.textLabel?.text = post.hasFuturePublishDate() ? Constants.scheduledLabel : Constants.publishLabel cell.detailTextLabel?.text = publishSettingsViewModel.detailString } @@ -297,6 +298,8 @@ class PrepublishingViewController: UITableViewController { static let footerFrame = CGRect(x: 0, y: 0, width: 100, height: 80) static let publishNow = NSLocalizedString("Publish Now", comment: "Label for a button that publishes the post") static let scheduleNow = NSLocalizedString("Schedule Now", comment: "Label for the button that schedules the post") + static let publishLabel = NSLocalizedString("Publish", comment: "Label for Publish") + static let scheduledLabel = NSLocalizedString("Scheduled for", comment: "Scheduled for [date]") static let headerHeight: CGFloat = 70 static let analyticsDefaultProperty = ["via": "prepublishing_nudges"] } From 6b61bc4be1c0f96a05a504f755c1090ffb07a3ac Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Thu, 16 Apr 2020 16:06:54 -0600 Subject: [PATCH 220/245] Updating WPKit & WPAuth to use corresponding branches. --- Podfile | 9 ++++----- Podfile.lock | 28 +++++++++++++++++++--------- RELEASE-NOTES.txt | 1 + 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/Podfile b/Podfile index 5e70cafa4512..6bf9aa198f71 100644 --- a/Podfile +++ b/Podfile @@ -44,10 +44,9 @@ def wordpress_ui end def wordpress_kit - pod 'WordPressKit', '~> 4.7.1-beta.1' - + #pod 'WordPressKit', '~> 4.8.0-beta.1' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :tag => '4.6.0-beta.3' - #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :branch => '' + pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :branch => 'fix/11771-gravatar_user_not_found' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :commit => '' #pod 'WordPressKit', :path => '../WordPressKit-iOS' end @@ -185,9 +184,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' + # pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' # While in PR - # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' + pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/update_wpkit_version' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index e6f013c9bb2b..f448836f74b2 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -385,10 +385,10 @@ PODS: - lottie-ios (= 3.1.6) - "NSURL+IDN (= 0.4)" - SVProgressHUD (= 2.2.5) - - WordPressKit (~> 4.7.0) + - WordPressKit (~> 4.8.0-beta.1) - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.2) - - WordPressKit (4.7.1-beta.1): + - WordPressKit (4.8.0-beta.1): - Alamofire (~> 4.8.0) - CocoaLumberjack (~> 3.4) - NSObject-SafeExpectations (= 0.0.4) @@ -479,8 +479,8 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (~> 1.13.0-beta.4) - - WordPressKit (~> 4.7.1-beta.1) + - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/update_wpkit_version`) + - WordPressKit (from `https://github.com/wordpress-mobile/WordPressKit-iOS.git`, branch `fix/11771-gravatar_user_not_found`) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.3-beta.1) @@ -527,8 +527,6 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS - - WordPressAuthenticator - - WordPressKit - WordPressMocks - WordPressShared - WordPressUI @@ -613,6 +611,12 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 + WordPressAuthenticator: + :branch: issue/update_wpkit_version + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git + WordPressKit: + :branch: fix/11771-gravatar_user_not_found + :git: https://github.com/wordpress-mobile/WordPressKit-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -626,6 +630,12 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 + WordPressAuthenticator: + :commit: f597659ec0c82b1b786dbd87e786cefede11117c + :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git + WordPressKit: + :commit: 864eec7eb314cf89e3c7defedf631db87c1af42b + :git: https://github.com/wordpress-mobile/WordPressKit-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -697,8 +707,8 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: d55a86bb181478bb536b3fc8a9dd4eaa7f6bc3e0 - WordPressKit: dde0a214279fb70d7150b69ae90c7224c18fe2d0 + WordPressAuthenticator: 482365d748b60fbc1aa49efb734230901924957c + WordPressKit: 636f3f7e1c879b22f1d46e61d662ad640161f8b2 WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 WordPressUI: 91b91e51b8cd7db83a2bd492c12998db711a6a57 @@ -714,6 +724,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: f9691a3d2482bd52ab6eff1111a8b5fd201388f7 +PODFILE CHECKSUM: e8140fdf61b5dfbd85630a499d57614cb524803e COCOAPODS: 1.8.4 diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index df8a1078ff3d..196f15734dd0 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -12,6 +12,7 @@ * [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. * [internal] the navigation to the "login by site address" flow has code changes that can cause regressions. See https://git.io/JfvP9 for testing details. +* Login Epilogue: fixed issue where account information never stopped loading for some self-hosted sites. 14.6 ----- From dd461605b1263d6b99af6540133a571cd192df82 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Thu, 16 Apr 2020 17:23:17 -0600 Subject: [PATCH 221/245] Fix a bug where followed sites were duplicated --- .../Classes/ViewRelated/Reader/Filter/FilterProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift b/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift index b8c2c42ee627..a36cdfa849f5 100644 --- a/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift +++ b/WordPress/Classes/ViewRelated/Reader/Filter/FilterProvider.swift @@ -103,7 +103,7 @@ extension ReaderSiteTopic { let siteService = ReaderTopicService(managedObjectContext: ContextManager.sharedInstance().mainContext) siteService.fetchFollowedSites(success: { - completion(.success(siteService.allSiteTopics())) + completion(.success(siteService.allSiteTopics().filter { !$0.isExternal })) }, failure: { error in let unknownRestAPIError = NSError(domain: WordPressComRestApiErrorDomain, code: -1, userInfo: nil) completion(.failure(error ?? unknownRestAPIError)) From 07ecc02e95fbb47ca559eab10b465e580779aff8 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Fri, 17 Apr 2020 11:20:52 +0200 Subject: [PATCH 222/245] Bump version number --- config/Version.internal.xcconfig | 2 +- config/Version.public.xcconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/Version.internal.xcconfig b/config/Version.internal.xcconfig index 007bbd02e834..3c0a1c7d9dab 100644 --- a/config/Version.internal.xcconfig +++ b/config/Version.internal.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=14.6 // Internal long version example: VERSION_LONG=9.9.0.20180423 -VERSION_LONG=14.6.0.20200410 +VERSION_LONG=14.6.0.20200417 diff --git a/config/Version.public.xcconfig b/config/Version.public.xcconfig index a65b8d686918..6972b1c4b18a 100644 --- a/config/Version.public.xcconfig +++ b/config/Version.public.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=14.6 // Public long version example: VERSION_LONG=9.9.0.0 -VERSION_LONG=14.6.0.1 +VERSION_LONG=14.6.0.2 From 321874451188f21b31b3dd5c70f68a53d7ce00a6 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Fri, 17 Apr 2020 12:54:47 +0200 Subject: [PATCH 223/245] Updates translation --- .../Resources/ar.lproj/Localizable.strings | Bin 562408 -> 559884 bytes .../Resources/bg.lproj/Localizable.strings | Bin 571930 -> 569360 bytes .../Resources/cs.lproj/Localizable.strings | Bin 569200 -> 566616 bytes .../Resources/cy.lproj/Localizable.strings | Bin 569702 -> 567130 bytes .../Resources/da.lproj/Localizable.strings | Bin 565540 -> 562970 bytes .../Resources/de.lproj/Localizable.strings | Bin 602818 -> 600064 bytes .../Resources/en-AU.lproj/Localizable.strings | Bin 564838 -> 562268 bytes .../Resources/en-CA.lproj/Localizable.strings | Bin 564666 -> 562100 bytes .../Resources/en-GB.lproj/Localizable.strings | Bin 565042 -> 562472 bytes .../Resources/es.lproj/Localizable.strings | Bin 592448 -> 589860 bytes .../Resources/fr.lproj/Localizable.strings | Bin 600310 -> 597682 bytes .../Resources/he.lproj/Localizable.strings | Bin 552004 -> 549510 bytes .../Resources/hr.lproj/Localizable.strings | Bin 564858 -> 562288 bytes .../Resources/hu.lproj/Localizable.strings | Bin 565276 -> 562706 bytes .../Resources/id.lproj/Localizable.strings | Bin 581070 -> 578398 bytes .../Resources/is.lproj/Localizable.strings | Bin 570078 -> 567498 bytes .../Resources/it.lproj/Localizable.strings | Bin 593660 -> 591040 bytes .../Resources/ja.lproj/Localizable.strings | Bin 510060 -> 507682 bytes .../Resources/ko.lproj/Localizable.strings | Bin 506920 -> 504640 bytes .../Resources/nb.lproj/Localizable.strings | Bin 577082 -> 574428 bytes .../Resources/nl.lproj/Localizable.strings | Bin 586892 -> 584240 bytes .../Resources/pl.lproj/Localizable.strings | Bin 565202 -> 562632 bytes .../Resources/pt-BR.lproj/Localizable.strings | Bin 583798 -> 581168 bytes .../Resources/pt.lproj/Localizable.strings | Bin 572110 -> 569538 bytes .../Resources/ro.lproj/Localizable.strings | Bin 588074 -> 585512 bytes .../Resources/ru.lproj/Localizable.strings | Bin 584004 -> 581420 bytes .../Resources/sk.lproj/Localizable.strings | Bin 576160 -> 573586 bytes .../Resources/sq.lproj/Localizable.strings | Bin 584894 -> 582328 bytes .../Resources/sv.lproj/Localizable.strings | Bin 584584 -> 581894 bytes .../Resources/th.lproj/Localizable.strings | Bin 564032 -> 561464 bytes .../Resources/tr.lproj/Localizable.strings | Bin 579914 -> 577340 bytes .../zh-Hans.lproj/Localizable.strings | Bin 492166 -> 490066 bytes .../zh-Hant.lproj/Localizable.strings | Bin 487824 -> 485724 bytes .../ar.lproj/Localizable.strings | Bin 4067 -> 4067 bytes .../bg.lproj/Localizable.strings | Bin 3189 -> 3189 bytes .../cs.lproj/Localizable.strings | Bin 3462 -> 3462 bytes .../cy.lproj/Localizable.strings | Bin 2837 -> 2837 bytes .../da.lproj/Localizable.strings | Bin 2830 -> 2830 bytes .../de.lproj/Localizable.strings | Bin 4458 -> 4458 bytes .../en-AU.lproj/Localizable.strings | Bin 2674 -> 2674 bytes .../en-CA.lproj/Localizable.strings | Bin 2740 -> 2740 bytes .../en-GB.lproj/Localizable.strings | Bin 2674 -> 2674 bytes .../es.lproj/Localizable.strings | Bin 3507 -> 3507 bytes .../fr.lproj/Localizable.strings | Bin 4687 -> 4687 bytes .../he.lproj/Localizable.strings | Bin 3994 -> 3994 bytes .../hr.lproj/Localizable.strings | Bin 2826 -> 2826 bytes .../hu.lproj/Localizable.strings | Bin 2914 -> 2914 bytes .../id.lproj/Localizable.strings | Bin 3016 -> 3016 bytes .../is.lproj/Localizable.strings | Bin 3005 -> 3005 bytes .../it.lproj/Localizable.strings | Bin 3444 -> 3444 bytes .../ja.lproj/Localizable.strings | Bin 3204 -> 3204 bytes .../ko.lproj/Localizable.strings | Bin 3056 -> 3056 bytes .../nb.lproj/Localizable.strings | Bin 3442 -> 3442 bytes .../nl.lproj/Localizable.strings | Bin 3350 -> 3350 bytes .../pl.lproj/Localizable.strings | Bin 2795 -> 2795 bytes .../pt-BR.lproj/Localizable.strings | Bin 3960 -> 3960 bytes .../pt.lproj/Localizable.strings | Bin 3314 -> 3314 bytes .../ro.lproj/Localizable.strings | Bin 4347 -> 4347 bytes .../ru.lproj/Localizable.strings | Bin 4532 -> 4532 bytes .../sk.lproj/Localizable.strings | Bin 4484 -> 4484 bytes .../sq.lproj/Localizable.strings | Bin 4377 -> 4377 bytes .../sv.lproj/Localizable.strings | Bin 4501 -> 4501 bytes .../th.lproj/Localizable.strings | Bin 2918 -> 2918 bytes .../tr.lproj/Localizable.strings | Bin 4260 -> 4260 bytes .../zh-Hans.lproj/Localizable.strings | Bin 2716 -> 2716 bytes .../zh-Hant.lproj/Localizable.strings | Bin 2694 -> 2694 bytes .../ar.lproj/Localizable.strings | Bin 146 -> 146 bytes .../bg.lproj/Localizable.strings | Bin 174 -> 174 bytes .../cs.lproj/Localizable.strings | Bin 176 -> 176 bytes .../cy.lproj/Localizable.strings | Bin 118 -> 118 bytes .../da.lproj/Localizable.strings | Bin 128 -> 128 bytes .../de.lproj/Localizable.strings | Bin 139 -> 139 bytes .../en-AU.lproj/Localizable.strings | Bin 84 -> 84 bytes .../en-CA.lproj/Localizable.strings | Bin 84 -> 84 bytes .../en-GB.lproj/Localizable.strings | Bin 84 -> 84 bytes .../es.lproj/Localizable.strings | Bin 128 -> 128 bytes .../fr.lproj/Localizable.strings | Bin 129 -> 129 bytes .../he.lproj/Localizable.strings | Bin 150 -> 150 bytes .../hr.lproj/Localizable.strings | Bin 95 -> 95 bytes .../hu.lproj/Localizable.strings | Bin 160 -> 160 bytes .../id.lproj/Localizable.strings | Bin 134 -> 134 bytes .../is.lproj/Localizable.strings | Bin 138 -> 138 bytes .../it.lproj/Localizable.strings | Bin 120 -> 120 bytes .../ja.lproj/Localizable.strings | Bin 120 -> 120 bytes .../ko.lproj/Localizable.strings | Bin 110 -> 110 bytes .../nb.lproj/Localizable.strings | Bin 133 -> 133 bytes .../nl.lproj/Localizable.strings | Bin 130 -> 130 bytes .../pl.lproj/Localizable.strings | Bin 96 -> 96 bytes .../pt-BR.lproj/Localizable.strings | Bin 158 -> 158 bytes .../pt.lproj/Localizable.strings | Bin 156 -> 156 bytes .../ro.lproj/Localizable.strings | Bin 148 -> 148 bytes .../ru.lproj/Localizable.strings | Bin 166 -> 166 bytes .../sk.lproj/Localizable.strings | Bin 140 -> 140 bytes .../sq.lproj/Localizable.strings | Bin 134 -> 134 bytes .../sv.lproj/Localizable.strings | Bin 146 -> 146 bytes .../th.lproj/Localizable.strings | Bin 154 -> 154 bytes .../tr.lproj/Localizable.strings | Bin 170 -> 170 bytes .../zh-Hans.lproj/Localizable.strings | Bin 110 -> 110 bytes .../zh-Hant.lproj/Localizable.strings | Bin 112 -> 112 bytes 99 files changed, 0 insertions(+), 0 deletions(-) diff --git a/WordPress/Resources/ar.lproj/Localizable.strings b/WordPress/Resources/ar.lproj/Localizable.strings index e34a4632114c993bf147d5ac822c8cfc977097c6..0523cc888b024636a3c084be53624db6f9eabeff 100644 GIT binary patch delta 706 zcmYjOT}YEr7(VCwIo~$M9RAcaGnwM%2%CSTGsQ1|$hlNPi2iJ2N-opZT7nWbEbykE z=|SJ9h;<_*5|c@v7hZ^0byEuEg-AqDbP=OMEa->ctuEr_IlS-7bKdj3&-wV+dUM7a z?aDex3Q0MJi&T=@^jW>&e=R}ujgp_}Ren+)E%PLn^{?t6zQKBCeo5I7>ys?Jp~cJ# z+D*Kn&A@jK?@uIK$Hd$!W@F{7mZfGoak7myV`XD4p!#VRpFi5l-@4am1z%{-p%pNB zh^3o}nCELIBya1C;C?O`^ga^AC?t07Q*(2I#7EANKCHtefVhBpX=44XZF0JidYXL1 zPX>?>A{WUOGDLcj*ooIu{SEwL|=&ciOnA$uJOnn3GO)*BSf}Dqc(b#h8cGKFt3>=A(aesp z8s-MoE1UsuP||6J6Vm(xh}Fp+Sow~%cSkBoYR}%w(fWzmVy4X&D=Q)1xSpwP-Bq6E ULGqDOp)D>db4yx$NLN$x2aT`QQUCw| delta 1867 zcmb7FZERCz6n@|P@!s3gm9E`jA24n^_Ccv*qmzB$aO>LAEtM>01|&rHVK;``TFVH| z=-3Pq62J_ua0pp~h|x$82PIx&%pk-cI{tuB5)%w9F$5E$2!D(*;(2ekfKh(<u;oDC<_-?|- zgL!Hs#KMewLHmvkfQ=$TJldb%yFuZvuzetltEKJ~+aKD7{&C_%@MkqWmTH~%{o?wv~o zG6T$vk{WBf@6?-zqN&*}MF;h(4?arye(kWpWFuV;&+lh>mL3FbI|9}V?jg01R_VF% z#g@Q7oN%UDu)=s)WZ*eZok}V5W3GPvwOcM|z9KG39sT|GEz4*N=le&eN!ls#uya|9uF zC>h<8P6|dkDISs^v1^1!#R~=VjOM}YEG>e&=VTQ&%}7p*M!aMdu@Vn_GfRsfEx=5e zm4J6IwaH=TWdS(*2XhtIu?Sl+N1Yep2qKl-4zUJk+Dljd|6|S-NKSbOk$)93wJaaf zAGTwg@59FU;5@=q9TipR?3bN-ebW+stl0*G z4Cx5JoKXz4 z14DK5VBkI}xZute*$(^DvMs;TL^#A&Bg(5V@29ZVAmoM-rs<5Vx&mm2&|k^Q5HQ|K z<L`tXn{Jfstk=^=bvXr?a?C$=Iw35}^xzDaQ84q#L8Tr~XM zikp&f{A(c}u3i=wS(4Z;{pcNm&wgf$VQ?d=`}#O@#A*>|-ozSdU_9d*QxOf>@xXYy zYb3y)#v1s)Y_D>D!sydTJMysJT=C)Wytdl0E-nI%@V0BgswWO(rr{aEz9&(_j6{iY zDG6BSa=IEaY1yUl8hgnOnCL|ar!AtifcN(>?P$52H5rjVkT!Z6-A+Y$0^99rhhLwtx}E7HIb-GMS2ne$iS z9xlHadU{C}yxga*T+5;37eV$K@FLfKwD`3U!IdCB9O~@#u!7BpD8rR1sCicKL;AKD LFdAd(w`G3=5+mNi diff --git a/WordPress/Resources/bg.lproj/Localizable.strings b/WordPress/Resources/bg.lproj/Localizable.strings index a60463bb0d6f896303c5a4d1ab864bdc19808c2d..735666372cdef6d0cc511c62ed82af8d383960e8 100644 GIT binary patch delta 653 zcmaKqO=wd=5XX04-dEyF8=KaARPh-?i3+vm7>R@;DDnAG=|L}*+OI^L_EDeON@zmK{a)UpEb%VM<~5mpayHp9=ffCOW*yz2|B##P8K-rn5;_+Eh;ukumIii;R$dL@!{6UedQyF!9&?&YkEDZ1@iv_C6E6c6GDU_3G#P z3{TC_H!@q0BJkxo)u7`(^}|{oy<(p3V<)AC`pFN~Q7ML05ZY|jvx_nVf#2jce&il) zOVrhZ%3CTzX@fTK@pbz2yt5B)ejA@P23^~N584BQ%l#*YugSpi1BwqyVZng;WlszN0zYOu6SUB#>*H(K?!y8^I{&xpCHkt;Zk)VH`}OaA}f30W&x-g;i-3DTR9L=#4OXEO7K(-TNPftcm$?G609ZE8hAS;mvu6 z=Fgdn4sI@r3;kevC8Ow;RKDtxg4N;!xr3jnNqPdFs7eexCuB8Oi_5$gS7s-8bw#<` b3KtDgWTmevFML$m*I+s?gtaEGiB4c+K9*n~>=~r%;OSpfPj)+L zA&sP&w2>%@z`!lp4L3u=iMDMp@e}ptSCbB0rkaND7>VFhiu?8CQDQSOO&38(4pJ9g z*iQ~pAC&dTd8u*s2i5EOdOg8wQ-%CQB^*5_Y|x&oc=WmLW%-XGP>i(VyTS@@KFka$ z45Zb)DQBoa@n&k2FWJGH$AsTP%<9Gmq>$T-?*U{;=`$6)w&%4wuir zbet{YDIZSfDwT&?um};W5IeCqqIg$yS;t7n{GCBcFt(>KI+N4=*caUk@=~-hFNzkF egmJfY#H|R?vpghBpAoqb-%cBh9q)*53jYQN#pM0~ diff --git a/WordPress/Resources/cs.lproj/Localizable.strings b/WordPress/Resources/cs.lproj/Localizable.strings index 579792fe1a6dea1818f3bdbf88cc9ee46af5af64..704fb2151b523c912ecce6de1b6c94f35e7d8836 100644 GIT binary patch delta 714 zcmah{O-NKx6h8O;JHB4#b4({0hapfQYn;+zu$+QSrm-pLZ`GfgGc}`Ay~GK!G(!`S ziHn?#*hZodYNlB{2wJq#eikjIMU1Un1dRqZo228SMVsPqFNg1*@0{;^+`<>{(tB?@ zRJ{)x!3X=n15I!M0+d2XoWbpV4a%GI3v zs8?owemLZ$dwJUAt>N~Z@3>`R{JEx^7DOQix2XALNK$y99+x|WYL>+8SHWZrJaW;Q zD_$t)JRJ>1j!;<_T!&t`3H@*z`kFST*L&qkyZDf;w_&o5g)zOr%5Xd_=sb8%!fy?dZu=Kl zN9UF6unO981`;(G^eTP&{Z6}-JU|}{TIGHuJniA~Qlo-?S(ql1P8zW0&kRWRlG(Acx zVzgA0jP+2~$M5c`uIt>){#8Y_Nr>T%UDEc=|6vb|i2kav;*4k)XQaVy^tt3P<^@@^ zU4lIF9VdnrA1+!kgirPYuMO+lch)V4}vXt<N5+ZPGO2XG&z8m)u?2?j+XF@y(VjWK8}QjHN`!0${0)>spwnat#z z@0{~rzVH9fT>H#-`-X3Ay)hKr?g-1sDQ{)}tg)}~^coPq>AZul9Y#$4=5H(b(X=z=6A^@X!V;JjL zj2XjIY0K9Gk1%mW$G4M(@Rnj+#8xo}^ZhM|x|g|=!XsSci$epNZj9~9j%)V2+;~$h zQde5`!!+fWm(f^<(m<0A0JTo@Ec$LO_ai>%kln`gkFNObKZb_M|G0fMWpCn@ zRCNekemua_>D(4m2WS+AMHOuLO-#H|q|M^h)MP zuk6&!#$mZW9Yp2Q+n0GJ)t|R(wBw@9O^p+BCcS?dHTM@bvrWmRwMXIX(1h$-a<#o) zc0HuIB%K`;^~d%?nr;@O&=Al2SMy8n7VZuopODSt6Sm$qYN_O@RQ(|mxzr?UNv+WL zS@0#gAjqP$yhO_(=RKPj#$s@)qY?T_HQ^$ecZWT@RaM0r(PCs9V}Z*(~(g zk8c136a(FFwPck2fN>9$j^R7Yn)w_(b5u$bHP>Wj-?Hzj2EUFR(baokO*Cl}obEr3_ zxW0_)UWYcDW15SOyeB!SW$J(1DY_>mo7E@Ov8?}?(Ck{CL6>G!jatsCN{Z-!`_h2~ zWXuy44{eL%Lb%h65*ovvS_0t6LyiE0PjtM5T*6OLU6p29ZQm=qp-Rm|s}Z ZAD9+@ur`_>l^!E~SgSAxhqUYYe*z2y`W*lO diff --git a/WordPress/Resources/cy.lproj/Localizable.strings b/WordPress/Resources/cy.lproj/Localizable.strings index af6533d1a602164e597fc5ab612920d6a07d220d..b41b48ca336e342b60cd09e837d50c00c0150efa 100644 GIT binary patch delta 626 zcmaKqPiPZC6vk)vUuH{OmL{884YCO;DuSVhAQGvOP-@)L9z1w48r#$cjV`4s280a- z(_-nt5uXSR5sQZqF}RjNDJ7Re4n?X3se;h<;JLOS(nEBrP;X^;59XWi&Ex%e-`B!l zKZI+#3@Z&Be9_?%s4gen3H9wMx1Mlh+(F|>gXdM-M`Ko(8#$ly;W!jN3Wl0SHa{jh z0--J3j%_G>5q%SV3z7~InGn#6IJ{FGgso$^1@={(NCPkTsQrA*J1B#O;hQ0Z_Uv5wd^uQsMcSa27A%-+ z69`)|g!%wAm-eZH9K{U|BLmNq*axQLT_F$;L{`QFP8HHE9b>A z0#`Dk)t=>8vna>$=6IVS-aX3^4xtemI$<38kGF^GyEx(VI}UAo4On7S4D2mdrbJem zl3K5Vsmj(&O5XSZ$48Y2oQz{XTi%qrPv|07!teIq6XcX3AU8Fl}-O~el=;EuFNzvsinAe z{g_svE7Lc2AS=>}C{~G){P9pmX)WRqDJhE7PQ*Ep;U6^v*&kCn&&$NdS!ErM+;D&A zoZmh7oZq>tOM#z%4CE}LR52uYG8T%4A@wEU2%acY9OF)H7Ry7Cs$ z$7yqHmv)^s=O@`zSZix)^Y11q=_Osb){_9PkKivr%20@0kzRmd50mq!_jyETxm(>v zuoh{0fUhSZcG^54=fVJw_)aU4EHn_kzXE zsj&W%EW@)W1QQ#?R&)g1hV{326D0Fg*1kKWz}gqogzb(&`&ZNp;R{r$#2sdv z#)vrSh2_^c8zfz{7502iExPqHy7IU_VdLgIU^>IKjt2%gJut{WEbHnhU+2P>Rl{rn zbDaBBl)-gDuvVyK7rBopBmnOf@Q}X^(DIa24T%Yq-ajL58YU0$<}J}h{el&8Bh6D~f<%fO{XE7XN#4`kee8NNOxSfJ&)pg=Ij9D4Q- z;kT=|(Q~lY2vv~yP*UK^nrH^$6mvjzBU2!IhRSyhqM-XxDD9*VMlMl1bbpIZEx+D| z=guk7qNDP15iE_e-59?vWHUtg1oA~oGE_@gFI??lHaLBcB>U57i=)l(??m4tC{W{k z75}?2z7H0bIJ*{|aa8o7F^*swp1C18SsJ%#auhE4B(~r4x%&|`ZgsP+eWjZv z5F3C4FG_Zr(t0mCq31kP!~yh+YV-{|6yMx>AncyyyjlS}@XNdGy!X!YpD8jotS>Uj zS%Yb+Sm5r`1^&7>j_Pu=WP_f)%mS~T!+GslWae%E=k?%W-l7%POpy49?a)^i+0Yyc zM75W{OaErCg02cNe4-Ou5HGc%6*ZB-XFXMV1Cphp$H~2z;-lCSqo)0+BBPo3>|=!S hshD~i{X=DM=$05=|3wLr_gMq9jmh`x*-`m};Gg(x*iirg diff --git a/WordPress/Resources/da.lproj/Localizable.strings b/WordPress/Resources/da.lproj/Localizable.strings index fce4d8a96848556b9c4cecc2619229dbc343b507..58124e87c68c57728755f5ff1dcf7ab84c89e7f3 100644 GIT binary patch delta 661 zcmah{O=wd=5Z--n-%C0VQ(1?eSLy>?OV=XrHN2E6;Noh@+*ru^f8w;sa zEXhSmaWNw~)Cy8O6bU|IL5c*S7eNr|S&A2-2W^9hhZ3B`OD-bI&hE}P-^|X(ym;@c zzVg*xGdSL-ZtXyAQl8AjwDX2cn47OgA^25wL$1kspk`rCZF}GsbA*VGc*sTEJ`zGZ zPf}<@@L*iFYLVDmE4>V3A0?Y%g5+>{NFUGv=`78`$$@O80sbs*(?;WO9zQYD;h_mK zN$!wovVeJ(NR~_?VGL<4f12dUN=LP5+xw4b-aT#Oxt}}Q%abibWk_;s!P75muzi6t zQCp>XmG3BhPCYJ|<3N*G}m#HxDp-xRIxKLy$b zM||MLMDP|)#6Y3dZ*91(e=H~9q z{qDKvp7WjW%+AbLyt`PD{*b3jzQ;I?(ct$n;sg7nY%8u{H0EKP*0TVoSAMgDW{@uU z>|4=O+{Xl&PNs)>p6O>oP_jo-)i^>?1YF~=#H z`Rnxxv^9|3=yJTw1WoVctB=c`?p>3Eag`V1_3#>yTAw zSjz}1Tv`?scrwe&ut+hl8yUg*7ba;)5+0$tPleHgoDHr~&hbx1KX(X@e}CULjTy4E z$AnQSNenSHN_K&9kW)6hcysHU9fEz_ah5Y3XZc$lG%C2E>wTdVCcefJv2&sm-Y%C* z;rJK44QxO03VKQ4Z5paS*BJ1}uY4Iy{J@Lmi5vWx>su%$v5z=mby!sH2{L^+G>kV6 zhcs>nXw$q*FLf&L#wU^}Xh>iT_N)*U6df5nbrl&ps&SsJ?ZP^eY^l{;zA6}vIX-<> zzxHCFe!S`^`s~6>tyZj~Tn;g)5d@8mcdb>fWYSdGEtMOLNf-t-j3 za!Lpz%^mCFcKThp0#ECr`#-w4tc!=ixK~uh=PE^Wu2L#JneV&@bDbwy@pdywD5+sx zpp_85*y=+o*fHNdYn3mY^)>6sB^X4{ z3G_C=^wXyARd}dZw!_Eour_eK{Qvk$v(D)g*nHo-CXJTeRbC{;Z-?@fB&$`Jffajr zqka}2`Vm%zNS)+>)+v;U=e%U!wzbXuPoYGz{V24hYrNThUb?t&r|mp2+(2v_Jm2x_ zo>~^_UkIXpLOBh!<+$v@Si12onyW#Gsl~{eE&dQsqKqsy@qYqOSVO~z6KL-*_<-M) bNAFfHVe(5}g$Mk+2KHvM*EC}C%;cw$!kYuqUmc ztP7q*k`?R+pOk&L1R|SR(33v&&{Nq%5IvOo5FuopQ6h#j%>C~7o%zoF?&6n>p_Po$ z>ZC%*1uq-{H{`=%C zh!m9;m@!mq?%?$me!g;Ci-ZGqh57j0$pq%ZR6mR3v$cW9bj_fHmE-y^$!XCcM2{Oh zJar_=83G+HLOZSdAV}3s-&tI5aYp*|>?b%I&uY%-& zZ4pMF%O)(%GCOccvZ&~qU@ktdy3mb^hC^lalV~q7LJt%Z7B5MO;^qXKsl?F_tPaDU zm?oN6*=mEOm8QRL%!Rl2$qCNNe@nPbU>l9y4n24}U&=(gS2`=o3Z!S}ExAw*^>706 zFeWOebE(FuKg z{h$*!+f3H2!S6WQybVGTYcy+4d+_6V>_V n!8L47X0f6>U2E9On||ByT&}iXBvxp3@Azt2qu8=pmNNeWgO%*U delta 2024 zcma)7YfKbZ6ux(!celf`vh4B@bU=(qs4gt6w4xvwLkYzfHpDbkSQbQ4R(4S|jgQ9K z22G1jxFhOaYG@-WAHWot-K7LrUHg2j3Hm$|h*rp-aa~F`BKH`tLGxwZx z&*MAaJ+pf#qyKhBM_H1GJWX=RGejpj_UoGu@Nj;nQl$&HmbM=t9 zy)z3uD%`AMl5w`Qd{zzyX(si!dZPJ_=gFm8QNEeW;o%9<3uDXFIQXJV%IFQ3S3v8AL_x}vWrBlJ~6;VfT(F^_YM$gOTM)fPK zx2`(tz0jawg>FiZ_TCyDwm|3C)CS2B#YH`k6Hy$NT0|^>7gpdS#eWD#Ys%2&= zeq7OM7p#wD0VAzC0Y)xK68L|XY==HgF^3hp;!R_uA{mAjD~U$W!hFy|l)-(w#SYzv zFsgPCm)+|m$t-xAb}GGT%5AD4 zue=Zmi%AeJq;}}~jm3j>Lu}&8IIzx8H5k2t=@m3ko4NZ2J-y1j=@vd-3v567y5A@2 zkkv1^%y0G!KgJq8_sh-pqeAU)%x3J07gOJa1vEkAit04A*F`-$N+(k~EoLWAGA0=| z+@Z?I<%7`1}-Cw0MBi{!+FI&AeeED_0! zYYXmnkXEt@(gqYKy!t?~frNz_eWfW+8YY1|8aIJkOQb-{{f zWo8x?%WY%-!NRo>MTfB>tm^6t(FH}{OANZVP;1QgXs$Y<&B?OmqTqn`m3XTwiWIxt zinlHR%avvUMauP($qp&0e2~;*2!8!4 zF-R@pBSw$Pnqf~RbHK%Vg{1{i*MK^1&-IOXg?LhY1aUZ9VAmgl6Y|<*JJ`dbVrfB> z22=&%T%DQ#!PgWQxX(yRjvnnP_p%93uR(v~{S8K2GAMtj#>40l#R^;f%$}5u)_4_gEk;9LGfp!E%?B|qd5&>+rxhx$DE82=%ywov zt4n>dyjxzRi4b1EY_a@?Op*YrgHvtT+G`hZjIexWn}*%SLRzDL0?vaVs9ox8Cl>{< z=RBkFd=P(Q<#`8;WUyQ_l+P*#CW)5<`4L4^C*XS&0E?`Wlfge%)pz-jlMPW`mQS!D zfJN5e*c<=(aS%!nKn`dt=gEY89-iTB_Mya!UsL~{9k}a6$hh|JJ~`X!(K>+a=S4(4 XC;y9UjyiS^=FgV4nPr0I%TM=UiR4aPr8df7Ks&>lqEVCUTEfgY*ri6F`Y&xt?W9_fl z18;gT1$|VYl_%KF+)6nMDd&J*Q>ysbD9*QnaRi$@@ByFiEQ^R24WgTbBpY%jl^HQ#P)vGC1h&cGx nOZ9;Z;`fP-P4J?2CIRBKkO*H%gtgy#^ delta 1708 zcmbtUZA@Eb6n@{^`^8NurC-2W;L@02X48GZmI;{-XMnJ3mQ7e-vF)Ghu2WqxTVyCij{ywYq7m?N^nera!S*h5q@O#1QJMBMm1h_{;*MNNE1?ih9bcg=@sdg1BjIfK?b z$N%VOVZjEL_k|sB^r%6u=t27&+cJ8PMBxvoTnnyV-UM}bdAUL*G4!TNqWKi4yw5w~ z-5+>S3;)KeYb6{L-A8S3>y)U#y^LUjxuoQPv0ah^Pfby|d=wGmh}ol~vg~CmR3AiY zc4z-jYUekSIpz;=R>(XdiqPN9StJG*nmQ5MbVKY;rGye?KTrCx#a^`Z?1x;gXq_OYpp=INORQJZOy z=Hf*owl_ColK!^=5{HZRoE6gNC||A*+>mZ}yu1+ENA1kpA%pRpWCYJARBp`E7R~+p z5GExsSzqM^(hsUWy(bp=x(Ym#NcQ;v&e(}Y9KJU%JQ_%HlQW}lEZTmMPCK{XO?E|c z!uW!uRK$?-f-=}YyFFuv&%G$={58pDZ^X9rhDzkzyM~FGB~H;kT$EOp3&Z4q)2-B4 zptJyKgZqE-EoXyhicroNKGb{&IT}IYd+=n*9qYt{1rMVbI-_y4O>8Uf#XY*6f*1+l Y*TaK(TZlVKL&C=?x{P>At)NZ(uk*NfIGZGAS4%WLz9C@uRz!*3ofvzn49<#hMTb+E#(l$HJQs>}+kmCvxb z8w$5C(X__ytA6Ya$p*}8w44oVJ}k$nhV?7diQKFZnp!PZUMemG3c7*xE?GhFnA#|W z^{{UlE-d(|1LiEP$K~Iu6JO)h^;cfP*pPad56{xY5cW6IFmg-O#e++otf~NRCa|$)eN%vqCz`6K-ku81ufXM}g}aO`?5Dw6cTLz?}!W6OFC9gV|rI z)n4IH437qA6-!TsGsTp|izzv;VthspZ;J{yqa-d|jSEjBVsKRW91)&+MV4Tpwz}>8 z8`*zZ$J@4U{1E>7qP$j$^Lq9v%mY#rGf#B# J)@kE<(;uD5-0uJY delta 1686 zcmbVMYfM{Z82-Ls^rF4FV}8@W_x)EgFUt`|-Wq%Y1q zs$nWAS72^H_GL8_`3|BQ0k?QD-rmgfv$p<&rRMmWC4Y0b32QNXgm@W$%=MT?brFsR zqyp@`OWcI1om@tyldIV9GWQ^EzlE+yrD(h?x~*U*-y>t2*>wn;uToFPh?Cq)%oKa}&Zy;vwtx`hJ`Bgnx+NoJLnsvuJUm5FyQU=>)obXWc8Urd`kqeDPT$VtgrAC&Ny_Dj z$K`d_1Jlx_Esj8|?P=S+Fij2AZq3dd8V=Tq59$>!+H_e(!}EeCcQ19QK}H7s?jfgk zq$UKNC%{u&&uXXcjS-$e({J)BQ!CRjcv8-W=MGt3q5pw0`6>LM3mWGA@^K8EB+gDa z8|x#?n)fT631^Io?{`*0J++U$N+Q%qf76JtB=!XaZ*DV7IwKahTbn*X@EF%^iB*IT zEAB%3I7(gziCdDjJ6z+0?Z@?)teejq$~IrUtRe8Hph^45vKjkM3pz4yuE@7$UMQq~ z$+Hd*DhG=H8;6{mIN+_#yb%2s{Ivz0kpH^HUIzs diff --git a/WordPress/Resources/en-GB.lproj/Localizable.strings b/WordPress/Resources/en-GB.lproj/Localizable.strings index e4e401cddd1b3b448afc7e8ff3f0113e9384bcc8..2e257fde575155ca306e7217b8de129ec0a3a888 100644 GIT binary patch delta 688 zcmaJGKMkA1!mNQLfynY) zyt`5%DDf(t^u>_)Zn}+v?t+k_k^<4)SRm57k1o83IGmUFJm-0z^ZuN**WTq7Z>F{4 zES!P>oCA+(LlA^|2*DX>SdDf_+{jnwJ}3u_2hO+VPFnII-qX~G#z)16qX&`=-8VEV z57fKYn!ZV{Ab3gU0&OqJc;Ge+kPY(m3ui9Vns?S*f?EWRLz3Vm#2^lL$m@j!Ef4td zN;9iCk|1CZ`b|olXv5^6$UTlM&KHxI-_@E1Va${ng+5|+P;f6qNh}F>4`tA3qC=$h zPc~0CIQhHZ54mlxHurXS!GeKVR{iwqej1JAl7t(3vJLH@M4N7(Vljn3ll?dx7BzII znTEzArtluci;+pD;Qll#<4a08X0FL0Vpd{zRJD3zI_^2hK&L2%)UL$DsgRvkiBu_gMfL+I+m z&Qey1?pLZJCZQjnyjPu=X_iZH^D9*o?v|}McVDpbozJDXkP;ML{-tzgGbQMoDKV(x z&P}ncCJv+2#u1v(2sJiFFUP5UF>_vY$2;mOjWQqh z6~WA`+=e{`NqPB8@@+qleV4;CdB39P{p!RxH=+)GeNmmL!tj=4)jKy-V*{6diUa!k IJ#EVO2ghO3=Kufz delta 1765 zcmbtVT})g>6rQ>Nte5R};li@~U4CLKRJyQzpi2zWHbMxtg;qikYw5D($GW?P1ww-s zFcplI5~gr`z=qbwfH7Fu>NV9M)E70x;Dg3Akyv9QF~(}GqQt1@E@+8JBJpA8&i(ex zcg}q0o4I4JrcX_$50oaj$^9gcxQR}3$!_Ao(S@UnpfIsuO1_z~wmcT?8-A)ffk)3L(Cy0;Kk~-2z{G=X(TSyS!y@={0L;^5bMK#(8 z<)6@au?YVQ!g#-uNLM+RyJ+lR^Q>;_V751s!XF90Q+7no61O2oBcvH}0`xa=7Vy8v zDeObp5zdh>d4@(roy8Tq(sD5>K#t?+j+DDn_8K%iTXasOZdP8bQTNab;?AfLmKQV^ zu+-vhX{IXc3D%%M3xpUpSMpGJrZ^OXYL$ii9~~ToD`%*MbuP8Bi97d(gSRe3!E`{% zOm>qTWITj9OmVy@gHDd2C@mO7wo*UK?(?9-kq| zy(Vgq^gI&Jo#&mf>zZhfyvn9!Fc4-7Bn`g(9FzWhp0{lj@XK@5wh4CVaSC?vNlfs> zh6&cim^pf#L%iV}5*ClJpco6o26e)N<-D?`7Modtx|yE$k!E-|Nl6AzB~^!i5-d>D zCn!)oCs`o&5jhS<5i=_92V`82eJ3FGS@mspd&Nj`MjI0W-6*0A*9MWlIP37fv>09q!PXFMH9a<1Qr+p}IeMI6iw16M&-h$HB z;-#^2)$hP!_M+UTfUVg6&?=sTYfNkT5b@&d?w4d!jLwZIp?ojrhORNX%NPkNXEXl< DjD_bX diff --git a/WordPress/Resources/es.lproj/Localizable.strings b/WordPress/Resources/es.lproj/Localizable.strings index 72f2502ed5a936db80420d371464f5b25a4f3686..523c3c2ceb313061734c308a94f831f9e8fbc793 100644 GIT binary patch delta 695 zcmYjPUr1A76hGg++r4*s88>z6WVnlH82Aq@ETeE?51FLN9(=HJx!IOZ$6RXCgY=L# zj0RtMY!7B+U~lPyPYA*Usi!fYf<)<|hoA%>r64+6f^qpShu``A&iS41eCtmtm!>Kc z?aq@>3k}c=X71ktjc^KD=$u*Ue`w+6hAU-P6^R?y+j&J^Y3hNk?ksjSs{{Ovr!BR6 z@w=t45h_T1j!p%sP4Ghiw|1mL-u1|mid}t0&YPdM+p&ah~g6|U*Ap=BSoy^k`MY}kQmWisbOkkLMIi-;#vOP|7;xLe#&Q= zWQr=9FaRTX^_p6eYW;mXAB_)^OU$Y4-VCm_DF&W5EV@W1*e`{DwN|4Zk~K_>F$K*e z(=ap7>^S?3oYlvEgr)8UgGh;+JqNZh=j>V6efy+;s&NE6LpS5~1 zv1Bb4yU5}fFtg2i#o{(w>$dgNSYu=|ik*XM3D(p~_NsrD!-V>2#F4`>Od7;TafFa4 z#BeJvIWW^8c|}j1ln&u~zEY+RkYI?C&mFR3?jzY6Ubg7?b3xL1^hY^*W2^x8i&+Qu zCM9ipa$XXX^K$ty?2F4C?hp)9Mol<#XL~~xkuy?4* zItvizbGR7N4)>0-LLu!cXY~r delta 1865 zcma)7eN0nV6u-Cc^}a`WHkDGo1buu68`C0m8%#GriHPV7Auib#w*j?KTnCjF7mabS zu)vHT%!izepkW_bmW(VA*q+Ij;fTpJa|@XL;hb9_@egIwgk>=VjoUeG9U7O#G=07A z+;e~DoZtDK+mG9G&h+N=RHb^@YF5NNOlO6xn61TC5k8C9QzPDYWutm|m83HrZufFe zWU;4IazU_{t59`jZXQjfZ149G*|{y^ztf0uT39St-@jqD*470rE)Z=xYxm& z5>j=iXd6YYhH9a!?Rw^{OtI67zNBDv; zPo3a{8)3H4qAzPkF5bivD3x%mDf_TRJ{E$Ri_#O&`KmPmF8|Cm$eI=jFu9ti!|@B2 z6zD9r?xc+bv;Pu5U1Qo;S$=FXrbFAh#`-MgSf7-;l=@_z{#0sDeV{jq(0`Su!QszT z6>@(S332~68Q#Cjmo099e?TmU&qI<80^O3fL`QZ4m@FwM1R0NuWVm!zw!|1KrK`r~;1|6(aomYM;wqzo87$?aVw6OvgnAxxhEB;^avj@?hFw?y3Ll@XQ77p5LP>?`Vyn&UeA+rN|KAGfJ1=zT zb_+X%uP902sE};NcApx*524x+td6xp!7c7WC4E&OR>09MQW|JSWDPF(k)3lPp~ZP) zA)Dd7kj1sANmDNnJsTFu%b;OxKwz4`9SB{IwA0Lxtp&KIxWG{>1nk{!ab!24cql&6 z<41>9EKkP+1VV>!W?;|jR;N+>iCEc+=06*Kkmn!$HM=Xpt0N6dhEm*-IcW^^@#`vA1OhSk8-d2+S(lIs&J> zqitx#RUKv%!kV!4_!jLnNrC!KzFxF7A!ajtkcs!*{vTAkak)>EUZ9El3z@aOgL7to z$(oiOb@xWy@#sCC!uyE4Rfx96S-uevM2Yuq#=h@08THe5l68h$6Q|INpWXQ`BHYXpL+Y=2T9+ zqP-1OK`hf>jyv+9OvC8!zOSNceDk3g-1x_)vuea5DU&?t_YK4%Oi~_VCdEKW-#5@H fS05xum|4IJxvbWbW0b9b5~`NTc60c$8eaJiHD>+$ diff --git a/WordPress/Resources/fr.lproj/Localizable.strings b/WordPress/Resources/fr.lproj/Localizable.strings index 8d4f88e765d4e657b3313b7ba593a3fc027a0633..57d33389d910bf81b1e23794dd4cf27d0228f205 100644 GIT binary patch delta 727 zcmZ8eO-NKx6u$TU&3nV}c&3$O6TGI8#>$$Je#eSb5SgB6(V{G3WYip-F|{{oA>qbG zB1GqchhmV~1uaCI=mrtYBE*FY+en-24Xk{Cu! z(n@;JOyXx}N8Gdrie#ynR^)=MyE6sehFU~KNf)__d9Go$ZqkP6Cj3))j}e>P+{C&0 zeHn3Wq#b>nxJ}SU)lxVo(kHpq-*ZkFQzZ}BFR20cbH!khyum+c^ic}3S%<+xX*#E{ zS=kRQ&!`I`X)1yKfR?aPB@Eq6+&?iT>liPCm0gqvzdcitN+cf0ToUbXwVmCm_Xdd&sL-_=-Q5V6DJWP19*-@ zO)OR77x_Qi))a1 ztpxa;(~40C*~^Yl$}_BR&#=R0>5p4@s7$Tj34vwB2?3w#=L^Tw^*LA&wF~g6T+(?& I)F#UR0C-^5BLDyZ delta 1815 zcmb7FZ){Ul6u-Cc-|e%G$NEoZN8i{Oir4}}Sk^hf=`zPO%Q6!~rrFkY4AQXLZXgq( zMs$Rbf!x92!(1>LW5|S!;hrBvhaaSTfh|!Ji7}uCm@zs+To4gF_jN#sn&^k#-gn+T zzjJ=SbIyIoP83Z~6z#29@O-c2 z^2SLAp6nnYJh703iB9I-4zO!Kt>KB2fsrZsCgpwFLO!llkJM=wBQP~4$xw zj7e@A&e@5nCIk>aQN5s0=CjbPMh^R#vY;{C+J6lke6v`BZi3U1{hIm1_-}%HnM%dU!budh1y4EM< zf_aw8&Q@DW^yc&px0O)obPumvkq4PA$^$T7FO|a9eU!nWUaG?MVQRp|Uh0EwwW?ul z>ZKVKst+qZ>-quORtZNQbC|q*19OW+1aVQLEl58`Qt;t7(jy>W#ljvwM_v5$L@oq= zq9(jqy%T0&$+WS_``e9IR)k-(d~)OW(~Fg|iYzrT#g0ij@bo zmuMagI#mWfRmp`z87U7MFCojjwz5HWF0AU7bf~MBWf)gg1KOw5dDt~Em=&Z!zUzh# z2TQ33-ao~R{{=qFB%5uj?O4?=(h1u+4gOQGd{N+L?BNt@62s1F!!?TPbm4yzjwYEG zc7KF4%D&Q!9@lBfa-EjH4!P^msf{FY{RNM=W2_{cETwKZGAip(QLN}z;F|2Hg7kdM zzwa!nQU035W;J7&dW06Eg8{fz9)!S3#RK~yDATepG%Vo?g;|LTW&Fm!wGdo*SoT8i zO4S8BBdY7b8p(vAD#q^HVzV_7Jqe#(qh4S?C^>LBqI&L+Ax9G{9!F*=-mLlI^04B9 zaOY(BwB9$i9$lz?lqHokiAK%O`-3_x->UkW#myk9AZn08^-auj zqa7!1dt~?7kq~*kJk!Ndn{aaGDcjv$WYYFb+3!SMF=Ke;s+!-E-lkgVZQ2o@ozSKB zgld9Hlyt$Br(`5^#UaDa0nJ52S(z&unGR=MOb?@QHgHzuBm!p}XER#G6JC3^trcsF z3h)Q zG(Cg!o&Hmmr5I^}cY?IgT9wPH^8Z`%6BX=1I3H%RcLC-tvTL`qpJB@j4tin7fM!5( z7>CQqD6;pi`f;)V$+VCSsNCvPvL803965B74}a>0v7ea?ivuiVeH>;tGk4~4F4RO+ z{kEF7@jcM_tYX0V=M=o*8u98%UuXLE5Y}6CRIM#xD<&AlT>@(@z9x(CO(n(`Q`v>p z>zuKN&_{U1&=SSn-7kRX2=S%{QIa!XrDjBm-GdcFoH!{qV`>%v-fE!hteoH3d-MMS DP+Ik` diff --git a/WordPress/Resources/he.lproj/Localizable.strings b/WordPress/Resources/he.lproj/Localizable.strings index 1a38301daed2fb4e9fc6e2f4258eb82e76564faa..7562de2149c952f325a0b9d8c986b7694242ffd8 100644 GIT binary patch delta 704 zcmYjPT}V@57=FKV&UZFXHrAPmo2!n~z;1Mk5~vlJe~C^nBCIGh%{g>AY#PCkx^d9O z5)b%7NUU1}F%EHvy09oOqDXB*{;;M`wbj_}7gbEX zkQI#kBo#+nBp0?VSTc3{1=UE^%u2bX;GxE6C_GR~Imx&AB46ejl;ZtO!J&^f)ESQ( zV=7+hwq`oQ&;tRuO~4Ka(a@j}U$+TP7Q&w|MF%@&^j>=!!x@1!>AOGV^L`kBei(#X z&_&o5s_1}D>JWyzX~YS>#lQ097GYU>mz;&OdyANygSH5(Adt&aPyGGh$9WHPq=DT$`vBa)FXD79 z&o-||*xXr+A7f2s>npa|oY6^jLvRxYuv`)HarifrPwtts!oTjTOY+a8IgzG!h4yQF z5s!p~t7efRByNm;mn}ebRs}b1|Ud|2FcGJDhq(0<}mH(PH!%Dx)(^}{JyRv=}A!}$MORLADk_>&QR)3<`aSq}L$aFMx}#@5PxKrkZ7UEUhj*bU4$Dk6FGM=yl2}PFD$(&apCluq@h4t-)GQ@E=z8-Vy)+ delta 1879 zcmb_deN0nV6u-Cc-S-|3R!U1LRDp*daiU_eVm7CsEYXDEXGn%l6R;vPU?D9in8nHB zbTP`%n|PuzjV8;ICEIi>N$37>F>wp}2ez!uaAPP=zUqWzGt07MX6L@*)NJvurRjV3 zo_p`P=lp)>ciz!&imne9^=x!{$TDIO5B^q?GO`?>rNsNWZ<#Y+Ordei(`{h3=->w#`3-B!ZgON_j#e3D_aIt!H zB}^q{gWq50nO};_Eo2Wqy<`qPSL1&UMsJW|mShR`1H%=#by;bLHJjvl+_T)qAD7$0 z+bgfj)XNLk=TR@5s?hRy|GEM+JY2V6z86pb+o!NT;F}KgQUrmbtJhOVZO~Y=qqwf4=3@Md4q6lMjI>D7m4oQqBe2QA-IN9<}ID;G+tZ z1gHi#t2LcP@ysN2ZO~j0WvUGx-;gpQ_5eMkKtUzTiM(=9F~n!yK}>~Pmjb9uMl4JG-OT4A4ibOvH`C&NHJMTbmVO# zBCsD}X~cIMTsy~{=1z5HCzLH#3gNSrlFlEWRA8!%=?m{7$q6=yWE*6NO|l^t!%-Zc zQG6%Rl3>GZf+c~bvpk48kcs~%nAlm#0gv|6+0REb_r(znVT4gQ$<=(Aic{;cz!51D zI3nNN28X-kY?yPAx?Ov)`~nC|J^r`OXsUq(;ID^xYVjR8C)3mut_D)8P%$dcg3Whi zEz&bA7bO3?%)nlw7+~#VR>;nj3_ew;rFY_0?dDYhSerme_g!V#Sa0{)I8?l$IvsJu zF^TvYWD-XSAu8zVvpC?;4dk)+U222wYNaMJ+{ap9g9{a!o-gDtQYb;cHJHRMA{v8X z+FIb0pE@8~s3>J3iF)L^*=!hM$6gdgD(xV7%LJhf=TFyBmAojF2fZK2Hr9+A4)9A` zo&1ZJZC2(`b?5%(u!4SfwcT)5qmwAz6upWL0kx0L-JyOl32XxDPHaQJhfs5tY-0%Keyr z5OtMRgXR0lPBmj`JI+PIDfm-d`_Xm)tzw4V(gb2Rc2n%5JS*XXx0@6l#!59SR0WVi z&py@aNMZ()m`MyH75T*>R69F=hov-$~2Lzek)x0c!>U$v;4-7kvy zrDtL$W^00p_f@N_4LNzjqYtY_aD|LO(Z~302)w7-y>Sd@a0cqQdGR>TZksTspcmE= z3`>ANgx$GsWi%tx1oHV?ilFzQY=boq($$n%) m$#-xp-aj+p@ir!N4`-t`_QX*FHzwEuD4L|+h*7TXnfEt`={f@d diff --git a/WordPress/Resources/hr.lproj/Localizable.strings b/WordPress/Resources/hr.lproj/Localizable.strings index 8df232e7ef24b7aa735f3a6f6516dc21ae5b1b9d..4c69d87bc9545f5ef17facc6938d26440d56c9a3 100644 GIT binary patch delta 668 zcmaJpZLg8+3L;OM7sW--+JK@GXv*OH>BuSAuWa1=^%STj*7lm$`hWH!NN&ED**t7DT6&g7i zCzIqdxkNHpDo3u6DHNZ=l)re2WJ!Kc!;xL|A8Pn8E4g^{$3tEHUa>%MnR)eE`{^Pa zJS5wpu_-EWdzHE2Re{=JxA?hYe+PTw5u$4L0Y2>Y}cu~EGzt& ztU$C#!zk;4DwypZEq`Kicf@$I!JwTg2FhDQQ1#J>5qn8vJH(|6!)$5$O)W(nq=XA4!Oz^(G2}(vHZN3f)YR8FY09JxyZo6#ASbS^hfcI?#E>am4?lr1Z8F1BAG1PCWh=0? t%#>18Wkyt$l^kEx9LBqfto4HJDrRdh8!SN`sgWkeR1CN+Fc;Six=*uc2|pLG37>gA&zY%>SECMe1$*=M2udvJ?D9U z&ig*^b57?kls&vsHoZq4JG4(Ui3#_H=+3Psd6t-@3_mvTI$Ry3k3y4Q$$g}Ygh(6d zAf4nG2}7G#%>n6*W?*b5TpN}0VFk?&Wp$5Y1=NBgKhUd6BYt z^>J3I?M+-&5Beb;l66*FU$^~9JU2p);JY zG2FFd-@Vv(5Qg3oJnWlp_m*AD5E~sR0OxK&UjwxsmYvL;E>4{O6@;?pV zo}y0Z@7HvwFrgF0{uLDtq?0RE*7%%-RZCic(X9>*RI%!hY*DLwK=c zyaK_lK0zBf9~Z3iaWNqC!C0wN;$q(NFx=xwS_u7L$Qs;!N6CgkCKiH`r1~msxIrm_ ziH!`7GuYtLXg8DX{#Rl)I0k6(x+zzzJnu-7iB^(H#VwH5sT+nbVzH?MNLFpTCT(q6 zl4^+b04>ryaQlIjn`PoKBRI~Uj1^`-QVU>yPSULE2h!r)CPoh($CY9joRytoH;Dkf zCAi>VxuCHwQ-?sgV!-JisR2Jdra0k;^gnogc}q5I%~}3g`Ij1-Di6P0N3lvS!T@Tl z-Ik$gV-aYaP+jA5vIJ*;lO=6C zZ0SMwFuKLy(p@Ewb(QMizJmp&B<26le6Cb!f_>$RKK8BzW|{IHoD@{8a}PN&K^Wby9%T8=BF;P_B=Ji&3!#tC$eBL|$3V~F)3 z%6AzJ@Q18}GsSLxp9g<_C+V>8sboO)jG#lRQG5|B~{ztvqyVv$|nHlMCV3%ls*-619O4P97$o21WD8W0ayBc zW)PaBea*J8OL@nm@z_DeJF>NTLY_DVt&R|d`l>+!CCLW4KWM3H3U8lQny*IN>`;KH z#7mCjR!IQuJV~Gp@Cywa|1=hEULVWb;K+SRvE@mMq{(HBPLmuiFByi7QA4jihmItf zMMoY9d6GfwYmP);SD|61+PP^GCzp`1fW@znESW*(c`VTNcllTMwQy?B`wuoZC+$#r zY&gK{KMKw4)*JcR&Q1wphZ)l!F42;}>!xAYoT3WE%G3cjZc`QNw5@%mTY{ zDna8jW3@7MBi$*V!LH`9y9{hhQQPmt=&GPVwM>Vgi}CJdKT~u(%gdmeY~mf$=W- zFROo~fA7CMN-P;2l@&1RE5M2uq4kq#;N51D{^2`2`c2oqn*1T~4~YzdTS5>rW$69_oh+NCtixrU+AH0(#OGHW;Vk| delta 1771 zcmbVNUrbw77(eIU(|hl3?n)_bX`yW{1+#@TwG1_8Q@2c=b74zR9(1BB>k1N)b}bz+ zQHv%+jmah#@|nm3F1k&#Xh#=sBt#kUVJ@>%9%Eg8BI`i}DoJn*d` zukRu;(nb!DPSQ;}pdl<0hPq*)ob%?+v+GoQLaY}z7?DUfG~X>%LW^IpYhQ@&+(vQFX1JJ?;|h?X6v`$!CuA-Qt?*Hl1t+%u#wu5uZ7Mm#=Sj&^j4JVs zBm`Tpuxd?>$Tf{6s}(6$NVVp-Dst*0lNDOHuPJxeQxn6vV}*xgux+7rJ`9Eak0Ue& zdQk*PCHoPq6kab1OP|ncINn5E>$d+ZJM$~8y>VL&&yp3~zZY6xpjKc5)UD6-(_sPXpR~AiI`nu|B4V{aCITNx_T1 z2p&-1=j>XzUjpSEli|X7s$dsH;b5M6;E(0qJ9+Goh?h1&c81#Y%`^1KZaA{YIbflT zll6>^Yd4&yIT@Bic}*%`@(A|t#W8DWR_L8g{EpzZ^_ z)%e#`07#J;VZjM` zE6?DyN0|b12qs(^6%~(xq(M>t0GBkO>qc2G9Q{so(v;SAxl)_DD#Om0WYs2*DKP$= z$RPW=D6P#G^mS@N9DG}36Lf630>nv69S(LiqdQwte4k4o(l-7hD z(v6Qn3Q4UENyU5=NDws-VigQn)7U>fMR^E)46hhUqWD+h>KN|U5Yc_BkU&q-4hUc6 Lt@_wO=}_I@5RvP2 diff --git a/WordPress/Resources/id.lproj/Localizable.strings b/WordPress/Resources/id.lproj/Localizable.strings index cd2c6f89a06dd9873b681de838eeb8b7cb7c26e6..19aba6babb2c3305262785e172db6443718ce485 100644 GIT binary patch delta 702 zcmYLHO-NKx6u$TU&zsjUI9Sd!4bPFH+%!o^O5qfyVS{5KWJNYF9h@PZCVfiTMnbfb zV&YO~5&bTtRT7VSf*}tVErM!_GH7AbrZ!@wEuuwrW+>!v&gFdfyZ3zO-1~B-YGJY} z*IK@f)DoRU(CWz!vK?cD)II8I7TAapwC1JXloje)SjH`}MOT^CQ!CispvMVJ>LB`EzmBHUz;dO#P2D3V++QATaG{wGM2|(_vEb%5u z0&S;0aN@iNGM5DnVqZkn)r3v=Vyj6oD!FoMz!{xi2hOw<8=o8F?71<1S-UaB$4;bi zhH0!ah_2%^Br)s3)x@m0r(^vzIg5BN>RFv_dug`^xoPC|m9o`)x>0#=Q9X-q-BA1? zcAoKN{_)flZ>Oe&hbeG0@sK@RA?{rP;g%GEox@avwkNy-9d5~MPp*-wqj2{ECx8=_ zYeB1)6o?*_)NwN|*=AgJMsWyb_UCu<^B~JDYjFFcyvbf#k>AcS=Xi&mnN|`T{{rI7 B)>Hrh delta 1886 zcmb7FZERFU6rFkBU6*CM-L-7nrLRRk0;K7-2!w>%4^5$#T7>um1!=dXUv#_fZbgWZ zHkOns(dvtw_y-$e2nmRk#k_#1RSbzB&=8|g1xo@Z62z*}pdrLNuV9P*ku;t6-pt%{ z&zyVi?4><3&U`qdza~(~!pvla^tXgP%oflXX5qm|rD6>&s*+7+;%qMuq2vYb#+mKh z#Z3&(lLHv-;~vzUHr&wq_%aOi@;TUkRCeRoi<)c7M%KvcSOaTeQPzaqn-uWbI_{HO zSkmeq3aDi)#$veerIAf|lpuT$?AWV(8V(-fIjIxMZEmg6=c==bWD71|*Mrt!eQs)& zzIzG!^HkHCUs;$ZPSC+N&{)j!X{u1B6kOwoPTP|2g#t_mZy zrTn^*IXR?=0w;xJ+)ZKV#jJqVRv~=U2wDTJMqV*}{x_$XoeYrbulzj2Ds8Av9eCRF zRx0+(gAZV!ls^=@gGVw6sUj>%f%QZ-L6SxA=@U{AhnLA-c!QFWR{qbz%DvJIEVwQC zRgooOgPypBZx!a0$X{bG;DLjs{ zt7=C2Mp`C^u{L@(3klKvlM=v|R^5YPNE)V}pto33Q)FSpwIQB;KLn6}UiPW&1m1SP z9I}%RwHS>iYbPxQ%}%Gr&G>nRk=uK7pKRaUryOX;n9cpTG03y9|2rzd=q^LSo*k+O z2c9yrtoh|0><_5MRFhoNL1=M8qvpbMC-tB`=2xqJ`#*Nde@8RXWoRDEEs{;^wNu8T z%>>s;fTBkl=^42LogD95viw9hRnQLVB%)A<6`kr#EPR%fH7=4fh89XLtQ#hKl%#0} z=Gdwiv7Op#yVcNYN`>C8khlmoP&&~?t0`f<<9pMY>%iq~H3PLJ6ukEj$(!CnWf!bO z`I{*yj;$A^0D7h>UPKp5TACozL`zA0Qfy>~1mC0sIGOP(n(3gTzuzYZLJ6WT`b$I# z@Fab=Id9Z)c)NgSTRUoeIJi#t>#Zb81M5V0g^_{MO068jRhp|;S+3d2a($?0yn~Cz zZv?`b=wNZe2t_CGMkQH#`vz(}(tSE&=XC{_j_XE{7AeG}1{2!HopVNMZWGe`wE$08 zgWqQ2*qGu{HwnrpgOmwxpKjpbMzELp+uY}uc-$x)H)kJta?L6}iJ2P12B7rq+S zefan>#lX9Vr7Wxe8?XKKY5io*ebMFx;6cjV{G;xfnk1xa<)BiP1lYKH{?^>-o5kw4e7_ZJax&|MiRHl5xAPb zq6C>BVe1Iq`9)##DM1CL70Pu|0VW(<;6ydjOoZMh{M+u(siVD7(!S0?s3jWhM6{E> v$J^CpPQF5d6<12k+4lH7iN^0}kw$n~5UXbes9Px&?;PX{?Az}d>u3HAAGZVO diff --git a/WordPress/Resources/is.lproj/Localizable.strings b/WordPress/Resources/is.lproj/Localizable.strings index c01444edd2f44280cd211b4a8ae5c95704ca01bd..6ba3fea8ec92f434737a2ca3ab7b7a475a4238b9 100644 GIT binary patch delta 660 zcmah{O=uHA6rS1tY~vbhHi=0gH6XOmUIM)oq%}yux~<|>NE4g3i6(K4HKb5Vd(enj zD2({T)Ap=LWQDoaOA!>TTl7#ogj_5h#9|eX>Ps)dgUIk^-hA(SZ}>i@^(paYC(-;O zv+R{V*U$uk*~JO=^@!ry`m<4J?<*N-YI4vGqz#!SS^T^SAGU-5WVdCB*;d*$tjclt z{8aP9(0f7m<%o@|pA4{XnG>c>a%7&&;(dV>F-n*ZvXfcU^`SaaIRsSL}1Ae%DsPD^rQvtMou& zZDjx=m#H7T1~r(chG6?14Y6g#U?0^8I2*zcJerdYBu3%a6D{x;TW9wb1C%N?VEhi% z*@}{dSMzd+*YDES7&woq#VfCAebP6BI%=r13h&}-7@{V+(#2?4h;=-MsgR)ay^xTc zW$SCvo;lQ7LbaW~8)w8gvv(w@9Fuj}98)zj-7R9rIvyOO)-0Th|lZVy+cEZN66z+T*-nuOY zBaM_J@{}WGbI|-LUE&jhyt&V<@A8XrxSCW_usbOD8_tNroe_0mku|km{;;WT#bD(? Q()sdRHTaTyYnpND56uF_ssI20 delta 1847 zcmbtVYfKzf6ux)fJ5JWMyDZD{=&&WxP=p1nA*NEKNkdkwO-d{=*aFK!G27*}NFf%h zE?}BeDWg5HA+{yjkcKvzO*%g`DY3*vOidx`55R_yXbiDM4L)KT>$$UJL9?2oKV~xb z+;hKk&Ue0hW_reV^Bdp$-;0KRB*5!LhvFfc4GRO*exFVrCpz)rvu>?{*JJb{*cXso zxjG4x5NRMyq?JTS3;K1Dc3cP1s*@;bgWNRg6m{H=!YNAA;7k**rG-fwI=7KRbjl}1 zL}eioVdrAhMc2O70qQaQv8=cvah!2Z$u}01s(4r#eGKZCWC4~{G0WIn<5Xjf&DrxbdBo2gi>HdB*S#hw)-Si(lS7Cpb5rDM=t%XZ{jI;Y&#& zbX?#wVRD|T*`+B%u34?)BY{Btx2lK}X|0Y=*44gg_Ht=_dcF_AJH^MLu z_9I=4$RJXtlSU-43mFT-69;Gp48O(+a5R_KU~!CBY?T{#w{2K<9H85wK40?0eRp1X z85TLt3kM$+J;w1T%b+|$CAe{nD$w6gec=C)x5H!^6+pi$YUcPc`mJR82kGiAaCkW# zBE5;-+6dZFNBQGxK=(iU4% z9k6wlX0C6*__IrlOCp1au~JLje7m;6}mN5kkpPW=+M$A zZ!V1r^$jq*i@IRXCF&KM5v~(vy2Lb?EKFFN4jyrjar@5ydhyep{Y=|6;z zR_<94&HYjqjNU>Wt)4`L$+LoDgo7&FEaD_t$3AqD5S+TmIia>pvcvDU@4@q{GRcwD z<{tQBjCaAATbQY`A_mMKZj0^;i`H$d$Lvl=@XjS}aScXnv^1<+wl-*Jm7Sp5B?W$2 z<{Zvelr&3=O$bJCClY-AS9E#A&$(@#2-br3=vz9Dg78+)ff(x3t)0fuFK{Wp-< z70viORUYg`mu@VIl^DSidypZv!VzfMns7v7>Bbvhr^5ort1#W8*bUXd zOMUi#VZifW3J#{WE#};~Je9fmQfMK}jPdCZz9!q#nfh68lO^LfPF8rJT+W7PreyEG zdz^lbcYwZvY961GU00KrFehVuyrqE7g_;vs#lBA^A1vl@%1a^aLW|XjYKzb&q?8Sp zc1v_EqyW>}jfpX;yHR%0HG3hRVFNXUmLPtyKUd;suqi~(KS9Ee1KbXC@l|Cx?@tEu B`8)ss diff --git a/WordPress/Resources/it.lproj/Localizable.strings b/WordPress/Resources/it.lproj/Localizable.strings index b7cb55605afe3d7b2d1fa99bc4d8ee8b8e9eb434..8b6897301a8521470ede21ed34f2577fd7ef7347 100644 GIT binary patch delta 697 zcmYjPT}V_x6h3qBox8KEEbFdj>XJ8E!9X%MGgAY9u);RekO(4FOmlPBUDU*)2cI%c zV%MoX_G4JD^`Ij0*KJgk*cnda#!u3G1v-$j8i_IrE+K&3w%7X-{Iz6KTpS zg>o?95R^hC93fOve0Z)is-fe#>W(`sZbjByYLts#yt8k{u(v8cHG>`mV zYskPU5#MfD(_CICpkBvm6o8lJ%izbk&x%W~`WoZ!PVddcEn!W^jZMX7?SL@BfFjw_ zmczpMMO9twKs>*F;6X~Sr4Blv6MEqa^g{@)K_7K9;4Iao@_rbE>$}u;=aW0iT@WCI zC?0@rTKh1gS9789L9xXj{}O39GR@rPJ}b@gKAd={ zh|$QDVn(La5ho_bRbRfJ?Da#CYz~rK4@vpyDLrJeK~bMvDapa*T20UEf*XVmN(WO1 zJ4LBoiuA1{&!j)Im@`_vq?*-BT2mO4{oIFLTWj6>%E|9HPjq_J~_=Fp;i!@KwH6XI}j(CJX-pA)eKw delta 2097 zcmbtVZETZO6u$R;`+m?hTSwcqqb+-f80TUN-M}meC{A%RWZ`2`F%a2GHx{?G_5;HH zSkPn&1l(TOiAHb({h{&4<`N4*$zbwjByQ1wL4_HNAw*+HOia*BpZm7k`0xjbX?ojx z@A-JnInOzF;o7vy-tZXoYKJ4K^YM;~{ z)ZfeP+@Ll4xu3r1<&D(U!z=J}Gr&D%?JUZg*k;zoI$0}BCRrT&2u=-_VlmqBtL{<^ zT&HN@nBq}Z;66^_N!<^V@Daw(zyV%uPP`Ntb}9kMJfT&Zx3s$9y;|ro8mZB3l$p>~ zsyx7*re61Gc^H;stOaW|n}>B7zViUzuu$OC9H?4DnIrP-VP|cP;=Nr;1TC;aiiT=* z*Bzz{Ku+ggI2de)wpe&yA$58m`>f@-}78O7`KpKlK7C zJjn}bbys$^#GBtR4f`A#>{NVa|H>M=ya%58cXJmPt=;58hz$SK&QEvbe)!dVsmKQQHdx^(vA=0G74Rg9dzY1x6_pkicar-#~o&G zY&MO2E8D5!7hXay1l1Cn7(+Sq5d006@l`Z-3H}Vb=E!ck#MiFP?x~b^zD!1)>gyit zld^+-@@KO}VY77~$%hfr9mV7!dgdB97WfAazpPO0S`w*=f*tRT%6@wB8o*5773J@c zx+K!Hl}_&CUiu*gbnSmB&U(Y5UDCR21rgg&IUyRw|1{Q4%XCh;oo$7QPE=9I2r@*l z??6r3kmd3p`Ts)dok6+{22*Sc+@wMOWBYj74C3(pBNphpfNbMD*;{Zo)b1Oja`wik ztszdCWs;lT|D4b9w!mcqaW&z)7SW3ajk1KferXvkZ$Vy{ELQAAR)az!k&~dZQ(7ra zE>QIBu0_iJTld3T^^6)Q5WH@OoixZaeib&xo|f(AAw#FVD8h&M3d#rO8K&79oB{1rKBl)y!|2`mneZY1j^pG>{1-ojBWuQ?Z*ux7lpk;3Da| z=B9VX^+LLJL2}T=4z185LMKhddo(XS=a%Lc3;SJG#GP1SpME-}dzI&L z+)S@@%MWC`Cbho6eMeM$S40@wJI>2qT3Ctk)bGJ^qEuIltdhZfqb_C%BJ;f9h)Wa)-{j}9U-fVuXKyAuw1cVvruq~#stNNm>aaHes@Lw^>BXa-% diff --git a/WordPress/Resources/ja.lproj/Localizable.strings b/WordPress/Resources/ja.lproj/Localizable.strings index d712bd3dcc7ac55d173016a947038c5c78a3b73e..388db5c66f220a268d75d380be0deaf2b8a0828f 100644 GIT binary patch delta 874 zcmYk4Ye-a45XaBCkK?0dySlDg$+k&^7S(8*pi!vUBAe!xnp$e+)~;6SY7f*8+hUPs zuf;1)84*;774*8sB@^4|Lj@r{Ng{e+MD#GBAc&HVDI~+34>NQAGt6(k1m>O{w*;J~ zRAME-EsfYn5`UMIq-(CHBBp1HhOR!UXiL~@s=lpss6#WDY6*+fe4#=rdRH(v24!i! z8eC=7dNQ9$reqS&wN`SEC&{FgEG5b6I(vy$nY|!_X5g7)f;nsp@p7}01dO;O&Z1t7 z@QEgxsNE}BykB*W=A>*PF0zAoNCT-Odq^$W%8T>(mx*{a*-e_JHF@Z-bI%MI-96># ztrudo@mIZ}==Y0p+TITxHuP&uGJR`aa%^ zPzMx#9)DahnSTx!c-tUvKGm9Q?VHrY7y~t9U^9(Z7o3bj%N%OZJL0G%9qsk9q8F4= z3sa-y1nfUR4fv~)8r3IqI{HSWH0-+*vT$0wOY-6U_foXp=Awj(|kdq-$&8P+}!W~1*9W9a`XM`5~+D)`na8FA1q zgrj$*AgP^?6!|%vgU|SQsc7n|V6hl17i_vAL->)62iMRj)8uYizz!wggd>}jN)OJf z5zOd)AjImp<+-o@B8cw&0Pg%{0S8=-5e>p4XT}>K!d?(p8jW_Yk zEFJDH1b#l`8Ao)BFSj^9H!l&Bvc)+Q$Epu55eLn!1$I#{uuCnOcvX;d^u|L{%doDv ziE4jQQ&KeB-s9BY=sapM?ExG@^?@*EEKgcM_Ur)bojJt1-Ne*s#`ABq3~ delta 1745 zcma)74NMbf82-NY?pjMlptjPYaKeU+xb7>sA-Jh4H6e~zR1_IH3$+xGw8)R3WB$w` zW-JTykT)@m!A8vHW`=9@U?cuyo7u9sh|Zs6PD@;}n5k=`SqNcn?_G5x(PZXw-`zd; z_U-#V@AG{3;r--Wohh9~rfeb-hDRQGo-9z;+@szLT1ot2xmF}1%q^#Lpw2@Zp>iY5 z0GC6so{q|RhaC+>_JkAYc@&6 z^(8!0iG!>s&mjWma)esw`%9Yuo?}{DD0%5U4qN;$Fe@4;ed5ZY+0vM6-W-L1M-yg0 zh&#KiG_+$`dOUb8(&eGawW)i+)1)y-C&F7p_Mfx#FnEc73Uk;o%W7;?p~j0Xi=+Zu zZ$OH?((Xl8YM0`3XH9cX#bEGP&Y+(tneYGB<5&k`g(fr9dSm|rnlHJ#&2rd6(@#pHKjBbCJ*ZjTv})O8**kTeNh107>B_g+L9~T zgNYC>qk6ddji84KGiTIoL;8KB0s1qvDKK$HYlONEs+SB!1{gU=jW}|z)bCH?huKLM zhLim|E9^4RLixl&+OtfKglXaixPO~3l&>z<+$(_Ic1@<#bv#2(-=`@Wkot}rVQCwU zlNUd$Jz8nntb|pvxtjxQ zn4Mu?v&*an92cnRNpqdA!O>scKxZonV@+l3Rkryt>DniqT6xmRz3GIy5;_xhy+v)a zDp3dZIJt5>S0PJ^#C@b5P8aLuz^#SU2s`$2h8YhvULOsCKRy$z@Z(NSFQ04UTCe=S z7`iX>VvHh{TKuCX97g;_O`7!XuzvbBte{D)0F%R(8jT6Y_0*WM-W^v_$~xFFHo(5a zhBh%5vefW)33IbjUjeL))g~!QES6heS92W1&hGj|hjdRS#OT9^*l! zaWAa=f;WS>iE=TD9|Ma1k@UYW@hK3wDR2Aw^Eiha&x_8Yq^#cap@ zw1g(eSHi-`tS7F0`jpy<9UPo43G&7TLwqC7K`C7ARh8537TyHg+l07zOQ!66i&oUI z3v7s;MQ63G94-s8HEutS;uW?8`dc(sxp!R944}_M^VDtZ(X=z+(0g3oP9O5^S2-_4 zSq0E54aiVA?k~~L!hEbLKgt$XRjYERd@k(jA!5yq7;m3aVTU`9++=sz_gLXk6wXh0 kKZqQL@Olh|bB2ASA~mdLO=E2ms8G2?$s%d;PQy~bQaGf#&5T@mVVjl4Cc7)0AfOhg#imT8? z=Mv4`^sNs)-RnOKm@MA4G6(y%Bv@J0NQr4d;h8HNlhkPFfh4)?%wm4T6|$t z8=t>uLT9gjkG8TLQN?-_ljOLe81Gjx1zXND3DYgij#mTBjD@Yt&Q}fjI9sR7!{h~> z9S7zmOPp>7$BfqhG`X^Zv8cR@C!|J^xx}_Av0;(IDIrAGO%S^YVUW7%B4M5X8I(v zcy>ox{)GN_1`h_^L{jk^tU^9#cwf=K5i^L5m^^fb{!Wfaf05-pYGC$;o TCzwvl`*6F6m5aoX@uvGHC>Gq0 delta 1737 zcmbtUZ%k8H6uW>DG2gfylapDFa&S;#e32|yR#KdLH54v-UPB&e$WFLC_?mg$+ z^ZWhIIX7@K>6?k9mI5V%WD=ER5F5!RuakMW+KBC#tB2RBkLU9$QDMbennhLEv6hyA z(@9^Yt6@vGs7$RS<)nm^kqWYzxFM&JSD?#IWBCf=0jrfNVh*V$)$qt`NWk#DPHMxy z9w&VT8V}PbZQK##&lc`b%_pU5W72Z}ZfS#E3+KL%pmWt~xbcsm-@BGC+mzlx?QrO3J#S-Uj4ARbDKM9Y+= ze>)1l#L03-$3(A6l)?MG(Bc+T{Wovac%Y$;n+XL+1&iigYKQB~sRS*>)ENDgrM<@y z)bopJtfXIGOCQ+bvvug*IMtZ28Rg!JJXmTEeyg}{M}^BtExen@zow}*MmT5X^{uR(i?uFyPWWFqiE4ON9IB0Le8j%v$^|sAbg99lv8h=!~dwjc(af+wE(kz zgh<^iJJ2*yf%a8G>?vdesl@Px(G}(srCseYse|9%iw{vFJ(mJ;ETW{dR$;oVl zH(-CTxmk@jml8JIYUHd6>vzL0#ZV^COIZe$Gxi<>w_%WO4I zsfkp7BSzm#Gt7WJb}GM}{>(gI8=m;CUf&j6f;F8rc;uu?OuekGdHwr!hTM7S+8Ik1 zWApP6^I3KA(3$QLm3$h4@kHJX8GFQ~O$Yai`oX=DW5r)H8lO2i{Roe7aAEIH@^FFe zn5axIjSR;m{#rymsWl{pr6>rWm5lLhb{MtoNT&`bhSA%MXIo)QltH1jTH?SAsJt!8 z;#Tx4)wVP#P+w_~(|+>>dh-ydH*jRY5&8uw{4wyf5c5wvPBUxkdE#9k(mH-m)8)&O zWcjbar~LysloW~a@a>osJRfbE-Xap9#wL2{YSbB=wVW6xkgSdSyhOG8BkC zG}V#LaFaBYEf)o3!qs6RJde-QF@`l+Ii9%i>*>R19LUD=>cLZ97JKW$?9<{8PrUDS brH}>qXvp|n-~Xoz_1A_0$(k diff --git a/WordPress/Resources/nb.lproj/Localizable.strings b/WordPress/Resources/nb.lproj/Localizable.strings index 9bc2f5735a51e5db396100bf2e3f120c798308d2..4d959b2c6bbfc68a2269d9b3533321a061d7a254 100644 GIT binary patch delta 706 zcmah`Ur19?7(eIUd(Q4|GA^6bwQhLT0wa(mQDG!1Y>2I854{A@9h%$Fbj37-@K0Ei z8Vfwq*Mr4+sW1p>#1S7tBgp6vK1dJYgS`~^QWOP64}I>Xgdh&zAHMJR{rjEy>Dtw7 z?d)A`a>6P;frBEww-uZ{E(;a{tQ_nSEl^B{ZRTqrHN+-| zP-;j6>VDD&R&`l`_(J>;JNk|G&$LBxMN7MU;J;?(zj z1{97fmV8F((j^GFG)>lDrZ>5mVs$W)q-9{{sUb#rkd=-Anxj=B&jYZ0o;4yW2#wEm za}(4fOjZF}j#}t=M2tni7-AK2^%{+|fb){Z;PVRgfc1_W(s@JYV*5MsmO*kFZ?ef5 zv|YGp{4e6drAP*|n~<GVLDr4+y)gEG`yt(~ns9qs^FY%h zs&9*IWRQf7S${sJ6cvlN{4i_MD7?C&=-KsgMXrylg9bQf)#&aNQk}x(22gC0#0Dwk zIEk%n^!iYz(GFp}7w!~PU-f^%KpVA6>0DQz1hSbKRc2+K_7PA0oEo*X63YZFP zJNxFF_rC9YvlD%bE*xJpbXqlyE$bD78SqO#uK@31o&%GIxCcHQ(R8Rg$ZKJ=pBI4M z&%Ka)g8QIqw@_zAS(r7l7PgIbun2s%Ne1A(AuR`iwn6FxHLs|eb>ff03>;%Dg4Ytf zFJ?=bhb_eYiu!pOH(+Bwe`;X0dv5xo`a3u4WwCik)~4snXI4PYuTnMNUt2e?3>U^& zD~=Vkls${rLPoQVtQ$6txdJeFPqYjK+&T>QsQKxs8pG|M8C(7^)<2CK;uYrAwTtIf z;JbgK(`*LaZ+0G5%{}YZq&sUr_9J0+>E5lI2h6H_r_;rEYdz4wMF=jQ7r9wYxF&(D zG(&0~55f=^`B^o8pYxt}dH7m5drcNX%e(3v7~aBtrZJJ9KJs9!7p9_WIaIFa%VBf} zSK)Rq*I;~1^}^78ROQqIi3)6xI!yko=vI6`-zTiM4)U$l=Iu@SX2UEE4i9J=^uMX< zayKdvW(gQMuRHr7&nX%VU*b9n)eI*e=fS+yC`}kuY{9YB)-%lFED5ES(gq!u zQSeW$2@l-5g!+GfO>CyQTH5^e+ z;ro%~&oN2H&0sP!3ngJlfNS>iB6d&%r~y*!Nj=qxGA6sZlsZysn4Z=o)M|Ru9Qm; zBrthLJfek;*d$Auul`X8gD)vsHYMY9YZMx9%2K#uxqN2B>p7P9qEzSpdokHFih+-~ z2*SQwQiZ7r>B%GalVLIp*wo>%2>b${2V>V|L78*hI}vf)R!L07{sd5QPNo@zHteH> z#V6(d(dl-a3$@3DKKl{)MW7bCm+uXuy&|^7>TDWY5VINYIx~BeAoeQMhY0RMS?Mgm z&kwGkpMlvYF@DL6Pedy|Ip%PV2_i0mW+2Q2E49}|Z7ZX6Puf141}Ens@z~aMM^2(n dh}&DyW-*-UMnh~|$0IO&U-4Q$p3v@w{sbCF`D_3H diff --git a/WordPress/Resources/nl.lproj/Localizable.strings b/WordPress/Resources/nl.lproj/Localizable.strings index 8e4f911dc0c8d1cdd2196959c4dfe0df1e8da32b..e0372004af6f59da1c82d495b0dfc26abd8de9b1 100644 GIT binary patch delta 665 zcmYjPUr3Wt6uDAI&6QI^j6zv!ZHw8KeGc4%?Lipj znuAN8y%Z}bdn#?khtY#X4@>}Am2pJ~{GC{7AONi~qj35bN1(i&a7JNB@+Cq8|lR#t|BO&adqK}{tqp#$p zNDy9($_}G_KAxVl^1QZklfD#LQEmE<4t%Xs=YW!fJ3F6moIq7}>8jAC;tgZ$bh{0HXE_mT{{=;>JVy`^-i5^4_f`LdX1c5UX3M6RbXt0e z7sp^(5e7Bae&NSY@I4pZTCqt?d9qVMQJV@%k8a^Qd$d=ZQnZm}eiXY?yE@bx@~h58lfgZGQl`WXD1P delta 1916 zcmbVNZA?>F7(S=>_T0<0UMmGkTO2o3Wnlyn6sMChSVUq>BW}rzkj&E7!Uoi}e8j~F zTQ+eDNOGL7KiH=1$CfP`T$Q^l2IE3V%$Cd_+m9`XiQ5vF5I278OHH=-oC5oDKepVY zy?xL7@x0ITzNh1#2M50kj)Zc{Nd>V;IX+v+MzR4v*OQ71k!>p9w{?eN5excG&{a?} zOwBBdRHJVZ+Ny_W074fXE~px&4KO=MABJDXXf~WV&D6qn5+h*}C2gdW#4#d84&d(y zS}oE=5-{(l9!%ZFFI@9FYw_>^41KK!=whuQnuG6HqmuW(T9BSnnS(cLC0a4YV@{ZF zWnMm^m845G*JH46S~vLM_WIy@JWi1P_*p4HE`Sx*9xUG}>@e@uy1_l7uI8Z{D}Af( zu8Ku&Z1>ViXq?u4nCBrhyuZCTSc(4s%qFZ$+4u`bJ$$^OJ{@Y9^>AzN&h(MylGAW~ z%3<)4Uq{o{PkWX@zd=p7e2(Q|iLj4(vRV*K3j2ug@XJ2f(5Sef{Ia5F)&0e8KI1U7 z1rtBp!9ejn4?C`_kW@kPh-|{HT3{m~m0A)~7gBsi&pgFd6gibR1 z@G!ky3!$x!e6U`lIxlV2p>#}jX$O(@7)im(Y2^_(KS_0%dsZ=E?-$gC%0&2;PM@b% zvKB`_Azuomi$UMC(qWHZr;f&Vnu{E*@We7j<>hx82C9xb?5g96-)*}`72Ut6N)EKo zP(KvBixs}gW`-uypx{?8DFHY%LyZTVg^#jA2o>Sk+$CgZ-)(0Owx~vGzY3|WZ}#$s;>xRrQH}M7DU9Z?9f;7(K=HL z<6y->J9vHYNH!II3x zpz)Z~10Pi@E-=4WSeDoifjk9gKVU&HKh;cl@1)aMVabgZJNg{ru;9c!HLx_j_4bI5 z_0&p+3&mdV$0TLw`!rT*A!6e#X-gn=wVRj^E+!oAU>lB&z#;AcL2MEUw$NK-5D~aw z{M_5VRY|nO(LVVP2Y@NPy%*^Lm&Qlai8;`)yG`g-)rQ+$<0nb zT;HWweK8!yxE#oxl9wo=i{RSBd(M#^e_9<|3;kz u)FX3tVT|w>S4{**GBYoN<8FMCq;xH&7Yp5kM}mIQ%>&Zg7pC;SHNOLMQTNXP diff --git a/WordPress/Resources/pl.lproj/Localizable.strings b/WordPress/Resources/pl.lproj/Localizable.strings index 0194826a9fe37c5263fa64222a51cc98017230ce..3186323ed851dff5442356e7d4f7a39c4196e640 100644 GIT binary patch delta 686 zcmaKqUr19?9LLYO|92bLF}t|A5p#`LA-4A5LzLzsBfF7FFPY3OtsKr;GAEgg1<{^* z=|Ddp!lKt+7FTvEk``F_P_jZIdb+*z;Db!T79rAU>|sH~;ruw~_xpZ-KhB5q>9v3P zslN~qNi6O)d*vNWDl>g#Ky{f#n{gP*Cq+A0U!_6lPY3}L?R1dTDa|}^;)~D{Mtx?kldQ=Ux`sxX{46uY(FjVQG`iU^DpJdiqkpR5c88#o(61axR`;15oAWmC zz307VaeE<0%J&3n&*Gd!Tv8AQqu37RyI3VTQ6rYL`#~OS^|PJqk?l};$hCv-BCEQj zR`@xmIQ}vP>IN??w{dm#u^}-)pWMNZyP@pH23T*g1GMHOXA}?gmz&gU!LY@d74*6aLn+AJHd!2&;%nt!MKkxZ-UVs zLuqp8pbl$$1=VwgrT!x#8D0DHgXoW0e!C?f0iH%cxHJs04Pk&9RY6;)^WVjtZip=i z0(4cRPDoZoB_9e(G!&GVrbubkNi&b+Sq~Jlyq&sU$#aVk+QI=St??0h{+5yr{04s{ B+c^LL delta 1701 zcmbtUeN0O(w&|D9KuAS6P4-C@dSx zR>%xy!EJKUlNeK(nk8-#CpErkq6=gu(qMlbYZAhb2)AYV~ z&$;J!&iUQnd6&+4Kfd5SU&*ruccWP&8cYq++P_|^z&%8_!Kp!70<#IKz%!o+&VmjS zCP5M+?WBuDfZi<@vYUrgUPD8ib-z={Zz3@ggPkX(QmVm?1g*h`XOP~<0z+k~2L3n7 z(&AmrBJD_xi~jXvyvBUn*LiA)MxtaNuC>IAYaRZ*B*zM;KNUJbUE&m)o}6(R|>m=RQA+nkL4uIv9hUG>}=zX zZK>Jqar@|Af9mX`pN+!8D3#gl&;3mK@y=BGyW}dE*gz}S)RJn%+l`qFj@n2Zcdf`( zFH+M6H99SY=>n5;)#j|NnO5X%gUz%GwBximb^Mpt6QDlC`Pj(%`(b836(Bu8C8!*r z#qf0tRrHOA=rKVL4beC1Vf+zOF$7L<5|o|8I(zrTSa5M8@~S#g>f~-W5x@d4U)`U0+&;~ZFxK57u>M)B__Va%<4)<(nXbj#%TH# z(UhaKEH6;jYoHC!GqXO=xYoUJ&4(g6_A*wd>@rK%Al^e0l3}PeOnTUB8_FTM2MhDx zVKY4W8O66k1zJUuJ@g(tAO$KAu{7h-NOX@A@<-wK_1OvL4veZ^dQ!NJqzhUJQV3Em3pXS5aLCUWp?N9o1Jf_QR_CV z-R6>oZRLEGHQ6mNN9r_tZIjuK)me#K-yN?!>06LoA>t<*If3FQA-vOM9O^Z}#Uh4< z1*82H?aYn~^bOVKGRP!JlAD+`N_0FLIRwR$;GsHnZHq2?xH5d{MhOZI8fE2ed0>J} zW4ReJMXqA*IYf+-F|1&a+kbu9+w@)||ICJZMsb1Ty`Zx2&qo#g$GR0F-$fq}iFExg z1k;KGp6`k_zMP|`3~$>6FRMy+h|f|xEElN?a|P6bMcT#;+1;|hw}AdyhPv6D)MFjM zX4BY43SzUgy@g~xDbNI=VrLhney%^D_j2kBUaTRLr(!gb#9=0};tYz0>qwwAfvL&*zjR5329#gONBO2lE}Vj)oM3^iVL6=jj>z0Q zqCC5UT%G*FhSK9>LtibRKNeNKw5#;3F!N*_*7jKJ&~Z$1!~7f7!K2B(B<;x;E4EMQFtiFR#QYD&jw$AF;B z$VUbY$gXgVSv2?q{Q=8HHCMu-xELjVuo3yAS)v;lB*6@RFo{3Vb8bbdVuHDO-`;!9 zdC$jl&hvI~xMF&&V(^r?Z(Wlq$b#_PLGFX9#gYxi4sbWD-p?f%@8yczz}oRi!i_`R z365S~1MlzW3!u*~mj%)+!J;hAQY^!gEXcBK6Mn}~8e}=v4ntomPBDn;9L#!6P@#XD z$)={s9j*`>RkDYfmCd;m|JosLJ9>bZ-3=v}Ga-}>U&tbqLwcG`7 zd?%D>mt}XpQU1IJx=$-sZFNJvuNqC-SsU(Qa?Y0Fn!`vMX9@UyR8aGdy2GNYSi7X4 z#XSrirxg!6^7F9P-Y~yBjKY7rBPqHo9C(F0HSe?ac}L@K&c1ak^YQiZH?>E8J)U<@ zU$nr$3O?5tHY#3&CkVC}0u*Ge2v-)XiD?&>d0-F(Gvoq7sip33a{qqO3OfYBEw-`= zmWArCL>HWGk-Q%&{NgTn=>>5K3?COlTK6g|oY>9nVE;m~!jEm-41;^P0w>-R9MC;a za_HA~@nK1C>g9XtAhcL?Yu9HfFtAcqwDb;T26b&4_Ar4#&J3FtLGx$a3YjbDB7K3| za8P3K!velYo9ys{veazX$42=`i~i^wVI;Y?d!L|p?=yL4Qor==Z<(4scUn>k{&D^w zj9(HJ7{6jJvHaC~@Qw4?cNH=XQIu_g8$Hm%m3 zVcJCIwP?_43^!qbw+0-`ap%#fBt1s8MUnMs^pe5)h{0LhqqwpL(wosDSfoe3f$t}i zN2S0?G%3)9$kWccw23t;tf-M3JBfi=WD}WPVV4X9ucD_;Yz28QMBHG!$52XfNM2xW z4o`1I3Drz*DJ&p`y28oAJw;g(PgAHTI~+3HbL> zU1&yMg_P;;jpJ7qrF5aB&^iNCx6G+Lb1)kgEZQz=9^rc&%2R?Dx?ih`m_uawljlQJ0>w6NgW8^Sy3Mj{4X?2w^Z*iyH}I3=;Hd>Te;TUbU| z=$6^enK0x{IEf(}M&rl)2(!`44_(auY$_vQ_QQ|((S-PmC1qyIqWti@m5;j2ITC-| zoBN*koadbLoR51cRXTICbn-))PuA_0bfQD*6fFWhL7o3NS;3#6P0*jOS>e|>wZN7* zwL-&!;wr*?~_f$&&Kd8=isKb)^g@56fnVmB{X7b;B*$m94*h4Fz7FSM3O0Ce@NESbSgF z3?m)XTvEHHlI18%%5y{Zr0=O4_R$xcljARxjY0YylbL(|?B{!LmnUt%pUna9Br=zN zMR67(I0EiRHUuL9WJ@Q9kh=(S8GzKQrXrYnT(W>oXIf4}_C+Ch4^s1;vd}@A$9+E* zB)?u7Kf%4b++f+k3V3z>qcDB~o!)N6*Ox=o42?O|2C*J0gI857M*k2UR$%re<}^M} z&`VyJX*HppM}w;4ng)9lvPC_Lg=;4fNWCXL41Y`^$S^1xT%4g6EN_7Sa<~w*X=>Sk z2Mjfe%AK$nRPrI_rp;je20fm=te{z?T)ryHGrGQ_u|39Vm+3|uc9z_n*muli>^mm? zoP$+2tfwS*!Ahmw&~lBsVfZT3pfb(OY9!+(1mB;-3iVtQF|FKfTE0U{BN$FU>^VtY z@cbEU-QUhh*89?4+K-CMUA7+It~K9Bu#{2Kh3(l#qOj{EE&kUS?rkMvNo<{vjI9&0 zzYVH)QU^FMQa9^B>@cJTSUzug%magrIiLq*4c?HL8NU5kb%KvF&Gip2y-*oJwAt`fPCF#d!QRDDMAnx6^w>61JjdPJYu2X3V?01QejRQ zMV+V;g*k`j0#5~YUE_dagONN%{vWW$&TF=WzfLjyb?Vr_YIe@T?RObykxBq+E-*~x zQ%T++hPzix63$XhTq%a>w^U1EAD%@He-jc zd)J$|yZY~`a=nWqB3ah_-7-NdUjrejMvUblx2jj(?!p PA-&sFW=y=Ml|J|vGF%Yp diff --git a/WordPress/Resources/ro.lproj/Localizable.strings b/WordPress/Resources/ro.lproj/Localizable.strings index b32fef9fbfa9439e62650d253f1431f2e39f69b6..302e9f35bc22bdc4764e1e68dca04290eb1cf177 100644 GIT binary patch delta 650 zcmZWnU1*X~7(VCw{C?a%%rwVzYkg?av>#*z17qT(TFBSWU>60^6l={nok$JxLZpkW zhLrPwFLYN#M0AmOap-5|Am}E#sjCRZZ{dh^Abst3`~9!?3HM=ZZXtdbR1r93J!CeWO3NwYw=1UvPy z>A0gl7i(9cB~fD{P7)+Vu8$4EG;eu@jU>~{F7ph|H{Y28);%UWSWYQ2=ohF8rHW*Mp^{)>4>nzJ|AyEH z1)pf}{<83#_oh*rBo01D7N8cD?9iML{aimOn$AP>p=j*E_dr4#bx9*_7E32l-&w4r zqm^Mh0#5IH&A)n0N%eLbAMoW=U?#fJu&B8wylZWwr28Yp>;@_ z;$II+)nD-Lg&g3&_sLphIh2xlD5W%(a5@{m`(4=@U{;I9pIX)IIxB|H@s}UejQ1}; CKf;s% delta 1926 zcmb7FeQZ-z6utr~t`Ouy#zry*EI4J+ERH2@*RhiM*0p5} zLI^}M49eK{k{$n00?|JfHE}TJ%Mj*FOawHtnQ11`VHAx~LSzX<;{u+0%K#0Dn5Or= zd+s^+{Lb%uyuQhzcczNEs$C^SCril+vWk?D<+%FE@{{3D6?5dpO|njO=zfj5Aa;b> zVfYv3m{o}CPvak-aOWt^fn+DG0pAh25E|d28K8TqQqW8yBuE-alo(_?Dkn$`_hFRk zBuQG#1N+=^lq8{bv*MmthKDi2O>|sa(4d9*@V%HUA$H+s2ErDzt0Q-y!sd|7t6H(C zv&wqGbL#xOfCyoHsd*(`0MZdm#XX6o|0k`ww%DYDY8Ibflp zIAFvlDOOJheM5!IrY*~w?4(uYW`FzK9w&pU3mSvHA5k`oCule3BSI2Tc2Qm=r11H3 zHapZ!PzM4D!=)$bA~^ktG`H8Q*1;EFV%qJ0s&=bujMhJE4Hrq{Q5cy+t1P2aI%B~y zRq}vmP+n%mDrBXWC((NTxE#;Nbz9$pxpWII@EnLIkT$bPld@++lCQojxrGjxDy?t%_n>?;np+VdH~H;o3sg z3FD=57L2~Yn0eN3ht749s&SlnHDcu9NG6 z@UXxVA$!aNZ@Wa9Ti+I{Ys&AFo5u$L4~qA54LS&k^4Eo|1^j-S3%dNO0>?Mt(iWG} z(xaHS6lDq0Bm@K5yk2-41`$n^PDFgq1$4j3sR^s)&>2AAczDu*Vv$10Ml2nJ)6fV3+zTsj)>ziP+=FU z@g1*bE^81akU%LP9#NDUaA33SwsFM}%sZ&M!MIHs#J<5+Zu^Ql;nr@&nDP2Ui~ByAUos=|wLFd)@oe2a<9Y$uD+Won+L#tNsJ zf5Uv@rz6xP>igiQi>xRR#Ca3J;~?3A=;Nr$&BHu5crBkw9KAuj5|2%o!j0RC+pMmu LvCdpz#^ZkjSik;s diff --git a/WordPress/Resources/ru.lproj/Localizable.strings b/WordPress/Resources/ru.lproj/Localizable.strings index ed79153395debb436f2d2c2cee3d01d1dd728b68..c53b9b41cacb913c525eb8972426f547848c60dc 100644 GIT binary patch delta 651 zcmZ9|O-NKx6bJBg-#hc(%wv$(=u1bZfB*6;0-;r>XiH?&95E zozI5S_;S6LIu%?)R?cf13|3B4hwbUS`baS4313ZTwRCS)G8}EtCyogvysX8|`snGp zl+JdfHdA357fo-u~B zILDyL^<92*3w zU!Z#ay-YZOmFN?_3NhD6Q?KQ1e6d}(*6+wccWh!_o}QS;UNRrp!d9Tz_I<!W-{nH{fIq{tJWyyZL_zz7Y#{mEU delta 1874 zcmbtVTWl0n7(O#|=F+8Xw!7W7+tM=Iq7cMoyW6^Dp|@>;3Wc^xR4$TUEKoyA?L{t< zf=NTMkyaV$4@!(i5)&mASdtAq;DSnGLI{vp4Vv1%s1JbpAQCm=ccwHIdC{27IWzN} zng4wM_x=CbmmE8kROk)sISsUkLGF zXo21fO%3ge#|o}k7N7I@evj3-wl=OkJ32i4x#Fbx@>|hj5M1M2YN4jP8>RJ+XU8 z8m_S3*_&krod)IA>xOk>w=qMQwi9->vMxIRiSmd5X~~e{pbb}~R1`xCogV}1vm3Q6 zI`N^wX)wyQl&HO3F%MJS*K$(=@1CkpT=UDY!)R#FWgkU^qX6A=v{WfbkL8dlpN~5sk-lnzu2eErd|_edHjZ& zP9vXbd0<#c6H8^UQp}fF{<9uyp62>rn-oqc9tylF&HBeqI$DMo3sJF~R5!I(e|21W zzdFv_Dfy<9P7f!f?95H5sZKcGgz*HV75&o6I_b-1BbOEoa3|H~s|JmXaD#TG=ni^= z^bBg8t7^jqDo-5tt2ciAH>KqMKr`u9mgc0;A|-=5B8owO9FZKEJ3*kwCeVqEVIt^& z27S9o@zVTkErWPeai>-CGBi*TybNJLK=LP5f1=T+^~UH#n!(XETCV7Hk&)<~HOQse zu5HuCwo%htx`&bx&7fny%dUbpl=@`iU2KajgJ^-R_HiMYpxNl9GTE2XY1_XA_Ad%|WNvYOXzHJPb0WsNz+q=rUZRm@6=1T$J5peaCD>Jew>A>QP>a^&nq>J<9Q} zSc&kJQ;FUCt{h+0@g;Ut@m3MOj$kc}`^6X`9;Jpgs<(e^y_OhTubCUC2>03p{EiY$)k$zbv}GqH+(%1LnJ+E$7Dsc1KUpJ?`htdVo@9s zZHUxPSF07Tx*bq6HJrm)dHIsAQP~AOBTbl71ExZO5OR&t)fuusMYOzdub6&51`^pn z$k_)+-HDNJ^vgN_k+wLKa-W7_;>4b7TiA^!!QD=i^;koPyfpl=ITc=#eYEa7eO_YZj(#CIRY$Wt4~RD%HJyqIRTov<*7E7r8N;zO zfTKawTP+y1qkFm_R1=P=$$uSTa+MGbcn>TQ5{iGLfc-PUyBqHZDDA9~v)p7k5ULbH z)!8 diff --git a/WordPress/Resources/sk.lproj/Localizable.strings b/WordPress/Resources/sk.lproj/Localizable.strings index e0ad50eeae43d16967bfd8db9b824ca03cf00e95..6acdcf1895edf2c9fe29537ccfc9bfea60721350 100644 GIT binary patch delta 696 zcmaKqO-NKx6vxl|y6I+0W>k={ zWbl$l$YK^5QXAzhZiJLji--sV7a|e`uA+rw7A=Z87J-}Mau4U6`#a~{`{$-_myajQ zQ!V+2;Ru*uK@HTBXOXp_dM=byd1AiQX1Xc!lq<-qvkUCWtkqgfsCp}=e=-BjgzB}g zHyB!>AIhl5G1_I|C))>|Wc`?t6}N4jo^s>l3&Y`#K^P)%iHXr`hzP5bZY@6cP%cNjq2ZW#tEo(j%T*;YORF}SvEYW?r*KWNNtlJdFv z?Ex-%6<U%;W1{Enc;GlFxpz?5fQr1Dyw1sr~WC_aQMnC_Q0(S@Yp)vtnR+RLbFX zS`JUMJiON>F@97lpujP4Q*vN5BUPbwgOFvd1n)mLoH#iu6;OfqFYHBMRQ*E=B8ThI zSs?|*;%lj{B`ZX4y8;)WA9s4>z1zY{kL&^Id|)}a9$-a$Ar=_fNXlX(sXW|)vneIGCqfcNpogUFAtA#w zG(zHrNl25tUjFP*@&4v5?|&4rQHbE(8ntlie~8DolvvS7d`1!R8TDNlQ|GiGI+@0V z?9w(qV-T4o!a9rB;o^X-V)rR_99K*^8`XKuIWpeJ#CW5gH$d-m3ExZos)wgC4qSPw ZSBOt*`qWcQH>h4*m^K1p_p~v%?-z{L)WQG& delta 1791 zcmbVMT})g>6rQ>NEX%U6dv~GyUBDJoaSPq18lng#VQa;vDi$Az0d^NkEz937SbuQQ zQW~QbI?}LDm*y@!`&$IdkUB zIp6udIoF*#_-=0BVYPsGiAD;@L!^l8!?`g&Jm&8fm?j_MHKKw049$SP)715kl?`T2 z({c#+(EDj640T9q!U+;2wIo0qNr*H+(zCJ(;c>-|#~NYiW5F$!k`~eetDh@rbUo~q z9_rkfuk_FqDENb>kBb_|#^v2?Sw1-Ny1Y;XM^1?rHs~wQF2r1$Nj;8Ul7r);_~noo zD`el6nqcY`A)j5|XJ^m*Y!g!1l0dy|)u&P~l%5h(F;XTPzVzi~8@1mZFUHEA3OU$` z$IB;b4jy%|m0-n$z4{{t_BBCZGq*mR5LO4`K;xwQGQ7lt!Ja`33>^F;|^@t;c6AljajZ%aCx9D@aYp%w|{>FG@rN^ihZ;Qmb<7mezW2y zU~E`P1G_`A>(gCySc1if=+g6hY0Uu^>PmsZZmPgQzoNk8C2ENalaq*jkhDYT2>$^4 z`XvSWW~ht((3A|txzv(y6tgyR4P)6)vWHkm z4tzgH(>6EYa+8z^(@xn6i*rbXzfYJO%oVk5JEU79od|xI9K#+*%!V{!kuR|R3>6li z(dk#9Hk4)9VTdk~X&Ukt`N^%qrKC z4zvbf>}SaVM_!g)Fq$Y@^h%q!a_e46v%g+?h!V)LhxAJ$~oCG^m-EEr|x>^Di^#vk%F?D#j5TVeL|3^rr+zkd&RO(x(Ty!h zWARD{L@$!)a%qEJjU`e<;g!@y79n0#gh`ZF3Q?WBikEX<&d+nsbDo*^MN=<}l3qt8 z?1wTq2u>)6DyW77aF~2Kluw4*jC>-arI!?=#GU88eAS$nK5KRzd3=0SW)*zQn@hg# zww;gqPNb737wkCm#bmX|p&fMSrHMg^(sP1~*Y!JC6noYTcD9#q3FM?R%^Ad~jrkgb z5Q2-)1~KS{KInoL0-Pq;zq}4{xB`WgsUa%_KV{<(h7RiLBUCS~>V$8E)v4YHtu%us z;Ln@P&i(5T(gka73l9iQxD9NiALl>HMog9{R&i^94J-Vq?83ZjEDHlkwhcerWfnfD z9O5_RCVc(bWc#m{`lDF6TfQo^B&)5%r8#!$-dh6xTBTvhH|%TfC2!x_ManrzX?;VJaW+>z zBSwnks&!mWDP_V_pj5bVrBtoP!5YPs&;p9k0_yL}ER2(j>O1jcLG@ecm~655N!2ty bvDu2z?`pB|NT%TzIRAv56CJNiO}qaBCosv~ delta 1816 zcmb7FYfMx}6rS0=duLd2UD#bUp_AAVp;ib*S^h&^*@)u#PnGnv^t zXU?4So$s78d-g(F_=mKC&CUXnL-NVvL?LT%tRn@a5Z6NTuo*{byr3UjkMUixg>8a!+#4Y(GN zR9v6NnTkji;SL?69B2&N0jK+=Y;|Cxq82~HM>94}OSC|ZDvPBBa5BuDXlo@3elE>S zE5JMdwkV|cEvlEwDo6L1UA3vM%5pXF6+U{d>Ks7N5o%Ve7k8`s?qrO9`&+RYj)&xQ z^zg}$Y>TKxGy$Zc4x-LT397$6CZgoNXtqjn!b~+agJLj5n}lu`M13mfjAhYdz3^+d zln=_BycT}%rIuw60^I`i8=e4)O_E@yg+;>EyT(ZEMlU@eYtms_QvuS1*nH?!LBC>cLf=B7;3^2*C6ME;1-}&H$F&J1 zZ7|~H4yZ|?*8lJRc99fq+96_uq+U5zN0RgCNDvo1*UOXDRaut4g)yVHFeY8}!T1e> z9ljVt2EsRyeb;F&!Q4@kMO8K=LRc}`;rg(|nIF+(e}MZab81$_R5btJ1vBWTc6G6o z!~1cv6$ZjA2ErZ84ApN_zI-oMtf0e#gm~2>Cu~qMZi;3>u_cW#yTOl zcYb8F8R$kDtJf%u56LcVpHt2+*6B+U-P(Y}b){e%5_}z*w+R(k;O>l3@=!_6v8&M?)c`g7(Sn*mw3m&VKA>GDTT%mVTXBf1w{QwYAI@Du3dxxU zM_;H?)$SQDq>v9fFHj+s2d=AP%3sJG$E^3XSds6veamYFNe7WK4_3FFdm>XC<_vY zH;Sn>qF&bxVmWOqG&o@5MQogj9%cutkH@bN?0PYE0!=#>yl0p@)Sk;$E$b(in7H)R zJPQ7lOzwo^^Gr_4L|X!(XrQIk*6GnMWy~F>NiY|{=h?zJhnIFTOL99FLbHxSFpI?F zti`o!i63}J!v`fa#qzbzdG_XKdM&|3Hoia?hh*~#o!5W5NP+jBFvWu_LyCjY9htx8 z#hPo>>#kggPW6XV8H=Q9YuTx8k{g mi_fbbwy?J4A!}X>8mq(V$xw7tFyc1YKmkL#<~q+0JoYE;7Wc*g diff --git a/WordPress/Resources/sv.lproj/Localizable.strings b/WordPress/Resources/sv.lproj/Localizable.strings index 5251792f0901fa2b198b3b74017d88995f1ea1fa..b11bf6a0f1cd87868c204df770cc510f572cc13a 100644 GIT binary patch delta 648 zcmX|;-AmI^7{{OUd!1{p>6kfN_{+_)$n2*`MOo-5g|$?KK&WJ5n{BBZI-{@`14%2e z#Q`5L7W4;%sk=BB6d}}=j4p}@x-hVyAlgmpmG!6;hw~hsb3V`8_e_5D-dpl!Lhc4Q z1ST8>gX}RlPPTz;9hmdIw-i42(v#cJ$|Sy`gt*6Ao*OIbI)Q}>J%$|*6d%tYaq!zA z`$CIDW%az|Y&Cy3q;T80mWA-D69>OqY|b=XfjA6PfgVWFG9ZBSy5wdloc|>|*@2ul z(mKNn>z!x%UIj?y{NMX;$F%o17&K}fkV)j0p)OcPE;PNHeg2pJ*aPASa@g~)Zn~#~5 zKh+xX)tFqvU#o$lR!W_ug8f)B%3S}*DXe{{mWgnNWrG-5W^LHgL- z_O`vam*THMlv*}m0Gorl6L0#Z(&8ixQ0x6PP#+9qWt;BCNTt*%F8U--f;UA=x$()O z$4G*HNMqeD*@Ycx)sBT}#fDiyji$f*aC%L0;9R{{K9QM{L}p6fw4-@P4!h%|Oq@!L z&^G8BqU80_ndWy7yYTdL*|Be!#O>LBT!X~6>~Zo^1YW0kzjzdv$ULD`6OD_qXk1ik z6KK|`VKnxtnkeeIRGQfgG*p=%gW$4w4 zwX^yIB!N#Ih$D_T0#MVYbHL4dYJa5mk9X~}xDQ@wdYal*7p0fp zfrTN?qYOX)6s(@45}4kl0>qxBX2=_-2ACY9IWQX%P3rCAbX-t>JxxETg_d&OuFSe5 zC`(F`;yNlp|9OrRk04>4Bo3Fa>i59#6?EVCks!fPiW-sBfHE3&z@-$;ph0k7)Az6g zvuaGy#uimqpxb#6)_jzMg>vd2+nms;n-lt_3}uaTsnhT4Jr3k8Z$~qt8bqYscuxRb z=Pj`L6KA%`q=b|c1M>bi7FjYfl=j7LBWD5l&P{D_*U1}Tu}iW)7DX~cc+gEYNDS{R zO%PpTh)G78!$^29?jkV%ncn^Xs)3u|>&-BClDgoon;Lu#|CE!gWBCcJhQUZ+MGV4# z_9g0 zaTjkA8A?2X%p%?i8E#%u8)bgx{=bpiv5SHXB~~E=%03mXaHmRdP=;kG{|F`?&=RL9 z3}{qh-;hc+ac^3L-26UP3mSEiP3;~jO?-s$uS_MK(Equ>A@Kv4DF(|wQ_I*$o1l)giEJuy)*YU|m~{p!0M%~^mdp-x zWn&+~OvoCHUKH|S=!R&7)vu`JPV=8`eFO~-ZBd=T2uuz^C2K4jY7gjhcy`nQZkyf) zvx~gJF^I>^k)i3sE8QcU2&mwA2duuQGeDkCCqZ*1Z&hv|GiJrnrblaSRI4WjsrzCf zOjhbmis_bF-M=apyZ#fZR6TV-(>+nL6d?%4YY20tyBi<_%JNwY%v_-+_@P9?uhs)m zf)7!Q&Oxo}9`tEP1k8suHN=p?Xhd|FqN%LE3M5@aJ+t2TWieZ2d3I^@|5 diff --git a/WordPress/Resources/th.lproj/Localizable.strings b/WordPress/Resources/th.lproj/Localizable.strings index 34fcc317637ac789c3c1e3d7315fcf5e637e0cf1..b288323ffc1b4484620d965d59aa2e6dbc00d92e 100644 GIT binary patch delta 655 zcmah{O=wd=5Z-8_vDKbJXA!!0r zmq?zBBKaJqXyL7ptA9Pv7F8|Y!l!;JMu)~U5Q2YmV<2CR2K%h#YcOC`8lVRHsyV^EGD$q(s!nsbW@(O zn`}Tn&6Cq~?l?4F&;dxS&<@_UOwE4B2-Y)+e1EDcVv&r&=V8$WF-{d|gj5ae8&U^bx~;K0t6q3q5)`($>aN%& zf!if9tU&d;7$44J53?kPz0Bb)8GJz&yPLsI22snSEZ|v2+{A%x4Y$AT{cj{Z*)RE8 zKZZxA#J!!Bg__70YSKy)>^12;_isqeZ?H73^g=pH-TcB=xf!h(-3m9l)k2BK?yJ?^ XtnfpJw-40=Jn&52c+L}(n%(sqEcM3E delta 1720 zcmbtUZD?C%6n@|P-7IFI%UzQ!ZEs`2F=t6TkvUM?id~f&nzgu2*~mxJtgh?QeAreo zts7FAI_h585gglSL2yhKiS{atxbBDIENao=9Ghk!tUqR$8^Z91cy1a=R$AHc$GzP9 zobx{CoadbPd^Y7iJL67I2`s(&8D1kAJi4D&!^SriGi1l9X$f>=oVLS}F}j|1!>mtI z?;9Xt5+J>#pA3=+_%8D*2tBlt??3{n-bCE^eheQsDMMlY zM=1&EfKbmY4_leP&607pUKFaz-J41zFuzxElwz#vA_*)hYVfn!wg>7qm0Zi>m7(n8 ztvfQot%)_vGt!aqys-N)SPw`7M5j54rEeY0EaZ<>Kt3kb12-wzDuSq29Q6u;?+@yL zZ8_0i(RwH5?V_fonDr*LK=e=1m6^IdGR~U4PS7@pcGmgSX0W_SB{=mmRlq&MRr2kY zhoJF>SPQA2d9(h=DD_KV-7c=xy|2+Xo&f(2&JLchc?D9dWCe~53ubu~D-M%5TzH>< zkadw)0bR~7!y5=*L#@o2IGD9{F=eN=_Bdn6OQ^{Z%s z?_Ipc@jb-+jZW?A-CS6)`kM z5KO?8>rxe5+Kvr%R!g?J|H+X!$yq0~T1nSxZBO zZ@XYE(^7$v{j%AS#N3S^d3oL4goN$d1sifKpEmi&{h4EvOB#PyJzWYeSYs1e+F9N|k#~YTc*4i4Fz) z#5_jkC(e1;4~m-59IEehujcK4?!e$1vkh%)g4L3M0xcPW>igqetbh}r1qa)sZ5}y; z`U~+Bkbop)VGN2e4wI0FQK~*m939U<3CeAc^-xuoGBV|J3QZ<=cF*&uTa$d!kpMq zWgS%I!N`i)-d0-ME7{b;#wqTtve!`z?O-tstuQ;6nk+wHNmBcl;Q|zKLKe2V`l%m% zhAeeBPF0|IF}~(8{`$%zol-Sg@eNAcH)#4WO;U97xwj^#cj28$;jK@mSRbvAR7{%2cHfR@tyA2C9;XsdW%LhNH|Qh z;MR|l4JO{8BhWogAA-~=nhK*YOJZU#=_COXBzuTXx?rhQcDcfMG=PU8ToK%BD2%}M z4vQAPed2QO#(Y07g!(UW+3+`IUOnw z2r9cKYtcG+p&X{DBEp?KtB2`N7H5^9T0hy1Paii&9>=wjl#ph0;A17FO)w?P`OIEX z%f6~nqO;YvM8|r~(wHV3rHUhNRk8Sp7xvCrGT%Nz)hyqAUHDdA&|?m!J+&?BtUK#q z3&93fxJ!u^HkSb#{quw9%6nnkBDyo7 zI)22eo=u0l2dygI2`852OqgwvlcN5=w!XsJ>N8*}ET%F0wlc_$P)Uy9Ei?&5?+ckQ z{i%`!E!mRYm^?@qB||+#&s9QUnUDsfuTlk;D`W*cb5u=;ko{PlP7;RS+=z4WjF1YI zpYu}m2ntMIrZzY^E2YArMj z1j9dOIh)89M31rZmZdT6UcEBl))kro&EHxTSd=6+C2W#q0C8Al1KhkqGuIU4RRt*8 zC*?r-4;a_al9U0P47t#yVa7pHLi=#(xYv+cd*F0~)%8C(JbKmQfK#tgPt5BlPb(QP zv>So&-B$fIVhqL#$-nHC8)qF>0s9*>2_!IN?l`X1I4F zPeZ82RktJPJpN7+V&@;rVS2RXJ=b>)wLK^@4i!2X>7 z4y!w9lkCtojTT0W1cfzdYT|zMJZO3jkxs~+5gaMrb%2>1S#9Z4= za5VF*ADZ5j9We2*r1&^;OU3)=Y`w~>VoXAWgBSova*?rc}B4+#u%jI*{~TE&$J(Wj(PTyyQI%VECkQbA+aY7 zYZ8<%Q4exB)wr-IJ3aq3C$?92!`biUq~v&g;us_c1s9afQTvXHb(Acoyehm(ycRmb zGh#x-XMGS8>A^U8CHVy4mDBK~AOCZfb0GQWDMTuu>b#I{+_)kCzHo0UWT&jn-+u<- zgtB~V`HP)cvo5o44Xa+lSg!z%O7o*m`#8@XWHS}=$J(-PBOkjE-JJKjSS&b4p_utqw-_rZvNk&-1a8` diff --git a/WordPress/Resources/zh-Hans.lproj/Localizable.strings b/WordPress/Resources/zh-Hans.lproj/Localizable.strings index cd9859429d63cfb22cd041207b9bab8656e4dc95..0d96b021050a959101f51828d0ea9718d54ae398 100644 GIT binary patch delta 672 zcmZWmUr1A76hGf~@7?usb5k>y+PIEF3j-Z!aUn57i;>%86m#hy*QP_An=TR#W#uok`N zR2vv22;I;L{m=&wAqo!|-OWVVegqQm=)~{ul6~P*E^{h3ycj@Fo58AYd>9t-bAXiU zwlB^&J!~NvUYp}9a3)A(jCl!%3wMd6)$tPA{Nyx#^O4dllJQoySYC4~;}>J@kje7D z$f_y4c&yp^%FEc~C%IXThe|#&Sc~;GqZ4~xkbHdqk(cQFIQh|#6J(nVLJ0bCcgj#? zKJ#>9oV0b|q~Gfv3#D}&Wn8@> zNcN`VS@yjXPMqv&%BG)2D-DUg$+ymuX2y@Q>}78DGB3NBGQ#}rf`qnvxv=ctEuqug z_Gxx8ARc{pt$UOws_Txo*`1>;uauxCMJ)8U+1OAxCYBqiSk4{RpywBN8#g*Q4r2k1 zqf71F)lFPm;H#*$il1@dydcB16xPK@A&LmJRYL~ErBonvVY>rVc@);A)&!wJ zkwV+WX*s5?6@Iiewm&eNbYjz1Yy8s$O|`_dky5aY8WTyi{4m(pxnO~`{xFldxw-e8 z@0{~}_ngZ!DTfZG235P0WD$ipNjAwLYsu5Nt|J>xd7t5R<>&1tg(z@oCyjw%8I2ED z$R@O1j{o9mH59pN8eF*}#6|2OK2k$oA`PU8)Iqe*WQW28$%-fqFmQ}ImTe&|_%SmD z*Je_Oe+KSXkxU{p;Dul^yj)J@a2D%9%>P`$$7M89FZn1rbe)HP_*Of+1x=IWToUPG!dfh?kTI!knGt}W!;e4US3 zYT=r0cw^4F`>*SupINF=4exW*b)Ih2cLy>PVTc!5| zW4es?uZM|fE?)obj2Uu^Br}Y5P&v#`_Mt{T(gp`)(_`>iH?=@s2O?}7L%@x1QVZ(o zeV5V%@mAM+mD^O9beXEyg$=&GEXc-WKfRf6RD4H2*ad1LZ-bFxUW5^Wt~EwiasFSJ zXoeVN%C|FJQek|MCcQ{rBh-qL`)XM+L+;60VKQ=7 z@bY>XvT?DXv}4-p4bBYt-wHOcMoEc!`o>7etK`j53i0DZP)O^1N5GVaPcniPeBPyp ziwm9`rda666fCfPH7@7A2)$)`%K9vmSG!d+meXV`t6q%_m|El&lx{!CZld6}_A_ zx&b+6aTwS2Xw(YD0nQFHhj=TD+@zwt72jhWUis0a7K>wD+^!#2?XHX^4JFmz?#tAq z`lCm^yTjGfzFaM5Uw440MTa~0-)`>?^!UmvIVW@q;#T-$6DmJmgG@YN4{bnqQ9GoaH(6)~ym$krOym*vJ_ke#R0XLydY-S=xk{R_l6E-r zy=aeU!+gD%c>@A9LG)SCF0|uOE!=TqjYDpce?qLvu5a?5@N@?zo_Ft0D`&eM2Y!6* zDfNEiQ0cuu+m4$-u~c{7U2aqy7vFI_T9Wz&p94luiRP4*bNu>|KsEvwD#AUE4Y=At zQ{p!-;gN+;REJA144iH;e)wEW{*dXq98Nl@9Q6?IW#G~H9Lh_qX+vG%*~JXO9kyKetlQ7cCPoW193a4^Mw0a-?shw N*&NL%DwD*={{c(!&~g9( diff --git a/WordPress/Resources/zh-Hant.lproj/Localizable.strings b/WordPress/Resources/zh-Hant.lproj/Localizable.strings index 673a6898dd11c9cde11b44cf13034f329c5c66f2..7390a067f818ac57b5cb577be8bea8743f135d87 100644 GIT binary patch delta 637 zcmaJ;OK1~O6n!`I$#fXPkR~>ztt7!fr6@9pg`lFX6bVTj5z#L-o*%J2Ig_F<4E`xu9%c4MPH0|9%vc~8M)!qsd0KA3ZS$AoRkic9^t zJ`Wmhj6wkOW1w1lWfe;)@LHRq`WHDWd(bmXbMp!Ktm7onb8g+Cd)1OOYnAB#bQAn@ z3MxkyS0IM1DtP(LD!d))n5KPhuo+guL<2&OHrIe2+^7)y_A02{Y(RQ^F$!J`s*)n5 zY3V$^s7Zdj>ys5cF-S#k3mRVR71hwl?=hu9zK&cRD8jJ&0(T9#qHSFI;)-`?Dbp;Q zrEF&@*$gSOlwXFGt+NOGk^ldgAbb}lo(jleZh8d6zmSXwJQ)!`9mZl^jN_q{DD(C6 u;>v5jJRt2D3$;m!*Cu686t~_BUjF@|ytW4mJ)*{6K9w&$;s;Il<V6n@{{uX-s^J_;16T-b*dwIC2(a3UXO0fM&$Y6|LDF3Q@rAq-$dovV|xl8{deb3-aoyl{%qxOfbbBAYS4o z&7_TVkXG31;Y{#TtYj1vwDf}8Oifv(q!SnYcKleztsOorDR5+Ra^nFK~@>R z5`vqkoXf(!95xE{0<8A-wuVsLwjraYc2{fFJM^JP&go$Y?!_!Vn?D_T@byCpI#TGX zv;eZEgrpTsSl%AY-J^9CnW+svnx&~L%9b0U<0_T)3$AsoUrx$?P|Agz(4+4iT`*#y z=}m!KjnrlSyiTKu|~wEXv%&qdF*^qDkOr(^Wy-BuxyTpP;wP zAbAxEd3KJ<;gXxQqCvacS{>fAMptzIxy0fAST4u(OvPk4^&WCQ@s!uYf%Tl6*+Y5} zy%R}4>lPJL@5g$y;=dP;KIKgjPie^$E)5BpTF38l%J$mPy)i0Lz3qm@*VX)*`d$8s zCoM2qDW#!|{{zy7ja(9ZP(w2qT>5gjWHnaZ>G(t4VP}wIfov`u$mV}51V?~NaRq#GtU$pVjVb8#?Q&+FqA%-x4B-BA}vXco;dTF2|d-?;eMoB!4z z_Y$c|n=91AgVll&I!444aBLN2?P9LJ_AmzQ!;tPsP=$Dwg7>oF!jjsSP0kH}m9x;F z(3IeK(vsf5TFbEbvwGeB;i3EEjdoAF)wQta#sCBdv3W*T3mF9w5iKlG3&OAocOp>J z(&RIn5AMwiCQzJ$2)B(o<1200+Ki2Y|9$AtjVZHBf(2pM1r8Qms^-iqx+9A3L&fcq zmWtMGHqhy(U_{dSLwhRuD*j4_E;t{YcwRP-ZS+jbywir zE-@(}7{k|2iSsG{!INDCFmqMp;mr%8oZ5>8WJDtgp~$STtbFeli^h`|q-prbv7L__lHgD5G#_{3d9f!M&p4h* zL{wEouxbPn=_^8_VgW3|0;EVSLZ}i2RY+_qRYeZ4Lkre5C^E4Yp$kq9|$6Ulkzls})q%hI|Exd$e7QQD9cRa#Q9XecH&vXl5N zi1>-X`N(kw6|z~WY|Nx_Ro}piX>6|7HPO_?nr@i0SwNS{lA_JWC9Q;2MJoeQc33K{ zW;4Jb~6TzZ0dxR5KK#*!@RT2bgAudy9Fk1u;KPJj_j z%Zh>zUXO$u%J6JbR!ngk9A2=72`M73*Y*0dThh9boUK4Kx_cq2Y1^ zZ4iw>aR7~|0Nf9USc84AAt?#>9uju@$Q}D%L#}w zuaXJ-G4c!FMQ*x3Cx4=Ns01Cog!%ILj}~{!x@5-+3c%Z&5d>+tdT<5%mwv z(jodqdVn6Gr|AWHi7wM?^t<#8`crzB-lOj_=a@88Vb+){%r>*b++yxAzcRlwPgoZl zVy9S>-C;juzh{49_iYQdif!9=-S(MnkF#?jF3P>mjdF9`GIy2x8MUDk=mILBU9>lY zZlitllt0b~_y`~8SNKo(FZgfx`}`mFeMhHb%#nAfj;oIAjz>X`JwH^zXJzj`Tzg` delta 1217 zcmY*XZ)h837{ANiy_ekOuCWknx7J+$ByH0yHEZqKX+OlKU0Z6q zdk2Aoz}30n_{{A23&~VElg-V|UtCyRTF$S?s|7_}E0(nN4ZWOB$y;#2)fCf-6d@B^ zghm)dk&uWAVG z)vV@@p?O~rM5+}o(~aJROhu7xRhrg}joN1+*ds5&IxUHhkz+?l7;?3oXoxw2(q>&t znLolvGjdslSt{sVOlpOaG-?{QYCxC@4la+%MnTmjtL`D2RLka;x==qH!MRZ^T{NrP z7pJj%>=TE9uc(&O{+Ogx{2`>pJn{_;P3iY8W)QiQsPy&l}p>A{r zzGFt&D|+f+*WWcEVenAEtyRM_Tu^!XB4{GS`YN1kq`Svj=*) z=7yqEhtadx$`p!2gAjy%Z!hR<4BAnTGoL_b@l+e!Wdmdfl-Xyn)2HAO3c!x=LFgz{ z-ECi;Y#38bV8FP7eMfLPZ2Ec}*uJMdyp9d@Ie{WL+;K1+HwQ5!?yPqhC+@ z8G48QnEsUhg8qU2oj#-=F%;uw1ZIdi$1E_b%oXM)^9}Qh^Jm1-gDiW7U16`YU$ghv zzu14>)9#}Cb@y%0P0t@(giCQHZkM~ucku~+mM`&_`1klb{NLU-Z^S$4ecQV$WCdBM Z2;0K9!h!HmY!*XezxcfPE_~V0{vQGnRha+) diff --git a/WordPress/WordPressShareExtension/bg.lproj/Localizable.strings b/WordPress/WordPressShareExtension/bg.lproj/Localizable.strings index b43452f36f6621fb936c5e15249bb021e0735a51..86f57de553ebc0590c08134254d70cc1278ca61b 100644 GIT binary patch delta 1175 zcma)(U2NM_7>0A~WBbJEG}BQv8Y?+0bfZKn86_-a>tFgaIzrmzzfIfBNls%k*G_Gx zq8HODv8zf*M2CrsO~583xEz8zHbCM6B;bxKxLPGZNQk@Lp^0OcPB2vnS(eX{-|ze0 z?|trv?}y(?FN5SusWWFs$Hpfnd(u{!= ztky27^+uDdwI;Muo*1Oz)|7BwQ*DB`td5Nx*Rr>;Mr<-XJX})-=(}=1Rb-K-xD$ir zX|kqv3|7*cwXnLW>V{f32zGRrIE5^Eo&6c4iV*QCDusgDa!NU}Zf%m)9C16giCqh~ zEyrCfupw$o)y?H8)oc($H(P98A+0tp74qsPSC7e~)NliI?%CEtlwqdDF(xmtJ zaHKfdZW~+0g6mF>O>CL88$3q;5Vqu{472SoNXJq1#Ntd-cku#CVa3ax{lLVwE&JhZ z#=FrXtWXm~VXo;w1kFIQp#+J$V2! z4L$|Wzyy2&J`dw?4#xk1uik=vFb$J1#RTm88jQdRc09|JGroQlCLY21FPJU(Bs|4R z;;ecUj_I(U9mm;wdcT_9K+yx~KB4*I5oRvV#7USqkn9m19`)NN;0PRJqmpo*el8Eu zT{IXXY&^TFNzmgaB;Rw(V#_X58K9snN1KpdO~vtR+NfI4V_4e$oI4sL=E z!ENvrm*jGs#%*wyxgD;{ead~${lxvs{mF;;7(dUue3!q*f60Ht@4^+R!5#QEyajIy zNQem|!nklws0ufPJHoEWi(zp{ydYi_I~nn+*cIOwKM{Wre-R%@ho$4vJJQF}*V2!O zN6(-UR6-WIj6Onl(Rb+gpb|_3bHQ40C-{LJk(2V0ydhta-;{q2p-_b8dyfAFXX8^7 delta 1242 zcmb7>OKclO7{_5Z3UG)Jhaz!8LL8791RPp%p`}6s!K@uB5ecarW@dLZ z-}nE2|KHs`clW$LJ{Wl}3WLu}L&GDZW8<-jW5-XNoILeH{B&aK%-Lirmd<2z(=+Gt zvvc#kg$2CWA1anexl&E1@G3p)>I&&xio@J0r*Q^X;Sg8jOwQtLbZ{nJUqiTpHDm5H zDQOr@)ojf)Ec%s<+B0Ldn!c8sAZ5Iw)0@J}R2GAQg4cIuWl`6xs%BJB&9v;kzP^ID zJ5$q5Tp|<;{>Ftz_U9%vYgx0bxl|R`otLCuH|x3W(t@{#el0&nFMzKtpQ)9wO;B7j zmgt6fkZ$rX@&S5D>FRt6g-}`3$^9nBoF+8l+S|P=)YL{RE!onHQ;rgNnNY9N(>9yb zid7Ud4VxJBmfSNiAHznG=*Vi>$tKCNxk~b_qp3X|V=gLYeeGPF4ZN zN_AYe|1HRJNSFw(Vok@3Izg6Z6D!+Nq1SjneMj8aKHK`=Zgvf(ec2SzNzu-vHCrd? zaa>%Y4Og%?KWSK`Znun#l}gCQ6)Tq{xP(k2l}X0a33A>}r`atnD7^#oNn)?m4P={5 zR|W6G$BA8RB54|7-Zkigei&ivC>&<{5QOQ6QYX#IPdIq#mKda$m9+gkHXt5qtNMQpD*r8TpQ+3e_Hf&ILY$_pz4ImLzU`v2&Ck-NKG#b4(_nvd^ zx#w#C)&BQ$7v~q^uP2hJbS9h2FD@+?R!$c$ky6>Dl}gpJ->5m6Bz0(+6{CGgi}=)7 z^P0X9Fwb8zEb7zo@$q8xIKQsP_}`k$UlN7}v$M29nhvxap7#vWBDO@ecG{O?!?_v4Xcfj?desf6&x{V=a>6cK#*F7O>axtP zFn%vIaK=GNL{JOa$VF9Tpa$|#fS55R@yi4NJ;o)=EBM{O$0I;(?I#T4)h%p&D|)E)&e!<}K~HCn%bQvx5oR zK9G@E1z$o8ZNpnbYxxB;U_Nne#wR0V@xo%Q8FUh}?s~1JjS{E{5VQk}#ygJ*Yz^Fx zSOukl(!(3DA?BcY(6A1LEm)NYI%>eaj+%T<9qwdjvV!7p--L1?rvH}LQ5@$1!i0K; z3?SQ==0*E>Pk5Mruc^Ew1iV*0*WP$a$tId5->wnK~@EH z`d#rLuM;S~A&v1n(m?dk{=|l7*2p^7!V~^4X;C=D~KA|1uzbPmAGs*zJAMSs=asDuTj87>?bPBPqfwCP?RgR3ma|Lapy8!Yt z`U{JA1V4|@;)^(r3%G=38{Ac~nlx zBqi76kL1tfJMvfZ1NouRMVb6T#U!F&*2ZH5G<3ll8jQ%uVBU*J01y?nm0)^e8_()En=BLcfb= zEVg@K0@X0Rq(+0wNwZXeQ;torO`lhzM^>khUBVXhx;(N;Tyq*Y-+gre7p53=*>Rgo zGfV;F$^_9*gkjnz?-^!t6AnZTWLl_bVd$9zd)e+xdXekrM(8Wb08In}q2=!FodK8h zh27Z{ws47L(k8KR`UEOfX^S6={Q4aO2ELDB4 z-L_#n4WIs`j8R9uC$tXcSPpzvyv>TYq(16spS3-vqiURfsZP?O^w2nF*{K2-`~^r2 zOo0k$f+7nOWC1c*qXjSv)iymC9OQO9eM*n^v&~IbiH|IE!)YJ_9ixgicFf(!4b!jG z33^!Rr9T8F=;wjKwt<5dIKfy|7zAOMke!PR3V{lJLETU1)R6}lXAO_I$TmqK+p2v|CvjxfkU(uj6JgnUIypEyWnGR1N;bXaW>cDUgNHE-*Vq^zj1%^`}r9E zFu%rs!QU1nVN{3<$AmSZCbWcCh1Z44!iT~&VN3X3>=FCL1L9+1Mm#URExs>a5wD9s zi?_vpBtcT7kaSdfRLV;gX;XSrdQbXV`Xe9*_6ELB%bI*lJ}ti^em0;VZvnyZ3?4!erBJ-}peKIDpw9K zAE~aauGLQC^}0Lgq)u!4aKXVLK}isYD561_Acurxa&nRZ4Y6M3Nwt(A4IF!v zeX9IgKAfgqMtKlYg{S^cIb>g{x zlM9=3xPHbg;7wA=y8aoI!yBZg_dm6_gW{GKV4K+Nsx+LoW?L;Uu}qhGq&#cei1N#7 zy1p2%dv4^gapm0b!`A)=>M9)N&xY#}b{Y zu#Ezry|0e2D=>L*Im?rDGuQMq)73|gcCA(BZI_}&UeRi&eLjLn7zW|J(|qT|Cbcs2 z!J(My3^5!TuP!2xwqw!eR_x4_v!)7%8>{+?xVI; z@!zoh1y)_i33mj~G_c*S%=>MW2|VKeGcMgS2`BYG_)P!7$K^{WN!t&i zz(z(AwLOpjWdjDc*G?k-r4bP71Wg{>wv&zcPh5Kmklk_hA8;LH{c!v~KwdlHvb?i> zKZ-HI#0k{M%gD=EsF)upeS@8{VOWYPe7QYsM5^spVN)JdA(kY2b z+tQBox%8!UEw!3*Qd_BaQy-=-LlsWIr{N4d2CJ|Q--DmQ@8A!zAS-g8JaR%Fm#5@s zz{6 z?ZajzL?sR!c&N3eJyvjP#UWB9DiD;ahqgk!fH(j*q$1G^s1jX9<$a^Y=)g&T(=^;ks+tDsi?espHsA{*TsTbe#3VUF?jA*qcIEcR{P`#G^Q6 zSf^T7_p=*ZlN)6i?RYYd%Z5oGO_|-E!V>(>k-m6a9Qz$zeR;bVr%8>n1vuWlnlVaM ztk{-EEp`ZwA6{38RiY+#JAQH*TC*Fp(AnC;OG;>=VmrY~Dohf3ZU-98YJz z^0bXfgBT{+G%0oskGi?eSaz8kY+cyhv)Va!n%QMxX&{%SCM|iIYIr79XGrN3Yw`OI z6^>gjb-a%7w60^1RNQ=q5*^!CR?DQ+G=0TWRZ?N==;?#&8S43tg+05Sx)|-Bqh6_v zplu_xswzZpvi`^ryTTs`0q$iNQSe`pu{CjIcUB?(qnB>;T2g|lO?BP)E3lN@J5Y@F zC5>iyLmVF`ZIfF67u&4W>?oFO}(mJVH0pH@fbW!4XgY@d&T;; z`k(BKm6X{G!oI(=+x3s^!au6(LCybHc-@*xLu@6G1`hx`%a7q=G&)b4mhIYlXwhw& zrl+N;OUk*BltFw}L=%0F!D7*_k<+h%b6^X61a5)v!4Kd*XK^j=B6oxPmb=S6;C|)D z_!xhL-{8OEA3_n1!Z@6Q8?Xjj@I815egHp(pTRruXQ5XZ6b=f<1Wniyt_Yt9*M;wd zd%{EEHxY_R>=6^m)Df=FrP1K&R1L=p1?%eT=?DchNnWllRCm`3?DPnaLl@x8*P7ue&&QziaRB DqwRfp diff --git a/WordPress/WordPressShareExtension/da.lproj/Localizable.strings b/WordPress/WordPressShareExtension/da.lproj/Localizable.strings index fd832ae798cda3d0b7a8281717836d23b9f5333a..f9d4c8cb3204887fc64f88ec878b0d60b2c45b1b 100644 GIT binary patch literal 2830 zcmdT_OKjXk7#@4q_HO!eo2HLI>9nD3XqF{uf%E~CG_MBIblFEXX_A`R^<+K7JLB53 z+eQck;#P5~1YCM57cLxn;06Z}7cNL3jvyg86mdgB;#492@g`|n7AQza?P?`^X6*m* zec%7N68J2V{r%tDgPNX58m5&>cWl_WY4a9)>$cAAT|0K}+TH!o!+Rdti}&sCdGx@+ zL%ok3?#n!$eWHKh$k8XCdU{YhcKn2K@|kDT&z;)%{Lty)kP&K#aSKR3T{!FicfsxF-_P@h(%WA7?>B&2v*G(sFn5iVnohBTYaI`*DY z;0xkX7Y|@JB#ROUB9a+cEi#`vc29vcDL&x4IPioN5hn0o_aqklM0tcRl75OT)O_-u#W|&A?19s;o zctk^q6(I9@2IUS5E-9DOE#w>Ls^Uz*{t9fsOpF}RbD@U~3I)wt^xl14)d?^&_)&qsCGMdHEd0gU}a5EtHQd|$HJ{0<2gKo6wJ@8? zO4>Tfih|}!feT`ebyXf=k;2chw~kSWqpFFWCHAlX+1lD#8bwp+rWywXR&#I0RvLSS zhWsu|yTi!JMdnvXjTXjfeMU_#CryytJv$kA81)}i>smq+U^FgZdJ|B^$d8TZPV<@> z;=JMe6!iJu?F;x+21XfoBguUA5uxGvm>dj?r3c5v{)K_vm&P@F1{{Tk@eu!$Z*i1I z6y(9+TSQR^0#V;37i4l1)z-}G{<5-C$*r;GdLt_hEjC$O8$&6yjNU-k(8uTp^fUTh zOK5#szc#3iX*q2{t7tXtqV|?{O}nmrpxw|u*N^FW-P14XujyCxtNKU!m-@H*Px`II zhD2ZDTtX(UCf-ean)o8|V{#$sC9fpkNxq-FVWf;cqlZhdHdW_@M-lG>g+o|;a*nYxzV lk;duMX(wGzzncCg{agB0N2+5pihsJ+x}wFE>&m5L{~z?_nEC(! delta 1127 zcmb7@UuYCZ9LHyO_RnlE@w6o6Bu%D?k<`M`h)7Io>?JXOYP{&(Ztjvxa+%ytF5B$Q z9=m(j28zW}5PXO|#upz1q0l~vA{r1>C^Sf0`qGEiC$Y6yp;WA3K?In zlT+#GnRjP1bL73Q9rHW0Ce;(9#1DyYcG(~S2q*yyFpvWn6o3Of;NxwRy1R@?j#zBw z05vUw#|ysYFpvMN;(8-mDA>!%LApSSHopZw#u$yu9UkGl@mwR^F-WI&SirfZvci`7x<(L)s{q#HV=7VoT*K+xVLBF>ljw z!*kibii~%Q&098hReRuK!FGsA&B=-e$4H*?aoDk8I&Nhb@qoj8%J@HO$FA7{!m`xH zUd_NnoaUVpP1m++!_+{~I_J2{Q)5BJz+}b$5!B4bm8Rz4cQFT(60vMDZ&U19KJ_MQ zHTij=v3#nfe!6yiraUjDHcup|O|!nCTfR;8ev)0{WwAYy9%UYN{aV+kX=0z`ykwjb z6FV$n#K-g){lwSx;5HNLLt&Y2DC-9pXruj_h zjesx3rb`z5+K?R9!#y<;&}-wj;qohaZ84$?C2Jim!!UDJsmiKfd+Rk=h1au6Rah}n zVlPFteH|)e=p*W~sp^XDKsh-=1FY@~cv@bHClzI^Xxr5NUqB5NGSp7$mOW2$v;wDN z35*75FoPW20e+APyPA$A3Sz-U5Dq|JV6t%?6W&l4{_HR~0nUO;;2QW7{0$xmOehOq z3v0qn;g0aH@JQS$M#LU*PW)AT2xZs`yI?PzgLznnr{Op7BD@N}hqvH=QiIeebxI?W zA)S?0rOVQ{(jU@2>7n#QhBA`t>5s`8!kgK}T3 zSHtRFbydBt-c}!@5DKF{v>!R>F!}-=M<>xm^b`6W{e>QB&DuNK5$&jUT)UwCsQscn J;dkrWo&vm*alQZm diff --git a/WordPress/WordPressShareExtension/de.lproj/Localizable.strings b/WordPress/WordPressShareExtension/de.lproj/Localizable.strings index 0dda2885debe6e1caa676349251934f8260155eb..52367c4e03dba01d75c918f6b32bd76ce5d635ba 100644 GIT binary patch delta 1335 zcmZWoO>7%Q6rSDn`e*&OiA3Bsq?yD`nv#;XRM3_{!A+A=HBD0gJ5FN8-m$&)de_}u zrwynODWFyrhgbvRPzlirsTYKb%8dg>;lPC-ajF0bijYuy;ef=23h{OwxS%=g%8&+oq0f1GfyzE~EjS)QGAtO%c69HC3-cqVx$;X{1wR zl@?}Iy@BUQla}P@A@>b#w={z&RAKjp9fO%ftEH`F(yFb|d_qyM4arKfywEOds#Rw> zemxe;Y`?%=g#GZXs#@oAY+rtg*t7;U7EkLIHErzVTS}^xI-W9go9cG9ON@Qyi67Qb z3K6u5RHUOC!l;D|WFZ@mE}x}}O7MKkRt?=Mc58L9SciM8ccqJgEf5weEXe~P&H!r) zd)TBfGE|ax{g2^@rZ^m_mC7V%Sy&to=8}{s*w9OIj2#zZoj+cUEY5-uUCB!FAl&ZU z?^Z?&(~4^21yFd|X(ohVYMO@m-)Y)8v5Y6rbS{1(x2;w&(^5bWmw4`^YBg00wCtIo zcBSrMxc!Cxs3?KjQ29mlE2<+6QN&LB%G0oI+jy0lR=ZNC zdJ_ngVVMx@08nVi`)I;hRkR4)O!NqTGzzH}gYi(!w>>vKw?)4=E*=(N5KoCk zQ5QGGpS;Jtr@XIu-}E8h&a^M?%lcH`8@`V3y6*$u7ka$iH8E6;reOLJsf}sUYSJXV@5?2*%-zo2O>b}Z z*xgHQkqU)EfB3`e2!c@Yk116mg$ROHsun-~35qEGC{$X(3i?B#2nF5Ui-Ny)X5V?{ zd7k%~_g?f~^wsR(^xXWy$#^1}N@udU#r)FpN?{cjOByLx_EqVrnx0JHHGa~!eN+bt zfWaD|fPo4?paBeE0UHhFlI9tNE10t76GWpJ%{OdnFpCEv3Z*6*4gE~!C@JHn&Tqq) zxGcr`3u^a5v#3+6N?8Rp49gxF87Zi{QVrd}8sQlBw9fAw$Q-3som$p%qKZxTBr#3H z%xpmm>L3rpNBDWMTgj&y8ny|VrL5NaXo%kwPV-YD3jc?ka*_OiZ}+aqs7HvJZ7wb6 zV$d9}6Fv_Im8Cc>RneruY{K|nI5@U4iCKy0$ZBgy$4T8-Bl-5nBg{@Z)D^=#vpDOh zcXT>t_*ZcEzMfH}nYe8KpU^QsXCS}K^C=%m2R`}YeG-!a$jhvz1_O&nwafQ zCx}i;b}C72og|;br5bPfVk7zInMF*ytz$ydkc}%=CQh)143 zuU}Vv!N*tP#BQ1l*@maBpmt3YyX2+e$#ERy5)Icm7vLhC3=s7_ek3-&A}CSiv93_l!<@pn5?{JrpwE-xfpvzyp?HSP(1OIqE$C_g6f zv*9tm8F-Yh`}+b}_Z)Mxj46kBwDVzTsLyi2zk`1qtWK+K9)ycUleh+QQ_L$ z$HkPmA-*quDBci%5`Po#i+@W{lBJMzKsqMnB_dsvZb;uqcRFS|Ry(Nwm8Ac!+$X;v z>+%Kp4S78<5Eu*01m5ZVHW&y#64)Eh$(SHCFT!Z`o diff --git a/WordPress/WordPressShareExtension/en-AU.lproj/Localizable.strings b/WordPress/WordPressShareExtension/en-AU.lproj/Localizable.strings index 26063925815d16bb0544ba6b8bea202cc94ddb02..45e64f2469c062bd9903deef6e89ddb2516e9f77 100644 GIT binary patch delta 979 zcmaixOH30{7=?RhI*%fOLW@CS!vz#u8v!FxgAXXBAW%wer!PxshW6S{7-rg;X=7s) zqB~YLSKY8Mx^aufmAWt?Cb)3nS~svkw%R4#Cp8X~E4)DI^L~M!&#~^QmPn z$QMz}D@e=G$FHEIx%G7Q4=m(FnNOoM-XS}?L#|v-EQL5h6H(NaPD4#UmNc9Fg(Xo? zvp7Pm;pa?OdClsGx_J#{^dRwRNkxhVE7}VIA(e%0S<;ZCg=;2okEsvmsT0ldn(68y zE`yHt#o7W?bu_xwq}hhelnuAA$M7fSI9{f0#$YJm#eS2MjRX*%hO&fR>{0xZDm7j6 z>b9!^@ha2TAM>OI4f=Hoi3(}`0U||_mEV)6GU0b@9OnU?jnosxL%Fn`qv|O#A*d^Y zs^@K+L|Q6a(Wt`L86I4q-O`}8N@Ih6wUnr(u9wrWh%UAP@gx5PT_^0o7+4O5+KmGy zM;+r$e1~yZ{sU_DPe6^p7+6Eeux8jWyfW+8AhJZBxJ9fJW#R?#p7==Y5kJU7q?4Q{HL^@TAm5PNC1#{0%6 z#!ZT)oYWa=l$xUARFQf}y{0};-)WXUOxx)(I!JHRyYx54$h0xT%p4PEa?C38h}mL3 YvlKhT&aiLUJ@%`KG{sG~vA?PJ7ZF%GlmGw# delta 1041 zcmb7>OK1~89L8sNX0sdHrZKjPQth<0rM`k`i`4q8eX4!t*_yt_?3k|I?8ej>Q2%?CB;z6t^C|2-LMD*stgCIi1iXeDUK?FhbkXrSio`#v>`+wj6_kAe(P;{oH z9yM$drOjKmZrko?bnb99HMg|3weMWEYj;OyDK0DT>h7uP_4@p4)~*W#*L!Me>q33~ zejgcUz5Ei73VeWoai9PVL;(hIpaT!#&)yV+Z@G<9<6icqs+#uU>W^o7-}L~gsRxg1qga+OdqG=+>tfxYf4*3 zbtAc_BRw%4GLwJ3R8mvy!LmX2S-%>l_wCX#87GQL_No+{ibc&}&V@~K#i{cv3I=l5 zAG0P=pDXC2DvekHzhbG>zk@`^ScN;0fh|2u1TgIk=?{3R_7px*#wUZ z=M$ZW?ASjb0}@DrqhJDD2Y0|jFbm#+kDSJ(xGUT=_mX?Ved50ID|t8Hz>o0H_|H&) zrO*R6!4VjPDR>cHg}2~+_z2FxFUWz4Q8j8u0dyVRM)!i~0eXerqtED@00l`X5bA|C zAuJpaP77y+yS7?e&^Bf}WxH&k diff --git a/WordPress/WordPressShareExtension/en-CA.lproj/Localizable.strings b/WordPress/WordPressShareExtension/en-CA.lproj/Localizable.strings index 9924c517fd403901f93aa10a2bf06abd83fed928..738358d2ce44c6381eb2332f051ad7bea7e51d59 100644 GIT binary patch delta 1063 zcma)(%TE(Q9LINdyN{MCtB3^xVU)B~QNTygAc|NXqP1eXZNY-g(2nhfWw-2ZiNqL5 zym2s=Q7@eEV&cJI!okG&iWe^$?|RXM5dQ(=!5F6xi6Lq@ZGJnyncwgG`K;Ei*4`P2 zb@M009;fT1`_%Sox%YIUed==$2+PgDkKs1X~4NYno zTB?mLC4{fh6E6W$4SCGFNFytaDhkS2u`r%CX7QCUw)3VAZ3E^E%N|qc1e8IlJ{~}N z3TvvKp~I9jC^e--&@3Jcs`?ZRp=q3ys}Gg#zMUD zIGB|E8)OdhRaNmYMrmm1N!dgHd&pD%y6bX~hAUwp%VLXfY#^=LaD=j&D5{|c5Syl9 zZd3!siu{lgWCp;_cqMltnoHAUr7h$Asx_@zl**1lY^SotH%hjOTJH-T6}A4|e-XOL zWydCe6Xom`ZGTnNAZ^h_{XZ4_W=~>5%NB8Sn^4nw1M#jb6J!hqF=<9+bS49RNx7Nw zuO~0W>YD%1b^l3~Ja_tT&NEBQGv+h%mH7!c&;~leF)#>5zyz2C888EGfhDjE9)cC{ zhCR-P*(^K5-e4El0=vq-V?VO%><_MrYvV3*Hdo;8aj&?y+!x1$BkNdj+;u!~tnd=w z#vkE(`5`{RFYu4}5B!?2O=uMM3q69;DP)9C!Z*<^)`?#6tcXNITojkZ*W#Mwl3Jy( Xq)F@2cV~ms@9c8kc0M7CuD!ni*SAZe delta 949 zcmaiyTWkzb7{|}dncG$`+pP_nR*$Z(idtP2p;c6`*xq($cU!BrW9M``F`Zd6)7B}k*51+CwX=NJ?m%}HTG7+n*Y6F6#PFKBwUKDOe|^J-fx$gu zNSYx1^b)@cLO=o&Kmi&^0t8Y(2PUwPcThCaNJ>hIHq?z}MMAwPOVKrxT;x$vxFwZR z)6q6OB8{u$6+BE%Iy~;U)73Y=UscReMN6WTZdyK{j}!=1nPbaVMB5Z|Ofk)&(5Pf& z(hIs>h? zVp2EKdjfVxd%W!APhbVv$}J_cY#ATPw;#ukJ@}9%iuP;VS({_f%rDx!FNm#i zLqnFH`)S-++JUV^j;pCy*tExsJIibnF_H~w#LDx~wMNp#ud*$wCU0OmYYNeMk8MFE ziLvWS|71VUd~qG}qY*{L|K(0h%0>F2=O4i6FTkT9V6Tw`g2Ol`I6dfJn(-M94jd_vjID23!F*!3=l{-h)q+MrEie>LK-#dPjYxzSApd zAKgd~)6eNS$igbDP058KE@Gg7|U%@X-G2>=xnJy;GTw$h}+su9DHS>{~ zV}7!b71$zn6Whtg*n{i|_8fbQYv3YWnmfzQ)N{|cZ#>VhFk%1z diff --git a/WordPress/WordPressShareExtension/en-GB.lproj/Localizable.strings b/WordPress/WordPressShareExtension/en-GB.lproj/Localizable.strings index 26063925815d16bb0544ba6b8bea202cc94ddb02..45e64f2469c062bd9903deef6e89ddb2516e9f77 100644 GIT binary patch delta 979 zcmaixOH30{7=?RhI*%fOLW@CS!vz#u8v!FxgAXXBAW%wer!PxshW6S{7-rg;X=7s) zqB~YLSKY8Mx^aufmAWt?Cb)3nS~svkw%R4#Cp8X~E4)DI^L~M!&#~^QmPn z$QMz}D@e=G$FHEIx%G7Q4=m(FnNOoM-XS}?L#|v-EQL5h6H(NaPD4#UmNc9Fg(Xo? zvp7Pm;pa?OdClsGx_J#{^dRwRNkxhVE7}VIA(e%0S<;ZCg=;2okEsvmsT0ldn(68y zE`yHt#o7W?bu_xwq}hhelnuAA$M7fSI9{f0#$YJm#eS2MjRX*%hO&fR>{0xZDm7j6 z>b9!^@ha2TAM>OI4f=Hoi3(}`0U||_mEV)6GU0b@9OnU?jnosxL%Fn`qv|O#A*d^Y zs^@K+L|Q6a(Wt`L86I4q-O`}8N@Ih6wUnr(u9wrWh%UAP@gx5PT_^0o7+4O5+KmGy zM;+r$e1~yZ{sU_DPe6^p7+6Eeux8jWyfW+8AhJZBxJ9fJW#R?#p7==Y5kJU7q?4Q{HL^@TAm5PNC1#{0%6 z#!ZT)oYWa=l$xUARFQf}y{0};-)WXUOxx)(I!JHRyYx54$h0xT%p4PEa?C38h}mL3 YvlKhT&aiLUJ@%`KG{sG~vA?PJ7ZF%GlmGw# delta 1041 zcmb7>OK1~89L8sNX0sdHrZKjPQth<0rM`k`i`4q8eX4!t*_yt_?3k|I?8ej>Q2%?CB;z6t^C|2-LMD*stgCIi1iXeDUK?FhbkXrSio`#v>`+wj6_kAe(P;{oH z9yM$drOjKmZrko?bnb99HMg|3weMWEYj;OyDK0DT>h7uP_4@p4)~*W#*L!Me>q33~ zejgcUz5Ei73VeWoai9PVL;(hIpaT!#&)yV+Z@G<9<6icqs+#uU>W^o7-}L~gsRxg1qga+OdqG=+>tfxYf4*3 zbtAc_BRw%4GLwJ3R8mvy!LmX2S-%>l_wCX#87GQL_No+{ibc&}&V@~K#i{cv3I=l5 zAG0P=pDXC2DvekHzhbG>zk@`^ScN;0fh|2u1TgIk=?{3R_7px*#wUZ z=M$ZW?ASjb0}@DrqhJDD2Y0|jFbm#+kDSJ(xGUT=_mX?Ved50ID|t8Hz>o0H_|H&) zrO*R6!4VjPDR>cHg}2~+_z2FxFUWz4Q8j8u0dyVRM)!i~0eXerqtED@00l`X5bA|C zAuJpaP77y+yS7?e&^Bf}WxH&k diff --git a/WordPress/WordPressShareExtension/es.lproj/Localizable.strings b/WordPress/WordPressShareExtension/es.lproj/Localizable.strings index 57add7d0aac7fc990d71258a7b32756d341ce573..ec8dedb04122e62b8f057d392bba9ed6d5e4ae2c 100644 GIT binary patch delta 1322 zcmZWoO>7%Q7@ghquD$Cm-6kmx^e2;~DNWNxt%B5uNJOcV7DVc#{&yY69eXGCkoAtU zJ2r% z-rMbc+xy+$=i`ZFDxJyZF65UA%SVbAQK@X>m6b}BytwM56WGCJRmz;cqB86S5U(dwLLKkQ4`&D6CVT<&pv&RSZSR7X$i2STSMIIv~V3z-!7OKBbHd z7Of}$$8f~4+Z?fK3gCe^!aK{@8fz!n_coD_PMR5T{QZ>r94o zb2edcQ7Bw!n<+{l_B`r6+|9LjJQc`tR~kN**-s@p=34)M$^@oU5vTJAZ6S-INA z==dxANzXaBLOlMrHl-A;r+D4iA8w0^JWWD#Ugm5Ac{cI{jTo(!L@sUY zK&!msQ7rpQS45R%gwdv0~SIX z@lPz&%OVEY7gS+Q1cUm8)70}GA>P!+9`AX82+OoqM;;>`?B(E5ep`QzyZQwGUK`-& z&8cu^9^*EfqBX>+KEw^}rQP``@+wHQ?zB8E&JXc}y3ToUPj64hU5K1V&|D9H#9z~n zU(R-{7V-!|XUeRB9P-LTV!2uDi!0W??OP~`_zS#fmTi`Qr5Bv)L zl@w`AIw75s&Pa<=K`KcVX-#@v+LGRrK9p`rU(1tnT&~J%@+EmwZpoj>m%o*Nlz)-` zQNqfYvY;@frM#tlsoYh53KRm>z-Hjh!25w)YDgVZC)8>6teRI#>bvSU>R+0o4QQhp z(pEL5ZE82P+uG;a9qkA0e$Wi|1qXw(!F^JSM%+u=b8wj?LYWot7%h1XEU;`gN&ct9CA zln;d$Dg}!;>%=a?GIiY1(b0V9V6tpcWMYn_&f1l(zVsAvO2l!NOFwMQ zhlY5o^ccS)hxJ^tY$6xKIbv_rJ~_lYownzgIR+?C5w%!Ay zsD$~vG^8)Zh_MbQsqJE$k4QsLtxO`@z!r3x98xh{qE(!0J{o|TNdaA?Z1cjLU@v$I zF?>hrInfz`CPQoP{{e;gD21qsh=mFkh7NJDlWL;yo1V_vwceJc=I6s%H|0z?6~`7f z++>2d7EYW+#s;r>2S#(}Z3i>A$z#Gap^J)6I);%6sU1(o<`Pl-teZ%PYCbgF@atV~ z@aRemyA@_bmo~WNL+$6VYc#gepd%EdXDW!9i1AkfgS=1eI@WQ%?um<-MWKnIUBOi< zw9JR8!`Uh9 z7>J3nVpd~I5LwWmrLrgzmT4?o9Ng-xfnmYR+8d#3Cm-!>Zk?D^R2g}u zf(`M`KUZhx!p(gM$p4s4Tckv6#Fo!e#`eh&Fe$Ey3$VB(6fp23K)Ff8ipVx;Bjo*p zW51LS_3$mFXFMP35@A?JoAnq7@1RMXGPQ{ah9h!SPhQ=bNA_&k*MhB6{F*Ytw|ocq z_2B!xsc8!r30ngR0qKGYumDY^s8z+HT^v(-`Ky{9&WGBXiP-tye_eCv7O`PK8MchEcPJ>^~Xe(l|r6zPx@kxomiQc0>wThiOow)ClV zPr5JtA-Bq%^6+JOR!+({}%TlVp(6FS=_*Q?u=F;Tho9?LwIh=aI1z3EL&#? zEmyo8jrn>;C`G&3zT7X^$_PuyF?OV!W8;B#HWlfBe;3)I)XnY(a-ExK5r8>>N<*h; z1K#V1vJb=EQo3&Js1{}4$$PA%bjr{jH5}rwC(7vbCQ89^0&HCf*@L&Y5H2Pxt8S_u zVUPfRqF~U%wB-=pa4Ccq=Ituh>ew`hWh)&Z>^v)lCzWN-BF1)|IG#-$!X)J-_C+|s zo(BG6sn9GJZ|J=#UT!x~5(-i%uES^@7&KwOMEiTdd`&ylF|izQhmmWjA&w2Xngk}; z<7gNAT6~2m{sDH<;*ofseHEVQ8AI^ET{#QEa8qik14bpbGRltS6*zer)*hy}6xrht zVOQj<(LzFVi0cxZBkRrmGW$V^b#0;};Aw(32f$!JR7W6V020iwPyDBmViHEKlPZ|k zo7L|@l_dk69WY3kI)O{AJ*&?)B7d{HQdMp`0PyDnqjGLmw`^|~y{(tty@3wV=ja5G z{L2YkoEzs}=4QA>uE?!(I=9W;ChpW-Y0Hh-PJ#UJpW@yGm+{IC2! zLP&@U3j!4mgge5K@KE^4SM*hUw|wvWKJq;fWic*Z5GTc}VnL+h9q|u;*}v<*?Y}Fv zO2bRim{gEz(mT?=bRc~oJ(MN6RgTFs@_yj$z_-EP;6yML)PiR4I3$PSp~=v0=)KTy nEqcrM;r4J}_+I$a@YBf8ktfkqRF7U$sB)s5wm!#3+g|t&kdK_g delta 1290 zcmY*YTWB0r7(Tl*lbyZH?j*Q|#+aNoNln#k*p`;sfU<7eSQ?XbFWF5to5^J7WHZU^ z%z9=fHeMaG-HO~c?#>yyy`Y^8Bq z$$AbRRVxI>xW3SIN-r(oq-8q9gnPNZBQr_WED;0SO%4+&Qn8jvp}8~w^GOC>w&=># z2xHH9vS#2@uJd3tjy0;zJO2k{&5v4GT~>8Noihlwb%)p!O%%A|iPm23lBS!--C9@p zeA`5t7^LK6GrD7t%)@GF32NS+SmBgu6Y4a1Bs2{>YT3@Eh^k@BOlMOgnNf1q$z<5A zBKJ4u^}08Ba3)0@mzvnI8r&4Q^(1jh4K*5cSO`BlMByuc0zMB6 zMHf*DZ6U(+x0xqa*zO60K@9f5bHQTwWL9|ap$#T~dER#?p*RD;u zzl9W&%sFLJA!gm>a8)|(>1y!0EZhOV`dYCfM-y(zH5*RAnr>GuQ)kY|?LxyzG2yv? zHzg4+Hm=qBAFJ1UGO_~&VUJvQ1|`g%j^(n^4DQBvz&?4{`B^GW8P!lS??F#ZBF32xi~k(&2km4#;tR&ac^?(bDwaV+zub+ zqkKRA2%qII@o(|(@*ncw@Za;>{NDm6h=L>>6^4a^P!=|XKU(CLLoI79FST6uy)YpP z;)CLqoqQn5lh^*QAzW$AKBgJV>{Wo*_~uE zv)!451}&x(K>~%w+rFe?(U;GvJbQO zo^$^H-}&Fg&|>IfD$?86KM;+@6NAZA`sC2?$Y|!2JeF0+crKS$Cnn?CV2o%aYh|Pz zvAkR)c-ELMV$(8;vp7$Rq@$yQw!1Jr%(b;9kCJhDT7%w(UIWWBvZ~2r8o{P&5i{OP z&OoJ=N+?8kb3!T}mviP|luQ{jWHd^w>7tG;0~ZX_O2|{J9&yaMFs!!rxd5UDD`UB1ko-SyHtPq8+^E*O`u0lbZO~h48BdIP$!4{ZhB&mOT zOjFG~O>%R=V4^mGs|x$!JFaRAXM<0sBCaLC!U0@pPKN;GD>6x8+t|x(ii#Q!lTy$Cwm}> zYGfHH1h>umoy|!4n4(&^9}*t19}`+IDHe_5*6Emiq6t@u>g?XmWG$_sL_vW(9Ps2( z)tpjI$a33pVrBEThV#DgJ_MD}ZS)PQpfdeX?BWe+H~rbyPKVu((M5NQ%1~P}q^Iar?=$pue|*P%fbrw90hYKLxbEwmB3i--CvV3V-fGcNuMfpgmL30WL@{iirN`3x^db z-3H+@L3eCrnBJU(yJawX;23SO&`8}r`m6g9+fq~T(_ybf71SBYf&2No-ph{cg1?DgMa}dk+PPf?igi?h-Yo$-Ahy!1uNfl7wZyi) z?aR`4yaRBxvxXIFQo+QwDme=**;^S>xHhqmmi&95y#>zC(Qe_Rh8(aj1JPPFMMG+X z(hJUV1^4!54N&dpSVCohDLLS_`gin`x(oCVA&C`;ssgZgCqd=pJs_8NPg{hWKAi*kAHGyFm_?ic(Cf8KvC5D1WfPS4ao{ttc_%g_J- delta 1309 zcmY*WZD<>19KXwRPm<DiIh)^5FRrt9V!=}?&t88chwpiA4lH0}D5UUN^ATd#K^ zcdaW7#SK6BK`=bxhcZzRH~cW1I8>^jFhpTr8cpr$x@zmz#ZEyFYSW1$WK5pa z=n6VR-FR1XQmpHq9Mx1aqv~lXYnWCr7)*+d@vLUZ3ZXLc=g&6mNE}hk3Dq=*q8T|? zo+P=PkxNveNijfuXd6At)p-ZvSw*&p)T!#@`A=HtRrWc0ij#bs$fIQ>J>Y0+tZlai zrOAqx(qG0%VR?ekE)?(%M$}YB3K_aZbh;M>o)`|vdWvY0S@F;tArr8e=Z=C+ za@vZ;pqdn0?R&lJ;P(wjh&7qhCCjkACB+9ih?TNm!?pt(DEKG5jOTHQ*47-P*J>Jq zDqg}r;1#H?GZJ*?abW__;ad=vAX%(7mhm?b7iqUARHNV`UI18;9&*;x4)6Qa=S$E! zPXHO>Lp1DaqHTN=&EP}(Qn-Mx<0TEqz6SUlE`mk@vPHZO#6K#aQv&guhPaoC-bd-I zGeG0Q7OMN|=^E~*w_Sg+Ezo(4J}o>5^o=$>#Poz~+g25rZUSQw-vP$5_mUy*w#VD} z#x1HXasz)4BdfM(iBeChM*|Cs;A~^qOUtXp*4V3l`s*^7Yuk0jHSpb?6E)skLIM*Ru zSD^N7xn_vXRk)vi$JYhN!OlDwx@Eu6rltGK>-K?xivG;+XjOr>eBgo&nJWvVfTe)v z2*l;5fJsAqqXar55JbDXVL?56}(U)ii{muC}KiA4V%f-1%+!bz?`;1%V ze&sf}|1iRCEZ_t97#_e1eiMI;ui-W49_N1NG3P%qSC4DT^`7fD*M?hkH@LIzbM6`U zy_z-8;~vfPvgf?#7oOo${2Bfn|2qE;e}%v6-Rcc_Gv15d4~38r7W#!z;ca17CM3}6AP$O9}?x~{FL#Uf&9%O5Sf>+a4jrIhjQ%*rBQeI`n{7*hqL^p`vzzR`_hx>7 zzVG{eQx7~AiQ(ZNjZsBSB(;>D&h)HX-}}G@W8^U>X$SS^54~{s#qlE(#^luIqkYGYpLnVN<>{08 zLUHFSrE{3TZ^u5^eDgJzJup9r_rakR{Djpls40 z%s(?he4BdAZ$Jl?BgAf2WRWw|%x~g6X+hN+M&f6dQc=e;`c}8MvTu$DfwyQ@nDFSS zamT>|@>_;cY}bJ^w;KdHw2ZLmQ4&$?k+yHUShy6|c<2;E8UY|dki{NvU>29Va*(rm z3lrbLEz$%y+FcH?D>`zwLE-u3Hi4Y2tH`;Tmd!COHwcq7oSGnlHh|sP z6MjTPfh8bkN({=K;J%=~sCJRF47@7vjUd^WXUTiyp)w+(jv^%Rp1G6M zVFVWf!MGpIcBzUp0sBj^0W&djK+oB3MjU|vVO#3$?{r`pJ12PCbNs!44#+a*BZn&_ zkTM7c%UtovR2>V=gnGR^!Vo?Nm$tIT6--=;`wQyM!PYSdNqAJ78;BlwLeDI8rz_4PQ z_}F%d-=I<SA?4dxi8i!hExl&TQoc-Y!`^bv1(y9 zrIoDdBufgKH3J949P6q!$s&oLWo$f3A&#sjc9z(`{%31j)6(wN&8pyLyu+$y)8jt7 z#m~605fx#ony9T1n6-0AAi6YZKJ0g3^7u_wXXeRk#4*c0Yq7hxxN4q69`D?*rgld! zn@0setci$n5dj?km80E1F7_`R?4ES4CNh;?c)^JHMMF>v<>cp|UF@_Of_dJ{HdZav z&yfyW?PAq}QzteE^>!0OX|#ymKv&Qg=qL0m`cp|LL&~r+svK2{%A8VH8p?U)E#->x zvGS>MRry9epq5luJ+Hp5UQ#cspR3=gKd8T`e_v(A~ zL;4B5s@wWI`bYX_`q%n3{kL>qdMsT_znT6pvo({;6f?6KmRZPrpZPs=y+`X=kK#*J My1!s&H(fpWFQs{uN&o-= literal 2826 zcmeHIO>Em#9Dk1O#3^g%c9f1n>Fc&`-4;U2S4YQJ*LEM!H6@9Y_0xTcUt_P1pJhAg z%3%@*Zb&c*?Zg2I2~Il=goHpl48#G615&RbnAl-RT$ofLf#Cn_HY-|-sDuy_I0sv? z-~au8AOGJgxwhp8{r%slgF;M{()X?##pGhdsKKK0aiILH_S|#dA~BGqXqM=Jf@>jFieoK1b?QSNHH6HaxNzV3+v;X3mg}a)_WhvXFx+ z2qPCUpHa%7UjS=Pbu7M8+g&ODWKn*Gl@s>3Px||a1R#%F&XTU~53%q*LNtJ7D>&YyO$qQ|lbTaD zIVrfvJY&+MK78)FDQvR}wnDlaFVbaJ#l$gil`K*0*CKS0LL|VvBDV^>0tHgMD6HQw z2hi2M1+a*=2vUQPF;0lCcHBj8^qsEmj`&`;6*ZG=`jl&OvVNU=heR#~0SM7NOmb0Z)@1yr6M zhZ>-2XpoL=dePPP&7;u30X~}m1J;RUhm*sJ^b67Ex~i^Qq%o6x#O^ro&b)4TWHws4 z(T!F#8FT#<_F0v}(17)pfdIVhG5%f_xsN(AB;z zSlkS@QFT5`gPIqbmitOqTTfDGkpm5x1WmM@V^yskMjTUH(In*E5~>LVQt&(q5M9qe z2mY@^CbFHS-+w6Y3K^qB%2s2#!?-JCO6N%(g!pS|H?4V)_W#En4=8Hx0JPHQ}Rf1F!_4&a`LU@wd5Dcuadtu?Ly%d6QVnW>L0Eq F{5zZ$ouB{! diff --git a/WordPress/WordPressShareExtension/hu.lproj/Localizable.strings b/WordPress/WordPressShareExtension/hu.lproj/Localizable.strings index fa95681462419ae30fd775c425b775189866eec0..8eec513f6c12dc4682e089fcc7439ae1fcb27836 100644 GIT binary patch delta 1088 zcmb7>OKcNI7{_OJcXoE|RCO^@oT zRuhUq;)YbU(Ew6KB_0>99NJ1Pty-yv_R<4qKq3(mM2IUV1dJVs0zyb=rCoiq-~9jI z_xmq2FEszqdkF5^--Qkw{7OC4-E_F8*B9#ZhXegbjviZgd|+^B_{64>(MVK}1>-vs z$+45E@$^LIlrfo&M~OwUlzk_!XF*A0UBXr+(MP^EsupE0l>pL*$v2cekb_BGH}Y;g zLQ3TtnTQZtb!?56wMyBgW4be=8F|CB$3uplC6;OD+uPgqUL#x7qehL44VrdQ8#YQL zBD@o75u7o?K3&+>Cvp23QeSnNL~ACeiBc$&f)w zzU<7Tj@d48s8*L9kC@ql7Ao76*fhT6&;F8HSq*J#N-fRXXk>FRuxetdL30a+!>7#n zHnMr_pS$Z}C2@m#lIgk`-)H@VW(!{J8OESTl@>l&0RS}UPXfiRb^@*f5_ zc*?)?;Jpa|1+mML1^*HD2@&CJ zL6{cK2p5Do;b-B0;jZvVcrJRyHt~c=#X0ek__z3Nl4E~7ut9rRFcl3V57a<|+s56Ee`Dt{|~k0ty$-h&Bt@ELp!|Azm?_wWMx#8JRP2}XOtcGZhi%MKT??h delta 1108 zcmbV~O>7%Q6vt1lkjDsZsOWmj~##I)v4)@=*)>&oOUPlWGX#7 zcQW(L{K8`PVEE9|VYZyp6RZL;u?;S&?N80=^c;JZ~^MQ*sU4a$pCh{^Urh zWLDE-{1jU=VGF+reqT>lwx#vN+OlalD~45|CEIZa1_rV%9m$euvpffegSB_syVGNa zQ#2fBA+f^B^_RR{w#(^5SKPU{LJr*cEP!r)$m0`MG*Gjj|$#8Qi;bK5pbzXvDT$ZovWE``luL zSvhV}r|Bpa=S921GtHwhdN$&jDA?ud$tf?3=h}+~?~_i*Dxpp!VHrwo18j^ z%biqH6D|uuVK=<3w!ylr_~)Cq4+Snuv#qHFH+jxY>V|7_eU#-^p(gem$Q-vEUUr+q zNAh{A{|QMTha#SEF_rRu=^Lz$0}iWU z_*xEvL-wEf7rRCTRnc4MJi3H7&`op?{fK@METJZRB-{}02;U073crg_iv!}2xFmif z-p4ZT!eKm&mv9l+@J0MF{uE!wU*RqMn-q|OQlE58N=lcc&!nrTr7xvz>1XM_^gzZk zk^SlRuC*l|dz=l$7_BPn1pNmU34m>ho$uHPkxGJhLMjJ1(4ti0fIupdxa0s_5kf+=LPCfmLR?VcTiYNZPOI6O`G5cK z_y1-;xu3i;8B?Bn{!HUy?^A;-rI&EIVv^OWMb~QfLYmm5!b*w5X$$)VZMvb40_OUg z$Ra)&85!Y&F~mE{Whm-k3&K9j-K zU?D~7?gm*&5f=ImVlMLBfE6;Jj;okDOXJw75SuzxD3lq)m0Bi^H%MWcIyE$l>!g&p z|HSygDj>lV zTpzUBuHmd)BHYVs3Vsm*hH>VN+kIiIobH_)dP#u0HTGgl<0-O4-GdvBZYG&WoRA< zFGpd*5k!37_5WR+i&i`v%X3FO`gE>MtC;mn;L$Xmo1j6R2Eg**Bw-aR(rD%j`DEv* zO)Y*?MLaNu__%h0pEi2p3)9$H3!B;BQo6U=m`NJ)UrfXO8ue?~S(zgBGPWtIktol? zxLd}^##Q>C5y-VqEu?AP!%h)K0HX{J8IAxnb3|q0TR5OLGHK{ktJo?fdRjX*NP+ho zUETQ%@v#S0vll}%w3jm&YFn_5=7g7wL)_EW#Xi2R9+_#O1NBx(6p0Wo@`yZa;#2vl z)~rw%#WW3QB-^%BoN5jWn!=knJBAsyIf|d)uPNQbi*sH;QFA_)#zG7f|LLN0hB(A8 zQx@q!6?kBKdKdp#LHuoflw-Y*zoicHH{yeO4ju%CHu+!r5&oUx8HE{A4>5x)KWN7u zJ(vz176lX~4&R7TXES0HV9X*=WdM9tPx6~aiC<8UZxsMct2A^oAMN`gZClHqhqSyYn`i**5 zOKUG{4eed+hW4p;Tl-bl^#^pMkLu@jOW)CN>pvL>j6=rbUB-3eBjYRMN8|T+JYI`m Ni@z7&2iGWp&|$sFOhPy5IEkzLPnb{!d)0sKv|G)41 z|L@yL@1!rD5g&izNu_bVZ~wBf0;RHvS1ZS=WUXdpby%m*Cej&;(>dVQIl|dog+rXn zIh@Z0Xt0p=HV{;R*h`bxB!H&ffH<~KTLjdWJMFsGMt%&hLTJ(3!X{OuLw$zUF%y<7 z;#Y}XL9XKm!^6Xdb|B|k4w#sN(An6!zdt`l{5tXdCA|t>REa&$@$!4EhBiRkg&w*k zcC;3At_cA~6U44HJ{_dj_~+@Gh}!?{d^+l+ClUt_?90T2C~R_>g{TKjK^@a+VW4$! zmXxb#)Ug9>(?^7XYi6HGnR$%dgj!og#m z8Dx5}8vK`#4L{`|SO;Q3$->Ad0ruybEc6QB*|^l(w%GjL!@45Qcg*S7!sQ^BC4q&r zBT%l6il3jwU?RuXbF&lKDf~i^&9YlV8;bY!PNHROc@_tu zXQRN0wHexdXK+xC-H7F|3FdTCcfmHabn^q%n5Wo{>X8d3oT9tQp62_VAG>1kJi+~6e(%?r7}p%Qg3qpEVctuqc>A&wZJM%B#27? zmWBqI9zA4_%<>r)4t7RD_RX*&@Ir#J5C*LDed!4ONq&y+Wo%v4Nvd5PvCqf{2+&AW zT_J|nPp>Ku9L=CrVqrE;>^~}DuL?e~kV!(jQh{obMF94Y4GqPRKPYNzaXiif8ix&_ zRprsAv=IovVp1cFh+#oz0&B!$SBoPdFwsqY^W)82kisOchtSM;R}6en?x!~-B!a!#UFtmpmdEbQr%ZzuiyoZNsIC7QcauTym*Gp_GECr#@Qot$P2KOTO z8n?}T%zefE%}P-cmTFQ#q;VilJ;NuPRrSZOHkp?NGZ_q)w`aT316^-Be#v-=&vZ9{dMGETHuO diff --git a/WordPress/WordPressShareExtension/is.lproj/Localizable.strings b/WordPress/WordPressShareExtension/is.lproj/Localizable.strings index 06938a97dbb47bfe2aaa3ab48b65ef58fb05ae07..f3bb2eb130adff352dcfc53cb17092be32cc437f 100644 GIT binary patch delta 1294 zcma))O>7%Q7=~wdy+3wde<_Kw$sC%f+M zI5ZN_O5Acl4Fjie2?u&Wl?tjjfGUc(aN)$Em5`9iAr(Rhqh2^5#H)XXcdrcS3bvuCooe4$t> zSI$vd<8kp;7>P5+SgbTf zTDZsL-fd|Y;YCatZZLv;%88#(lM7t@rtdH3^Vs%_S+d|RlKCv*J;DQsidgWL20}|>e1oDgEOetWiGaeCGM!Z_7x_&UA9!n zQ_e_v!m<#T&FazUY_Gwn-xiK>Njzch5l!vU1LaA~i7lN}XB?k+90kSavb5Poldi*w z!;2d##FwGbBMjsK28)0K2iO3CE^vVlI2x;+CKkmg)8*84{OX3WK`pTYcMQ*O)Ih$B zPudZmXfYwom|Bm<#IMF~@i`pYx2Le_0d06Xh@N5=YEee~Tp^nh4{PIQDNC@0Tt|$A z_lobdrO4Tov^@w&{A`SlRi-V<(X33d7LbxZ5b-?MyT6(aR^sDuSvYX?P-!!fYN2b% z7zTPvQ`BFezRYVRNqDmz)EK}ED6i>9H%ae*d<(t=q``U+2oQb!fYS!kpe2){@{`iHX5SLegS?o3*+j}4B0{~wvB&f%+0}66dyVA$H zj6N{UrK@0qDPZ}O+rhzHuS@fE5J=#d4!XsG36{VmunN8acfe2JPpHCicnBVaNjM8@ zumNp&9=;7%;TpUGufeaCV@g(OE9aFrm1Sk+qH}n}d#2J|3&T!88 zpYuEaE5R$lt?9|}V-v#UW3ux26Hh)hH9a#sH-CKL#L1^)r{asJml8=mmCj_B&*bte zt7C;Vy#8>sSR&<0RZrp#w!{ac21o)7HUI@Cr~m{Szyc0%(UE1{ZXsO3)Lc15N))5T zhD$BeVLcG_rluMVqm`K@W!yB_b@(h(#NnYrVBmCf-JnjDnibTr95)h)u#c5+`?-7X z&&*P%P90|@S;e;hpV+o#XZ{K(1V&gN472Bjfql7Dql8_8V$`g)KRCj!a+};C_NsE= zt|%%~gWS$A=VxH!eCXi*Xr~-%HVg}wNNL%RMR8mwY!Qy^%O_~Die@a+B_?|ajvQN^ z!Df*d$mwcHCrI7eAi3_VQ#d>0NvK$M>rBkc=;`%ZDFlL^j39eax+moI8n+PMz|_F& z20;#WiIeW8Wf!@j_RIJ6=DWvkFuN#Z2hvGmkfNK?scR5@8W(G<%@0R%CrpRfZnyAM zsf1iyaWV;lOUN>lsYFbVle4a_dtVEI(axYgmwO&uO%S(fo5-~~-4_D=^TaK7hToCn zNlvAy<6^cb-_5Sc6CS$<*!QsY-?Ugxd^DuTtQx*O=?<&ZG__s)H>oewVYa1({~w_6 zUO@RcE_=d>S)qpGGYZzg6lj87ZwayYM1X*@w~~~N!NdFa;9^l}ko7CW2Q%}ARjW1a z3RnP!7qJT>{(T20e<%ORiEYb6>@qj_uaE+1j}A4AtWFKIj%(OQ#OiW*wB&ik05`!d z0dcV7+XUb$nClAljux=N?j3;6?*Zg{Z3ommuOZKIeuK0t7$~3x&ViS}1@IpD6#M{g zfSa7jwYfLAtK7HT4)+W9JAasu@DuzR{}q1=itrGO!b!LW>#z-9gKxsO;fL@ucpd&K z^a(@4sIVZUg!31KcZBzakA&}ppM+b&A0iYLu~!@ykBd1Gi<{z>cuD+Hib1kbagA$dAZN@}~Tw(x-%!qsoGkQl3%T%Dc)Z$~EOTl~?=KF?B}Gsx|eT`ilCN b1~p9^)Q)ONEw5Fyv)b$0W#CEcwgX|ERx*td~BWm&*y#SBf$1}ir9>a-+W z?dd7*-2l4^W9++%?XAl_PwO+#M>W=C<$~iO*9T#}#T+*4V1_t8a{T#SWAuyI&?%eC zbC7Fsm~*%q2e>9jIFIwevFfYH!Vt_geM}s$vfFEd#EbXOLDK;&ZM`XNo7JCisu`D~! zBj2ot8qs{&e99pz8?04GZ!3eMp&g-}YHu8vtdt3TOfxD-RI)B&bYTb6Gl{2?3;Dn_ zk>}wSp?@h8sXU{il*5gHv@o4a9aq_+>5>+tw-WtV^b3xKk?)dX9@;Hfoh1zfEMx;l z$eN)YoB+`Eu}N&wE=mlo_dkDE$i@cT-z$ZbFl+OS6Lx2Ds#e2+Q^O%GhSts6XSA4b zUzFBWoBpGwsVNOkmiHLJa4CWWdnRuCV5FD?SQwZQErE|gY07Z|+lGdAl%;a8vpvbS z8BE`lPWM;mnqhz#G(vJ1aZwPFEL~Q{=>2#%eJG94&G?ISI(~v)R|ff$bVnI^vaP3Q z5bFYXK{)yyCH+Z<{49Tfp%%`d!N?`-#XeNW>6qHp&t5g-*}^UCv8qv&_VEY_MDHaY z(P`yyT5rct4dWrM10y?n4tY)N_;fjyzH*hj$=&0&xnH@zd66IGPx7bv^L&=C@+*9e zzr=6yH~A0wkNLa&m%?*GPN)l)gv-J;VN3W__(u3%_(j+elj5j2C;H-+_`Y~w{7U>W zR*ltT*J3wfAI0uUsx&H{lFmpkOBD%8Z%MbMucb%Q@6wKZLY^qd&&$hlUEY+h%kRmz z@9y0j`F$kK>0!WSxu=k>P2-)eOvuNeGnJo&&0Fw&G_~Boy1Rx WKavBRD_O1gD!Gp|;C(0DB4(&8D?hJdKx8%VO8T zD@>J#6SY|1Ol!#^?h3K%ut{BSY;3F+ix-*}MJ8ql^mi@{94ekBZiBdPHMfEs|0i}F z>J;}%Yq2Ej1rM?dQeU)EXqw2wFiq^$&gK!eCBDecOR)D|<#T=|J02R0-G z&0z~0ULj9B3+GQEW0iG6!(){*wu>FF%Q0b^&_i{%n8nD1)Xo*M>3jyi4RE{ z+sGqeAa+Mi9p(gQsY#ak9U{jg2DNB)qFyJ|u@SVmMeMQ+Sy)+NJCR42tt8lo;RE}s z8QQ?mX{+ zxO^(ir);!noA49_XVA91=PyA#3l1l2VB4cXViR01ak3U0NZq4`OLTpmcMX1ev=%#< z!LHk~eV=^}x5>A+#Mz2_0PI#c&fb)h0}t#y1nnWQIho`7IxMaK954F;@K=v!c?S4; zN@qAX_8iJ?Do3AK2!cRdg9Oa;{_a|Ko%n$$r7^!jw>6h*83v~zZJOheU^Cj|?5Xfk zhN45Sy((N3HiR#PZ-tw}AHv_FEq26@#Vzqy@i%ctyc2pTG!{A$S`2N6ZUY%4Kngq! z7C{4az$NerxC*`k*T8kKEA>kK(unkeRFF2L&!sP=Z=@U2E$Oy&R|c{w_sGZP=jDow z69rKvdV*zp4*v(#y{I(+ diff --git a/WordPress/WordPressShareExtension/ja.lproj/Localizable.strings b/WordPress/WordPressShareExtension/ja.lproj/Localizable.strings index 8c56541dc3470906d5b8b6f9230a2410bc2464fc..3eb594f2938f959d9cb14005393c6d557837e1fe 100644 GIT binary patch delta 1248 zcmZXRZD<@t7{~YJc5nCA)JvhgL`^ekn>6VqVYHS?1IC)Z5J@k|z2q*vJxgQAbi znS3-NkD~rA-OPiKJdD!*dmk*{0i}Xr$tqIu3R_hhJ5(qbrTzY% zl49t#hU3hsKp=Ma2G}4plYdq>W+wtoi4NI8IpQ(dY1*jh0C(O%SkGvn!!jLYI(-|$ z@O96weFhbwWNMVsDU-@kfGSWHWm67l7(9+tT?X9+N4HEnx#6|U!n5?Yt*H$Lut~7Q zVcK6q!l}W->~7q~*4L%|_x(>{y`j1qksXPJyKn^;l;U9|tH3hT{s4ZI4b0woYRic( z62wMiX@4!LRyUWOq5dPP?tmVW@Syvcpprbw z!sCZ^dsw$gmX$}5lhIs8`F+XzC^KWqMf??CgDbteajh?aRd17o;3x1)_$FL~%Xmqw z;gozG93v;%wkz;DTu{PKyr?2&{$x8GQ`+Ek9-F@Hdv$mPeh=@!MYtAfp<3Nfal1(oA)j6x8C0cR`3gTLbH$;P72Qo=Y*@mlCUQ36yxHQ_^J4X_=m6H XoAABs`^dK}?UBM#TvD-e&(6OAgSe>W delta 1249 zcmY+BZ%o`|9LL*x+FpAFcCa8a2kT%kwuQ?BCUb!obAod-?AZO|fP*{Q>vMPAmG-*>nVl@r}{2fdv~ef~f&)D`aT>5cUDM`Ht`6qivV*_=|2rPW|S9L7FJMUzSd z2$2{j6hb4Cgg|5noiGSfsP748M+Gq{Dq8;$BrBrOnK2bzGcXT?;?RLiMjZ{eql7r5 z;wA7BX6f2(F?ZR~AxTw?l%getjBc17k0<8d63VE$C?hO_^4zJ)?csLC7*q_SKadi$ zb|=ba^=x<@jk)V^38=!SsIsC+C?ks|5;_zuotvx2^W<@Sj1o%zBcHWNyw9<9%ciEh zpfFU>l6!1M@QQ;7cY?a2KED!A32nM&A`R~bb$g?2q83N0U=%!b`O%<0j3R|sUa-5( zl1}Q`(cTWrz2(yigBQWp=JF;%&WZ{1|AJO{uP%tgqN0kDiUdP3kk1$h#m!JqF;x_NMvSL%&Qa@$9M%k!H48ot$g*IHNh9n>qAciIAmr}| zdeMj(3|hA_cSC+(R~>vq)Q`-etR|Rx-doIFdJviM{NKpiu@Xp~cO%{SduQdQq;&qp z{czH*y^TUWjxrU+3AhAr!FS<1XB#7L;+yOqw=|&)H6ZKqHoOX#;Ua#>9mhNQJx>f4 zaG!d99EM>6w!@RKhw#`B4s%c90lKOx@kaDaYP1EWVGkTfz88`lyaIoLYm!aj5~lTW zl%JxVxPM_G0e^)n@FO^xSVc4VGkO;;ch2IAt_pm@RgD*&75EZU=YG_s1&jShbay50 z<#yqx8Ll*C;q&lIIBN}Au+CR_nSH7~l^30a)9^>@ZVoO>{^u{qkA_Uz1%e+~z%>hB zOPrmCW9P2JF?%7pyOe11{sA@o4O@*Dm|FZBT~&=XMk(HVULI=s1Zg`F(PCxVVO!m- zY_xeB*SE6hiajPxj7V?G@CLjL7cDbVD;(F|)wq<|jHkFV8?{!szK8gJA3|2^44gdo zw|@%R<|dlq%WzyuZ-*n2{b>W<&E}1aNUd1sg|U;w>%=tiDe*ONk60#FNR7;q?~(K5 zcjQmxD!Jy^;qW+G90QKqjt77S+dva&1p{CZ0){x{Tv;k2k24y41J0IkiJ8IOaIJ7gUl<;W#$gE>Li^- z&QfQGGwhU|udy|3n0=M~nEirX;V7<^>)?D`lvB82?jm=SyUX3@{&MYg9d=!DO}jpE W&AI;MoqQQz#ndq;^aay(vbHWw3%0h7fnqkSOw>P=fe1xpde?L+$o+9V z&+~h}FQ4au?SbvBKx=!4>s7bM>+AFfy1Ij*p5EH#kQGI#bB!v*HB#R zEC$0jO$Qof-~l`s1`>#aD1aaV6rchP*7UrBM2UwT2~ASsYOvUKTMMU%$4h&Q8c@~2 z>J7uz3LQ=b9;6Q9XDNGi*!txE653_a$cR*r&+Wv!=(-ZW8}TAk;$f=|KTp|Gznyuk z+o^*nA`4rq^xY?pY&Sz)$3;nlE}d|X@tFDuM9HL*{AYFCSYe+jfaAo0qy8OQL0>}D zd29#ww@K=tr0Oj9oIqM%%+T0=U;TZA1-O0}uQK~^%6ter*(O@ZIBsm=Zu5TAkEGJFf#c@!m=SpJ&hG2Cf>5bajomrfoRW-_53X{N_K)zZRKIuLS`7 zGO*!VgMtwfH(Bal?$3aH8-T@tljBBkSQDAsn%SG125{- zB13PIw&Mxz7*24F_#@^JzGP{t?4M8PwXd=Orf)60sW%_ZI6$*v-CeATZ_;IWlOEd@ z&4y+UKca>ovJHDh!|Qf-Wn;%->ELVt=gmA8nWrj5qqqSyS_GQQO(hH)VeaY00={dh zJbMmY26JE&{0trv6j4Vwh$i9$;Uannfrt{Ph%w?a@jme}F+qGzK0~_67%g68Ntx{*Fczeoq^lk^$- z3jGazkN%4>F-^>KUZ#a{F+rxEQJB-r81oKujhSRVWfqy+tcz9IarRyI6LyBZ&i=su t!LeK^XXhN8j~nOm+^=T4x!D{v-!uPWDYw`y4ok{1Z&|T?jn_){{|!$6&9VRh delta 1236 zcmY+BeM}o=9LJyQ-L-eefQ}7Otm6R&Ln9sFCJV-x2~JHau)aW{g>u(>CW(zhQ?&}TB4ZekLT_8 z{eHf`=eb{Wzv!&D;!tx->tUzM?P+WGc69puUEP5mUI>b)H&oXr^$*By7e9;-n~G{> z-~v1t1`-H^5P%>86rchPR(80fBajdAQn>3iBuYGNiD;4%R&fpqb3F$m5qYG&3H9V;5_mPe1a<2=JP~EUPI6!g$H7DmG}zrI_{@n-oMJ13?)8bvK8mo zW`J-g%Mv>b4Q%EI5pE$Xw)ve>un#sWVGV`xQ)I=n-Hm)Wh-9c{GqgF;pfZen*(n3` zHm1=bB|6gSNT*NdOgDp zbhw+*5zXyRp9ZW|nfDqq|!D$GE*aqzM4vylw4mLk{f5z&f)B_t1~qgt>i-DHQ)hhiQ-9vtH4tGw_P_QGARp z#%8W0KQz0rDg&5IPDga@>jeIguE*b)kK=o6HEy+(mr9^EZUfN3B$EmMOlqbIWhJ^c zd&+S7f+@!N>?66ov+)%#fM0oUw5~wxVP1GVg7LRNSjitDv-EhRepN)qS z{)!tLJ-bNMsDI;GWGeP36SsuIQ?a^DGt(~d6V09{1_Mo(!6BhQhakkjNmsgvvEpHv=INL5jhoPoJl!=x^y1y>1rWW^BG-UN+w`|6<;- z5SD$G=PeG)Nd_=`87G672=fs$$=qZ9Vji*_yMrxb8`)0wDEk&0V-u{-RdLl^9aql@ U+#q*^JHx%py~nNKm7KDF0M(7a<^TWy diff --git a/WordPress/WordPressShareExtension/nb.lproj/Localizable.strings b/WordPress/WordPressShareExtension/nb.lproj/Localizable.strings index b3d1b757a91cd346adda5e40c559c81f482fc6d3..b6c2120cdb9203b78da90a220ec79064e93697db 100644 GIT binary patch delta 1306 zcmZWoO>7%Q7@ghqu6JXHZd!pulqOS3LLpHgs;crMHBFNSDoh;w?>e?K_Kw#RPj;Q% zu|-;{RI0f20?|M@%fK6YWDl)eeb>R z&Hl*#$ZN%g<fH!R$2+AXr)ruht}xWQ`XaHfSk47c2_ z2Yu#xTd;*aJTo)HPedSpTArLJEaE2WQqg;O*@dWw2t{>@p-&k0v&;A;QJLVTI?l&r zt(eUs+s~)*hTFr{G-h4Tfy{*+*Jq`yKu0zr&guek8kiEt7K5_qP@|pApdKzIiPMJ5 zXam>GL$l!>*zHgkS=i!tl;QE*e5XUVa#_MCF3wvPWMWv&G*`NHO8gct$X64I+`$dl zN0=7hCZRi55|0)a5W}|6Sia!+*kdr5x0)u67F=*0h8>pg6XTyoj-R9;0}$u|0vuoi z2s*$8K45UN@&dL9f~gK8uH%>cT0<mwI94-9 z{>N~FS^-DwXL9KzA5^Deg)~MMbe)=+;AfP?&Tp6RyOwr_3I}eLa~(_g5fU#f5`TmE!pos0%o?o#BiwJW zpFE~QMPd`O;$Ow!V*zSF$NQIo&|eDDfP0AA<)w8j(jG$a zGtuFpO8+Xf!l>8GQNC>?_>Zc}KQuP^%f_@4EOOp>fVB!wM*n7LnS z=9nmqy}z#>kp@diBwP(_58m9i0r@x4M7%6kBR1wYF`;}Yw#U`zQ`^P3R8BJH?&(+AG?w_ObT4 zc1!y{8jar7HT|@HR!`}xdPBdazp3x(@91CZ-|G8D!+6zr&$w;e9WY{}vB}tSJhm32 Q@xk~~JQc6}%yu1*$0gWa9BeemQh6B9p(f$Cr1Lzc z^zAp29plXzVtezpW5I^&v4MdBBiU7K5Eq%4BdK%c!sET=VcT1@J#R8UkEnkVQ|i+4 zR;iIp^Bqz*zaV!cYQ=_$7=~Hfsjpn==hq^y^9331*sgrVujEIfsji)wKoB-VEwk#^ zz)`e_`IwYWOyum@c{t=c3_JWODgDCK5OQWQfnLZ^%Hc(~g=^s>5UdOdY0ITcXR?A` zaEfO5cT(zbX9k)S&9VOrisnaMh+4=dXog_u*$jK7P=#NLbgsPD(>@U{x9++mS2{|0 zOzOkfOY({d|2xhZ^8v%~!pqND##k?(+nHJl@fmocYd6}!~kC8OLul4YUs><)GJ$*)UcjmuNd?-ITlvT5SiGx~>kv!y|-}?+q z6BEwa1XGcUI`eDhUBZ8j(Pt+ITQhWtK{H@0<_Tu3HnM=lOatl4sW20EHS70I{Yc!^ zdilk+UVc+asim-<(^YkB;&Y z%Bj4d@F_zE-!@?uWVT2z6GphyoC8^5lox!zw~M1#un8N&JtO(#wrBh+t!LRtJ{IOg zOxV9<%Y8BT6Igs7R7BSdh(Qc2fj7Y0U>$6L>)6Y}jyhHAk56UOx;c+B)HNKG3C^4PGv zt}oXLmg$yhQrPY6jJGOKv%_ijTsN)#8=a?8v)F?Y^O(6zTyQ+(&s&R_#WI?;i3h|> zG=plNdIBXfdMsTC?NSL-sV_Gr-*g!VP>z(w1*t!4vYfr3( z8Hgsbyxz~gcAsuIgY-qi^w2URob{K=)ci;AVmp3cs|*pm5Emk#-kxT zIcK_?rps8i&x2Pi`#l=_W&24tqXOX2-{c-z30H9VsWY1dI!BHpP=uA+UcL_^G~N{pboBQmi$bBl}*@CYJ`Gij)mxC z!)no=LJxuuMVsy73;7iNIMlA@_3jziVv^`h`NX+&D;g$b8zD4F-ENB4nH7iK7)Ht@ zWxHmikA&L#C?%mO`nuLlccj7DwPrAE77TE6M+h3qnV6ZTbyW4!T5LJZHM=o|2D_1j z-jjxDS)CN~`WbplLG+T^Mn9Jq_(?hy9HNI>o0bd%xQtp}?_($W=wFhjq{8fuFmQBF zIWv@FzQC#chq`0lu6fAw_d(p&ocke@Zpu&XthNv_?%AYY|^eU@L zUD;J`DF@1D%42mv9ampe delta 1290 zcmY*YU1%It7@gfav%9mCO~%wTHci_bYucu@v8l1tYQ#;_v}w1SbpJP-&F1dT&F;<4 z-dSd5HwMID-$Wl=ZY}sAh=N*dp<=N317d?Hg5Zn32ucO}A}C@p6vTRGHUylPJ3rrd z&iTG`=1Sj{zE{sZ{%m-BV)FFVnX}X9&POgxMQ3I&#^Q-&DxJyB<>vDXg+){>X?Ur8 zyfR9btBE*jvWwo{5nYH2NN5T~ph8)ILR~NfOR(XAY{FcHsEi2BU%(ncaHeh(gIY`h zFq90}>-uVX5-*{K&TfO}SwPyqub_6%Hi|m2Duk9{-LUN8;o*YXm#pgs(lA4yr*&!9 zKzfo`HDX!$cm_OMH0cSkN+*N}~2gwSg1(*tb7v%;1|*ty+# z+UaB`z5RV%BQ7Cqw7Imb(*vWZhS>}l?3j;{QUy*J)W(z@27@OSCJ-%Q9a?P-sTi&q zO`K~VE@5VZQMR;ZB(|>F^n{5 z(0DQyNks8;b|S&w7Su!TzOH(eBMUKXH%tm`!_`($ADF^+$#uh(!zW13)GZw$%H{(7 z?B9T6TGy;;6friTQKtkqR_5D&8{BVfF-;!akr~HLY}urojoXN72$>ptC1|r-%0V_J zKLiYQfWg2J+Zo&)?w!PZtrf!YmN9H%vx1P$i8JA)qKT`R@>KF_d&d7WD5yh>2KTbVio*5;#@JQg!B94e zP|YnZs7KweKgwM@3aXmo+2V2M86vb|G&J^-JTkTrrnI3u6T93wUbNzf;p7Y3_bys? zD+2^)B0Ry=i9j_tz`pZ6$?i+L9?rIrcw<5B*&2bv7O~0WX7h!fVr$a*(EN6p1CUk7 z&TQLvuEDV$>&XN*8)f!>AbvFOCYR8r;Rwp73|w~Y=dR*(1Y?WCW>SV;#+3h4j|E3r z-q*XP#+|(JPZh-1$!UauuqwPDTo$eiH-#^SUxnX6Wi2_&!&jDV-WBB+5DcoVz}J_MhEufT0^PwW(X#6#j)F)3ab*Tql7&&6NF z-^ESwz67Lz6p~J^NoS;-RFc-Dx1@FH3+ayZhjh1j?rTpEY2=3+ev`;~IPo{*F{{X?yq;UWM diff --git a/WordPress/WordPressShareExtension/pl.lproj/Localizable.strings b/WordPress/WordPressShareExtension/pl.lproj/Localizable.strings index 03c3d0d72104d59c1da96e0f0880cb7485ebc539..6d16500469bb1d563eaef8bf6352ca54b38779c3 100644 GIT binary patch delta 1119 zcma))OKcNI7{_OJJ^SDl7jObJ!b4DKf>Fey6#+`Xjst|aiEFQ4aS}7hPV7xKyJmMb zU?c=;)eDzm272L8!GZS30STm5DpfD-p@*J&;6$Ygp&St6RJBE{B?@; zTlP1Nk!KkYZ z)6@PJv}{I zj7-gHX);d>3B#Jj!(@(@f-SoiYp_=}ZK6}1-xoK8Gtp|*tYtKVnKU2Ob={4z2Q*Ve|1jS5M_f0MioQoUooZ-6svATX4(XQ4va9oCPNCz3<0uRPt;r9}? zX^;dqI0YQ=1hDKVsT%H?H&Y8ypn)1-e#h8*v)W!5YO*rO+hIj5&-7-NV0Cj2*S&)e zzX8L%1$93UzTJdTK!CpJf&dE`fP$XJT85#kIH1>IwCZdQbhE|F)vz846!v+5i9m delta 1096 zcmbW!Uq}=|90%~(oBcCeT8DX=l{sWaWms1|nD$3cD=qWS-QJz&spsg9=jOV*?CzOX z6!a9m)G@tAJw!nf6$L>BK14;2K|xPJLcIt@6hzR!y}OA1LDbVQ48Qq)XFjum*}%zA zL*3?jzF~`mwr<{7k zJj9St6-fC@x-vt$=8S4a8e690*4EZCj4HE7%a_GlG-q6Moc_otv2*9twoNRua^vi^xODOSU_J|HEZrn3 zRTH^c+(E`E>x9)sePL~Q6gQiOOAWRLR&O3?CdM$;u~R4#3)69Pf+h<~KDejZtB^MB zsor+)Mz5^*j+DR5t5LQo98ABG*_oehzyUhtgmWKvdwU)?H0;3sVa6!+KGoLQL$-6qTzO> zgHF1NLegvtT04IrOx=uaVAsrdVsGTqidZkPH0MCdzrcf~KQ=avdJlOum#1Vi@ZewZ zDq~GXM$hc~{`q;kM5mS09?R^@>($9c|Dnemu7q{Ns^6HF|H7n#C~!cAYf0=W;An(> zLQA;3%G!TXVOO|?f7Dn+fdZz0>!pN7Ko>B7%Q6vtIpbhy+uGzr~(NgA*5VDTtEo591v1DpRAx^t9^X9$x z|Gob_>VMRKV@`^+=lWkhQYx>Zb<@I?YK^?JVdpd0#->*`4rFSGVYo?~47wg=o3Mr% z9vd6uM?#RFk`E6TW^n~IZ4tX~fkM)B)ZvhnKQhRCV)d zT&FEuN@K6d9OzNlpsu%^71>c05odJ)5zS&W>5<+&l6_@E}%Lt8$A=j z9oTHx6j|8f_mu+!xv56O-ppl*XXB+Q%YvRLRyK^q=DJPX8ZXG#QmI_`2JB=Q72gW6 z+gDRBF3lhhSB1uvHyjr;5Bl|1)5NU78R~f0@$#L<_~)Ua<2J|u1X_Rq2UGzB4M2el zJb1YH7Pbh2=NlfOj=R#)8sy?_Y5%@bCkJ!|SfQ|N^a(h9ysjMLr#)=I8n2_8Y?g<0a(i7Qz4p2eP7^K%6A74x|eSVc%h zjNi~^crpGGe_tPuSHPm+V*v(!0o;g>_f*9O1AE|-KvoBoOFG>UI(#QEVV*p-J;Y!G zF$6n?5L3yv8bq=?_9}ekljM8m=#u|(4tTnXQR~h2X8uJ<4V##VRX`T}4m{8VHlU>`iieYt%bDpS z1b;RBN3X!h7_N3PQe(7x`T}q0asHEbkWWNYd^^6&k7`G^mj2~Xn(~^+CYQyOe8kJb z6b8gDO)jRL^-c`N?X}hzEHka9)yaaTIhP{ zX6VDvj;gC8>Tz{aeO+BqE9xEfyRZ^A!js{J@V)R?;UB^e!;dvd)3v9yVQpHQ(+XNe zyR2{PclGb}pY@0OpAk87EHWFx5f*tb@=@e*^h)&G=w7TAqp_X%?f6|IVI-bQoJcGr Q4<^qg-%hUae9!a$0FAP-Y5)KL delta 1325 zcmY*YU1%It7`?N1W_Po*vzZ2$(B|*fm|BBPyTz7TA9S0jjmEUe&Tf7-+0D()&F&<# zbC;RfZ4-*cfchXv*K6@X1YcD0Pzgj4jNn5NrQm}WeNwTCLJ@swArS<RI#VXd01O(y02U|%1Zsc+ z2e|0ajApMQT*ihq{{qnsjLy|ugIW%gAyTsGTFqRY8X-%#Zn9hO5{pXxeMPn7e0|Y0 zoQh$UQH?t8(9lp(J&>)L6zhaxm~5`^KR7jFI90=O<}(#+dy~YrsXf&?T2u#E0`{Qr?>^`1M zA>GDH?*9q-^5YcY1~yE*XcFWYE^%@J3)>Wu&3Ag0x!|*fwJA<_m%}&6Ww6=6Hv2e=*wMCRM^SCp2zLcpw872dZ)~LPAf)Obn+R*k zsdUXWO4wck=Xp(ZV1r))Wt;L2>q;C+?gd`LmL5=g9(^0@XB8izM%RDF`8_cIjBj~3PaK_*6;HDf*^LU(TJ%!%wdi)+_pwy$Y^)Ny z5PLcHL+rM^EWaYZF260mCvVAjFFn0iMvZBLDyZ diff --git a/WordPress/WordPressShareExtension/pt.lproj/Localizable.strings b/WordPress/WordPressShareExtension/pt.lproj/Localizable.strings index 707b909161a8fce284f7140b03e116b70c212936..c4f1d5818bc674189d3318a25f68bca347ac6a10 100644 GIT binary patch delta 1267 zcmaKrUuYaf9LHyNZ#R3l+Foixl0wXsnAmy}602Ag8!u^EB59i5|CnB`bGMV-Y4&z5 zvva3GrGY+Keef84sxQ?CUxXG^5G+OT#TQ>iEGn%JQHn2p6I7hNOIj<{-G^m%X1>4q zem}ptGjwO@of!z*GviMkTz#T)7FTNyS#v#lZoQBtKB2H<3p; znV6W62V+P+r;U#lkC8Rp^wrvZiwxlwrarFv1cg+PFtWpRrvFVJ8eE#f+|%ys2eF`% z9FRx#0co4B?Rj}Ynd`<-Nsg%BLr+ejHR_Y)Ifn|gq*5zKfYcI1IA{FsXf7Jbe5@n` zI67I}Nnj=4aFp-P0gK0ISf`=Nr}sD!H80ZWFpJ>cFw?t$kF0|wWtS`44AfNwp?ZG? z?18*XS>iUS%I_X?>m@-qnnd7GIgGILe{o;UskAXi4nYBHvHRc`3d~n?#S=};9n58a zeDs0npDCsrKCNNC26EsxAV3rN(Ged>JG7?ID0#AbjC&37$!9$#-06tK@=ixkENk|G zzWaJXbxYKc@~AyF^q;*TFB>UoCk`m`1O2_-9ja~vb3uI%@51-uZ^{?+(FlITUH=E~ z-f|i#51hD|D+)WvC%eeY5pty$$+_$<=>NeUFLkghMY+-Q`1#_z8!(Q!@}EYmDu}w# z(H&KlfCV0jz!>$hU%m>0VkdpGvM`Pfy%GE&B2W7;@j ztQhYb*Nj`n@8%wJz??Sc&C}*tlbNrZ7tFWJkIn1mx8{%L?H<_EXYI8PS<}|Mb5JE-)<8_t`rytm3*SufS*JOZG^ADb_b% zU-4*Ap?(?FSRmr@xV#x1YMmY!&QH^zN`qi2UBSHlop8>0ezTwy8nUVw zE*1pMQh!Zu7-RCH_LTg|8t&byJkqX|+arT}wkJAcP`&0c>=JjeU4!OumB?dowC6;M zIu$g5}n`7O-vyCZXzl6H4Wd#FBA^ML182cHcprQUz6U>pKQv!! zX>Vy4wQsZ^wCmbmp?#rvXfm`M`Z9C_8gK|E;32pStFQ&%fal@6a06a~SKy!eHoafp zuRo?|^>zI{{UiO<$NIPWZ~6`WZvz?;qt|%IIBFCO$7mX_7;hS%8^0LW!*=+E@Y~@F z;mhWrxz9Xk9x@&Cr1`3OA@X75a^%M-jP^$-qJ?NB`nv@!+ZwkftZA!gHLNq%S?j!Y g$@;<`w;#42u^sz)`!)NVy>5SPUj^!tU-bk diff --git a/WordPress/WordPressShareExtension/ro.lproj/Localizable.strings b/WordPress/WordPressShareExtension/ro.lproj/Localizable.strings index ac89018393a08958fdea3920faf7f7da9d0b58b7..640f60915e7ffb04edb890b4e9cf1c0d88634d6b 100644 GIT binary patch delta 1337 zcmZWoOKclO7@pbndi{#MZODs0GD&b+l>-;JmI4Qggir;D0|FtnJZ9IS7Y@6#GxI;b z|NFkZHE?U-h1}Ha-2BO8DxF!#=JKZ&mkP@Vi>Gm^tdmNmTB9qgY#~J$DLX~2H&w$H zL2G8yLbhXCYp6ynGCDfS5Bd;)L>i7~kCF;*G7-Cb)Nq{*eDZ5jjCvreiWBi(<$5{ z`59`gqFG!gMJ@J#mxG!OW@4S_{D$1ypP6hl*jgq{9Y%7Kx{e&ttf*=8%@U(_jc29J zo}SE325MIr5o?9A?Twy$b5qzMRWak@3Bx9qgWP^gNm{O;ViU)@lSk1V+^DK z1}#8=0jdCj1~7pQ95h^boahvzxrRec!(MF9>eb@guxs~ny9Tlav0}oawoj0=kJsgU z_+dFdP}J`JAHq1(U5vy|Ws)JWtrBU-L$*o8DEYYaA-Qa!`5P^p$k4d;Mt?pu2WlZx$78l z$~Cu!r?1dwMeslX6Hgg9;*G&Nl(|1J!B2PO`GH_zJa?krV6;qy5xQo@+BDo`q*J?L z8ni?i1sPz0I+R5LQ+zc6GqwBp^PztJO5kuXH|+=wh(q{Hr0*_)AxT=)FcHHDTjI)O z{C#DpKR;Thyt}A%PFtq?v+D#k1hIIEz~ zqu^)3n<0NF8d?oK9eOqNY3N!QgpY?mh^UdrB5y~oM1Jr1Ga8OAL^q;5HWPa@b}{xf Izpf4b3kYwTO#lD@ delta 1224 zcmY*YUu@e%7(eIi#7P_{v}CknrB_P2YK1@tY=dbUrE9y1(ysZ_BReN|jvd)f z=&Au?;su@-eM7u}GzrASL&cy7G(ZAW5Iph39x5TEA%TP@cwwkQn=~#?hlDKI_gVMd z@85T~dT#Yx$R|c8CQnbL(wXdZE?+n^Gdnk5T%e0ui7k~6F6%3+MkY<`Fy*^%&_HQK zQ61^XL}f%!6|?6ZWHscz0a&q_KalT}x@Ob5c4M6yHGs&O`Vf-TXS0oU<4 zkfq-4Vyx|SZPC!3W!)^3s^z%JWU?6Bo2?oaEis@t-Z>(#zCt?qs%Y z*}2`;Vk`kF?t=4Tn=+HFmZ;0fxNfdCKJSAq;RRR`iTYpXNV5};`1b9M4tjv3*1{?k znmuHKRv1j;gfg4bwPiAFnJzQo08Sj5AEu_p4C1snOs81Isj#;41ACG9gGi>l1-P~{{wRI6BeO$svC6CV8qc~=1jLx;EE7$y!}9AwpH$)bw$j# zO{bZ`G&h^kU4vzwrP?Yqe7(t;Q>Mdgx5ZZIuwVh zbo`Kxe&DlY2pGAjhHO4vF2@Vg@#A6v0Le#&8w$nU`}7z;bF z9oi3f{GIStDA85e4OC|>iW;Y8BMl{+4}7H@hIax_g6Z!FvjN zY`y6Xs8{<}_?=s(5L8I z^eei7{t`@~A-pGS2|o+J2{(n?zK48C-_yPY-!w&KNG(ce-Zx_cf>mqmSia+9g)VQ8A+2aNuNmD(oO$S|4IK; zAd?Af1h! lK;-erLgZ>>OFgGH)Hl_4qe8SVIu@OcTG6%WHf+Zp{1>Aye4YRR diff --git a/WordPress/WordPressShareExtension/ru.lproj/Localizable.strings b/WordPress/WordPressShareExtension/ru.lproj/Localizable.strings index 9c939b926e026b1b9c5e9f076fec1643f189991a..a2c7c2fb4b2e5816b1b5163f83681a9059eceed1 100644 GIT binary patch delta 1287 zcmZXRTTC2f6vyZC&Fn6F8=$(-N*P3oxCNI2fq><#O6?EUH=> zO$?>evW3Nxk~Fuys;Ooc;@mZ#FZNI&mouEldrj2}d%l*$h+@$U&bT269#d=F& zHI4%}6X91h?RK#=}%e%Z8qm ze9+JP3iq#iE(Z}r8Cg=Q$Jg5PrOD{RSX#B@IV8MXTqcIdG@m!}|9WFZ4`L(%I@{P6 ze@JUFmP;d#QsePa)!bA~WLY^*tyH#{qqJY#4<%J(nzWOCG6);?Zr+fdhE_2IQ;sUO z9kzs1aO4QVYvLI=akn&4a*6~d8PZ5POYc4S5QKH91%4D7##M3_ z{bw-jA_*{U#Y0IQ26m%$s-yv{j*&rhE|QXRoz!6XEF+U4JkwYRv%@`SGu(Ce!Bw%k zLnS^8??7Q6+6A;;9ee7>2?FSrvY@^q3_E9F z$>E11dn3Hyc@_W53%Fwo!O!+H@Uo-6RzpG^hzr++O%IkB1WM2gQrk<{m|M&z%rWx^ z^MK`9KO11X*>QG`U1nF=47$FYSmTcE;pW42${c30J7aSSKJC2_me^z)a#w+3#A5?tj`fq0 zKq}&mBFy2DO9iMENEJnmghUYqwFn+~;h_@Z0Z}A)iG)B~7<3#1+ z;v-6aQ_1I-BI|Ol_>$yudM>_?CPWXo*g80eE1e6mY)UqW6jZcK;o4ES!8`#QSaLle zM~fu*O|?e^UrA8fDr=?Yii{MJHwjF$9_M0MNv=x)T{DOVCsMu1 zsc(~o@~0#?8=%r@J-0I-r0%It8V0^(Yul=QQYt5}83zSv_>eBi+p?m{t16N5ib3)- zWfi!>R2N>a=NHT6ey=NdwsIyyRFX7eQN>V6bXZPipkQkBE=+29k~7LahEgfXkkk2i zn8+zf*CMfSFd8CH8qp{{O^C-z^Lp3h=vodFV=JdghFEt`!EEB^A3V5sb60)I(%)ZqIDe=>ZZE`;`SK)VsqDN z_#t}lqi1bp=hSMk|8ObgG+)!Kpco3HAZjUc)MO_fA`~h{?Zlk~*Z%if7u%`f2=wt) z@Rj*EfY|)pv*=ZH8GVR8M?a!H^c$lw1?D1igZYm6iTR!R%k-$pYw9trm~NTwvK;GX zeQYng!fvt!_5yo}y~=*fe!<>m?_n3N#>emkj^WFA7k`AW;~((P_%8m3V>v6wbAE1| zTi`VAeePTCZ}SQB)8?1Vmn^SEt&FwVnz6oRy=ML1de1g*d%^PF^}*$+Ai;+!R1kzheGm$!;EN~ zCic3BI3n$d=1#IQZ5nX5KW-7aO1VLc1|v3in4ONZH{m2IG-X&kC%I?SXxM;jri(3ka5!_kUN>5qGN@b~8qb~N_6oOwW#4J$l&T$#ZoZID8D&um6;T6G z%)~36!{To6tVnnlM8O>qJa{z3a0o~ln4$-kHX$~BF|pr0BL4F9lQNnId=v*!4YfF$ zL3)QFXl=nZ2fYK@SQgSwShc22)~q_MHJ2T>jFPC?(F5)_XvaE_4uRCsFPN241{ui0 zmpcjuii6l1gtH2lEoe}Kf;H3>)c?F}X?;Qqk33yQ2{>!^O0sdP*SRfP;b+8+;0w1t z_x52C^B)q+%H&fVorQV_F$n!380CnH^Wh!44Rit&s@=1Hx}Az$Yt_z(jjmfR{NarF zNEs9N;QcZ%EPhZY#pOU$JXTVoFR&s$@n^(i^%y?%1k#|k^H~GTH4p?nz<{>|7CULR#6)OQ zyrJe`pm{*UIvvpRHuW*@n8<4fu3SYM=r-W{4gHH{JdXF{7x8JFz3iu%=~wA**)NaFGqNMM<@e<~@;CC&uDq-2y5@S% z^|9-w;!(zxN#&SwMp;m*%5~*;_Zj!1d&7N0^{azvbzDuWW%Z)EuC~?B)Vt~*9@*pb zL_G;F^?u;}&ij-1kx%mt`Rcw8eRq6Y{(k>q|2zIifq3BUz@NdsU_A7C$OzpI-3#3h P`@`RAyR?I%*f;VYPr`Ta delta 1191 zcmY*YZ)h837=JJCUGwMurL9rAcJ|ts*-j0nb~<%qtlgZ$uFcY5PmCWgq$|B%NUNI2-}*`vmqf?BnurOz}l+BjLJFo7e|e8R{U zv{Bn~sRjFSRQXYc9z<(+Ns+&9){}iLvB3ebr4SSv4ITXzuHMkNEUrg1Xg; zrMY&~TRPbO5_Pl9uhF!_Cdi=_GLg-lM+QgXZT|r%2L?ORK{alds*d)WT_&Y!(WUTC zV2~RCTZzJ^)Zd>&aTbhf3sz*83Zh77xv?1=W!d>{V_e1@e5FpqR^S=Kd_u$Lg;%QIzHW9(!jX0;idHr+gT`^@d@-?FdACPr)VOWT=P|%^|j#LW4cp zctBKdbm!0%sxi$9A{?C>Cwkd%boNh`(a+EwNWpD?7X*CW!)9w|oQ$@a6V}U^EXJf! zPGN`1HniPX7OSzI5~|t31G{@U1W$MeVJ%x`?Yt+cgR=ut@_q{ zSNxKH&>#0-4Qz^{_@qe0H^leEzod5QoODV0Ncvv7BMb6~oR=@l-zYswO!-53pz^A$ UE~zzjOf7) z7AdMy)C;OO5Dln}Dir|-E*vUIPqegBRm1@#I3OV^A%zQqN?eKr2ZR{gQ7;@;JG1*e z{{P?i?f32Xy-Q9F7hXrjl7_d+I;m8RS~i6ZT%rZFE2SeF!yU`Dp+hZu2kO|y6B83` z*aO)s;?Q93EZ#z{!DEjtTM#u6F;LOK&><8%>1F%||1-!`Z!bG3`ts>CDm&REu2~Jd znZ(q!O-LZ&Inb>e z7SgcB4yCT%%uKy*>}1k}8aO|rX^`?}1yxPBMT0mx%ZZmeJ2OWauw7xCzqg37cd2tE zKZ__XbB}9_rh{z?oBh_4q@=@H%cR((*|sot&(l9;fD}NW0SGWb89-167H|NCLmP3d z5d>H2lvt*-*7n+}#rA~b$2QwFpu@p(hXu8V!|7o)X@H%U2A?aaC;q2!(9oJ1v6IRq zV=U|)Q*ud+G-#OxwUfOnb?!ZRGjbuuL9~$-)L#Czd%Wcgug+(JX*qYXNglI4rkdhk7-G7)@aR_&!-9!;4!elMNXl@ zX=p&_L?pjk$C)kV!^@VA;+YB!gB>SXRh5mBo`vV5Cd!`Mve zlsAUBEs+(%FMOU4$b!(rqr2I4MQxcx-sxxZOYJox>+>$aY z*`MJDtVfQ^*)taRjoDBBk>KhA*N*uFD(vs*=DVPtw6}+P;N<;Zxc@kO=?S}4$ buZ2I01R|4>YUI=CcJ#~W!{{IEFSYMKZ;+I$ delta 1147 zcmY+DUuYaf9LHyGcXM~Udw-HNNR!r%Y0@@9&n5wFo2MkrKYID&{Y}iD%j9-)H+Orx z*WI~jN~zes`q1O&gLx49qzEkp5-Dgxlv3i8;6te>6k4b+f)8qmf}neMLGWQ_nBn)G z&-eHH&1`mVcHU;kGAm>?tJAeyzMmC}Mkx^|>+qK6r9K125kc#SArs{gMrC9n2XTC6 zK4EWQk|WGqnxZ-*c&5ymWjdgWIFKAFmyM0|Wx7Tx20Rt7gHJwvDidy*t*jc%$ul#D z%a+3vW;9)PZv&E;?t~8*fKl_pVPj8TeK_(cjjGb(^g5 z{{!9Rr!7p@2{Xv5L9xR)by5uqYzb}Ek6#WfHnvB1ZAo)2sW>%gmM0U88#FOYvPGzR zPDd6dO^4dN;bTbGF()}E9iv3YmKjgRqKRqxE>9%f(@gkWykBN-5}RDh6{wzf zgTK}u!`09f%qczaz1js_zM{-eFg;H(rv*449Q3A!EpEA?pEObM2YcWkbQYAR__ojI z7ldBeR|ep&8iqlCE0lsm(Ci-^a0`~iW{%j!3c-!;u~G?*q7wQA+3r(}x{p#vc~n5O zHmvZgNB4BYroRJJwFI}6i#RdCuF}QY zUH?qS;#h^7>JQq8c0;?R w-PSg>9qmP+H;@iw0v`k(2Yw6Q4}KSX6nqkTEp#a~88SjVbUpMO4#S=Q0tBdX`Tzg` diff --git a/WordPress/WordPressShareExtension/sv.lproj/Localizable.strings b/WordPress/WordPressShareExtension/sv.lproj/Localizable.strings index 070abdc28ea69070b803c5927672d080f846e5a2..c4b44e0f1f2a3c5572559d0f628583f583ed7a39 100644 GIT binary patch delta 1280 zcmZXSOKcle6o&82cszc45=5N@h1}*P(nN-+Ao>uLG)<~N>ZJDg6~{K$o@;yJ@r*k& zwuop&Bo?S$;U3aW7pP^?E?9KIjs+kj#HNBh6;eiYN%Uwj(xZ7NdLbIsbpo zch2s_?!?=f#n{^V`FKJ}rqY@0Ms71-D85QcWtCQ{)ta_d*Bhw>)oIx&%0r17u_)d) zTNbt*)7r*0YSCyk3QxH(oZzRY(r0Lev~(6b7&9?x6HO;2onl*asIA24YwTqTWN{3h zzFnubFSC)F|9HL%UVvJQ*#D1$Q!4Pg>a3R8!R z^2q-xoYK{9jnqygYgC!%7DR598Vw6$|ajBuU7o z%jTn^6uOUev;~JfCk0cUf#L9qcb*ZcFg7|2dCz$>35OUeu~di#U+_^BV;PJUf{UKQ zV0OvT>eO+ll~xEYnU({m~D+L(uU(1}@JS><5-2HKcS)V&8rC+(aZ5Z=88}}rb6WsF8NU45Fa44LItK!5U+s@t! z5S^825Jzi6GcXJ{r1@~6ABt6~8w?_REtcU+|7Cc|uW{4N`3d-0n)fJd%qL8F9(FwE zAu12Zm0o9dZ_BmAok*B#L#&WcCHQ{q`MC#vGR;&1K+_sj0L+*jQ{x&KH>oHQpbN^4R^ zDoCbuQ`(mvc{tAzPu?5z?s`A-e&PMj7xo?U*}iMO+rCeHzxX-7>i;321l|kW4hDlG aK^js+M(A$n$Izqj1NoSIS}uY;F#a!$O_9C; delta 1225 zcmY*YU1%It7`?N1W_NaXc4re!wXwAm(?v|ujqK*~ZH zL{JNv$VN4!As0EwM@$fX9WYQ(e`k5a=V+KkIg$MzwLwODr4b*=UMI9(xY7F@+I zgDeg1Dkpkp*D99j*G;>oxsK10$z(avpLH#V7!(NZYaib}kRLbwrs?~OnL6>dDyio= zUjA-tIWYuryc3R#y-F$T8iY}8%CsBp&xhfH@FJ{=TKrz;;jKq)A~04=D?2vs%~29Gg)a_Tix?m&S-)rIzM*Ipor`>9lC6dvpK`V;s8XcTCHO;735^d+Y2{I#6e z)7jU@f#}|)G-Yd^tud#=t(@qYpsd<)qeF))$YxyP5!eW)z>f^>ZJ-Hs6M5Y7o2bF< zH+cvsvdamzV>+=I^=!h-76{R5e;w((!s6dAsL7*33K>RhgLnqe*d6#worJF=DeNSM zVJ`d-j43_vx}t$09nvVz8RKm{WuVmBXm z1l|u#!t=qWLb>ip*e5>$r=*Nh>fY&AE!>K4ZZ}Yl6SUB3F1=Rq%tk>sEvrHr1hz#M z;Rn7cNgf(m>B#Uow2Q9k+~b23P4hnfHzHCz%*+O5+zt3hp&*1Fh1JC4uf2*+qBH1I zbP-)cf1vAvEwqIXg$u$J;aA~?a67O&kPI9QEC+rHY+?!T!YOU;nv_ZskxoeGrSGIG!O>tk zSPISOLZ?DM$^-I(T$6qI75TFKPx!$wjpQQdBe$cEMW2bDj$TrVN?mc4H9HJ8FRj#y9@-0P?^LS70mOkrZ#^Ky>;_V3qpDhsR-^ak zd*And5B5IT``Ks#oPPU^I5_mqyJv@6Mn+@tvGLvK+9oF7o9axwpPZigAeGK!XLI@9 z!tuG{{K8`CJT6z%B$-VUgH+s7xFfA$o1muEu#w|hb`xpDCVhQjo|x1Ub4(oJ^8jVwDIDiwEd_Udm@OxaQ2J$da{87E{D+*d}rV}0?qS6ha<3M(# zUN@TAjP4pFKccG0Wy4D0@Jyp@=#EBn{3>l#I@eeC9LvYBOKL1nanf{%?IKTmKBZSQ z6thg1nC|SR3Hn2zhkh&`Z7FV=_8aLsXlq^EY(Ng%5VKkece9k;^b_SUomL|BlGGhY zXHyBfQ;aIP6u~O8OuC_T(VxX;XfDBQ`vK`6a?g>%n5w&IhHYWNTR1BqV%wIzbsO_; zR14Y_S*EVQ&&VU$T6g*d~#G-gr{8s#3{8M})9hL^9A!$m=OGL7zHR+o4jr6_rs~ndXWmjI4KbOCf@5uM$ wNAh3FPNhp3QqC)D%1!02@-SEqei-~RcsqC}_*c)RXL8MlRLVf0os9DLjV8( literal 2918 zcmeHJ+i%-c7(b5f#0l)oTUWYvx3g~D%9@2{_Z!gb)JIK!NUAues z?CpJeUte~A?wS7lfrEz*A31vL_zC6Ysg(BYbI%V94h@fto<1`+{=$nBXD821y)<1Y z?kvre&kxOBn7i0_>9R2o+vq~YWW@qqVus!(PQ>(SH6$JnLc-k>4k{pumXM8HR6_)L zh@$|7WY28TUnaChZTHeyX4;gT^Fo`ufuV0Jxpcu{B;=&wIh>j#-x9Pm=y}d^d4yGI z!wC)j>MU>ggjOoN;fBQIEFdlqi6u($m|wSp0K&Eet4G-&cxc%H3G9&NNYP@X09Rzt ztlKV-=+ltvVk{Q41`KkBP9nT{;#nNR(SXpFIt6$`-#FD+08uR4twogN za|44j4TUO0Ti)JEao%VS01qgf##BULBwOe&;9aB z0z>clOWLxKOJtZGHSLg0LDspFXHtMXVY`clzAM5a>WI()mWRRdryNFs2ZuJ?iX})P zW$v3(J`3P=&&v{r*N7d_-F%R%@H(NcN$PZwk)RQyixr|F5fOz|;1MX06+vPDsyTqJ z9S;E((-uQ&5;7_XG4zfH=#Aeq^z|{{E4E_htiVntX&ubly=IoCI2WgF06omzkh$Qz zox{B0nC@PHAWRz4S^!R>p75H_0735ZFm)@;AwjIz%rvX>B{mnIBI3^vg9J5D`N9Om z097M{bgWT}p|`iTLK6r0Y!VE(L~SSP96@9-6DK!xeZ?Zpo)j&1-+}l0b=4ym+XrQ7=!ku;E9h6}~d`4W}8DD1b&xf+khmh4Z)*cipGkL>vy_UHB-h_rsk;bX4#$+y>kphP$2Oh;rgz#obuK1Gont!cw!#qp??m+gsuB zAl?qq#vXP0Ey4x~kK++Y+)~E>qtLW*WQYZykwMz?#Q-jVwD2(A2mRBO zkKy*H$zZz;oi~mTMD27C;zHEFcRV5uEu(AbRdf@*gKnem&|UPSHoHucYs# zpQPUsyA!#@iNt*3^Ta(_m3PQ_`J_BA*X8T-8}eK7+w%MJ$MPNdX9X+mO0P1el$4vw zE#*Ds1La%g2j!mfhbpU@x=uZ&o>AviOTDJPuHH~@CkK+1m#URj~c%YOo^l8Czi diff --git a/WordPress/WordPressShareExtension/tr.lproj/Localizable.strings b/WordPress/WordPressShareExtension/tr.lproj/Localizable.strings index ce0b3f2c2313c02178f7773f5ecf8eda525e2e09..01d16874031e72e709c462ed71a05eff9f39b0c8 100644 GIT binary patch delta 1250 zcmZXSU1%It6vywK+1c6e9Sg~}l8>9Fn>MBm4Snc`w34Q2ut}4+JNuPnv)T`1s_!EgNS%HTl?a}%;nCU z^FROdJ7;rXbKs5a#O&PsGl`^{N@udUg~g@(@`1v$v{=&E%1XJSuU3t8k{PVz7L?t| z3bh$&S`C{xu4Ok#h1qO$bQBJF2%Hdx;+ZpSg*FTxyKB}Wbe-x3EgFnCy2~7OmOaP+ z#6gkzp-=E;Rh5>Vbb{5ab+(*fZo@W-YmvI;xH*-p(=ye~r3q@5n4z0xUPwJnOI0;V z*I8~xH>+fp)>uJ_j_u@-M%}Qe#x%Gm?(R>G*Xu?zrRuK1vg4XYTwbi8DD#b?p*t1G z2p40q)WZzYQ8>uY72RlU#D=pI)MaJfn$bpQiV)drprt>-7yBAc?ORd zD2XUqM>;Z584*-R7IKhFhVti`rc*LkcXi8j7CXJ}Xh92i?ON_=5Ql^19Tt>c4yPAt z;y!p%j1Lr)$N%RrZfI?f%t@vaGZ2to6r*$ifT<(Lq*F`uW#A z2X{JSxk*iT$vh{VZx54)5N6w!{pdE?zCp^91rrY*%{-*Fn5t`>$ByyL8QrPr4rlq; zS>~21ZH=Az^7)iF2ZpxcTlu8NQU(zG=IeoUct70n6}nbYnnSWV7>b&B3>o}1;dW>& zlu25qO{==4?E5ceFI)-uW4TFJuQEPCdj(DNa06*P(S~|-AiAuws!eU8F_SfQ6E1|~ zA$5w`dU~2RHRi%!fnG6+#^B>npU~aW{WKIEN~fCThCx@*X+&`W8C9rMR9CNLj3>C+H**Mn5(m%HG3X~37A?kos=73q1Rh8B3=?b)|CfbjP=zuWw* zGJKe?gWEQ5DT5swn~`C-E{(t)X+QLZ2B9Dyg8RWZN4BRE(BtibjbIJO;fg%YNd)0l zc?t%j=et(%GHP&TiZuQZzGqd`02Vq9bKWgD7wUz%z!bdh>xXXsyc50+f}D?*QI1Eq zq1W2j;UnL$H#JS`)P+{G?}dx#8u|p?L%*PZu!u+SVSE&y#q&6ii@1!}@Jsj_eiwg$ zZ{RP5V?six2y4QIa7kzhH-)c-AB1h;Z!sv2h;yPVw#2u@&&6BfkDk1z;<@B`)AOF^ zhUAk*q$AQ((v-9)6{WYOpS+Xa1@C1qc<*|DR=p48ZaFTWljr2Lye40jzmRXq-^<&+ zZvP>F-T$HgrvDrNegA{Nsem4MEwB~18G^9J(I*F8oS(GyH2L5E+U5 O8BIou(aZ3nviD!;y?+h> delta 1219 zcmZvbTWB0r7{|}t_BuPWrmi7v(wt4YX>Cd97L1`mAx+b&xwU&wHp%8>=VWuTvop)g zY;>_22)^ipb^S`8ELNyDuuzC1sL+QZ7K(^q5nsfL+Je*BEc2B-P#D zpf$vhfl3IYDl(Cc9NagPvg(+W2s7p8frLjRFxOjg5|I_BgXE%(mx~E5zDXQp+-} z?2fe%j)5X{!G_o-=hIbUyC~$>~G%oB7&9#1a&blJz+A>M1 z)1s43F-NDVW29Jy2H!i7f7-CA<+O5)Xc~4%$<8Jy(XeSG(}{`H6n)M~rQF>@_(1c% z-sgh{7ZTK|Sq65@X0}53p%c_8HoMV`<5rLvCv}ZFQ1uVPlYv9(LW-6xVquLMw9X7* zf&F|3dfn3rv0$V#ldhL)I$1>-cStOEFbJx1aiqJe0pG|UNoKeo#o?}$gUvuc*8}eb zN8qei0!I1o^xyGm$g$6DDoo8f&;#8s&W)@4834Rv$7pb=TfE+gpb|=?H6~y4};3RzI-vdX375E_#3oWB@ zm#HJoRax+AAm-1Fw>rw;^{6Qs%4X=VUaSMc_22!egDEd3V(W{&`|fTzlhGE%jjeDIrihkz| zuED*-UE{vze&PP$w)lPg0DqKUVElC%o>(aN2`&X+2;PxZxl&i>Ym&zUGzN)J2YE-SlM!4r6b<}ZX diff --git a/WordPress/WordPressShareExtension/zh-Hans.lproj/Localizable.strings b/WordPress/WordPressShareExtension/zh-Hans.lproj/Localizable.strings index df8f5fd7cf36471c06a32cf32d873d00b4645170..cc51049ab51116d205cff7220290a834446bcc66 100644 GIT binary patch delta 1258 zcmZXST}&KR7>4I(XJ!Z5GKEl}wdJ(9bQ>xG8-uAvS}8S6aF_jKcUhKYX6LXwFgvsC z%o3O1YHez|X_oZ>l9beHG@5wBg^3}(DA5bOurV5{Hb$jt)AWMWXp>%GsB?CSH)bv- zXTI-y-{*VJEY~jA&V{;M?p}}A=MVG+L*f3&Ky=U<8xp0s42OpkNo8bI?ejqu#?6>e z?@Njq2y%Kh0}NBoCArBNDYvyK%Z2s6U*M&Qjd=cX@mBtJVl*Cf`o2%SMYQ5a z!ez<*b0j3sZ^u9M@6P?HME^pa_M=Cn!TGGy5?Wf4Q(NBaSaBriblr1RVlUsfgEZP? zv*;q%h=!O0hoz}WZ;KrN&I7R!bhSmk9)HtwF|sOQH(jVHp&#OfR0#oFVl2=s_rLA- z&GAb)8S~=dGNWa%(|`p$W3Ep|iFN`^etF^CL?^DeD%>F4e#N1|4fVG7dSMzPKG~Ij zT$oI+y6)j^+bFcg9YrTu2a58?oJyI0)-!R(Rk6tAx1Q`D!NXX|`ol`!4lPzQ$*+HHqd&wv%kqL5)yg*(h-y=UFSI94@=P56hq{gUe>M~WNKBaC^ zKT-Fof9OiOg?7^>U8EQ2HTo<1H(S(}v|YB%+upaWFm|SeIl*)?uP_m2h{-Y6m~WVM z=2zwqmS^|)*&6mKwuya~?OU_WJ7>{Irleck>$&+=7#J@4kH_}BT%XrkiCzxt852><{9 delta 1206 zcmY+CZ)_7~9LKMH?$2`@+saI3o0}ZY&cb4)ybv;92o4dF+0uV&x2}Kgde7S1u6Lz( zt#pGe0R>}UY~>la7$m$vjWHxM8p*^2A~Ec?;oWGM zFUa@?ID{e9xiMjD-d_-8Ny|t|n#-x0?sB;jwzg1CR(TO&9@r~KS~rDvOIlXav{)d+ z=gmo!&#U?H12kcC;6~7akC4slqM@9~>xk=!T4Cmpq2z!BJ-H=~OWw>5d(UF3;0LRnuUS3HdnbT?>`u!-Y7E!eJsR~AV z4e7L+FAeq??hT(t82mYC-)47nVxAw?|1W5S_oy6S1(6RP{Ehc8mmq_lIaC8+Lk@JoS^l zv1^_>vvG9a*t6*P*y37SdNdVwnk}>Bx>Dtp%9rH@aqxsUFwM@E@MUI0oe-ZXIE6Fc zm(Sq}?8RR8$)+k6_$m%+7=8pgaFS|$NbqSVZ;8GGp7&0+mTwE@1pbL~G>elDPgTrW zariEpo4KEQ3!kCf_;p&vOK=mV+L~g^_*dB8DaDozi=6Rix(ROlY85fZgAJuWR9iDz zlov1uxq9T;8vUa9vhS7XJpPX9*eV9T&Aw{t3Z>OkqG-NMOgJ>|@2;AiI_yJ)%X~(v zOZL)FI1yS5+%7oBuI1(hlOL&_lUe_hZLLkUt;amm+G6^0 zP&=p>s3?`B#;Mn+3iSr{KJ^iGk-8tGyXhV}K_8?K)5qvCJx9;epVD`jBy*HG$6R18 zGdG!K*aTZ(2ke5~um^hKFgyT@ungzmC3p|6vII-9E_OS+lMS#DHpU*qV|9=H4aeuL AU;qFB diff --git a/WordPress/WordPressShareExtension/zh-Hant.lproj/Localizable.strings b/WordPress/WordPressShareExtension/zh-Hant.lproj/Localizable.strings index d09d840866d2a162113eedd6562fe47805cdc75c..06c02cea30f68d9c9da772bb72fb81cba2824c24 100644 GIT binary patch delta 1264 zcmZXSTWs4@7{`z8_>xr}rmUnbY;h^+I#Rlp3NbFDDqY8h+T7EmP1DTIIZ50&b{acb z)3tPB($*EGCY%;k41u^vJOEM!ydWllgeDM|7c?qORA_|<-~o^Tu?NtKolFRX{9qlQ z@B97#-~aR3=CjR}=#aV@K_`|J`tOYPjw|uh*A=wR4Sd3r?bjf5Gg2WB>0wK zMl2wqtQ8A_ZfJ$FkU<61)6;{yYyy6W>~uwrpp;lt%-SZ8CWs|bRzyibf-W0K4|&k6 zdE>%7?Zo>?CK?KfX?-k!a#{&Z1&~oJsDhyhc}+LQLnd8Ji?TX7B&tcI$ZFaY3Oyz! zv!S3^LgOQ{niV`^4kh?o`f5EwF|TMML=bONEza;@KChI+A=yw+bPz(pFvSu)?<-1* ztY>h9Jne9VZ*~ZELbv%&$x3y>aUeP*8Ypef7(1@&s9*?|-ef>dW`rS4HIQnI)s5i~ zY#sdy2m%q5fDBZS1_Hy=+S*;442=&%*${kY!f|VvW{H3b1+DPUY1lg9uq}#JqT~L^&9q|SJT&vD8IK&1 z^_;AmS>AdS8Oe;rsO{I>k5rirZelOvz&Xy=sVk_b$5t)yy$zx^*5(r82utL(8$%Q!B7!EIG5l>I^WRH*ke+#arwhRDI|@c!1&Y zJ&X$v+TFWTf!<2%()P)>&VRSlHf?6I2fsrPHPu)vc0U3=)}!&fb+zx`alwTjRu0xe zs)-z2eht6G9mapqu0^Rd?>z=nzoQMym$bIEc0Oylhu4Ff))K72>R`ZuGB^z`g7?8T z_z~P7D8fzj5)TkZ2_F$BBqB}B5NC*s#LL9%#0K#Zd58><8FGePAeYH1`7Zed`8D}H z`4`ndxhXGYP*rM;TKtgug!1PfxgG`9YGI^%RJjq;OZm>?ahwWz{VTai#Se<=}eVScmUuEB9 lFSFM;mh0vs9OTN}CGIosXYRTk*bmz!n>}sMW4P()V+G;dAPv`z2wJV`FO+-12- z*VJ}}341AyCVe(3qH~}qMJsg^L>>6YkokxEN4J7l>Z)uAqJj>KDArt3ggpn(bI(1` z_xJsL?{~^_%2Ev34!PWe9}O}c?oY2 z)0m|?+N0*i!Mq@eYEqOFTvkyvhr zr{sd$(x};n8;FPTNwTpn639YcL)?HUr%Ru8;%kQEI7M;||0`eAmH2?Mt@QzC#gNNa zyejd;aalIvAu4as;fVS8$$W&KnB(Kx{f6c6E`{SKcv0d732~~ZA$6$gf>#Wd(i@M|k5sqY zwN}VbE%YZ|F zQhF8KNAKBAdP|Qu+_Ybq?eK7X52k8tDt%NS>#Bpy|vE|Ih@#V8WZnef-wJz|| z^|F2%;>X#2vvB_A(7Fzg);k0@eXBZ`9=nPSSWo~bzqHL|A5VW=VcgaXOnSnw2Y5Nl2JmNQEO iGF;e<*gSx=A%~#2f||aaZwvz%Ffu}D22LmqqcQ;}QW6UQ delta 103 zcmbQlIEitBgmGAAab`(=QE`NGer|4RUP*CiSY~Q@aXOnSnw2Y5No9Y2^Tga iHV+_eIMGf{lS5EkK~vw(JBk4e7#Sfn11FS*QJDZCViElS diff --git a/WordPress/WordPressTodayWidget/bg.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/bg.lproj/Localizable.strings index eed61e6f57bb0227d43528cad63f6dd94dc4d3fc..44ca9fd0ab5ad0aa35fb656c673ec1154d726feb 100644 GIT binary patch delta 51 zcmZ3-xQ=mxgqU-FZfqHL|A5VW=Ve0L_M*IkvbDyL^(MG#TC@_UBU|{ H_9*}W(*zLP delta 51 zcmZ3-xQ=mxgjiT+ab`(=QE`NGer|4RUP*CiSY~SZL_M*I1)>vObT~N##T7L5T_STP H_9*}W)>{zs diff --git a/WordPress/WordPressTodayWidget/cs.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/cs.lproj/Localizable.strings index 31214acd90a4957ef122b0728ae63e3d93bbd1c8..a095ba28f455c951699c0345cf5955d2a8d4bfd8 100644 GIT binary patch delta 71 zcmdnMxPftkgqU-FZfqHL|A5VW=Ve0L_L{_iE0Yj41Np`8Oj(F8A=$X b8Oj*)7~V1@Gh}iIiYut;d&L$^oS*;zRYDcP delta 51 zcmdnMxPftkgjiT+ab`(=QE`NGer|4RUP*CiSY~SZL_L{_1>zIE)Hpc=#T7L5y%I|% HPEY^<*fS9q diff --git a/WordPress/WordPressTodayWidget/cy.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/cy.lproj/Localizable.strings index b7b06ab059ee534f1c15c6695c2311076be7a2d1..6f9b22d2ee63e4150fb8ab791b743b485dc12fcc 100644 GIT binary patch delta 70 zcmXRbn;>E5oS&PUnpaXB8kU(_UK|mYS)5stUsN3Gk)M{98R3_ol9`y2SQ_e{pHrS5 Z5t&<_np0j`#33lIpr&tX=Q1%&0RX{88Fc^v delta 70 zcmXRbn;>BqmRX!xl3!FD;hdkFo0?Zr92%CHT3#ILk)M{984;OVo|;o$Srp-ypOTrF Zl2{t*o}W{m&LJqSps8ADGaF`g5nBl`qr)!6BGc-M;iG6 delta 64 zcmZo*Y+#%qp%s={oLQ1zR2<=)pPQSSS5h1rmYG^!oXOzCkjhZZ@Pi>8Nar!6Fr-e@ S7vta%6j#vHck-K}H%GA?BQ)o12SejN;nwA>j Ylv-SxoRM0@At}H%GAr_WdoLQ1zR2<=)pPQSSS5h1rmYG^UQBOiO!YQ@5G&v)+D9Rfml~|M- Y?pT^uRGOB`AtR diff --git a/WordPress/WordPressTodayWidget/fr.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/fr.lproj/Localizable.strings index 3ab7ff98dbee00dd85b019350684393441b4dfe3..d8891ac1e5f58904d27696c66a249a26e5ce493b 100644 GIT binary patch delta 83 zcmZo8o12QVTFfCRuAr%J;}$$IQ2_w1OdHPt diff --git a/WordPress/WordPressTodayWidget/he.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/he.lproj/Localizable.strings index 025e1c7939768753dfdd684215cd7e2e93f5bc24..c772a3477e7f0f3ee9fbc52643b6ed88cf081beb 100644 GIT binary patch delta 70 zcmbQnIE`_FgpzZ9ZfqHL|A5VW=VcgaXNzn>mAmcK=^#3yP8-U>pj+s Ytj}3r00r)H2#PDH>DzfHOe|9X0EzM#?f?J) delta 70 zcmbQnIE`_Fgnn3Nab`(=QE`NGer|4RUP*CiSY~Q@aXNzn>mAmcK=>Sp@20WdW4#Du WzL;pG#>pWluAr%J=N&PzOaTCvW*FQ6 diff --git a/WordPress/WordPressTodayWidget/hr.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/hr.lproj/Localizable.strings index 2e2e01b30df4e3ba4a2f93398c2d35201f31bfb0..4f94d15e7c2197697b9f25aa1efa81991b1d7d12 100644 GIT binary patch literal 95 zcmYc)$jK}&F)+Bo$i&RT$jZzT>XVtBS{&h=pPQSSS5h1rmYG^!91)gToLQ1zR2=D@ c4-!r+%H$9fS5VVu00Txw2+hC-rD2pM02y!;%m4rY literal 95 zcmYc)$jK}&F)+Bo$i&RT$i&JL>XVtBS{xCUS)5stUsN37oS&PUnpaXB8kU(_UL5J2 c58@>jWpW6LD`@I7fB_>Tgl1ra(lE*r02^-<&Hw-a diff --git a/WordPress/WordPressTodayWidget/hu.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/hu.lproj/Localizable.strings index 6ad18e82fa83cc8034ddb0e7bd4cd6efa47ea2f9..849d1189d84a00fb615f076ba59e18bdc765c893 100644 GIT binary patch delta 64 zcmZ3$xPWnjgt&8lZfqHL|A5VW=Vcg@kA#x=}ZP6hKCF#4EYS{42eMc SGeb6qptypXzE|qR1_c1ZofIMf delta 64 zcmZ3$xPWnjgjQH)ab`(=QE`NGer|4RUP*CiSY~Q@aVCQg!$XD=hJ1!}hD0F!nIU_k Sz8MFHptypjzEkYP1_c1cRulpN diff --git a/WordPress/WordPressTodayWidget/id.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/id.lproj/Localizable.strings index 2fbd4aa7b6ac9976ed18c06349eba53e09e05882..71ce71bc40fa5078d91fed8951c1cdb0fdef9cbc 100644 GIT binary patch delta 62 zcmZo;Y-5}tA>*8%o12ibojB26P9!QIH7~t1FRL^! RokLJuK~3MpBWPlp0syxB6(#@x delta 88 zcmZo;Y-5}t;TM)!oLQ1zR2<=)pPQSSS5h1rmYG^!91>ibofs96nwMUhmsOgV9xov1 foez>vEYi(}G9tYpa*25yg5nCA`X=_l6Vns`w-6ty diff --git a/WordPress/WordPressTodayWidget/is.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/is.lproj/Localizable.strings index 5f38153784bb46f626e4a894dc1657d0da93a3f5..f05f504acff9e74788319287576d21bd119bbc93 100644 GIT binary patch delta 92 zcmeBT>|&fC5#*eoo12&*2|e delta 92 zcmeBT>|&fC5fqkLoLQ1zR2<=)pPQSSS5h1rmYG^!oXOzB@RlK)A(5eoL4l!+A(P=l vn0sn*NoG-uV@XD7dSY>EZc1iRlv_?}Nl9j2dSVfWptypjzLRIz#4H5>(3>An diff --git a/WordPress/WordPressTodayWidget/it.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/it.lproj/Localizable.strings index 7136fa8cfd6c63eb5a6f3483924f18160e14541b..a17ebe99422559b20a9bf539da23a5766b287170 100644 GIT binary patch literal 120 zcmYc)$jK}&F)+Bo$i&RT%ErzS>XVtBS{&h=pPQSSS5h1rmYG^!91)gToLQ1zR2%}5 ng-K?HfrV3}z*HhoK9fUGTtQ9W#MXrY3>X<9Gy^A;hEe_i@24JP delta 72 zcmb=Zm>}U0mRX!xl3!FD;hdkFo0?Zr92%CHT3#IDlbM|w1(r+%N@v2PGsD1QsT_jh N3Yz*R_8t=>6aWK^8fX9j diff --git a/WordPress/WordPressTodayWidget/ja.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/ja.lproj/Localizable.strings index df9454acd0d200c3302a64615110aad03fc58940..ea092a19628995f7d6a235e9005505871934d259 100644 GIT binary patch delta 72 zcmb=Zm>}WcoS&PUnpaXB8kU(_UK|mYS)5stUsRlI-~xoXDF&Mj9vXZ$IFZtkQE3%+ aFSQ`KODojBft5p0TtQ9W%-&;SgaQEmUm8;Y delta 72 zcmb=Zm>}U0mRX!xl3!FD;hdkFo0?Zr92%CHT3(!N-~xoX$z58Z{tc`t2Ad5Y8hkc5 akE4oS&PUnpaXB8kU(_UK|mYS)5stUsRlYqWh@Ju_;NLh1W48?){LwM{~Eu S@d+G);tFc|X4ZBS{S*K)P8k6J delta 62 zcmd1Hn;>BpmRX!xl3!FD;hdkFo0?Zr92%CHT3(!dqWh@Ju_?)WGYKU+O-xk)06NkgOaK4? diff --git a/WordPress/WordPressTodayWidget/nl.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/nl.lproj/Localizable.strings index cc1cc089bef7182c12d2644eef129381d90302e0..aacad4e21599a100c87761584d08efdfd58d5825 100644 GIT binary patch delta 83 zcmZo-Y+{@s;pv>8o12Fnimn2nwVUY mnOYnfo|;;eo>-Qe7wME*m7kiOT2#y-D6XKUZ{s>KQ4s(n79LOl delta 83 zcmZo-Y+{@s;Te`$oLQ1zR2<=)pPQSSS5h1rmYG^!921_HSd@}ll$n>FniuJmT9u!g loeESHl$w}al9^f@8J?P2l%80Yn#Un1uAr%J<2Er-5dbG59#jAT diff --git a/WordPress/WordPressTodayWidget/pl.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/pl.lproj/Localizable.strings index b9c5473886ed0a2f8fdf478fbaf2e679390c74a3..deff52b9ec36f48eab8a50d85a8047f5681a7466 100644 GIT binary patch literal 96 zcmYc)$jK}&F)+Bo$i&RT$jZzT>XVtBS{&h=pPQSSS5h1rmYG^!91)gToLQ1zR2=1< d4-!r+s!HV$6jxBwX8;36MhMNo2Bl$?6#zez6+{34 literal 96 zcmYc)$jK}&F)+Bo$i&RT$i&JL>XVtBS{xCUS)5stUsN37oS&PUnpaXB8kU(_UL56} d58@>jRi$zWiYsX9Gk^gjBZOvPgVHd{3IIWo6-EF6 diff --git a/WordPress/WordPressTodayWidget/pt-BR.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/pt-BR.lproj/Localizable.strings index 747808369b638405d486e75d8e98454c99b47556..9ef3289dd91e53f45980f4decf9c7042f79fe490 100644 GIT binary patch delta 65 zcmbQoIFE6HguHWpZfqHL|A5VW=VcgafEYeQAuV>;zTE7ktncWVqQsV RF^8bIf||aCf7Zl01ppG*7V!W8 delta 65 zcmbQoIFE6HgjQH)ab`(=QE`NGer|4RUP*CiSY~QDkXu?*l9`fN90gX8m{*cI(cGAm QLr`2nQ{TclYGR!N02~w+%>V!Z diff --git a/WordPress/WordPressTodayWidget/pt.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/pt.lproj/Localizable.strings index 04af9d38cb145cba23b5d470fc0c33be204cbb39..a964662b9512602683cc3bd9ef5e89ad2ccbf799 100644 GIT binary patch delta 63 zcmbQkIEQh9gsgLZZfqHL|A5VW=VcgahQ94aY_C}2V;>auux)NNop~N PptypXzL{^v#2N(v-_aHy delta 63 zcmbQkIEQh9ghp6qab`(=QE`NGer|4RUP*CiSY~Q@ahQ94aY=r06j(YjuOxM%sWB&q PptypjzL{gh#2N(v=?xY8 diff --git a/WordPress/WordPressTodayWidget/ro.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/ro.lproj/Localizable.strings index 27741762e07eaeccc8f5666dbc2458024ce8d4d6..ea42e9c79b7a2a12542864aa0873ce0606a2cbcc 100644 GIT binary patch delta 72 zcmbQjIE8V7gqm}HZfqHL|A5VW=VcgaXLc)Lk=S|Lo!1tLkUCbL{BA= asIbhc%#uW)Y$k`GxPqF#ooB+t5(NNWh!%wa delta 72 zcmbQjIE8V7gke}_ab`(=QE`NGer|4RUP*CiSY~Q@aXLc)Lk=S|Lo!1tLkUA_R9I$J aW=SGYVdg|TB~A`OaRp6%JI|1bB?qHL|A5VW=VcgaXO1Miyw<2iv^1fiye#U#9%GC iEEahn(~-rL#R(|v1f;E5EI0(k71Z?YLNg||DF6V|r4&&B delta 82 zcmZ3+xQuavgmqYEab`(=QE`NGer|4RUP*CiSY~Q@aXO1Miyw<2iv^1fiyez;7K=QP ha%3@OaRLfC0cmR%i-~qxoE(DU3Yz+M!C4dA6adU06h8m} diff --git a/WordPress/WordPressTodayWidget/sk.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/sk.lproj/Localizable.strings index c8268f2492811d4bdf8e391eb08d2dab67357063..d5cddaccdc71e7f3ae36be8761b0e29db01b503b 100644 GIT binary patch delta 48 zcmeBS>|vZBA?}=?o12VqP{o>hoHEEn!c0o#2f_x DlVcBK delta 48 zcmeBS>|vZBAs&`loLQ1zR2<=)pPQSSS5h1rmYG^!JkeKtqP`plhoHEEroLO`#2f_x DmI@Dj diff --git a/WordPress/WordPressTodayWidget/sq.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/sq.lproj/Localizable.strings index 291c832c978c2ec6c3448b24b1bf3a6c2f171ef0..63c8b8e95b8107915b7728264c51f2812561eb6b 100644 GIT binary patch delta 88 zcmZo;Y-5}t;pd#6o124EYR246iu^#TC@_?c97OrYQgbA_*I6 delta 88 zcmZo;Y-5}t;TM)!oLQ1zR2<=)pPQSSS5h1rmYG^!oX!xy@R}iqp^zbyA(tUFgCPva mr~={=hJ1!1hS%ZV`5@J)p#h0SS*aX?;tHDjcK+cL(-Z&$@f(2v diff --git a/WordPress/WordPressTodayWidget/sv.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/sv.lproj/Localizable.strings index 4c2cee7a54073b20df9577ccd5429e98d886e4e3..49d8f854a45bcaf266136c38806531db78bd486a 100644 GIT binary patch literal 146 zcmYc)$jK}&F)+Bo$i&RT%ErzS>XVtBS{&h=pPQSSS5h1rmYG^!91)gToLQ1zR2(lL z;GUV2lbD-Wl$~0XnU|he6zvUBnpl)t6bV$92Num>aAHVhC}#M^kj;?DP{feRAtXVtBS{xCUS)5stUsN37oS&PUnpaXB8kU(_UK}qV z;GUV2lbD-Wl$~0XnU|hel)>P{kjhZZ@QopxA(5eoAvM|?q9w5?wI~v3P99hphoHEE VroK~fJOdaoGD2tuPACndG65+4CIA2c diff --git a/WordPress/WordPressTodayWidget/th.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/th.lproj/Localizable.strings index 281edf75e5738cb201ba3930f42b5588160c86a7..e75a46436af95111acad58cccd90e464cfb6119b 100644 GIT binary patch delta 89 zcmbQmIE!(Dgp+fAZfqHL|A5VW=VcgaXKFtpE;igpCpjh<&(f42;O{`J?0NySW>;M1& diff --git a/WordPress/WordPressTodayWidget/tr.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/tr.lproj/Localizable.strings index aca6f9abe924db066aa2a228667bfa0a2a464207..c54ab86696bce88d849f029f516729137ebbddb3 100644 GIT binary patch delta 73 zcmZ3*xQcOtgqU-FZfqHL|A5VW=Ve0L_MjAi3&ozyrv1jQ9J^*s`^CUz+R00Kr7jsO4v diff --git a/WordPress/WordPressTodayWidget/zh-Hans.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/zh-Hans.lproj/Localizable.strings index 4522cc09f057637461cb4cc86fc038b9380cd501..3a40399c7502679599c10ba4825f64912ac8e158 100644 GIT binary patch delta 61 zcmd1Hn;>E8oS&PUnpaXB8kU(_UK|mYS)5stUsRmf8<*65qN%qRLP0ssf|7xDlA delta 61 zcmd1Hn;>BtmRX!xl3!FD;hdkFo0?Zr92%CHT3(#k8<*U@KYCGWK~ndT?p?|0Ps_Pe R3pfPD6*TpYEGPOZ0ssmO7xw@F diff --git a/WordPress/WordPressTodayWidget/zh-Hant.lproj/Localizable.strings b/WordPress/WordPressTodayWidget/zh-Hant.lproj/Localizable.strings index c42f8181afba870c1da7a22040d473a5e30931a0..a67002eec39559f72ed568b4a4d4874973c9c524 100644 GIT binary patch delta 64 zcmXRYm>^-{oS&PUnpaXB8kU(_UK|mYS)5stUsRl&%-KCFwIZqi%k=-r^X^UE2xNC@ TMK9tI6jxBwH?ww{7@z^*hmRX!xl3!FD;hdkFo0?Zr92%CHT3(!-%-KCFwIZoYD|%5<|Cj0iljq%= Ux-qqaLr`2nQ{T+mVPb#+09!U0-~a#s From 9ec09d3392783f74a14bafee3ed2752eec705264 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Fri, 17 Apr 2020 12:54:57 +0200 Subject: [PATCH 224/245] Updates metadata translation --- Scripts/fastlane/metadata/de-DE/description.txt | 2 +- .../fastlane/metadata/de-DE/release_notes.txt | 14 +++++--------- .../fastlane/metadata/default/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/en-GB/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/en-US/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/es-ES/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/fr-FR/release_notes.txt | 16 ++++++---------- Scripts/fastlane/metadata/id/release_notes.txt | 16 ++++++---------- Scripts/fastlane/metadata/it/release_notes.txt | 16 ++++++---------- Scripts/fastlane/metadata/ja/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/nl-NL/release_notes.txt | 14 +++++--------- .../fastlane/metadata/pt-BR/release_notes.txt | 15 --------------- Scripts/fastlane/metadata/ru/release_notes.txt | 14 +++++--------- Scripts/fastlane/metadata/sv/release_notes.txt | 16 ++++++---------- Scripts/fastlane/metadata/tr/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/zh-Hans/release_notes.txt | 16 ++++++---------- .../fastlane/metadata/zh-Hant/release_notes.txt | 16 ++++++---------- 17 files changed, 88 insertions(+), 163 deletions(-) delete mode 100644 Scripts/fastlane/metadata/pt-BR/release_notes.txt diff --git a/Scripts/fastlane/metadata/de-DE/description.txt b/Scripts/fastlane/metadata/de-DE/description.txt index 80707c4d3cf9..40f1328de3bb 100644 --- a/Scripts/fastlane/metadata/de-DE/description.txt +++ b/Scripts/fastlane/metadata/de-DE/description.txt @@ -4,7 +4,7 @@ Mit WordPress für iOS hältst du das Werkzeug, um Texte zu veröffentlichen dir WordPress für iOS ist ein Open-Source-Projekt, an dessen Entwicklung du dich beteiligen kannst. Um mehr zu erfahren, schau unter https://apps.wordpress.com/contribute/ nach. -WordPress für iOS unterstützt WordPress.com und selbst gehostete WordPress.org-Websites ab WordPress-Version 4.0. +WordPress für iOS unterstützt WordPress.com und selbst gehostete WordPress.org-Websites ab WordPress 4.0. Wenn du Hilfe zur App brauchst, findest du Informationen in den Foren unter https://ios.forums.wordpress.org/. Du kannst uns aber auch einen Tweet an @WordPressiOS schicken. diff --git a/Scripts/fastlane/metadata/de-DE/release_notes.txt b/Scripts/fastlane/metadata/de-DE/release_notes.txt index cca9ecda22e2..00d976c9ee61 100644 --- a/Scripts/fastlane/metadata/de-DE/release_notes.txt +++ b/Scripts/fastlane/metadata/de-DE/release_notes.txt @@ -1,15 +1,11 @@ -Neue Blöcke! Willkommen beim Block „Letzte Beiträge“, um deine neuen Beiträge und Seiten hervorzuheben. +Die Website-Erstellung wurde durch Entfernen einiger Zwischenschritte optimiert. Suche einfach deine gewünschte Art von Website aus, gib einen Domainnamen ein und schon bist du fertig. -Wenn du eine neue Seite erstellst, zeigen wir dir ein paar Vorlagen. Wähle eine aus und wir fügen alle notwendigen Blöcke zu deiner Seite hinzu, damit du schnell damit beginnen kannst. +Weitere Verbesserungen am Block-Editor: Der Cover-Block ist jetzt verfügbar. Im Überschriftsblock findest du Optionen zur Ausrichtung und eine Dropdown-Toolbar vereinfacht die Ausrichtung für Überschrifts-, Absatz-, Bild- und MediaText-Blöcke. Darüber hinaus haben wir den Dimmeffekt für nicht ausgewählte Blöcke entfernt. -Wir haben ein paar Probleme mit dem Block-Editor behoben: keine Abstürze mehr beim Einfügen von HTML-Inhalten bzw. keine fehlenden Ränder mehr bei Zitat-Blöcken im dunklen Modus. +Bedingt durch das Layout des Bildschirms „Benachrichtigungen“ wurde der Text auf einigen Smartphone-Modellen durch das Gehäuse verdeckt. Dies wurde nun behoben! -Wenn du zuvor einen Beitrag zur Veröffentlichung geplant hast, würde er als „geplant“ anstatt als „veröffentlicht“ angezeigt. Das wurde behoben. Ebenso ein Problem, bei dem Datumsangaben nicht korrekt angezeigt wurden, wenn die Zeitzone der Website nicht mit der Zeitzone des Geräts übereinstimmte. +Bei dem Versuch einer @-Erwähnung einer Person in einem Kommentar hat die App manchmal zwar Namen vorgeschlagen, ließ diese aber nicht auswählen – auch das wurde behoben. Wir haben uns auch um einige weitere Probleme gekümmert, die zum Absturz der App führten, wenn du versuchtest, auf den Bildschirm „Website-Seiten“ zuzugreifen, oder mithilfe der „Quick Action“-Buttons auf iPads zu deinen Blogbeiträgen gelangen wolltest. Und apropos Seiten und Beiträge: Die Vorschau ist auf iPads mit iOS 13 jetzt größer. -Wir haben ein paar UI-Inkonsistenzen im dunklen Modus und bei der Reader-Werkzeugleiste behoben. - -Du kannst @-Erwähnungen verwenden, wenn du Kommentare im Vollbildmodus erstellst. - -Manchmal landeten E-Mails mit magischen Registrierungs- und Anmeldelinks in deinem Spam-Ordner. Deshalb haben wir auf dem Bestätigungsbildschirm den Hinweis hinzugefügt, im Spam- oder Junk-Mail-Ordner nachzusehen, wenn die E-Mail nicht sofort gefunden wird. +Wir mögen unseren dunklen Modus so wie unseren Kaffee: echt dunkel und ohne ungewollte Zusätze. Es gab einige Störungen im hellen und dunklen Modus und das Verhalten war beim Umschalten von einem Modus zum anderen nicht immer optimal. Es gibt jetzt wesentlich weniger von diesen Störungen. Bleibt alle gesund. diff --git a/Scripts/fastlane/metadata/default/release_notes.txt b/Scripts/fastlane/metadata/default/release_notes.txt index 58dbb9e71d34..eff9d4af8fc8 100644 --- a/Scripts/fastlane/metadata/default/release_notes.txt +++ b/Scripts/fastlane/metadata/default/release_notes.txt @@ -1,15 +1,11 @@ -New blocks! Welcome the Latest Posts block, for highlighting your new stuff in posts and pages. +Site Creation has been streamlined by removing some intermediate steps. Pick the kind of site you want, enter a domain name, and you’re done. -When you create a new page, we’ll show you a few templates — pick one, and we’ll add all the necessary blocks to your page to get you started quickly. +The Block editor got more improvements: The Cover block is now available; there are alignment options in the Heading block; and a dropdown toolbar makes alignment easier for Heading, Paragraph, Image, MediaText blocks. And we removed the dimming effect on unselected blocks. -We fixed up a few block editor issues; no more crashes when pasting in HTML content or missing Quote block borders in Dark Mode. +The layout of the Notifications screen caused text to get lost under the casing of some models of mobile phone. That’s fixed! -If you scheduled a post to publish in the past, it would display as “scheduled” instead of “published.” That’s fixed, along with an issue where dates displayed incorrectly if your site’s timezone wasn’t the same as your device’s timezone. +Sometimes you’d try to @-mention someone in a comment, and the app would suggest names but then not let you select one — that’s also fixed. We also took care of a few other issues that caused the app to crash when you tried to access the Site Pages screen or use the Quick Action buttons on iPads to get to your blog posts. And speaking of pages and posts, previews are now bigger for iPads running iOS 13. -We fixed some UI inconsistencies in Dark Mode and with the Reader toolbar. +We like our Dark Mode like we like our coffee: really dark, and without any bugs floating around in it. There were some glitches in Light and Dark Modes, and things sometimes behaved oddly when you switched from one to the other. There are far fewer of those glitches now. -You can use @-mentions when writing comments in fullscreen mode. - -Sometimes Signup and Login Magic Link emails would go to your spam folder, so we added a note to the confirmation screen suggesting that folks check their spam/junk folders if they don’t see the email promptly. - -Stay safe, everyone. +Stay safe, y’all. diff --git a/Scripts/fastlane/metadata/en-GB/release_notes.txt b/Scripts/fastlane/metadata/en-GB/release_notes.txt index f54d1c0f4878..7e01f0f114af 100644 --- a/Scripts/fastlane/metadata/en-GB/release_notes.txt +++ b/Scripts/fastlane/metadata/en-GB/release_notes.txt @@ -1,15 +1,11 @@ -New blocks! Welcome to the Latest Posts block, for highlighting your new stuff in posts and pages. +Site Creation has been streamlined by removing some intermediate steps. Pick the kind of site you want, enter a domain name, and you’re done. -When you create a new page, we’ll show you a few templates - pick one, and we’ll add all the necessary blocks to your page to get you started quickly. +The block editor got more improvements: the Cover block is now available; there are alignment options in the Heading block; and a dropdown toolbar makes alignment easier for Heading, Paragraph, Image, MediaText blocks. And we removed the dimming effect on unselected blocks. -We fixed up a few block editor issues; no more crashes when pasting in HTML content or missing Quote block borders in Dark Mode. +The layout of the Notifications screen caused text to get lost under the casing of some models of mobile phone. That’s fixed! -If you scheduled a post to publish in the past, it would display as “scheduled” instead of “published”. That’s fixed, along with an issue where dates displayed incorrectly if your site’s time zone wasn’t the same as your device’s time zone. +Sometimes you’d try to @-mention someone in a comment, and the app would suggest names but then not let you select one — that’s also fixed. We also took care of a few other issues that caused the app to crash when you tried to access the Site Pages screen or use the Quick Action buttons on iPads to get to your blog posts. And speaking of pages and posts, previews are now bigger for iPads running iOS 13. -We fixed some UI inconsistencies in Dark Mode and with the Reader toolbar. +We like our Dark Mode like we like our coffee: really dark, and without any bugs floating around in it. There were some glitches in Light and Dark Modes, and things sometimes behaved oddly when you switched from one to the other. There are far fewer of those glitches now. -You can use @-mentions when writing comments in fullscreen mode. - -Sometimes Signup and Login Magic Link emails would go to your spam folder, so we added a note to the confirmation screen suggesting that folks check their spam/junk folders if they don’t see the email promptly. - -Stay safe, everyone. +Stay safe, y’all. diff --git a/Scripts/fastlane/metadata/en-US/release_notes.txt b/Scripts/fastlane/metadata/en-US/release_notes.txt index 58dbb9e71d34..eff9d4af8fc8 100644 --- a/Scripts/fastlane/metadata/en-US/release_notes.txt +++ b/Scripts/fastlane/metadata/en-US/release_notes.txt @@ -1,15 +1,11 @@ -New blocks! Welcome the Latest Posts block, for highlighting your new stuff in posts and pages. +Site Creation has been streamlined by removing some intermediate steps. Pick the kind of site you want, enter a domain name, and you’re done. -When you create a new page, we’ll show you a few templates — pick one, and we’ll add all the necessary blocks to your page to get you started quickly. +The Block editor got more improvements: The Cover block is now available; there are alignment options in the Heading block; and a dropdown toolbar makes alignment easier for Heading, Paragraph, Image, MediaText blocks. And we removed the dimming effect on unselected blocks. -We fixed up a few block editor issues; no more crashes when pasting in HTML content or missing Quote block borders in Dark Mode. +The layout of the Notifications screen caused text to get lost under the casing of some models of mobile phone. That’s fixed! -If you scheduled a post to publish in the past, it would display as “scheduled” instead of “published.” That’s fixed, along with an issue where dates displayed incorrectly if your site’s timezone wasn’t the same as your device’s timezone. +Sometimes you’d try to @-mention someone in a comment, and the app would suggest names but then not let you select one — that’s also fixed. We also took care of a few other issues that caused the app to crash when you tried to access the Site Pages screen or use the Quick Action buttons on iPads to get to your blog posts. And speaking of pages and posts, previews are now bigger for iPads running iOS 13. -We fixed some UI inconsistencies in Dark Mode and with the Reader toolbar. +We like our Dark Mode like we like our coffee: really dark, and without any bugs floating around in it. There were some glitches in Light and Dark Modes, and things sometimes behaved oddly when you switched from one to the other. There are far fewer of those glitches now. -You can use @-mentions when writing comments in fullscreen mode. - -Sometimes Signup and Login Magic Link emails would go to your spam folder, so we added a note to the confirmation screen suggesting that folks check their spam/junk folders if they don’t see the email promptly. - -Stay safe, everyone. +Stay safe, y’all. diff --git a/Scripts/fastlane/metadata/es-ES/release_notes.txt b/Scripts/fastlane/metadata/es-ES/release_notes.txt index 8e054fa25b44..d3956dd6587f 100644 --- a/Scripts/fastlane/metadata/es-ES/release_notes.txt +++ b/Scripts/fastlane/metadata/es-ES/release_notes.txt @@ -1,15 +1,11 @@ -¡Nuevos bloques! Bienvenido al bloque de últimas entradas, para resaltar tus nuevas cosas en las entradas y páginas. +La creación del sitio se ha simplificado al eliminar algunos pasos intermedios. Elige el tipo de sitio que quieres, introduce un nombre de dominio y listo. -Cuando crees una nueva página, te mostraremos unas cuantas plantillas — elige una y añadiremos todos los bloques necesarios a tu página para que puedas empezar rápidamente. +El editor de bloques tiene más mejoras: Ahora está disponible el bloque portada; hay opciones de alineación en el bloque del encabezado; y una barra de herramientas desplegable hace más fácil la alineación de los bloques de encabezado, párrafo, imagen y medios y texto. Y hemos eliminado el efecto de atenuación en los bloques no seleccionados. -Hemos corregido algunos problemas del editor de bloques; ya no se producen más conflictos al pegar contenido HTML o la falta de los bordes del bloque de citas en el modo oscuro. +El diseño de la pantalla de avisos hacía que el texto se perdiera bajo la carcasa de algunos modelos de teléfono móvil. ¡Eso está corregido! -Si habías programado la publicación de una entrada en el pasado, se mostraba como «programada» en lugar de «publicada». Eso está corregido, junto con un problema por el que las fechas se mostraban incorrectamente si la zona horaria de tu sitio no era la misma que la de tu dispositivo. +A veces, intentabas @mencionar a alguien en un comentario y la aplicación sugería nombres, pero no te dejaba seleccionar uno — eso también está corregido. También nos hemos ocupado de otros problemas que hacían que la aplicación se bloqueara cuando intentabas acceder a la pantalla de las páginas del sitio o usar los botones de acción rápida en los iPad para acceder a tus entradas del blog. Y, hablando de páginas y entradas, ahora las vistas previas son más grandes para los iPad que ejecutan iOS 13. -Hemos corregido algunas inconsistencias de la interfaz de usuario en el modo oscuro y con la barra de herramientas del lector. +Nos gusta nuestro modo oscuro, como nos gusta nuestro café: muy oscuro y sin bichos flotando en él. Había algunos fallos en los modos claro y oscuro y, algunas veces, las cosas se comportaban de forma extraña cuando te cambiabas de uno a otro. Ahora hay muchos menos de esos fallos. -Puedes usar @-menciones cuando escribas comentarios en modo de pantalla completa. - -A veces, los correos electrónicos de registro y de acceso de Magic Link iban a tu carpeta de spam, por lo que hemos añadido una nota en la pantalla de confirmación sugiriendo que la gente compruebe sus carpetas de spam/basura si no ven el correo electrónico rápidamente. - -Ten cuidado, todos. +Manteneos todos a salvo. diff --git a/Scripts/fastlane/metadata/fr-FR/release_notes.txt b/Scripts/fastlane/metadata/fr-FR/release_notes.txt index 977e23d4e57f..48b6bf6c7d96 100644 --- a/Scripts/fastlane/metadata/fr-FR/release_notes.txt +++ b/Scripts/fastlane/metadata/fr-FR/release_notes.txt @@ -1,15 +1,11 @@ -De nouveaux blocs ! Bienvenue au bloc « Derniers articles » pour mettre en évidence vos nouvelles infos dans les articles et les pages. +Certaines étapes de la création de site ont été supprimées afin de rendre le processus plus fluide. Choisissez simplement le type de site qui vous convient et saisissez un nom de domaine. C’est tout ! -Lorsque vous créerez une nouvelle page, nous vous afficherons quelques modèles. Choisissez-en un et nous ajouterons tous les blocs nécessaires à votre page pour vous permettre de démarrer plus rapidement. +L’éditeur de blocs a été encore amélioré : Le bloc de couverture est désormais disponible, des options d’alignement sont proposées dans le bloc de titre et une barre d’outils déroulante facilite l’alignement des blocs de titre, de paragraphe, d’image ainsi que de multimédia et texte. Nous avons également supprimé l’effet d’assombrissement sur les blocs désélectionnés. -Nous avons corrigé quelques problèmes de l’éditeur de blocs ; plus de plantage lors d’un collage de contenu HTML ou de bordures manquantes de bloc de citation en mode foncé. +Sur certains modèles de téléphones portables, en raison de la disposition de l’écran Notifications, le texte se retrouvait masqué par la coque du téléphone. Le problème a été résolu. -Si vous planifiez un article à publier dans le passé, il s’affichera comme « planifié » à la place de « publié ». C’est corrigé ainsi qu’un problème où les dates ne s’affichaient pas correctement si le fuseau horaire de votre site n’était pas le même que celui de votre appareil. +Parfois, lorsque vous tentiez d’ajouter une @-mention pour identifier quelqu’un dans un commentaire, l’application suggérait des noms, mais il n’était pas possible de les sélectionner. Ce problème a également été résolu. Nous avons également résolu d’autres petits problèmes qui provoquaient le plantage de l’application lors des tentatives d’accès aux articles de votre blog via l’écran Pages du site ou l’utilisation des boutons d’action rapide sur les iPads. Et puisque nous parlons de pages et d’articles, les aperçus sont désormais plus grands sur les iPads exécutant iOS 13. -Nous avons corrigé quelques incohérences visuelles en mode foncé et avec la barre d’outil du Lecteur. +Pour nous, le mode sombre, c’est comme le bon café, il doit être bien noir et uniforme. Les modes sombre et clair se comportaient parfois bizarrement lorsque vous passiez de l’un à l’autre, c’est désormais beaucoup plus rare. -Vous pouvez utiliser les mentions « @ » quand vous écrivez des commentaires en plein écran. - -Parfois les e-mails d’inscription et de connexion par lien magique allaient dans les indésirables, nous avons ajouté une note à l’écran de confirmation vous suggérant de vérifier vos indésirables si vous ne voyez pas cet e-mail rapidement. - -Portez-vous bien ! +Prenez tous soin de vous. diff --git a/Scripts/fastlane/metadata/id/release_notes.txt b/Scripts/fastlane/metadata/id/release_notes.txt index c1845206dade..80713c665e4c 100644 --- a/Scripts/fastlane/metadata/id/release_notes.txt +++ b/Scripts/fastlane/metadata/id/release_notes.txt @@ -1,15 +1,11 @@ -Blok baru! Sambut blok Pos Terbaru, untuk menyoroti item baru Anda di pos dan halaman. +Pembuatan Situs telah disederhanakan dengan menghapus beberapa langkah yang tidak efisien. Pilih jenis situs yang Anda inginkan, masukkan nama domain, dan selesai. -Saat Anda membuat halaman baru, kami akan menampilkan beberapa template — pilih satu, dan kami akan menambahkan semua blok yang dibutuhkan ke halaman Anda agar Anda dapat memulai halaman dengan cepat. +Penyunting Blok mendapatkan penyempurnaan: Blok Sampul kini tersedia; ada opsi perataan di blok Heading; dan bilah peralatan tarik turun memudahkan perataan untuk blok Heading, Paragraf, Gambar, dan MediaText. Kami meniadakan efek peredupan pada blok yang tidak dipilih. -Kami memperbaiki beberapa masalah penyunting blok, tak ada lagi crash saat menempel di konten HTML ataupun tepi blok Kutipan yang tidak muncul di Mode Gelap. +Tata letak layar Pemberitahuan menyebabkan teks hilang ke bawah casing sebagian model ponsel. Sudah kami perbaiki! -Jika Anda menjadwalkan pos untuk dipublikasikan di masa lalu, itu akan ditampilkan sebagai “dijadwalkan” bukan “dipublikasikan”. Telah diperbaiki, bersama dengan masalah tanggal yang tidak ditampilkan secara tepat jika zona waktu situs Anda tidak sama dengan zona waktu perangkat. +Terkadang Anda ingin @-menyebut seseorang pada sebuah komentar, dan aplikasi akan menyarankan beberapa nama tetapi tidak dapat dipilih — kami juga telah memperbaikinya. Kami juga memperbaiki beberapa masalah lain yang menyebabkan aplikasi tertutup paksa saat Anda mencoba mengakses layar Halaman Situs atau menggunakan tombol Tindakan Cepat di iPad untuk membuka pos blog. Untuk halaman dan pos, pratinjau kini lebih besar untuk iPad yang menjalankan iOS 13. -Kami memperbaiki beberapa UI yang tidak konsisten di Mode Gelap dan dengan bilah peralatan Pembaca. +Seperti halnya kopi kesukaan kita, Mode Gelap itu seharusnya: hitam pekat dan bisa dinikmati tanpa gangguan. Ada beberapa gangguan pada Mode Gelap dan Terang, dan terkadang aplikasi menjadi aneh saat Anda beralih dari satu mode ke mode lain. Gangguan tersebut kini jauh berkurang. -Anda dapat menggunakan @-sebut saat menulis komentar di mode layar penuh. - -Terkadang email Tautan Ajaib Daftar dan Login akan masuk ke folder spam, sehingga kami menambahkan catatan ke layar konfirmasi untuk menyarankan pengguna agar memeriksa folder spam/sampah mereka jika tidak kunjung menemukan emailnya. - -Selalu jaga kesehatan, semuanya. +Tetaplah aman, kawan. diff --git a/Scripts/fastlane/metadata/it/release_notes.txt b/Scripts/fastlane/metadata/it/release_notes.txt index bd9079c8b462..4ec0ab7a67e0 100644 --- a/Scripts/fastlane/metadata/it/release_notes.txt +++ b/Scripts/fastlane/metadata/it/release_notes.txt @@ -1,15 +1,11 @@ -Nuovi blocchi. Dai il benvenuto al blocco Ultimi articoli, per mettere in evidenza nuovi elementi su articoli e pagine. +La creazione del sito è stata semplificata rimuovendo alcuni passaggi intermedi. Scegli il genere di sito che vuoi, inserisci il nome di dominio ed è fatta. -Quando crei una nuova pagina, ti mostreremo alcuni modelli: scegline uno e noi aggiungeremo tutti i blocchi necessari alla tua pagina per farti iniziare velocemente. +L'editor a blocchi è stato ulteriormente migliorato: è ora disponibile il blocco Copertina, sono presenti opzioni di allineamento nel blocco Titolo e una barra degli strumenti del menu a discesa rende più semplice gli allineamento per i blocchi Titolo, Paragrafo, Immagine e Media e testo. Abbiamo rimosso l'effetto di attenuazione sui blocchi non selezionati. -Abbiamo risolto alcuni problemi relativi all'editor a blocchi; non si verificano più arresti anomali quando si incollano i contenuti HTML o quando mancano i bordi del blocco Citazione in Dark Mode. +Il layout della schermata Notifiche causava la perdita di testo sotto il case di alcuni modelli di telefoni cellulari. Il problema è stato risolto. -Quando in passato pianificavi la pubblicazione di un articolo, veniva visualizzato come "pianificato" anziché "pubblicato". Questo problema è stato risolto, insieme a un altro che causava la visualizzazione errata delle date venivano visualizzate se il fuso orario del sito non era lo stesso del fuso orario del dispositivo. +Alcune volte hai provato a citare qualcuno tramite la @ in un commento e l'app ti ha suggerito dei nomi ma non te ne ha fatto selezionare uno. Questo problema è stato risolto. Ci siamo inoltre occuparti di alcuni altri problemi a causa dei quali l'app si arrestava in modo anomalo quando provavi ad accedere alla schermata Pagine del sito o a usare i pulsanti Azione rapida sull'iPad per ottenere gli articoli del tuo blog. Inoltre, parlando di pagine e articoli, le anteprime sono ora più grandi su iPad su cui è in esecuzione iOS 13. -Abbiamo corretto alcune incoerenze nella UI in Dark Mode e nella barra degli strumenti del Reader. +Amiamo la nostra Dark Mode come il nostro caffè: molto scura e senza alcun bug che la circonda. Erano stati riscontrati alcuni problemi tecnici per le modalità Light Mode e Dark Mode e a volte venivano riscontrati strani comportamenti quando si passava dall'una all'altra. Ora sono presenti molti meno problemi. -Puoi usare i riferimenti @ quando scrivi commenti in modalità schermo intero. - -A volte le e-mail di Accedi e Accesso tramite link finivano nella cartella dello spam, quindi abbiamo aggiunto una nota alla schermata di conferma in cui viene suggerito di controllare le cartelle di spam/posta indesiderata se non visualizzano subito le e-mail. - -State tutti al sicuro. +State al sicuro. Tutti. diff --git a/Scripts/fastlane/metadata/ja/release_notes.txt b/Scripts/fastlane/metadata/ja/release_notes.txt index 6b47a02f1d61..a52a71db41f1 100644 --- a/Scripts/fastlane/metadata/ja/release_notes.txt +++ b/Scripts/fastlane/metadata/ja/release_notes.txt @@ -1,15 +1,11 @@ -新しいブロックが登場 !最新の投稿ブロックを使用すると、投稿やページの最新情報を強調表示できます。 +中間的な段階をいくつか削除することで、サイト作成のプロセスを合理化しました。サイトの種類を選び、ドメイン名を入力すれば完了です。 -新しいページを作成すると、いくつかのテンプレートが表示されます。テンプレートを1つ選択すると、必要なすべてのブロックがページに追加され、すぐに使えるようになります。 +ブロックエディターがさらに改良されました。カバーブロックが利用できるようになり、見出しブロックのドロップダウンのツールバーオプションでで見出し、段落、画像、メディアテキストブロックの整列が簡単にできるようになりました。また、選択されていないブロックの調光効果を削除しました。 -ブロックエディターのいくつかの問題を修正しました。HTML コンテンツに貼り付けたとき、またはダークモードで引用ブロックの境界線が表示されなくなったときに、クラッシュすることがなくなりました。 +通知画面のレイアウトにより、携帯端末の一部のモデルでテキストが失われる原因となっていました。これを修正しました。 -投稿を過去に公開するように予約した場合、「公開済み」ではなく「予約済み」と表示されることがありました。この問題は、サイトのタイムゾーンがデバイスのタイムゾーンと異なる場合に日付が正しく表示されない問題とあわせて修正されました。 +コメントで誰かに @ 付きメンションをしようとすると、アプリが名前を提案しても選択できないことがありましたが、これも修正しました。また、サイトページ画面にアクセスしようとしたり、iPad のクイックアクションボタンを使ってブログ記事にアクセスしようとするとアプリがクラッシュしてしまう問題も修正しました。iOS 13の iPad ではページと投稿のプレビューが大きくなりました。 -ダークモードと Reader ツールバーで統一されていなかった一部の UI を修正しました。 +ライトモードとダークモードにいくつか不具合があり、切り替えたときに奇妙な動作をすることがありました。今では、そのような不具合ははるかに少なくなりました。 -フルスクリーンモードでコメントを書くときに、@- メンションを使用できます。 - -サインアップとログインのマジックリンクメールがスパムフォルダーに送信される場合があるため、すぐにメールが表示されない場合は、スパムメールや迷惑メールのフォルダーを確認するように促すメッセージを確認画面に追加しました。 - -身の安全を守りましょう。 +それでは皆さん、お体にお気をつけてお過ごしください ! diff --git a/Scripts/fastlane/metadata/nl-NL/release_notes.txt b/Scripts/fastlane/metadata/nl-NL/release_notes.txt index 261cb057ff6e..14d44627e65e 100644 --- a/Scripts/fastlane/metadata/nl-NL/release_notes.txt +++ b/Scripts/fastlane/metadata/nl-NL/release_notes.txt @@ -1,15 +1,11 @@ -Nieuwe blokken! Welkom bij het blok Nieuwste berichten, waar je je nieuwe content kunt laten opvallen in berichten en op pagina's. +Het aanmaken van een site is gestroomlijnd door een aantal tussenliggende stappen te verwijderen. Kies het soort site waar je naar op zoek bent, voer een domeinnaam in en je bent klaar. -Wanneer je een nieuwe pagina aanmaakt, laten we je een paar sjablonen zien. Kies er een en wij voegen dan alle benodigde blokken toe aan je pagina zodat je snel aan de slag kunt gaan. +De blokeditor bevat nu nog meer verbeteringen: Het Omslagblok is nu beschikbaar, er zijn uitlijningsopties voor het Titelblok en een vervolgkeuzebalk maakt het eenvoudiger om de blokken Titel, Paragraaf, Afbeelding en MediaTekst uit te lijnen. We hebben ook het dim-effect op niet-geselecteerde blokken verwijderd. -We hebben een paar problemen met de blok-editor verholpen. De app zou nu niet meer moeten crashen wanneer je HTML-content plakt en er zullen geen randen van citaatblokken meer ontbreken in de Nachtmodus. +De opmaak van het scherm Meldingen leidde ertoe dat tekst verloren kon raken onder de behuizing van sommige modellen mobiele telefoons. Dat is nu opgelost! -Als je voorheen berichten inplande voor publicatie, werden ze weergegeven als 'gepland' in plaats van als 'gepubliceerd'. Dat probleem is opgelost, net als het probleem waarbij data onjuist werden weergegeven als de tijdzone van je site niet hetzelfde was als de tijdzone van je apparaat. +Soms probeerde je iemand aan te spreken via een @-melding in de reactie en gaf de app je een aantal suggesties, maar kon je geen naam kiezen. Dat probleem is nu ook verholpen. We hebben ook een paar andere problemen aangepakt die zorgden dat de app crashte wanneer je toegang probeerde te krijgen tot het scherm Sitepagina's of wanneer je probeerde de knoppen voor snelle acties te gebruiken op een iPad om je blogberichten te openen. En over pagina's en berichten gesproken: voorbeeldweergaven zijn nu groter voor iPads waarop iOS 13 wordt uitgevoerd. -We hebben UI-inconsistenties opgemerkt in de Nachtmodus en met de Reader-werkbalk. - -Je kunt @-verwijzingen gebruiken wanneer je reacties schrijft in de weergave op volledig scherm. - -Soms werden e-mails om aan te melden en in te loggen via magische links naar je map met ongewenste e-mail verplaatst. Daarom hebben we een opmerking aan het bevestigingsscherm toegevoegd waarin staat dat je je mappen Spam/Ongewenste e-mail moet controleren als je de e-mail niet snel ontvangt. +We willen de nachtmodus echt zoals we onze koffie willen: heel donker en zonder dat er bugs in ronddrijven. Er zijn nog wat glitches aanwezig in de dag- en nachtmodus, wat soms tot vreemde problemen leidde wanneer je overschakelde van de ene op de andere. Er zijn nu een hoop minder glitches. Blijf veilig allemaal. diff --git a/Scripts/fastlane/metadata/pt-BR/release_notes.txt b/Scripts/fastlane/metadata/pt-BR/release_notes.txt deleted file mode 100644 index 91fe6d4056fd..000000000000 --- a/Scripts/fastlane/metadata/pt-BR/release_notes.txt +++ /dev/null @@ -1,15 +0,0 @@ -Novos blocos! Desejem boas-vindas para o bloco "Posts recentes", que mostra seu conteúdo recente em posts e páginas. - -Ao criar uma nova página, mostraremos alguns modelos. Escolha um modelo e os blocos necessários serão adicionados à página automaticamente para agilizar o processo de criação. - -Corrigimos alguns erros no editor de blocos. Você não verá mais travamentos ao colar conteúdo HTML ou falta de bordas no bloco de Citação no modo escuro. - -Ao agendar um post para ser publicado no passado, ele era exibido como agendado ao invés de publicado. Corrigimos esse comportamento e também um erro na exibição de datas quando o fuso horário do site não é o mesmo do dispositivo. - -Corrigimos inconsistências na interface no modo escuro e na barra do Leitor. - -Agora você pode usar @-menções ao digitar comentários no modo de tela cheia. - -Como os e-mails de inscrição e login podem ir para sua pasta de spam, adicionamos uma nota na tela de confirmação para lembrar nossos usuários de verificarem a pasta de spam caso o e-mail não seja exibido na pasta principal. - -Continuem em segurança e lavem as mãos :-) diff --git a/Scripts/fastlane/metadata/ru/release_notes.txt b/Scripts/fastlane/metadata/ru/release_notes.txt index 612b30bef9e8..496851bf7b62 100644 --- a/Scripts/fastlane/metadata/ru/release_notes.txt +++ b/Scripts/fastlane/metadata/ru/release_notes.txt @@ -1,13 +1,9 @@ -Новые блоки! Блок последних записей, чтобы выделить ваши свежие записи и страницы. +Создание сайта было упрощено путем удаления некоторых промежуточных шагов. Выберите тип сайта, который вы хотите, введите доменное имя, и все готово. -При создании новой страницы можно выбрать шаблон и вы получите страничку со всеми нужными блоками, чтобы быстро её наполнить. +Редактор блоков получил больше улучшений: теперь доступен блок Cover; в блоке заголовка есть варианты выравнивания; а выпадающая панель инструментов облегчает выравнивание для блоков «Заголовок», «Абзац», «Изображение», «Медиа+Текст». И мы убрали эффект затемнения на невыбранных блоках. -Исправлены проблемы с границами цитат в тёмном режиме и падение при вставке HTML-содержимого. +Макет экрана уведомлений приводил к потере текста под корпусом некоторых моделей мобильных телефонов. Это исправлено! -Мы исправили статус публикации для записей, если вы устанавливаете время публикации в прошлом, а также при несовпадении часового пояса сайта и устройства. +Иногда вы пытаетесь @-упомянуть кого-то в комментарии, и приложение предлагает имена, но не позволяет выбрать одно - это тоже исправлено. Мы также позаботились о некоторых других проблемах, которые приводили к сбою приложения при попытке доступа к экрану «Страницы сайта» или использования кнопок быстрого действия на iPad для доступа к сообщениям в блоге. Что касается страниц и записей, то размер превью теперь больше для iPad под iOS 13. -Исправлены некоторые проблемы интерфейса в темном режиме с панелью чтива. - -Теперь вы можете использовать @-упоминания в полноэкранном режиме ответа на комментарии. - -Иногда письма с магической ссылкой для входа или сброса пароля попадают в спам, мы добавили совет посмотреть там. +Нам нравится наш Темный режим, как и наш кофе: очень темный. В светлых и темных режимах были некоторые сбои, и иногда все происходило странно, когда вы переключались с одного на другой. Сейчас таких глюков гораздо меньше. diff --git a/Scripts/fastlane/metadata/sv/release_notes.txt b/Scripts/fastlane/metadata/sv/release_notes.txt index 932dccb2bbbb..cd739b5904e7 100644 --- a/Scripts/fastlane/metadata/sv/release_notes.txt +++ b/Scripts/fastlane/metadata/sv/release_notes.txt @@ -1,15 +1,11 @@ -Nya block! Låt oss presentera blocket för de senaste inläggen, som låter dig lyfta fram dina nyheter bland inlägg och sidor. +Det har nu blivit mycket smidigare att skapa en ny webbplats genom att några mellanliggande steg har tagits bort. Välj vilken typ av webbplats du vill ha och skriv in ett domännamn, så är det klar. -När du skapar en ny sida visar vi några mallar. När du väljer någon av dem lägger vi in de block som behövs på sidan för att du ska komma igång snabbt. +Blockredigeraren har förbättrats på flera sätt: Nu har du tillgång till blocket ”Överlägg”, I rubrikblocket kan du välja textjustering, och en verktygslist med rullgardinsmeny underlättar textjustering för block av typerna rubrik, stycke, bild och mediatext. Dessutom har vi tagit bort nedtoningseffekten på omarkerade block. -Vi har löst några problem med blockredigeraren: inga fler programkrascher när du klistrar in HTML-innehåll. Och citatblockets kanter försvinner inte längre, ens om du använder mörkt läge. +På vissa mobiler gjorde layouten av aviseringsskärmen att text kunde bli oåtkomlig – nu är det rättat! -Om du schemalade ett inlägg för publicering i förfluten tid visades det tidigare som ”schemalagt” i stället för ”publicerat”. Det är nu rättat, liksom ett annat problem där datum kunde visas på fel sätt om din webbplats och din telefon var inställda på olika tidszoner. +Ibland kanske du försökte att @-nämna någon i en kommentar, appen föreslog olika namn men det gick inte att välja något av dem. Det är också fixat nu. Vidare har vi tagit hand om några problem som kunde få appen att krascha när du försökte öppna skärmen med webbplatsens sidor eller använda snabbåtgärder på iPad för att komma till dina blogginlägg. På tal om sidor och inlägg – nu är förhandsvisningen i ett större format för iPad som kör iOS 13. -Vi har rättat några inkonsekventa saker i användargränssnittet i mörkt läge och med verktygslisten i läsaren. +Vi vill att vårt Dark Mode (mörkt läge) ska vara som kaffet vi dricker: svart som natten och utan diverse programfel. Det fanns olika missar i funktionen för ljust och mörkt läge. Ibland hände konstiga saker vid växling mellan lägena. Nu är missarna inte lika många längre. -När du skriver kommentarer i helskärmsläge kan du @-nämna personer. - -Ibland händer det att e-post med länkar för registrering och magisk inloggning hamnar i skräpfoldern, så på bekräftelsesidan har vi lagt till en påminnelse om att kolla i mapparna för spam och reklam om de inte hittar meddelandet direkt. - -Ta hand om er. +Var försiktiga och ta hand om er. diff --git a/Scripts/fastlane/metadata/tr/release_notes.txt b/Scripts/fastlane/metadata/tr/release_notes.txt index 241c2cff823c..efd313f6a6ea 100644 --- a/Scripts/fastlane/metadata/tr/release_notes.txt +++ b/Scripts/fastlane/metadata/tr/release_notes.txt @@ -1,15 +1,11 @@ -Yeni bloklar! Güncel yazılar bloğuna hoş geldin diyoruz, yeni yazı ve sayfalarınızı vurgulamak için kullanabilirsiniz. +Site Oluşturma, bazı ara adımlar kaldırılarak kolaylaştırıldı. İstediğiniz site türünü seçin, bir alan adı girin ve işiniz bitti. -Yeni bir sayfa oluşturduğunuzda, bir kaç şablon gösteriyoruz — birini seçin, ve gerekli tüm blokları sayfanıza ekleyerek işe başlamanızı sağlayalım. +Blok düzenleyicide daha fazla iyileştirme yapıldı: Kapak bloğu artık kullanılabilir; Başlık bloğunda hizalama seçenekleri vardır; ve bir açılır araç çubuğu Başlık, Paragraf, Resim, MediaText blokları için hizalamayı kolaylaştırır. Ve seçilmemiş bloklar üzerindeki karartma efektini kaldırdık. -Bir kaç blok düzenleyici sorununu düzelttik; HTML içerik yapıştırırken çökmeler ya da koyu modda alıntı bloğunun çerçevesinin olmaması gibi problemlere son. +Bildirimler ekranının düzeni, bazı cep telefonu modellerinin gövdesi altında metnin kaybolmasına neden oldu. Bu düzeltildi! -Eğer geçmişte bir yazı zamanladıysanız "zamanlanmış" yerine "yayımlanmış" olarak gözüküyordu. Bu düzeltildi, beraberinde sitenin zaman diliminin cihazınızın zaman dilimiyle aynı olmadığı durumlarda ortaya çıkan bir sorun da düzeltildi. +Bazen bir yorumda bir kişiyi @ belirtmeye çalışırsınız ve uygulama adları önerir, ancak bir tane seçmenize izin vermez - bu da düzeltildi. Ayrıca, Site Sayfaları ekranına erişmeye çalıştığınızda veya blog yayınlarınıza ulaşmak için iPad'lerde Hızlı İşlem düğmelerini kullandığınızda uygulamanın kilitlenmesine neden olan diğer birkaç sorunu da hallettik. Sayfalardan ve yayınlardan bahsetmişken, iOS 13 çalıştıran iPad'ler için önizlemeler artık daha büyük. -Koyu modda ve okuyucu araç çubuğundaki bazı kullanıcı arabirimi uyumsuzluklarını giderdik. +Karanlık modumuzu kahvemizi sevdiğimiz gibi seviyoruz: gerçekten karanlık ve içinde yüzen herhangi bir hata olmadan. Aydınlık ve karanlık modlarında bazı aksaklıklar vardı ve bazen birinden diğerine geçtiğinizde işler garip bir şekilde davrandı. Şu anda bu hatalardan çok daha azı var. -Tam ekran modunda yorum yazarken @-anmalarını kullanabilirsiniz. - -Bazen üyelik ve giriş sihirli bağlantı e-postaları istenmeyen postalar arasına gidebiliyor, biz de onaylama ekranına kullanıcıların istenmeyen/önemsiz posta kutularını kontrol etmelerini hatırlatır bir açıklama ekledik. - -Herkese sağlık ve güvenlik. +Hepiniz güvende olun. diff --git a/Scripts/fastlane/metadata/zh-Hans/release_notes.txt b/Scripts/fastlane/metadata/zh-Hans/release_notes.txt index 3d1fa74a3eef..b064c5441862 100644 --- a/Scripts/fastlane/metadata/zh-Hans/release_notes.txt +++ b/Scripts/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,15 +1,11 @@ -新区块!欢迎使用“最新文章”区块,突出显示文章和页面中的新内容。 +站点创建流程实现简化,去掉了一些中间步骤。选择您需要的站点类型,输入域名,即可大功告成。 -当您创建新页面时,我们将展示几个模板供您选择,然后我们将为您的页面添加所有必要的区块,帮助您快速入门。 +区块编辑器得到了更多改进:现已推出区块编辑器;在“标题”区块中添加了对齐选项;添加了下拉工具栏,便于用户在“标题”、“段落”、“图像”和“MediaText”区块中更轻松地执行对齐操作。而且,我们去除了未选定区块上的暗淡效果。 -我们修复了一些区块编辑器问题;在 HTML 内容中进行粘贴或“暗黑模式”中缺失“引用”区块边框时,不再发生崩溃。 +“通知”屏幕的布局曾导致文本因某些型号的手机外壳的遮挡而无法显示。此问题已解决! -如果您在过去安排了要发布的文章,它将显示为“已安排”而不是“已发布”。此问题已修复,同时还修复了另一个问题,即如果站点时区与设备时区不同,则日期显示错误。 +有时,如果您尝试在评论中使用 @ 提及某人,应用程序会提供建议姓名,但之后您却无法选择 - 这个问题也已得到修复。我们还解决了如下一些问题:当您尝试访问“站点页面”屏幕或在 iPad 上使用“快速操作”按钮访问博客文章时,导致应用程序崩溃的问题。说到页面和文章,在运行 iOS 13 的 iPad 上,预览画面现在增大了。 -我们修复了“暗黑模式”与“阅读器”工具栏中一些 UI 不一致的问题。 +我们对深色模式的喜爱就如对咖啡的喜爱一样:颜色至深,而且其中不漂浮任何杂物。浅色模式和深色模式下曾有一些小问题,当您从一种模式切换到另一种模式时,某些地方表现得很奇怪。现在,这些小问题已经少之又少。 -您在全屏模式下撰写评论时可以使用 @-mentions。 - -有时,注册和免密码登录链接电子邮件会进入垃圾邮件文件夹,所以我们在确认屏幕上添加了一个备注,建议大家如果没有及时看到电子邮件,则检查他们的垃圾邮件/垃圾文件夹。 - -请大家注意安全。 +请大家确保安全。 diff --git a/Scripts/fastlane/metadata/zh-Hant/release_notes.txt b/Scripts/fastlane/metadata/zh-Hant/release_notes.txt index 0fab13d49234..940d8951f815 100644 --- a/Scripts/fastlane/metadata/zh-Hant/release_notes.txt +++ b/Scripts/fastlane/metadata/zh-Hant/release_notes.txt @@ -1,15 +1,11 @@ -新增區塊!歡迎使用最新文章區塊,藉此突顯你的文章和頁面中的最新內容。 +我們已移除一些中間步驟,簡化網站建立程序。挑選你想要的網站並輸入網域名稱,就大功告成了。 -當你建立新頁面時,我們會顯示幾個範本。選擇一個範本後,我們會為頁面新增所有必要區塊,讓你快速開始建立頁面。 +區塊編輯器也推出更多改善功能:你現在能夠使用封面區塊;標題區塊提供對齊選項;標題、段落、圖片、媒體文字區塊的下拉式工具列可讓對齊變得更輕鬆。我們也移除了未選取區塊的變暗效果。 -我們已修復幾個區塊編輯器問題;現在貼上 HTML 內容時不會再當機,深色模式也不會再導致引文區塊邊線消失。 +「通知」畫面的版面形式,會導致部分手機型號文字大小寫混亂的情況。此問題已獲得修正! -若你過去曾排程文章發佈時間,系統會將文章顯示為「已排程」而非「已發佈」。我們已修復此問題,以及當你的網站時區與裝置時區不同時,會導致日期顯示錯誤的問題。 +你有時會在留言中嘗試使用 @ 提及某人,應用程式雖會建議標註的姓名卻不讓你選擇,此問題也已獲得修正。我們也已解決其他幾個問題,這些問題過去會在你嘗試存取「網站頁面」畫面或使用 iPad 的「快速動作」按鈕時,導致應用程式當機。至於頁面和文章,執行 iOS 13 版本的 iPad 現可享有更大的預覽畫面。 -我們已修復部分 UI 在深色模式以及與閱讀器工具列不一致的問題。 +我們喜歡「深色模式」,就如同對咖啡的喜愛一般:顏色深沉,運作不會受任何錯誤干擾。「淺色模式」和「深色模式」過去會出現一些故障,互相切換有時也無法正常運作。現在這些故障情況已大幅減少了。 -在全螢幕模式撰寫留言時,你可以使用 @ 標記他人。 - -有時註冊和登入神奇連結電子郵件會傳送到你的垃圾郵件資料夾,因此我們已在確認畫面新增備註,建議使用者若沒有很快地收到電子郵件,應檢查垃圾郵件資料夾。 - -請各位注意安全。 +各位,請保持安全。 From 18f899f6814d8b42ab5a0ea36100625f5728f8a6 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Fri, 17 Apr 2020 12:55:05 +0200 Subject: [PATCH 225/245] Bump version number --- config/Version.public.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/Version.public.xcconfig b/config/Version.public.xcconfig index 6972b1c4b18a..c43451d765c5 100644 --- a/config/Version.public.xcconfig +++ b/config/Version.public.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=14.6 // Public long version example: VERSION_LONG=9.9.0.0 -VERSION_LONG=14.6.0.2 +VERSION_LONG=14.6.0.3 From b1b978de826b85a07bede72214f977b0ea9c68e3 Mon Sep 17 00:00:00 2001 From: James Frost Date: Fri, 17 Apr 2020 13:19:29 +0100 Subject: [PATCH 226/245] Update My Sites tab title to My Site I've chosen not to update all the code references to "My Sites" at this stage, as we may do a further refactoring to the actual hierarchy of the sites list -> site detail screens. --- .../Blog/Blog Details/BlogDetailsViewController.m | 3 +-- WordPress/Classes/ViewRelated/System/WPTabBarController.m | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsViewController.m b/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsViewController.m index 1536bdabbbff..6413c9c968fb 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsViewController.m +++ b/WordPress/Classes/ViewRelated/Blog/Blog Details/BlogDetailsViewController.m @@ -350,7 +350,7 @@ - (void)viewWillAppear:(BOOL)animated self.restorableSelectedIndexPath = nil; } - self.navigationItem.title = self.blog.settings.name; + self.navigationItem.title = NSLocalizedString(@"My Site", @"Title of My Site tab"); [self.headerView setBlog:self.blog]; @@ -1644,7 +1644,6 @@ - (void)handleDataModelChange:(NSNotification *)note NSSet *updatedObjects = note.userInfo[NSUpdatedObjectsKey]; if ([updatedObjects containsObject:self.blog] || [updatedObjects containsObject:self.blog.settings]) { - self.navigationItem.title = self.blog.settings.name; [self configureTableViewData]; BOOL isQuickStartSectionShownAfter = [self findSectionIndexWithSections:self.tableSections category:BlogDetailsSectionCategoryQuickStart] != NSNotFound; diff --git a/WordPress/Classes/ViewRelated/System/WPTabBarController.m b/WordPress/Classes/ViewRelated/System/WPTabBarController.m index 1dfbad246d83..6dcb6faf3e4a 100644 --- a/WordPress/Classes/ViewRelated/System/WPTabBarController.m +++ b/WordPress/Classes/ViewRelated/System/WPTabBarController.m @@ -193,9 +193,9 @@ - (UINavigationController *)blogListNavigationController _blogListNavigationController.tabBarItem.image = mySitesTabBarImage; _blogListNavigationController.tabBarItem.selectedImage = mySitesTabBarImage; _blogListNavigationController.restorationIdentifier = WPBlogListNavigationRestorationID; - _blogListNavigationController.tabBarItem.accessibilityLabel = NSLocalizedString(@"My Sites", @"The accessibility value of the my sites tab."); + _blogListNavigationController.tabBarItem.accessibilityLabel = NSLocalizedString(@"My Site", @"The accessibility value of the my site tab."); _blogListNavigationController.tabBarItem.accessibilityIdentifier = @"mySitesTabButton"; - _blogListNavigationController.tabBarItem.title = NSLocalizedString(@"My Sites", @"The accessibility value of the my sites tab."); + _blogListNavigationController.tabBarItem.title = NSLocalizedString(@"My Site", @"The accessibility value of the my site tab."); NSManagedObjectContext *context = [[ContextManager sharedInstance] mainContext]; BlogService *blogService = [[BlogService alloc] initWithManagedObjectContext:context]; @@ -1016,7 +1016,7 @@ - (BOOL)canBecomeFirstResponder return @[ [UIKeyCommand keyCommandWithInput:@"N" modifierFlags:UIKeyModifierCommand action:@selector(showPostTab) discoverabilityTitle:NSLocalizedString(@"New Post", @"The accessibility value of the post tab.")], - [UIKeyCommand keyCommandWithInput:@"1" modifierFlags:UIKeyModifierCommand action:@selector(showMySitesTab) discoverabilityTitle:NSLocalizedString(@"My Sites", @"The accessibility value of the my sites tab.")], + [UIKeyCommand keyCommandWithInput:@"1" modifierFlags:UIKeyModifierCommand action:@selector(showMySitesTab) discoverabilityTitle:NSLocalizedString(@"My Site", @"The accessibility value of the my site tab.")], [UIKeyCommand keyCommandWithInput:@"2" modifierFlags:UIKeyModifierCommand action:@selector(showReaderTab) discoverabilityTitle:NSLocalizedString(@"Reader", @"The accessibility value of the reader tab.")], // will be removed when the new IA implementation completes [UIKeyCommand keyCommandWithInput:@"3" modifierFlags:UIKeyModifierCommand action:@selector(showMeTab) discoverabilityTitle:NSLocalizedString(@"Me", @"The accessibility value of the me tab.")], From 69ebb071c26bd82d964254d9789ce0be9e6a3f7a Mon Sep 17 00:00:00 2001 From: Rachel McR Date: Fri, 17 Apr 2020 13:38:24 +0100 Subject: [PATCH 227/245] Testing: Save test output with updated CircleCI Orb (#13913) * Zip and save test output from unit and UI test runs using CircleCI Orb --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 23907c5bf015..85dd6bac6616 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -59,7 +59,8 @@ jobs: name: Run Unit Tests working_directory: Scripts command: bundle exec fastlane test_without_building xctestrun:DerivedData/Build/Products/WordPress_WordPressUnitTests_iphonesimulator13.2-x86_64.xctestrun destination:"platform=iOS Simulator,id=$SIMULATOR_UDID" try_count:3 - - ios/save-xcodebuild-artifacts + - ios/save-xcodebuild-artifacts: + result-bundle-path: build/results UI Tests: parameters: device: @@ -91,7 +92,8 @@ jobs: name: Run UI Tests working_directory: Scripts command: bundle exec fastlane test_without_building xctestrun:DerivedData/Build/Products/WordPress_WordPressUITests_iphonesimulator13.2-x86_64.xctestrun destination:"platform=iOS Simulator,id=$SIMULATOR_UDID" try_count:3 - - ios/save-xcodebuild-artifacts + - ios/save-xcodebuild-artifacts: + result-bundle-path: build/results - when: condition: << parameters.post-to-slack >> steps: From 068b8fbc8fe999abde813bd2c3fced43e751e9a7 Mon Sep 17 00:00:00 2001 From: James Frost Date: Fri, 17 Apr 2020 14:12:28 +0100 Subject: [PATCH 228/245] Update release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index df8a1078ff3d..7ac5b9067a4e 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -12,6 +12,7 @@ * [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. * [internal] the navigation to the "login by site address" flow has code changes that can cause regressions. See https://git.io/JfvP9 for testing details. +* Updated site details screen title to My Site, to avoid duplicating the title of the current site which is displayed in the screen's header area. 14.6 ----- From 80b36a4595d4e5a5d001c39f1f542216b7e0bd88 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 17 Apr 2020 10:41:21 -0600 Subject: [PATCH 229/245] Adjust the alignment of the filter popover --- .../ViewRelated/Reader/Tab Navigation/ReaderTabView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index c5d7b5416fc5..af6a8594cb71 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -208,7 +208,8 @@ extension ReaderTabView { /// Filter button @objc private func didTapFilterButton() { - viewModel.presentFilter(from: filterButton) { [weak self] title in + /// Present from the image view to align to the left hand side + viewModel.presentFilter(from: filterButton.imageView ?? filterButton) { [weak self] title in if let title = title { self?.resetFilterButton.isHidden = false self?.setFilterButtonTitle(title) From e0a1399d50443bb891b4fff0a9a66cd868194078 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 17 Apr 2020 11:06:34 -0600 Subject: [PATCH 230/245] Fix bad merge --- .../Reader/Tab Navigation/ReaderTabViewModel.swift | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 27f19b49713a..3a4bcf649587 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -1,7 +1,7 @@ class ReaderTabViewModel { - var tabSelectionCallback: ((ReaderAbstractTopic) -> Void)? + var tabSelectionCallback: ((ReaderAbstractTopic?) -> Void)? var selectedFilter: ReaderAbstractTopic? var filterTapped: ((UIView, @escaping (ReaderAbstractTopic?) -> Void) -> Void)? @@ -11,12 +11,13 @@ class ReaderTabViewModel { func showTab(for item: FilterTabBarItem) { - guard let readerItem = item as? ReaderTabItem, - let topic = readerItem.topic else { - return + guard let readerItem = item as? ReaderTabItem else { + return } - let selectedTopic: ReaderAbstractTopic + let topic = readerItem.topic + + let selectedTopic: ReaderAbstractTopic? if readerItem.shouldHideButtonsView == false { selectedTopic = selectedFilter ?? topic } else { From eeb406ef4e0b65343414247ccb4233e57cfe205f Mon Sep 17 00:00:00 2001 From: yaelirub Date: Fri, 17 Apr 2020 10:28:39 -0700 Subject: [PATCH 231/245] Check sections count before accessing section 0 (#13922) * Adding a check * adding guard --- .../ViewRelated/Plugins/PluginListViewController.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginListViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginListViewController.swift index 4e1ac9de6a67..19c82bcf8634 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginListViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginListViewController.swift @@ -95,6 +95,12 @@ class PluginListViewController: UITableViewController, ImmuTablePresenter { case .replace: tableView.reloadData() case .selective(let changedRows): + let tableViewSectionsCount = tableViewModel.sections.count + guard tableViewSectionsCount > 0 else { + tableView.reloadData() + return + } + if tableView.numberOfRows(inSection: 0) == changedRows.count { let indexPaths = changedRows.map { IndexPath(row: $0, section: 0) } tableView.reloadRows(at: indexPaths, with: .none) From ce1bc4f064949573a8529e080b54dd056d377ad5 Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Fri, 17 Apr 2020 12:38:32 -0600 Subject: [PATCH 232/245] Updating WPKit & Auth pod versions. --- Podfile | 10 +++++----- Podfile.lock | 24 +++++++----------------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/Podfile b/Podfile index 6bf9aa198f71..468bc5cae302 100644 --- a/Podfile +++ b/Podfile @@ -44,9 +44,9 @@ def wordpress_ui end def wordpress_kit - #pod 'WordPressKit', '~> 4.8.0-beta.1' - #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :tag => '4.6.0-beta.3' - pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :branch => 'fix/11771-gravatar_user_not_found' + pod 'WordPressKit', '~> 4.8.0-beta.1' + #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :tag => '' + #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :branch => '' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :commit => '' #pod 'WordPressKit', :path => '../WordPressKit-iOS' end @@ -184,9 +184,9 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - # pod 'WordPressAuthenticator', '~> 1.13.0-beta.4' + pod 'WordPressAuthenticator', '~> 1.13.0-beta.5' # While in PR - pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => 'issue/update_wpkit_version' + # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' # pod 'WordPressAuthenticator', :path => '../WordPressAuthenticator-iOS' diff --git a/Podfile.lock b/Podfile.lock index f448836f74b2..df50b399f368 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -376,7 +376,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.13.0-beta.4): + - WordPressAuthenticator (1.13.0-beta.5): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -479,8 +479,8 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (from `https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git`, branch `issue/update_wpkit_version`) - - WordPressKit (from `https://github.com/wordpress-mobile/WordPressKit-iOS.git`, branch `fix/11771-gravatar_user_not_found`) + - WordPressAuthenticator (~> 1.13.0-beta.5) + - WordPressKit (~> 4.8.0-beta.1) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.3-beta.1) @@ -527,6 +527,8 @@ SPEC REPOS: - UIDeviceIdentifier - WordPress-Aztec-iOS - WordPress-Editor-iOS + - WordPressAuthenticator + - WordPressKit - WordPressMocks - WordPressShared - WordPressUI @@ -611,12 +613,6 @@ EXTERNAL SOURCES: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 - WordPressAuthenticator: - :branch: issue/update_wpkit_version - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git - WordPressKit: - :branch: fix/11771-gravatar_user_not_found - :git: https://github.com/wordpress-mobile/WordPressKit-iOS.git Yoga: :podspec: https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json @@ -630,12 +626,6 @@ CHECKOUT OPTIONS: RNTAztecView: :git: http://github.com/wordpress-mobile/gutenberg-mobile/ :tag: v1.26.0 - WordPressAuthenticator: - :commit: f597659ec0c82b1b786dbd87e786cefede11117c - :git: https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git - WordPressKit: - :commit: 864eec7eb314cf89e3c7defedf631db87c1af42b - :git: https://github.com/wordpress-mobile/WordPressKit-iOS.git SPEC CHECKSUMS: 1PasswordExtension: f97cc80ae58053c331b2b6dc8843ba7103b33794 @@ -707,7 +697,7 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: 482365d748b60fbc1aa49efb734230901924957c + WordPressAuthenticator: 069addaf14f6d3948d4a0a3c1d4934c3cff7660c WordPressKit: 636f3f7e1c879b22f1d46e61d662ad640161f8b2 WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 @@ -724,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: e8140fdf61b5dfbd85630a499d57614cb524803e +PODFILE CHECKSUM: 73de16125e9bea801dd83639382442f8ce57c197 COCOAPODS: 1.8.4 From 4c3050e04cb93c7822658a1eaeef769302dc8681 Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Fri, 17 Apr 2020 13:49:36 -0600 Subject: [PATCH 233/245] Empty commit to force tests to run. --- RELEASE-NOTES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 55161872dd1d..10247e9f862f 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -12,7 +12,7 @@ * [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. * [internal] the navigation to the "login by site address" flow has code changes that can cause regressions. See https://git.io/JfvP9 for testing details. -* Login Epilogue: fixed issue where account information never stopped loading for some self-hosted sites. +* Login Epilogue: fixed issue where account information never stopped loading for some self-hosted sites. * Updated site details screen title to My Site, to avoid duplicating the title of the current site which is displayed in the screen's header area. 14.6 From e6addf4d6a21fc9a387690c0ce9fd061ddf272a2 Mon Sep 17 00:00:00 2001 From: ScoutHarris Date: Fri, 17 Apr 2020 13:58:29 -0600 Subject: [PATCH 234/245] Update PostStatsViewModel.swift Removing self and correcting indentation. --- .../Stats/Shared Views/Post Stats/PostStatsViewModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift b/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift index 0a8d4e90535c..d5cfafcc60ae 100644 --- a/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift +++ b/WordPress/Classes/ViewRelated/Stats/Shared Views/Post Stats/PostStatsViewModel.swift @@ -128,8 +128,8 @@ private extension PostStatsViewModel { tabData: dayData.viewCount, difference: dayData.difference, differencePercent: dayData.percentage, - date: self.selectedDate, - period: .day + date: selectedDate, + period: .day ) let chart = PostChart(postViews: lastTwoWeeks) From d045aa9b5ec4bc315cbf9c529cbdab29be6682bd Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 17 Apr 2020 17:36:54 -0300 Subject: [PATCH 235/245] Fix an issue that was displaying additional insets at the scrollview --- .../System/Action Sheet/DrawerPresentationController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 919f2652c816..56e2af5e1ead 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -427,7 +427,7 @@ private extension DrawerPresentationController { else { return } - let bottom = presentingView.safeAreaLayoutGuide.layoutFrame.origin.y + let bottom = presentingView.safeAreaInsets.bottom let margin = presentedView.frame.origin.y + bottom scrollView.contentInset.bottom = margin From 74f137be9beb03d987750c01736181348ee43132 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 17 Apr 2020 17:37:24 -0300 Subject: [PATCH 236/245] Add Prepublishing Nudges update --- RELEASE-NOTES.txt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 7ac5b9067a4e..bdd331a3489c 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -12,8 +12,9 @@ * [internal] the login by email flow and the self-hosted login flow have code changes that can cause regressions. See https://git.io/JfeFN for testing details. * Updated the appearance of the login and signup buttons to make signup more prominent. * [internal] the navigation to the "login by site address" flow has code changes that can cause regressions. See https://git.io/JfvP9 for testing details. -* Updated site details screen title to My Site, to avoid duplicating the title of the current site which is displayed in the screen's header area. - +* Updated site details screen title to My Site, to avoid duplicating the title of the current site which is displayed in the screen's header area. +* You can now schedule your post, add tags or change the visibility before hitting "Publish Now" — and you don't have to go to the Post Settings for this! + 14.6 ----- * [internal] the login flow with 2-factor authentication enabled has code changes that can cause regressions. See https://git.io/Jvdil for testing details. @@ -38,7 +39,7 @@ * Reader post detail: fix colors when switching between light and dark modes. * Fixed an issue where Continue with Apple button wouldn't respond after Jetpack Setup > Sign up flow completed. - + 14.5 ----- * Block editor: New block: Latest Posts @@ -46,7 +47,7 @@ * Block editor: Added Starter Page Templates: when you create a new page, we now show you a few templates to get started more quickly. * Block editor: Fix crash when pasting HTML content with embeded images on paragraphs * Post Settings: Fix issue where the status of a post showed "Scheduled" instead of "Published" after scheduling before the current date. -* Stats: Fix background color in Dark Mode on wider screen sizes. +* Stats: Fix background color in Dark Mode on wider screen sizes. * Post Settings: Fix issue where the calendar selection may not match the selected date when site timezone differs from device timezone. * Dark Mode fixes: - Border color on Search bars. @@ -63,11 +64,11 @@ 14.4.1 ----- * Block Editor: Fix crash when inserting a Button Block. - + 14.4 ----- * Post Settings: Fixes the displayed publish date of posts which are to be immediately published. - + 14.3 ----- * Aztec and Block Editor: Fix the presentation of ordered lists with large numbers. @@ -84,8 +85,8 @@ * Block editor: Add support for upload options in Gallery block * Aztec and Block Editor: Fix the presentation of ordered lists with large numbers. * Added Quick Action buttons on the Site Details page to access the most frequently used parts of a site. -* Post Settings: Adjusts the weekday symbols in the calendar depending on Regional settings. - +* Post Settings: Adjusts the weekday symbols in the calendar depending on Regional settings. + 14.2 ----- From 5601c4db42fdf7d61c374e29dab0e9469796e291 Mon Sep 17 00:00:00 2001 From: Brandon Titus Date: Fri, 17 Apr 2020 14:56:43 -0600 Subject: [PATCH 237/245] Re-disable new reader feature --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index f6aebd1e7df8..b59a6bd67be0 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -31,7 +31,7 @@ enum FeatureFlag: Int, CaseIterable { case .floatingCreateButton: return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest, .a8cPrereleaseTesting] case .newReaderNavigation: - return BuildConfiguration.current ~= [.localDeveloper, .a8cBranchTest] + return false } } } From b0b21eaed06d14fa980e458d5d68d1b9ef43edc6 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 17 Apr 2020 18:05:30 -0300 Subject: [PATCH 238/245] Fix the table view inset so the user can see all tags --- .../Post/PostTagPickerViewController.swift | 13 ++++++++++++- .../Action Sheet/DrawerPresentationController.swift | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift index faaf6256a649..630a4417b786 100644 --- a/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift +++ b/WordPress/Classes/ViewRelated/Post/PostTagPickerViewController.swift @@ -2,7 +2,7 @@ import Foundation import CocoaLumberjack import WordPressShared -class PostTagPickerViewController: UIViewController { +class PostTagPickerViewController: UIViewController, DrawerPresentable { private let originalTags: [String] @objc var onValueChanged: ((String) -> Void)? @objc let blog: Blog @@ -120,6 +120,9 @@ class PostTagPickerViewController: UIViewController { super.viewDidAppear(animated) updateSuggestions() loadTags() + + tableView.contentInset.bottom += descriptionLabel.frame.height + 20 + updateTableViewBottomInset() } override func viewWillDisappear(_ animated: Bool) { @@ -149,6 +152,14 @@ class PostTagPickerViewController: UIViewController { fileprivate func reloadTableData() { tableView.reloadData() } + + fileprivate func updateTableViewBottomInset() { + guard !UIDevice.isPad() else { + return + } + + tableView.contentInset.bottom += presentedVC?.yPosition ?? 0 + } } diff --git a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift index 56e2af5e1ead..7a71381f1f93 100644 --- a/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift +++ b/WordPress/Classes/ViewRelated/System/Action Sheet/DrawerPresentationController.swift @@ -168,6 +168,10 @@ public class DrawerPresentationController: FancyAlertPresentationController { /// Returns the current position of the drawer public var currentPosition: DrawerPosition = .collapsed + /// Returns the Y position of the drawer + public var yPosition: CGFloat? { + return presentedView?.frame.origin.y + } /// Animates between the drawer positions /// - Parameter position: The position to animate to From b0441ff02aa34218efdc8108db3a0e65fd994e9c Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 17 Apr 2020 18:51:45 -0300 Subject: [PATCH 239/245] Customize additionalSafeAreaInsetsRegular for reader filter --- .../ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift index 3a4bcf649587..6b4c3fa6cf3b 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabViewModel.swift @@ -33,6 +33,7 @@ class ReaderTabViewModel { func presentFilter(from: UIViewController, sourceView: UIView, completion: @escaping (ReaderAbstractTopic?) -> Void) { let viewController = makeFilterSheetViewController(completion: completion) let bottomSheet = BottomSheetViewController(childViewController: viewController) + bottomSheet.additionalSafeAreaInsetsRegular = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0) bottomSheet.show(from: from, sourceView: sourceView, arrowDirections: .up) } From 2843b084a103fd0507615a25d4cda4dc2c5ff547 Mon Sep 17 00:00:00 2001 From: Leandro Alonso Date: Fri, 17 Apr 2020 18:55:21 -0300 Subject: [PATCH 240/245] Fix additionalSafeAreaInsetsRegular reference --- .../Utility/Bottom Sheet/BottomSheetViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift index e4b40e00bfd7..53efda46b936 100644 --- a/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift +++ b/WordPress/Classes/Utility/Bottom Sheet/BottomSheetViewController.swift @@ -133,7 +133,7 @@ class BottomSheetViewController: UIViewController { private func refreshForTraits() { if presentingViewController?.traitCollection.horizontalSizeClass == .regular && presentingViewController?.traitCollection.verticalSizeClass != .compact { gripButton.isHidden = true - additionalSafeAreaInsets = Constants.additionalSafeAreaInsetsRegular + additionalSafeAreaInsets = additionalSafeAreaInsetsRegular } else { gripButton.isHidden = false additionalSafeAreaInsets = .zero From 7737b01ed2a752afaf245893d59e87c6d0fdd804 Mon Sep 17 00:00:00 2001 From: Ngoc T Date: Sat, 18 Apr 2020 11:07:19 +1000 Subject: [PATCH 241/245] Fixed analytics image source for Stock Photo being sent as Giphy --- .../ViewRelated/Gutenberg/Utils/GutenbergStockPhotos.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Gutenberg/Utils/GutenbergStockPhotos.swift b/WordPress/Classes/ViewRelated/Gutenberg/Utils/GutenbergStockPhotos.swift index 19eee9b9e608..6ddebd0cbbc2 100644 --- a/WordPress/Classes/ViewRelated/Gutenberg/Utils/GutenbergStockPhotos.swift +++ b/WordPress/Classes/ViewRelated/Gutenberg/Utils/GutenbergStockPhotos.swift @@ -61,7 +61,7 @@ extension GutenbergStockPhotos: StockPhotosPickerDelegate { } let mediaInfo = assets.compactMap({ (asset) -> MediaInfo? in - guard let media = self.mediaInserter.insert(exportableAsset: asset, source: .giphy) else { + guard let media = self.mediaInserter.insert(exportableAsset: asset, source: .stockPhotos) else { return nil } let mediaUploadID = media.gutenbergUploadID @@ -75,7 +75,7 @@ extension GutenbergStockPhotos: StockPhotosPickerDelegate { /// - Parameter assets: Stock Media objects to append. func appendOnNewBlocks(assets: ArraySlice) { assets.forEach { - if let media = self.mediaInserter.insert(exportableAsset: $0, source: .giphy) { + if let media = self.mediaInserter.insert(exportableAsset: $0, source: .stockPhotos) { self.gutenberg.appendMedia(id: media.gutenbergUploadID, url: $0.URL, type: .image) } } From 3654f211d5569246c010da8d1870f853814210eb Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Mon, 20 Apr 2020 12:50:15 +0200 Subject: [PATCH 242/245] Update pods for release --- Podfile | 6 +++--- Podfile.lock | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Podfile b/Podfile index 468bc5cae302..263042b02d16 100644 --- a/Podfile +++ b/Podfile @@ -34,7 +34,7 @@ end def wordpress_ui ## for production: - pod 'WordPressUI', '~> 1.5.3-beta.1' + pod 'WordPressUI', '~> 1.5.3' ## for development: #pod 'WordPressUI', :path => '../WordPressUI-iOS' @@ -44,7 +44,7 @@ def wordpress_ui end def wordpress_kit - pod 'WordPressKit', '~> 4.8.0-beta.1' + pod 'WordPressKit', '~> 4.8.0' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :tag => '' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :branch => '' #pod 'WordPressKit', :git => 'https://github.com/wordpress-mobile/WordPressKit-iOS.git', :commit => '' @@ -184,7 +184,7 @@ target 'WordPress' do pod 'Gridicons', '~> 1.0.1' - pod 'WordPressAuthenticator', '~> 1.13.0-beta.5' + pod 'WordPressAuthenticator', '~> 1.13.0' # While in PR # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :branch => '' # pod 'WordPressAuthenticator', :git => 'https://github.com/wordpress-mobile/WordPressAuthenticator-iOS.git', :commit => '' diff --git a/Podfile.lock b/Podfile.lock index df50b399f368..a55f5c7fda6e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -376,7 +376,7 @@ PODS: - WordPress-Aztec-iOS (1.17.1) - WordPress-Editor-iOS (1.17.1): - WordPress-Aztec-iOS (= 1.17.1) - - WordPressAuthenticator (1.13.0-beta.5): + - WordPressAuthenticator (1.13.0): - 1PasswordExtension (= 1.8.6) - Alamofire (= 4.8) - CocoaLumberjack (~> 3.5) @@ -385,10 +385,10 @@ PODS: - lottie-ios (= 3.1.6) - "NSURL+IDN (= 0.4)" - SVProgressHUD (= 2.2.5) - - WordPressKit (~> 4.8.0-beta.1) + - WordPressKit (~> 4.8.0) - WordPressShared (~> 1.8.16) - WordPressUI (~> 1.5.2) - - WordPressKit (4.8.0-beta.1): + - WordPressKit (4.8.0): - Alamofire (~> 4.8.0) - CocoaLumberjack (~> 3.4) - NSObject-SafeExpectations (= 0.0.4) @@ -399,7 +399,7 @@ PODS: - WordPressShared (1.8.16): - CocoaLumberjack (~> 3.4) - FormatterKit/TimeIntervalFormatter (= 1.8.2) - - WordPressUI (1.5.3-beta.1) + - WordPressUI (1.5.3) - WPMediaPicker (1.6.1) - wpxmlrpc (0.8.5) - Yoga (1.14.0) @@ -479,11 +479,11 @@ DEPENDENCIES: - Starscream (= 3.0.6) - SVProgressHUD (= 2.2.5) - WordPress-Editor-iOS (~> 1.17.1) - - WordPressAuthenticator (~> 1.13.0-beta.5) - - WordPressKit (~> 4.8.0-beta.1) + - WordPressAuthenticator (~> 1.13.0) + - WordPressKit (~> 4.8.0) - WordPressMocks (~> 0.0.8) - WordPressShared (~> 1.8.16) - - WordPressUI (~> 1.5.3-beta.1) + - WordPressUI (~> 1.5.3) - WPMediaPicker (~> 1.6.1) - Yoga (from `https://raw.githubusercontent.com/wordpress-mobile/gutenberg-mobile/v1.26.0/react-native-gutenberg-bridge/third-party-podspecs/Yoga.podspec.json`) - ZendeskSupportSDK (= 5.0.0) @@ -697,11 +697,11 @@ SPEC CHECKSUMS: UIDeviceIdentifier: 44f805037d21b94394821828f4fcaba34b38c2d0 WordPress-Aztec-iOS: 319620514af963ca519bd83b96a2c0ebdf3a0f03 WordPress-Editor-iOS: 497b55838ef0030cc6ca82eb92da84e661423521 - WordPressAuthenticator: 069addaf14f6d3948d4a0a3c1d4934c3cff7660c - WordPressKit: 636f3f7e1c879b22f1d46e61d662ad640161f8b2 + WordPressAuthenticator: ed1ea00ad8e04ff4dc086c7be6b77370b1738230 + WordPressKit: 84045e236949248632a2c644149e5657733011bb WordPressMocks: b4064b99a073117bbc304abe82df78f2fbe60992 WordPressShared: 1bc316ed162f42af4e0fa2869437e9e28b532b01 - WordPressUI: 91b91e51b8cd7db83a2bd492c12998db711a6a57 + WordPressUI: 7519c8118596f1360f05adf9bb007ac49087fd36 WPMediaPicker: 59559813ec8a7929a91aa5a1db74998d8485fb9f wpxmlrpc: 6a9bdd6ab9d1b159b384b0df0f3f39de9af4fecf Yoga: c920bf12bf8146aa5cd118063378c2cf5682d16c @@ -714,6 +714,6 @@ SPEC CHECKSUMS: ZendeskSupportSDK: a87ab1e4badace92c75eb11dc77ede1e995b2adc ZIPFoundation: 249fa8890597086cd536bb2df5c9804d84e122b0 -PODFILE CHECKSUM: 73de16125e9bea801dd83639382442f8ce57c197 +PODFILE CHECKSUM: ad442d03e0a6f79791ef26a5d8f1982d2384a3a4 COCOAPODS: 1.8.4 From 553accb00ae92840ceaa8eb8b3f58693cb1d3f31 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Mon, 20 Apr 2020 14:41:10 +0200 Subject: [PATCH 243/245] Bump version number --- Scripts/fastlane/Deliverfile | 2 +- Scripts/fastlane/download_metadata.swift | 2 +- config/Version.internal.xcconfig | 4 ++-- config/Version.public.xcconfig | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Scripts/fastlane/Deliverfile b/Scripts/fastlane/Deliverfile index 63808caf266e..a3546a299293 100644 --- a/Scripts/fastlane/Deliverfile +++ b/Scripts/fastlane/Deliverfile @@ -5,7 +5,7 @@ screenshots_path "./screenshots/" app_identifier "org.wordpress" # Make sure to update these keys for a new version -app_version "14.6" +app_version "14.7" privacy_url({ 'default' => 'https://automattic.com/privacy/', diff --git a/Scripts/fastlane/download_metadata.swift b/Scripts/fastlane/download_metadata.swift index 17dfa697aefa..835d03416188 100755 --- a/Scripts/fastlane/download_metadata.swift +++ b/Scripts/fastlane/download_metadata.swift @@ -3,7 +3,7 @@ import Foundation let glotPressSubtitleKey = "app_store_subtitle" -let glotPressWhatsNewKey = "v14.6-whats-new" +let glotPressWhatsNewKey = "v14.7-whats-new" let glotPressDescriptionKey = "app_store_desc" let glotPressKeywordsKey = "app_store_keywords" let baseFolder = "./metadata" diff --git a/config/Version.internal.xcconfig b/config/Version.internal.xcconfig index 3c0a1c7d9dab..74779b40db91 100644 --- a/config/Version.internal.xcconfig +++ b/config/Version.internal.xcconfig @@ -1,4 +1,4 @@ -VERSION_SHORT=14.6 +VERSION_SHORT=14.7 // Internal long version example: VERSION_LONG=9.9.0.20180423 -VERSION_LONG=14.6.0.20200417 +VERSION_LONG=14.7.0.20200420 diff --git a/config/Version.public.xcconfig b/config/Version.public.xcconfig index c43451d765c5..30006f446a52 100644 --- a/config/Version.public.xcconfig +++ b/config/Version.public.xcconfig @@ -1,4 +1,4 @@ -VERSION_SHORT=14.6 +VERSION_SHORT=14.7 // Public long version example: VERSION_LONG=9.9.0.0 -VERSION_LONG=14.6.0.3 +VERSION_LONG=14.7.0.0 From a76b9046ecb641dbbdd2189627b9a04923c1c3a3 Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Mon, 20 Apr 2020 14:41:15 +0200 Subject: [PATCH 244/245] Update release notes. --- RELEASE-NOTES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 5b8e0d524a29..301424a1768f 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,3 +1,6 @@ +14.8 +----- + 14.7 ----- * Classic Editor: Fixed action sheet position for additional Media sources picker on iPad From ec2d1d77ee97ef4563ecfd7ec71a4db237114acd Mon Sep 17 00:00:00 2001 From: Lorenzo Mattei Date: Mon, 20 Apr 2020 14:41:35 +0200 Subject: [PATCH 245/245] Updates strings for localization --- .../Resources/en.lproj/Localizable.strings | Bin 632650 -> 632806 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/WordPress/Resources/en.lproj/Localizable.strings b/WordPress/Resources/en.lproj/Localizable.strings index 2c17f3743b8d1f41a741538b66f625ece2b22adc..46069c7a054c944c91f7545edbc9075e19a3cb1e 100644 GIT binary patch delta 2289 zcmcgteN0tl7=PdQocG*wFPGEhUM^R?2p0xOVunC2%@Bf7DdI(l*A4tl^T(KDa}v~)tT{ZIY$Qve@BwwhHZQZPI}!`P6Jb)+Zxb4yq;Pyk;+peN zTg)vGFVRiMA3m@_XlAzhj6V&7jk~Z8#>$glRtv!c3 z9L1yrttzpOO{CDUFVPO&p=n+?oX!-eT}toTjOMb^DY@BCDo7bAf6Tx%aRFl;JRgSEu+VWMUx27U=3k#$ua}(-)Z*8( z`Jrk`jty+5#1QCiU^ZwzLgfGtshad3(Jwk+SrcCEbDONNa3`~Z(!_$D9#W5u@sL{L z$9FyEUrg%NOTA7w#VK~XiFy7(r@7i}gWju>sQH>$rZ6$Y>^kO-sKG{fuxB28R~TK~ zfamdG^<*olg+n!xJ8(vHsC$7sKtbTBwg!1T%UjLN4*e^rto1jut~?x2`b;2o{KTv# z4<_G0{II@Faw6E6P0+vIZj)xi=m*rQ9k|No^HvL!p&*c3gFGYyld3f8^et0w>IAKr`WkWCxnTx`Bj*$^6 zjqT-5xMCLVPfO!pbp9UuqE)oP9xt_{fIf?01W;5H>7W)c8|2Z8%iCTdJlcuAo_JCv}+(vXg4E5x&|fy3{k& z$_E;aY(fmb zE{bqj5kdsy3q-8r;oL)V@z|ElXT!(Jx?3>)gp3uiV%H+E}vB zLJ*1qrimc?3(=u^4_efoD2sL`Pr9A@7#rhqa0e72If`+aRp6$Q}@xg~Nqw7hGwsH2T`P||4%#B@oQ9Z#)$q)R#zZP*%ge1hJLQfUJO z^+=AmGDCZ^&}kV?`I@-ZYj$c!k4s4mVWM6+5;9lEhfazH^iqOV>K&Tg^6J<*2Xx%S z>1N!Z_UEVkl^grF7Ik$ZjsMU5cq$|tCcSKi>kjUM-adr#{FQ>fBXjVw7M1+?pdoZ_ zW3Hfjy<0}y%?2^c)v6}<{}$_XQw5woAUsMfdp&?oiTl@I5B2)BVe@%nUZ_!6L5viukF?Cq~a1(fsF1NExXn z+ekgBC5stAEj5xbdX4Xg;iv6sf7GE3_-z(z!%>3x=Ci7bG1~v&<#9%N}H22Co#*MCiOp zZKAwQv6*yVdz>hIN9m}K@Nm9>QUZAGz!L31Nq!Vqg+=p|27M^ak^WbS?yypK$5{2Q zykx;tbyo}^aw}vyRZZl_tE+9${kfunJ6-LD^kqO;TBi5^Xot6(B(}5! z)h|M8)nXoo$?7o^1F?bHkE54}58sV>oY6nXw41AN96(Tup*e?c5I2U@_F7ttfdF$COV@mg8p*Ju7^*n5ISx0Kw%qCf$mCFu(z0cRj3Q_Gzfl6v&7X3+R_5aMm8B} z*=X4$Ltqq5J@_4cDryQ=XGWyHhGPRb+KGydaXC7<27dimT>uxnk_Cca(7fB6hv>Jb zR>}^zdRDPO%_tTm>kPBa3y@pkG>=keWF}_T%&kPkitlOOE^vJ$&4=?v>=<-qqoU*~ zg^Rc??0Sv}z0cAT!R3)P80%%cW1j{WawRX=E~@D8UUm)&``Af5wDIEj8I~r4cY@`2 z4loXuFtfpC#yNNfmW4hPrpRv6BcH27^D=VIM6 z{KU^NUToH&5WQlOCG=Ez2JC~aFY5)KL