From 5739f074ae85d7cb99d1e4e1bc49453ee6bca27e Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 6 Mar 2018 12:27:04 -0500 Subject: [PATCH 1/3] Show migration screen at first launch. sort sounds alphabetically (other than Default/None) // FREEBIE --- ...ExperienceUpgradesPageViewController.swift | 4 +-- .../src/ViewControllers/HomeViewController.m | 29 ++++++++++--------- SignalMessaging/environment/OWSSounds.m | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift index 8d8b2bc63..e84bd7733 100644 --- a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift +++ b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift @@ -44,8 +44,8 @@ private class IntroducingCustomNotificationAudioExperienceUpgradeViewController: let button = addButton(title: buttonTitle) { _ in // dismiss the modally presented view controller, then proceed. self.experienceUpgradesPageViewController.dismiss(animated: true) { - guard let fromViewController = UIApplication.shared.frontmostViewController as? HomeViewController else { - owsFail("unexpected frontmostViewController: \(String(describing: UIApplication.shared.frontmostViewController))") + guard let fromViewController = UIApplication.shared.frontmostViewController else { + owsFail("frontmostViewController was unexectedly nil") return } diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index fd6148776..a760a5b71 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -287,6 +287,22 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; [self updateBarButtonItems]; } +- (void)viewDidAppear:(BOOL)animated +{ + [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; + }); + } +} + - (void)updateBarButtonItems { const CGFloat kBarButtonSize = 44; @@ -510,19 +526,6 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; }); }]; } - - // We want to show the user the upgrade experience as soon as the app is visible to them. - // It cannot go in viewDidAppear, which is called while the app is in the background if - // we were launched from a voip notification. - if (!self.hasShownAnyUnseenUpgradeExperiences) { - dispatch_async(dispatch_get_main_queue(), ^{ - if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) { - return; - } - [self displayAnyUnseenUpgradeExperience]; - self.hasShownAnyUnseenUpgradeExperiences = YES; - }); - } } #pragma mark - startup diff --git a/SignalMessaging/environment/OWSSounds.m b/SignalMessaging/environment/OWSSounds.m index 60acb3871..a29b16c77 100644 --- a/SignalMessaging/environment/OWSSounds.m +++ b/SignalMessaging/environment/OWSSounds.m @@ -74,8 +74,8 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob @(OWSSound_Keys), @(OWSSound_Popcorn), @(OWSSound_Pulse), - @(OWSSound_Synth), @(OWSSound_ClassicNotification), + @(OWSSound_Synth), ]; } From 51ae9365557e34b38ac3c77922bd77da8ed1eada Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 6 Mar 2018 13:53:25 -0500 Subject: [PATCH 2/3] 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 { From f459c9ce6d350ca4173867da6d4b4ce5c2d02308 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 6 Mar 2018 13:57:59 -0500 Subject: [PATCH 3/3] CR: rename SignalClassic constant // FREEBIE --- SignalMessaging/environment/OWSSounds.h | 2 +- SignalMessaging/environment/OWSSounds.m | 6 +++--- SignalMessaging/environment/migrations/OWS107LegacySounds.m | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SignalMessaging/environment/OWSSounds.h b/SignalMessaging/environment/OWSSounds.h index 99d40ccfc..506560d13 100644 --- a/SignalMessaging/environment/OWSSounds.h +++ b/SignalMessaging/environment/OWSSounds.h @@ -20,7 +20,7 @@ typedef NS_ENUM(NSUInteger, OWSSound) { OWSSound_Popcorn, OWSSound_Pulse, OWSSound_Synth, - OWSSound_ClassicNotification, + OWSSound_SignalClassic, // Ringtone Sounds OWSSound_Opening, diff --git a/SignalMessaging/environment/OWSSounds.m b/SignalMessaging/environment/OWSSounds.m index a29b16c77..0c7e29ba4 100644 --- a/SignalMessaging/environment/OWSSounds.m +++ b/SignalMessaging/environment/OWSSounds.m @@ -74,7 +74,7 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob @(OWSSound_Keys), @(OWSSound_Popcorn), @(OWSSound_Pulse), - @(OWSSound_ClassicNotification), + @(OWSSound_SignalClassic), @(OWSSound_Synth), ]; } @@ -112,7 +112,7 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob return @"Pulse"; case OWSSound_Synth: return @"Synth"; - case OWSSound_ClassicNotification: + case OWSSound_SignalClassic: return @"Signal Classic"; // Call Audio @@ -172,7 +172,7 @@ NSString *const kOWSSoundsStorageGlobalNotificationKey = @"kOWSSoundsStorageGlob return (quiet ? @"pulse-quiet.aifc" : @"pulse.aifc"); case OWSSound_Synth: return (quiet ? @"synth-quiet.aifc" : @"synth.aifc"); - case OWSSound_ClassicNotification: + case OWSSound_SignalClassic: return (quiet ? @"classic-quiet.aifc" : @"classic.aifc"); // Ringtone Sounds diff --git a/SignalMessaging/environment/migrations/OWS107LegacySounds.m b/SignalMessaging/environment/migrations/OWS107LegacySounds.m index 2c3214edb..20cb6c48a 100644 --- a/SignalMessaging/environment/migrations/OWS107LegacySounds.m +++ b/SignalMessaging/environment/migrations/OWS107LegacySounds.m @@ -22,7 +22,7 @@ static NSString *const OWS107LegacySoundsMigrationId = @"107"; { OWSAssert(transaction); - [OWSSounds setGlobalNotificationSound:OWSSound_ClassicNotification transaction:transaction]; + [OWSSounds setGlobalNotificationSound:OWSSound_SignalClassic transaction:transaction]; } @end