From 06eb794db68c1eef75551931c203e2537c58a458 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 17 Oct 2017 09:21:06 -0700 Subject: [PATCH 1/2] Simplify and fix edge cases around long pressing on system message cells. // FREEBIE --- .../Cells/ConversationViewCell.h | 1 - .../Cells/OWSSystemMessageCell.h | 2 - .../Cells/OWSSystemMessageCell.m | 33 ++++- .../ConversationInputTextView.m | 120 ------------------ .../ConversationViewController.m | 17 --- 5 files changed, 29 insertions(+), 144 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h index 0ba624c84..4aa57a681 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h @@ -31,7 +31,6 @@ NS_ASSUME_NONNULL_BEGIN // TODO: We might want to decompose this method. - (void)didTapSystemMessageWithInteraction:(TSInteraction *)interaction; -- (void)didLongPressSystemMessageCell:(ConversationViewCell *)systemMessageCell fromView:(UIView *)fromView; #pragma mark - Offers diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h index c4a4d7661..b06b04945 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.h @@ -10,8 +10,6 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSSystemMessageCell : ConversationViewCell -//- (CGSize)bubbleSizeForInteraction:(TSInteraction *)interaction collectionViewWidth:(CGFloat)collectionViewWidth; - + (NSString *)cellReuseIdentifier; @end diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m index 9b811758f..d525ae2c0 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSSystemMessageCell.m @@ -305,11 +305,31 @@ NS_ASSUME_NONNULL_BEGIN [super prepareForReuse]; } -#pragma mark - editing +#pragma mark - UIMenuController -- (BOOL)canBecomeFirstResponder +- (void)showMenuController { - return YES; + OWSAssert([NSThread isMainThread]); + + DDLogDebug(@"%@ long pressed system message cell: %@", self.logTag, self.viewItem.interaction.debugDescription); + + [self becomeFirstResponder]; + + if ([UIMenuController sharedMenuController].isMenuVisible) { + [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO]; + } + + UIMenuController *menuController = [UIMenuController sharedMenuController]; + menuController.menuItems = @[]; + UIView *fromView = self.titleLabel; + CGRect targetRect = [fromView.superview convertRect:fromView.frame toView:self]; + [menuController setTargetRect:targetRect inView:self]; + [menuController setMenuVisible:YES animated:YES]; +} + +- (BOOL)canPerformAction:(SEL)action withSender:(nullable id)sender +{ + return action == @selector(delete:); } - (void) delete:(nullable id)sender @@ -322,6 +342,11 @@ NS_ASSUME_NONNULL_BEGIN [interaction remove]; } +- (BOOL)canBecomeFirstResponder +{ + return YES; +} + #pragma mark - Gesture recognizers - (void)handleTapGesture:(UITapGestureRecognizer *)sender @@ -343,7 +368,7 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(interaction); if (longPress.state == UIGestureRecognizerStateBegan) { - [self.delegate didLongPressSystemMessageCell:self fromView:self.titleLabel]; + [self showMenuController]; } } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationInputTextView.m b/Signal/src/ViewControllers/ConversationView/ConversationInputTextView.m index f1163aa19..bc7aee8e5 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationInputTextView.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationInputTextView.m @@ -209,126 +209,6 @@ NS_ASSUME_NONNULL_BEGIN return [self.text ows_stripped]; } -// TODO: -//#import -// -//#import "NSString+JSQMessages.h" -// -// -//@implementation JSQMessagesComposerTextView -// -//#pragma mark - Initialization -// -//- (void)jsq_configureTextView -//{ -// -// [self jsq_addTextViewNotificationObservers]; -//} -// -// -//- (void)dealloc -//{ -// [self jsq_removeTextViewNotificationObservers]; -//} -// -//#pragma mark - Composer text view -// -//- (BOOL)hasText -//{ -// return ([[self.text jsq_stringByTrimingWhitespace] length] > 0); -//} -// -//- (void)paste:(id)sender -//{ -// if (!self.jsqPasteDelegate || [self.jsqPasteDelegate composerTextView:self shouldPasteWithSender:sender]) { -// [super paste:sender]; -// } -//} -// -//#pragma mark - Drawing -// -//- (void)drawRect:(CGRect)rect -//{ -// [super drawRect:rect]; -// -// if ([self.text length] == 0 && self.placeHolder) { -// [self.placeHolderTextColor set]; -// -// [self.placeHolder drawInRect:CGRectInset(rect, 7.0f, 5.0f) -// withAttributes:[self jsq_placeholderTextAttributes]]; -// } -//} -// -//#pragma mark - Notifications -// -//- (void)jsq_addTextViewNotificationObservers -//{ -// [[NSNotificationCenter defaultCenter] addObserver:self -// selector:@selector(jsq_didReceiveTextViewNotification:) -// name:UITextViewTextDidChangeNotification -// object:self]; -// -// [[NSNotificationCenter defaultCenter] addObserver:self -// selector:@selector(jsq_didReceiveTextViewNotification:) -// name:UITextViewTextDidBeginEditingNotification -// object:self]; -// -// [[NSNotificationCenter defaultCenter] addObserver:self -// selector:@selector(jsq_didReceiveTextViewNotification:) -// name:UITextViewTextDidEndEditingNotification -// object:self]; -//} -// -//- (void)jsq_removeTextViewNotificationObservers -//{ -// [[NSNotificationCenter defaultCenter] removeObserver:self -// name:UITextViewTextDidChangeNotification -// object:self]; -// -// [[NSNotificationCenter defaultCenter] removeObserver:self -// name:UITextViewTextDidBeginEditingNotification -// object:self]; -// -// [[NSNotificationCenter defaultCenter] removeObserver:self -// name:UITextViewTextDidEndEditingNotification -// object:self]; -//} -// -//- (void)jsq_didReceiveTextViewNotification:(NSNotification *)notification -//{ -// [self setNeedsDisplay]; -//} -// -//#pragma mark - Utilities -// -//- (NSDictionary *)jsq_placeholderTextAttributes -//{ -// NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; -// paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; -// paragraphStyle.alignment = self.textAlignment; -// -// return @{ NSFontAttributeName : self.font, -// NSForegroundColorAttributeName : self.placeHolderTextColor, -// NSParagraphStyleAttributeName : paragraphStyle }; -//} -// -//#pragma mark - UIMenuController -// -//- (BOOL)canBecomeFirstResponder -//{ -// return [super canBecomeFirstResponder]; -//} -// -//- (BOOL)becomeFirstResponder -//{ -// return [super becomeFirstResponder]; -//} -// -//- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { -// [UIMenuController sharedMenuController].menuItems = nil; -// return [super canPerformAction:action withSender:sender]; -//} -//@end #pragma mark - UITextViewDelegate diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index aba1b48ee..e7d7f7c1a 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2087,23 +2087,6 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { } } -- (void)didLongPressSystemMessageCell:(ConversationViewCell *)systemMessageCell fromView:(UIView *)fromView -{ - OWSAssert([NSThread isMainThread]); - OWSAssert(systemMessageCell); - OWSAssert(fromView); - - DDLogDebug(@"%@ long pressed system message cell: %@", self.tag, systemMessageCell); - - [systemMessageCell becomeFirstResponder]; - - // TODO: Update menu controller actions. - UIMenuController *theMenu = [UIMenuController sharedMenuController]; - CGRect targetRect = [fromView.superview convertRect:fromView.frame toView:systemMessageCell]; - [theMenu setTargetRect:targetRect inView:systemMessageCell]; - [theMenu setMenuVisible:YES animated:YES]; -} - #pragma mark - ContactEditingDelegate - (void)didFinishEditingContact From 298a4aa10879559c38f465705c766c59e946015a Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 17 Oct 2017 09:22:41 -0700 Subject: [PATCH 2/2] Simplify and fix edge cases around menu controller. // FREEBIE --- Signal/src/ViewControllers/FullImageViewController.m | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Signal/src/ViewControllers/FullImageViewController.m b/Signal/src/ViewControllers/FullImageViewController.m index 7a5875cf9..7309bf204 100644 --- a/Signal/src/ViewControllers/FullImageViewController.m +++ b/Signal/src/ViewControllers/FullImageViewController.m @@ -60,7 +60,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) ConversationViewItem *viewItem; @property (nonatomic) UIToolbar *footerBar; -@property (nonatomic) NSArray *oldMenuItems; @end @@ -259,9 +258,6 @@ NS_ASSUME_NONNULL_BEGIN } NSArray *menuItems = self.viewItem.menuControllerItems; - if (!self.oldMenuItems) { - self.oldMenuItems = [UIMenuController sharedMenuController].menuItems; - } [UIMenuController sharedMenuController].menuItems = menuItems; CGPoint location = [sender locationInView:self.view]; CGRect targetRect = CGRectMake(location.x, @@ -357,12 +353,6 @@ NS_ASSUME_NONNULL_BEGIN } - (void)dismiss { - - // Restore the edit menu items if necessary. - if (self.oldMenuItems) { - [UIMenuController sharedMenuController].menuItems = self.oldMenuItems; - } - self.view.userInteractionEnabled = NO; [UIView animateWithDuration:0.25f delay:0