From b6d782046aa05e2448a2c6ec9a425e0efdf44b49 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 12 Sep 2017 17:42:28 -0400 Subject: [PATCH] Normalize conversation presentation logic. // FREEBIE --- Signal/src/AppDelegate.m | 21 ++--- .../NewContactThreadViewController.m | 2 +- .../ViewControllers/NewGroupViewController.m | 4 +- .../SendExternalFileViewController.m | 2 +- .../ShowGroupMembersViewController.m | 4 +- .../call/UserInterface/CallUIAdapter.swift | 2 +- Signal/src/environment/Environment.h | 12 +-- Signal/src/environment/Environment.m | 93 ++++++++++--------- Signal/src/network/PushManager.m | 8 +- 9 files changed, 77 insertions(+), 71 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index d84ad59fb..2e94ca9ee 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -442,9 +442,9 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; viewController.attachment = attachment; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; - [[[Environment getCurrent] signalsViewController] presentTopLevelModalViewController:navigationController - animateDismissal:NO - animatePresentation:YES]; + [[[Environment getCurrent] homeViewController] presentTopLevelModalViewController:navigationController + animateDismissal:NO + animatePresentation:YES]; } - (void)applicationDidBecomeActive:(UIApplication *)application { @@ -529,7 +529,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; // If app has not re-entered active, show screen protection if necessary. [self showScreenProtection]; } - [[[Environment getCurrent] signalsViewController] updateInboxCountLabel]; + [[[Environment getCurrent] homeViewController] updateInboxCountLabel]; [application endBackgroundTask:bgTask]; }); } @@ -542,7 +542,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler { if ([TSAccountManager isRegistered]) { - [[Environment getCurrent].signalsViewController showNewConversationView]; + [[Environment getCurrent].homeViewController showNewConversationView]; completionHandler(YES); } else { UIAlertController *controller = @@ -555,12 +555,11 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; handler:^(UIAlertAction *_Nonnull action){ }]]; - [[Environment getCurrent] - .signalsViewController.presentedViewController presentViewController:controller - animated:YES - completion:^{ - completionHandler(NO); - }]; + [[Environment getCurrent].homeViewController.presentedViewController presentViewController:controller + animated:YES + completion:^{ + completionHandler(NO); + }]; } } diff --git a/Signal/src/ViewControllers/NewContactThreadViewController.m b/Signal/src/ViewControllers/NewContactThreadViewController.m index f3cbcbfcb..e348f9581 100644 --- a/Signal/src/ViewControllers/NewContactThreadViewController.m +++ b/Signal/src/ViewControllers/NewContactThreadViewController.m @@ -625,7 +625,7 @@ NS_ASSUME_NONNULL_BEGIN [self dismissViewControllerAnimated:YES completion:^() { - [Environment messageIdentifier:recipientId withCompose:YES]; + [Environment presentConversationForRecipientId:recipientId withCompose:YES]; }]; } diff --git a/Signal/src/ViewControllers/NewGroupViewController.m b/Signal/src/ViewControllers/NewGroupViewController.m index 0ad0ee595..96e951ddf 100644 --- a/Signal/src/ViewControllers/NewGroupViewController.m +++ b/Signal/src/ViewControllers/NewGroupViewController.m @@ -459,7 +459,7 @@ const NSUInteger kNewGroupViewControllerAvatarWidth = 68; [self dismissViewControllerAnimated:YES completion:^{ // Pop to new group thread. - [Environment messageGroup:thread]; + [Environment presentConversationForThread:thread]; }]; }); @@ -478,7 +478,7 @@ const NSUInteger kNewGroupViewControllerAvatarWidth = 68; failedMessageType:TSErrorMessageGroupCreationFailed] save]; - [Environment messageGroup:thread]; + [Environment presentConversationForThread:thread]; }]; }); }; diff --git a/Signal/src/ViewControllers/SendExternalFileViewController.m b/Signal/src/ViewControllers/SendExternalFileViewController.m index b4dbcd4b3..e7e6d6545 100644 --- a/Signal/src/ViewControllers/SendExternalFileViewController.m +++ b/Signal/src/ViewControllers/SendExternalFileViewController.m @@ -67,7 +67,7 @@ NS_ASSUME_NONNULL_BEGIN [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:thread]; [ThreadUtil sendMessageWithAttachment:self.attachment inThread:thread messageSender:self.messageSender]; - [Environment messageThreadId:thread.uniqueId]; + [Environment presentConversationForRecipientId:thread.uniqueId]; } - (BOOL)canSelectBlockedContact diff --git a/Signal/src/ViewControllers/ShowGroupMembersViewController.m b/Signal/src/ViewControllers/ShowGroupMembersViewController.m index 45ab7aac8..81aaf687e 100644 --- a/Signal/src/ViewControllers/ShowGroupMembersViewController.m +++ b/Signal/src/ViewControllers/ShowGroupMembersViewController.m @@ -408,12 +408,12 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssert(recipientId.length > 0); - [Environment messageIdentifier:recipientId withCompose:YES]; + [Environment presentConversationForRecipientId:recipientId withCompose:YES]; } - (void)callMember:(NSString *)recipientId { - [Environment callUserWithIdentifier:recipientId]; + [Environment callRecipientId:recipientId]; } - (void)showSafetyNumberView:(NSString *)recipientId diff --git a/Signal/src/call/UserInterface/CallUIAdapter.swift b/Signal/src/call/UserInterface/CallUIAdapter.swift index c458c5b60..d5e8e98ea 100644 --- a/Signal/src/call/UserInterface/CallUIAdapter.swift +++ b/Signal/src/call/UserInterface/CallUIAdapter.swift @@ -37,7 +37,7 @@ extension CallUIAdaptee { let callViewController = CallViewController(call: call) callViewController.modalTransitionStyle = .crossDissolve - guard let presentingViewController = Environment.getCurrent().signalsViewController else { + guard let presentingViewController = Environment.getCurrent().homeViewController else { owsFail("in \(#function) view controller unexpectedly nil") return } diff --git a/Signal/src/environment/Environment.h b/Signal/src/environment/Environment.h index fd9f51318..edb0006c1 100644 --- a/Signal/src/environment/Environment.h +++ b/Signal/src/environment/Environment.h @@ -49,7 +49,7 @@ @property (nonatomic, readonly) PropertyListPreferences *preferences; -@property (nonatomic, readonly) HomeViewController *signalsViewController; +@property (nonatomic, readonly) HomeViewController *homeViewController; @property (nonatomic, readonly, weak) UINavigationController *signUpFlowNavigationController; + (Environment *)getCurrent; @@ -59,12 +59,12 @@ + (void)resetAppData; -- (void)setHomeViewController:(HomeViewController *)signalsViewController; +- (void)setHomeViewController:(HomeViewController *)homeViewController; - (void)setSignUpFlowNavigationController:(UINavigationController *)signUpFlowNavigationController; -+ (void)messageThreadId:(NSString *)threadId; -+ (void)messageIdentifier:(NSString *)identifier withCompose:(BOOL)compose; -+ (void)callUserWithIdentifier:(NSString *)identifier; -+ (void)messageGroup:(TSGroupThread *)groupThread; ++ (void)presentConversationForRecipientId:(NSString *)recipientId; ++ (void)presentConversationForRecipientId:(NSString *)recipientId withCompose:(BOOL)compose; ++ (void)callRecipientId:(NSString *)recipientId; ++ (void)presentConversationForThread:(TSGroupThread *)groupThread; @end diff --git a/Signal/src/environment/Environment.m b/Signal/src/environment/Environment.m index aca076d1c..ff9e39b58 100644 --- a/Signal/src/environment/Environment.m +++ b/Signal/src/environment/Environment.m @@ -12,6 +12,7 @@ #import "TSContactThread.h" #import "TSGroupThread.h" #import +#import static Environment *environment = nil; @@ -171,69 +172,75 @@ static Environment *environment = nil; return _preferences; } -- (void)setHomeViewController:(HomeViewController *)signalsViewController +- (void)setHomeViewController:(HomeViewController *)homeViewController { - _signalsViewController = signalsViewController; + _homeViewController = homeViewController; } - (void)setSignUpFlowNavigationController:(UINavigationController *)navigationController { _signUpFlowNavigationController = navigationController; } -+ (void)messageThreadId:(NSString *)threadId { - TSThread *thread = [TSThread fetchObjectWithUniqueID:threadId]; - - if (!thread) { - DDLogWarn(@"We get UILocalNotifications with unknown threadId: %@", threadId); - return; - } ++ (void)presentConversationForRecipientId:(NSString *)recipientId +{ + [self presentConversationForRecipientId:recipientId keyboardOnViewAppearing:YES callOnViewAppearing:NO]; +} - if ([thread isGroupThread]) { - [self messageGroup:(TSGroupThread *)thread]; - } else { - Environment *env = [self getCurrent]; - HomeViewController *vc = env.signalsViewController; - UIViewController *topvc = vc.navigationController.topViewController; - - if ([topvc isKindOfClass:[ConversationViewController class]]) { - ConversationViewController *mvc = (ConversationViewController *)topvc; - if ([mvc.thread.uniqueId isEqualToString:threadId]) { - [mvc popKeyBoard]; - return; - } - } - [self messageIdentifier:((TSContactThread *)thread).contactIdentifier withCompose:YES]; - } ++ (void)presentConversationForRecipientId:(NSString *)recipientId withCompose:(BOOL)compose +{ + [self presentConversationForRecipientId:recipientId keyboardOnViewAppearing:compose callOnViewAppearing:NO]; } -+ (void)messageIdentifier:(NSString *)identifier withCompose:(BOOL)compose { - Environment *env = [self getCurrent]; - HomeViewController *vc = env.signalsViewController; ++ (void)callRecipientId:(NSString *)recipientId +{ + [self presentConversationForRecipientId:recipientId keyboardOnViewAppearing:NO callOnViewAppearing:YES]; +} ++ (void)presentConversationForRecipientId:(NSString *)recipientId + keyboardOnViewAppearing:(BOOL)keyboardOnViewAppearing + callOnViewAppearing:(BOOL)callOnViewAppearing +{ [[TSStorageManager sharedManager].dbReadWriteConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - TSThread *thread = [TSContactThread getOrCreateThreadWithContactId:identifier transaction:transaction]; - [vc presentThread:thread keyboardOnViewAppearing:YES callOnViewAppearing:NO]; + TSThread *thread = [TSContactThread getOrCreateThreadWithContactId:recipientId transaction:transaction]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self presentConversationForThread:thread + keyboardOnViewAppearing:keyboardOnViewAppearing + callOnViewAppearing:callOnViewAppearing]; + }); }]; } -+ (void)callUserWithIdentifier:(NSString *)identifier ++ (void)presentConversationForThread:(TSThread *)thread { - Environment *env = [self getCurrent]; - HomeViewController *vc = env.signalsViewController; - - [[TSStorageManager sharedManager].dbReadWriteConnection - asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - TSThread *thread = [TSContactThread getOrCreateThreadWithContactId:identifier transaction:transaction]; - [vc presentThread:thread keyboardOnViewAppearing:NO callOnViewAppearing:YES]; - }]; + [self presentConversationForThread:thread keyboardOnViewAppearing:YES callOnViewAppearing:NO]; } -+ (void)messageGroup:(TSGroupThread *)groupThread { - Environment *env = [self getCurrent]; - HomeViewController *vc = env.signalsViewController; ++ (void)presentConversationForThread:(TSThread *)thread + keyboardOnViewAppearing:(BOOL)keyboardOnViewAppearing + callOnViewAppearing:(BOOL)callOnViewAppearing +{ + if (!thread) { + OWSFail(@"%@ Can't present nil thread.", self.tag); + return; + } + + DispatchMainThreadSafe(^{ + UIViewController *frontmostVC = [[UIApplication sharedApplication] frontmostViewController]; + + if ([frontmostVC isKindOfClass:[ConversationViewController class]]) { + ConversationViewController *conversationVC = (ConversationViewController *)frontmostVC; + if ([conversationVC.thread.uniqueId isEqualToString:thread.uniqueId]) { + [conversationVC popKeyBoard]; + return; + } + } - [vc presentThread:groupThread keyboardOnViewAppearing:YES callOnViewAppearing:NO]; + Environment *env = [self getCurrent]; + [env.homeViewController presentThread:thread + keyboardOnViewAppearing:keyboardOnViewAppearing + callOnViewAppearing:callOnViewAppearing]; + }); } + (void)resetAppData { diff --git a/Signal/src/network/PushManager.m b/Signal/src/network/PushManager.m index 65bd30480..81aba5d09 100644 --- a/Signal/src/network/PushManager.m +++ b/Signal/src/network/PushManager.m @@ -118,7 +118,7 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe NSString *threadId = notification.userInfo[Signal_Thread_UserInfo_Key]; if (threadId && [TSThread fetchObjectWithUniqueID:threadId]) { - [Environment messageThreadId:threadId]; + [Environment presentConversationForRecipientId:threadId]; } } @@ -213,12 +213,12 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe completionHandler(); } else if ([identifier isEqualToString:PushManagerActionsShowThread]) { NSString *threadId = notification.userInfo[Signal_Thread_UserInfo_Key]; - [Environment messageThreadId:threadId]; + [Environment presentConversationForRecipientId:threadId]; completionHandler(); } else { OWSFail(@"%@ Unhandled action with identifier: %@", self.tag, identifier); NSString *threadId = notification.userInfo[Signal_Thread_UserInfo_Key]; - [Environment messageThreadId:threadId]; + [Environment presentConversationForRecipientId:threadId]; completionHandler(); } } @@ -234,7 +234,7 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe [thread markAllAsReadWithTransaction:transaction]; } completionBlock:^{ - [[[Environment getCurrent] signalsViewController] updateInboxCountLabel]; + [[[Environment getCurrent] homeViewController] updateInboxCountLabel]; [self cancelNotificationsWithThreadId:threadId]; completionHandler();