From 635c0275db40bb7bf9b774fd13061fe0e4fd137b Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 10 Jul 2018 17:02:43 -0600 Subject: [PATCH] stop observing db notifications while message actions are presented This let's new messages appear after the message actions are dismissed without complicating scroll state. --- .../ConversationViewController.m | 36 +++++++++++++++++-- .../MessageActionsViewController.swift | 7 +++- SignalMessaging/utils/OWSWindowManager.h | 17 +++------ SignalMessaging/utils/OWSWindowManager.m | 10 ++++-- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index ead2fe6e2..f98268dd8 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -131,6 +131,7 @@ typedef enum : NSUInteger { ConversationViewLayoutDelegate, ConversationViewCellDelegate, ConversationInputTextViewDelegate, + MessageActionsDelegate, OWSMessageBubbleViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource, @@ -1978,13 +1979,27 @@ typedef enum : NSUInteger { [self presentViewController:alertController animated:YES completion:nil]; } +#pragma mark - MessageActionsDelegate + +- (void)messageActionsDidHide:(MessageActionsViewController *)messageActionsViewController +{ + [[OWSWindowManager sharedManager] hideMessageActionsWindow:messageActionsViewController]; + + [self updateShouldObserveDBModifications]; +} + #pragma mark - ConversationViewCellDelegate - (void)conversationCellDidLongpressText:(ConversationViewCell *)cell viewItem:(ConversationViewItem *)viewItem { MessageActionsViewController *messageActionsViewController = [[MessageActionsViewController alloc] initWithFocusedView:cell]; - [[OWSWindowManager sharedManager] presentMessageActions:messageActionsViewController]; + + messageActionsViewController.delegate = self; + + [[OWSWindowManager sharedManager] showMessageActionsWindow:messageActionsViewController]; + + [self updateShouldObserveDBModifications]; } - (NSAttributedString *)attributedContactOrProfileNameForPhoneIdentifier:(NSString *)recipientId @@ -4432,8 +4447,23 @@ typedef enum : NSUInteger { - (void)updateShouldObserveDBModifications { - BOOL isAppForegroundAndActive = CurrentAppContext().isAppForegroundAndActive; - self.shouldObserveDBModifications = self.isViewVisible && isAppForegroundAndActive; + if (!CurrentAppContext().isAppForegroundAndActive) { + self.shouldObserveDBModifications = NO; + return; + } + + if (!self.isViewVisible) { + self.shouldObserveDBModifications = NO; + return; + } + + if (OWSWindowManager.sharedManager.isPresentingMessageActions) { + self.shouldObserveDBModifications = NO; + return; + } + + self.shouldObserveDBModifications = YES; + return; } - (void)setShouldObserveDBModifications:(BOOL)shouldObserveDBModifications diff --git a/SignalMessaging/ViewControllers/MessageActionsViewController.swift b/SignalMessaging/ViewControllers/MessageActionsViewController.swift index 6235513fc..51c137ab0 100644 --- a/SignalMessaging/ViewControllers/MessageActionsViewController.swift +++ b/SignalMessaging/ViewControllers/MessageActionsViewController.swift @@ -4,6 +4,11 @@ import Foundation +@objc +protocol MessageActionsDelegate: class { + func messageActionsDidHide(_ messageActionsViewController: MessageActionsViewController) +} + @objc class MessageActionsViewController: UIViewController { @@ -51,6 +56,6 @@ class MessageActionsViewController: UIViewController { @objc func didTapBackground() { - self.delegate?.dismissMessageActions(self) + self.delegate?.messageActionsDidHide(self) } } diff --git a/SignalMessaging/utils/OWSWindowManager.h b/SignalMessaging/utils/OWSWindowManager.h index ccdcbf9f6..2719d2161 100644 --- a/SignalMessaging/utils/OWSWindowManager.h +++ b/SignalMessaging/utils/OWSWindowManager.h @@ -4,8 +4,6 @@ NS_ASSUME_NONNULL_BEGIN -@class MessageActionsViewController; - // This VC can become first responder // when presented to ensure that the input accessory is updated. @interface OWSWindowRootViewController : UIViewController @@ -14,20 +12,12 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - -@protocol MessageActionsDelegate - -- (void)dismissMessageActions:(MessageActionsViewController *)messageActionsViewController; - -@end - -#pragma mark - - extern NSString *const OWSWindowManagerCallDidChangeNotification; const CGFloat OWSWindowManagerCallScreenHeight(void); extern const UIWindowLevel UIWindowLevel_Background; -@interface OWSWindowManager : NSObject +@interface OWSWindowManager : NSObject - (instancetype)init NS_UNAVAILABLE; @@ -39,7 +29,10 @@ extern const UIWindowLevel UIWindowLevel_Background; #pragma mark - Message Actions -- (void)presentMessageActions:(MessageActionsViewController *)messageActionsViewController; +@property (nonatomic, readonly) BOOL isPresentingMessageActions; + +- (void)showMessageActionsWindow:(UIViewController *)messageActionsViewController; +- (void)hideMessageActionsWindow:(UIViewController *)messageActionsViewController; #pragma mark - Calls diff --git a/SignalMessaging/utils/OWSWindowManager.m b/SignalMessaging/utils/OWSWindowManager.m index e19e555bc..94f2a8120 100644 --- a/SignalMessaging/utils/OWSWindowManager.m +++ b/SignalMessaging/utils/OWSWindowManager.m @@ -237,16 +237,20 @@ const UIWindowLevel UIWindowLevel_MessageActions(void) #pragma mark - Message Actions -- (void)presentMessageActions:(MessageActionsViewController *)messageActionsViewController +- (BOOL)isPresentingMessageActions +{ + return self.messageActionsViewController != nil; +} + +- (void)showMessageActionsWindow:(UIViewController *)messageActionsViewController { - messageActionsViewController.delegate = self; self.messageActionsViewController = messageActionsViewController; self.messageActionsWindow.rootViewController = messageActionsViewController; [self ensureWindowState]; } -- (void)dismissMessageActions:(UIViewController *)messageActionsViewController +- (void)hideMessageActionsWindow:(UIViewController *)messageActionsViewController { OWSAssert(self.messageActionsViewController == messageActionsViewController);