From a1386eca81ca2c4f6655c285668497ce869b6f91 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 17 Apr 2018 13:28:06 -0400 Subject: [PATCH] Fix taps in message cells. --- .../Cells/ConversationViewCell.h | 4 +++ .../Cells/OWSMessageBubbleView.h | 10 +++++-- .../Cells/OWSMessageBubbleView.m | 12 +++++---- .../ConversationView/Cells/OWSMessageCell.m | 27 +++++++++++++++++++ .../ConversationViewController.m | 2 +- .../MessageDetailViewController.swift | 1 + 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h index c4e735817..0f9a58664 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h @@ -41,6 +41,10 @@ NS_ASSUME_NONNULL_BEGIN - (NSCache *)cellMediaCache; +#pragma mark - Messages + +- (void)didTapFailedOutgoingMessage:(TSOutgoingMessage *)message; + @end #pragma mark - diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h index ec9bd22ee..19323d81f 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.h @@ -35,8 +35,6 @@ typedef NS_ENUM(NSUInteger, OWSMessageGestureLocation) { - (void)didTapFailedIncomingAttachment:(ConversationViewItem *)viewItem attachmentPointer:(TSAttachmentPointer *)attachmentPointer; -- (void)didTapFailedOutgoingMessage:(TSOutgoingMessage *)message; - - (void)didTapConversationItem:(ConversationViewItem *)viewItem quotedReply:(OWSQuotedReplyModel *)quotedReply; - (void)didTapConversationItem:(ConversationViewItem *)viewItem quotedReply:(OWSQuotedReplyModel *)quotedReply @@ -73,8 +71,16 @@ typedef NS_ENUM(NSUInteger, OWSMessageGestureLocation) { - (void)prepareForReuse; +#pragma mark - Gestures + - (OWSMessageGestureLocation)gestureLocationForLocation:(CGPoint)locationInMessageBubble; +// This only needs to be called when we use the cell _outside_ the context +// of a conversation view message cell. +- (void)addTapGestureHandler; + +- (void)handleTapGesture:(UITapGestureRecognizer *)sender; + @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m index b69ecd67c..9bd4f2155 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageBubbleView.m @@ -67,10 +67,6 @@ NS_ASSUME_NONNULL_BEGIN [self addSubview:self.bubbleView]; [self.bubbleView autoPinEdgesToSuperviewEdges]; - UITapGestureRecognizer *tap = - [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; - [self addGestureRecognizer:tap]; - self.bodyTextView = [self newTextView]; // Setting dataDetectorTypes is expensive. Do it just once. self.bodyTextView.dataDetectorTypes @@ -1071,6 +1067,13 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Gestures +- (void)addTapGestureHandler +{ + UITapGestureRecognizer *tap = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; + [self addGestureRecognizer:tap]; +} + - (void)handleTapGesture:(UITapGestureRecognizer *)sender { OWSAssert(self.delegate); @@ -1083,7 +1086,6 @@ NS_ASSUME_NONNULL_BEGIN if (self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage) { TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)self.viewItem.interaction; if (outgoingMessage.messageState == TSOutgoingMessageStateUnsent) { - [self.delegate didTapFailedOutgoingMessage:outgoingMessage]; return; } else if (outgoingMessage.messageState == TSOutgoingMessageStateAttemptingOut) { // Ignore taps on outgoing messages being sent. diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 3825b413a..49b6b817b 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -83,6 +83,10 @@ NS_ASSUME_NONNULL_BEGIN self.contentView.userInteractionEnabled = YES; + UITapGestureRecognizer *tap = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; + [self addGestureRecognizer:tap]; + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)]; [self.contentView addGestureRecognizer:longPress]; @@ -490,6 +494,29 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Gesture recognizers +- (void)handleTapGesture:(UITapGestureRecognizer *)sender +{ + OWSAssert(self.delegate); + + if (sender.state != UIGestureRecognizerStateRecognized) { + DDLogVerbose(@"%@ Ignoring tap on message: %@", self.logTag, self.viewItem.interaction.debugDescription); + return; + } + + if (self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage) { + TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)self.viewItem.interaction; + if (outgoingMessage.messageState == TSOutgoingMessageStateUnsent) { + [self.delegate didTapFailedOutgoingMessage:outgoingMessage]; + return; + } else if (outgoingMessage.messageState == TSOutgoingMessageStateAttemptingOut) { + // Ignore taps on outgoing messages being sent. + return; + } + } + + [self.messageBubbleView handleTapGesture:sender]; +} + - (void)handleLongPressGesture:(UILongPressGestureRecognizer *)sender { OWSAssert(self.delegate); diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 3ab9a4124..9c7bdb86d 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2163,7 +2163,7 @@ typedef enum : NSUInteger { }]; } -- (void)didTapConversationItem:(ConversationViewItem *)viewItem quotedMessage:(OWSQuotedReplyModel *)quotedReply +- (void)didTapConversationItem:(ConversationViewItem *)viewItem quotedReply:(OWSQuotedReplyModel *)quotedReply { OWSAssertIsOnMainThread(); OWSAssert(viewItem); diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index caa59291c..a78178b2a 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -322,6 +322,7 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele let messageBubbleView = OWSMessageBubbleView(frame: CGRect.zero) messageBubbleView.delegate = self + messageBubbleView.addTapGestureHandler() self.messageBubbleView = messageBubbleView messageBubbleView.viewItem = viewItem messageBubbleView.cellMediaCache = NSCache()