From 2e836433277dc38c3e23023a7d9861f584d6a42d Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 11 Aug 2017 16:29:05 -0400 Subject: [PATCH] Don't consider registration complete until user registers their push notification tokens. // FREEBIE --- Signal/src/AppDelegate.m | 4 +++ Signal/src/Models/AccountManager.swift | 16 +++++++-- Signal/src/Models/SyncPushTokensJob.swift | 35 +++++++++++-------- .../AdvancedSettingsTableViewController.m | 14 ++++++-- .../ViewControllers/SignalsViewController.m | 10 ------ Signal/src/environment/Environment.m | 4 +-- 6 files changed, 52 insertions(+), 31 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 0252d36f63..aceb8d0c03 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -462,6 +462,10 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ DDLogInfo( @"%@ running post launch block for registered user: %@", self.tag, [TSAccountManager localNumber]); + __unused AnyPromise *promise = + [OWSSyncPushTokensJob runWithPushManager:[PushManager sharedManager] + accountManager:[Environment getCurrent].accountManager + preferences:[Environment preferences]]; // Clean up any messages that expired since last launch immediately // and continue cleaning in the background. diff --git a/Signal/src/Models/AccountManager.swift b/Signal/src/Models/AccountManager.swift index a3eeaa8514..5adccb88b2 100644 --- a/Signal/src/Models/AccountManager.swift +++ b/Signal/src/Models/AccountManager.swift @@ -13,10 +13,17 @@ class AccountManager: NSObject { let TAG = "[AccountManager]" let textSecureAccountManager: TSAccountManager let networkManager: TSNetworkManager + let preferences: PropertyListPreferences - required init(textSecureAccountManager: TSAccountManager) { + var pushManager: PushManager { + // dependency injection hack since PushManager has *alot* of dependencies, and would induce a cycle. + return PushManager.shared() + } + + required init(textSecureAccountManager: TSAccountManager, preferences: PropertyListPreferences) { self.networkManager = textSecureAccountManager.networkManager self.textSecureAccountManager = textSecureAccountManager + self.preferences = preferences } // MARK: registration @@ -26,7 +33,7 @@ class AccountManager: NSObject { } func register(verificationCode: String) -> Promise { - return firstly { + let registrationPromise = firstly { Promise { fulfill, reject in if verificationCode.characters.count == 0 { let error = OWSErrorWithCodeDescription(.userError, @@ -39,9 +46,14 @@ class AccountManager: NSObject { }.then { Logger.debug("\(self.TAG) verification code looks well formed.") return self.registerForTextSecure(verificationCode: verificationCode) + }.then { + return SyncPushTokensJob.run(pushManager: self.pushManager, accountManager: self, preferences: self.preferences) }.then { Logger.debug("\(self.TAG) successfully registered for TextSecure") } + registrationPromise.retainUntilComplete() + + return registrationPromise } private func registerForTextSecure(verificationCode: String) -> Promise { diff --git a/Signal/src/Models/SyncPushTokensJob.swift b/Signal/src/Models/SyncPushTokensJob.swift index 62498a56b8..c0ff03e5e9 100644 --- a/Signal/src/Models/SyncPushTokensJob.swift +++ b/Signal/src/Models/SyncPushTokensJob.swift @@ -11,22 +11,20 @@ class SyncPushTokensJob: NSObject { let pushManager: PushManager let accountManager: AccountManager let preferences: PropertyListPreferences - let showAlerts: Bool var uploadOnlyIfStale = true - required init(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences, showAlerts: Bool) { + required init(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences) { self.pushManager = pushManager self.accountManager = accountManager self.preferences = preferences - self.showAlerts = showAlerts } - @objc class func run(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences, showAlerts: Bool = false) { - let job = self.init(pushManager: pushManager, accountManager: accountManager, preferences: preferences, showAlerts:showAlerts) - job.run() + class func run(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences) -> Promise { + let job = self.init(pushManager: pushManager, accountManager: accountManager, preferences: preferences) + return job.run() } - func run() { + func run() -> Promise { Logger.info("\(TAG) Starting.") // Required to potentially prompt user for notifications settings @@ -61,21 +59,30 @@ class SyncPushTokensJob: NSObject { return self.recordNewPushTokens(pushToken:pushToken, voipToken:voipToken) }.then { Logger.debug("\(self.TAG) Successfully ran syncPushTokensJob.") - if self.showAlerts { - OWSAlerts.showAlert(withTitle:NSLocalizedString("PUSH_REGISTER_SUCCESS", comment: "Title of alert shown when push tokens sync job succeeds.")) - } - return Promise(value: ()) }.catch { error in Logger.error("\(self.TAG) Failed to run syncPushTokensJob with error: \(error).") - if self.showAlerts { - OWSAlerts.showAlert(withTitle:NSLocalizedString("REGISTRATION_BODY", comment: "Title of alert shown when push tokens sync job fails.")) - } } } runPromise.retainUntilComplete() + + return runPromise } + // MARK - objc wrappers, since objc can't use swift parameterized types + + @objc class func run(pushManager: PushManager, accountManager: AccountManager, preferences: PropertyListPreferences) -> AnyPromise { + let promise: Promise = self.run(pushManager: pushManager, accountManager: accountManager, preferences: preferences) + return AnyPromise(promise) + } + + @objc func run() -> AnyPromise { + let promise: Promise = self.run() + return AnyPromise(promise) + } + + // MARK - private helpers + private func requestPushTokens() -> Promise<(pushToken: String, voipToken: String)> { return Promise { fulfill, reject in self.pushManager.requestPushToken( diff --git a/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m b/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m index 19b5909da2..c5c9d9dcbf 100644 --- a/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m +++ b/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m @@ -12,6 +12,7 @@ #import "PushManager.h" #import "Signal-Swift.h" #import "TSAccountManager.h" +#import #import #import @@ -242,10 +243,17 @@ NS_ASSUME_NONNULL_BEGIN OWSSyncPushTokensJob *job = [[OWSSyncPushTokensJob alloc] initWithPushManager:[PushManager sharedManager] accountManager:[Environment getCurrent].accountManager - preferences:[Environment preferences] - showAlerts:YES]; + preferences:[Environment preferences]]; job.uploadOnlyIfStale = NO; - [job run]; + [job run] + .then(^{ + [OWSAlerts showAlertWithTitle:NSLocalizedString(@"PUSH_REGISTER_SUCCESS", + @"Title of alert shown when push tokens sync job succeeds.")]; + }) + .catch(^(NSError *error) { + [OWSAlerts showAlertWithTitle:NSLocalizedString(@"REGISTRATION_BODY", + @"Title of alert shown when push tokens sync job fails.")]; + }); } - (void)didToggleEnableLogSwitch:(UISwitch *)sender { diff --git a/Signal/src/ViewControllers/SignalsViewController.m b/Signal/src/ViewControllers/SignalsViewController.m index 5b271e0016..84290579d9 100644 --- a/Signal/src/ViewControllers/SignalsViewController.m +++ b/Signal/src/ViewControllers/SignalsViewController.m @@ -485,8 +485,6 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; [self.editingDbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction * _Nonnull transaction) { [self.experienceUpgradeFinder markAllAsSeenWithTransaction:transaction]; }]; - [self ensureNotificationsUpToDate]; - // Start running the disappearing messages job in case the newly registered user // enables this feature [[OWSDisappearingMessagesJob sharedJob] startIfNecessary]; @@ -533,14 +531,6 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; } } -- (void)ensureNotificationsUpToDate -{ - [OWSSyncPushTokensJob runWithPushManager:[PushManager sharedManager] - accountManager:self.accountManager - preferences:[Environment preferences] - showAlerts:NO]; -} - - (void)tableViewSetUp { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; } diff --git a/Signal/src/environment/Environment.m b/Signal/src/environment/Environment.m index 7bf8381eeb..c76c874b58 100644 --- a/Signal/src/environment/Environment.m +++ b/Signal/src/environment/Environment.m @@ -61,8 +61,8 @@ static Environment *environment = nil; { @synchronized (self) { if (!_accountManager) { - _accountManager = - [[AccountManager alloc] initWithTextSecureAccountManager:[TSAccountManager sharedInstance]]; + _accountManager = [[AccountManager alloc] initWithTextSecureAccountManager:[TSAccountManager sharedInstance] + preferences:self.preferences]; } }