diff --git a/Signal/src/Models/MessageActions.swift b/Signal/src/Models/MessageActions.swift index 07c65f42a..70dedc60b 100644 --- a/Signal/src/Models/MessageActions.swift +++ b/Signal/src/Models/MessageActions.swift @@ -71,11 +71,13 @@ struct MessageActionBuilder { class ConversationViewItemActions: NSObject { @objc - class func textActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { + class func textActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(replyAction) + if shouldAllowReply { + let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(replyAction) + } if conversationViewItem.hasBodyTextActionContent { let copyTextAction = MessageActionBuilder.copyText(conversationViewItem: conversationViewItem, delegate: delegate) @@ -92,11 +94,13 @@ class ConversationViewItemActions: NSObject { } @objc - class func mediaActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { + class func mediaActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(replyAction) + if shouldAllowReply { + let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(replyAction) + } if conversationViewItem.hasMediaActionContent { if conversationViewItem.canCopyMedia() { @@ -119,18 +123,26 @@ class ConversationViewItemActions: NSObject { } @objc - class func quotedMessageActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + class func quotedMessageActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { + var actions: [MenuAction] = [] + + if shouldAllowReply { + let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(replyAction) + } + let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(deleteAction) + let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(showDetailsAction) - return [replyAction, deleteAction, showDetailsAction] + return actions } @objc class func infoMessageActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) - - return [deleteAction] + return [deleteAction ] } } diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h index 1b4f94496..d8617b62f 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h @@ -21,9 +21,15 @@ NS_ASSUME_NONNULL_BEGIN @protocol ConversationViewCellDelegate -- (void)conversationCell:(ConversationViewCell *)cell didLongpressTextViewItem:(id)viewItem; -- (void)conversationCell:(ConversationViewCell *)cell didLongpressMediaViewItem:(id)viewItem; -- (void)conversationCell:(ConversationViewCell *)cell didLongpressQuoteViewItem:(id)viewItem; +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressTextViewItem:(id)viewItem; +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressMediaViewItem:(id)viewItem; +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressQuoteViewItem:(id)viewItem; - (void)conversationCell:(ConversationViewCell *)cell didLongpressSystemMessageViewItem:(id)viewItem; diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 185349db6..a8429c7aa 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -423,14 +423,15 @@ NS_ASSUME_NONNULL_BEGIN return; } + BOOL shouldAllowReply = YES; if (self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage) { TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)self.viewItem.interaction; if (outgoingMessage.messageState == TSOutgoingMessageStateFailed) { - // Ignore long press on unsent messages. - return; + // Don't allow "delete" or "reply" on "failed" outgoing messages. + shouldAllowReply = NO; } else if (outgoingMessage.messageState == TSOutgoingMessageStateSending) { - // Ignore long press on outgoing messages being sent. - return; + // Don't allow "delete" or "reply" on "sending" outgoing messages. + shouldAllowReply = NO; } } @@ -438,15 +439,21 @@ NS_ASSUME_NONNULL_BEGIN switch ([self.messageBubbleView gestureLocationForLocation:locationInMessageBubble]) { case OWSMessageGestureLocation_Default: case OWSMessageGestureLocation_OversizeText: { - [self.delegate conversationCell:self didLongpressTextViewItem:self.viewItem]; + [self.delegate conversationCell:self + shouldAllowReply:shouldAllowReply + didLongpressTextViewItem:self.viewItem]; break; } case OWSMessageGestureLocation_Media: { - [self.delegate conversationCell:self didLongpressMediaViewItem:self.viewItem]; + [self.delegate conversationCell:self + shouldAllowReply:shouldAllowReply + didLongpressMediaViewItem:self.viewItem]; break; } case OWSMessageGestureLocation_QuotedReply: { - [self.delegate conversationCell:self didLongpressQuoteViewItem:self.viewItem]; + [self.delegate conversationCell:self + shouldAllowReply:shouldAllowReply + didLongpressQuoteViewItem:self.viewItem]; break; } } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 1b6346221..3284f28a3 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -1923,24 +1923,36 @@ typedef enum : NSUInteger { #pragma mark - ConversationViewCellDelegate -- (void)conversationCell:(ConversationViewCell *)cell didLongpressMediaViewItem:(id)viewItem +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressMediaViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions mediaActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions mediaActionsWithConversationViewItem:viewItem + shouldAllowReply:shouldAllowReply + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; } -- (void)conversationCell:(ConversationViewCell *)cell didLongpressTextViewItem:(id)viewItem +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressTextViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions textActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions textActionsWithConversationViewItem:viewItem + shouldAllowReply:shouldAllowReply + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; } -- (void)conversationCell:(ConversationViewCell *)cell didLongpressQuoteViewItem:(id)viewItem +- (void)conversationCell:(ConversationViewCell *)cell + shouldAllowReply:(BOOL)shouldAllowReply + didLongpressQuoteViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions quotedMessageActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions quotedMessageActionsWithConversationViewItem:viewItem + shouldAllowReply:shouldAllowReply + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; }