From 51ae9365557e34b38ac3c77922bd77da8ed1eada Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 6 Mar 2018 13:53:25 -0500 Subject: [PATCH] Ensure the user sees the experience upgrade Don't mark it as seen until it is dismissed. // FREEBIE --- ...ExperienceUpgradesPageViewController.swift | 20 +++++++++---- .../src/ViewControllers/HomeViewController.m | 29 ++----------------- 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift index e84bd7733..184c159f7 100644 --- a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift +++ b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift @@ -490,12 +490,15 @@ class ExperienceUpgradesPageViewController: OWSViewController, UIPageViewControl let pageViewController: UIPageViewController + let editingDBConnection: YapDatabaseConnection + // MARK: - Initializers required init(experienceUpgrades: [ExperienceUpgrade]) { self.experienceUpgrades = experienceUpgrades setPageControlAppearance() + self.editingDBConnection = TSStorageManager.shared().newDatabaseConnection() self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) super.init(nibName: nil, bundle: nil) self.pageViewController.dataSource = self @@ -505,12 +508,7 @@ class ExperienceUpgradesPageViewController: OWSViewController, UIPageViewControl @available(*, unavailable, message:"unavailable, use initWithExperienceUpgrade instead") required init?(coder aDecoder: NSCoder) { - assert(false) - // This should never happen, but so as not to explode we give some bogus data - self.experienceUpgrades = [ExperienceUpgrade()] - self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) - super.init(coder: aDecoder) - self.pageViewController.dataSource = self + fatalError("unimplemented") } // MARK: - View lifecycle @@ -679,6 +677,16 @@ class ExperienceUpgradesPageViewController: OWSViewController, UIPageViewControl allViewControllers.append(viewController) } + override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { + // Blocking write before dismiss, to be sure they're marked as complete + // before HomeView.didAppear is re-fired. + self.editingDBConnection.readWrite { transaction in + Logger.info("\(self.logTag) marking all upgrades as seen.") + ExperienceUpgradeFinder.shared.markAllAsSeen(transaction: transaction) + } + super.dismiss(animated: flag, completion: completion) + } + func didTapDismissButton(sender: UIButton) { Logger.debug("\(TAG) in \(#function)") self.dismiss(animated: true) diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index a760a5b71..329c73a1e 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -47,7 +47,6 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; @property (nonatomic) UISegmentedControl *segmentedControl; @property (nonatomic) id previewingContext; @property (nonatomic) NSSet *blockedPhoneNumberSet; -@property (nonatomic) BOOL hasShownAnyUnseenUpgradeExperiences; @property (nonatomic) BOOL isViewVisible; @property (nonatomic) BOOL isAppInBackground; @@ -291,16 +290,7 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; { [super viewDidAppear:animated]; - // Keep in mind viewDidAppear is called while the app is in the background if the app was - // launched by a voip notification. This is fine - it will remain visible to the user - // when they eventually launch the app, but we shouldn't make any changes assuming - // the user has *seen* the upgrade experience at this point. - if (!self.hasShownAnyUnseenUpgradeExperiences) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self displayAnyUnseenUpgradeExperience]; - self.hasShownAnyUnseenUpgradeExperiences = YES; - }); - } + [self displayAnyUnseenUpgradeExperience]; } - (void)updateBarButtonItems @@ -535,21 +525,12 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; OWSAssertIsOnMainThread(); __block NSArray *unseenUpgrades; - [self.editingDbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { unseenUpgrades = [ExperienceUpgradeFinder.sharedManager allUnseenWithTransaction:transaction]; }]; return unseenUpgrades; } -- (void)markAllUpgradeExperiencesAsSeen -{ - OWSAssertIsOnMainThread(); - - [self.editingDbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [ExperienceUpgradeFinder.sharedManager markAllAsSeenWithTransaction:transaction]; - }]; -} - - (void)displayAnyUnseenUpgradeExperience { OWSAssertIsOnMainThread(); @@ -559,11 +540,7 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; if (unseenUpgrades.count > 0) { ExperienceUpgradesPageViewController *experienceUpgradeViewController = [[ExperienceUpgradesPageViewController alloc] initWithExperienceUpgrades:unseenUpgrades]; - [self presentViewController:experienceUpgradeViewController - animated:YES - completion:^{ - [self markAllUpgradeExperiencesAsSeen]; - }]; + [self presentViewController:experienceUpgradeViewController animated:YES completion:nil]; } else if (!self.hasBeenPresented && [ProfileViewController shouldDisplayProfileViewOnLaunch]) { [ProfileViewController presentForUpgradeOrNag:self]; } else {