diff --git a/Signal/src/Models/MessageActions.swift b/Signal/src/Models/MessageActions.swift index 07c65f42a..cac969b40 100644 --- a/Signal/src/Models/MessageActions.swift +++ b/Signal/src/Models/MessageActions.swift @@ -71,19 +71,23 @@ struct MessageActionBuilder { class ConversationViewItemActions: NSObject { @objc - class func textActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { + class func textActions(conversationViewItem: ConversationViewItem, isFailedOrSending: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(replyAction) + if !isFailedOrSending { + let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(replyAction) + } if conversationViewItem.hasBodyTextActionContent { let copyTextAction = MessageActionBuilder.copyText(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(copyTextAction) } - let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(deleteAction) + if !isFailedOrSending { + let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(deleteAction) + } let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(showDetailsAction) @@ -92,11 +96,13 @@ class ConversationViewItemActions: NSObject { } @objc - class func mediaActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { + class func mediaActions(conversationViewItem: ConversationViewItem, isFailedOrSending: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(replyAction) + if !isFailedOrSending { + let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(replyAction) + } if conversationViewItem.hasMediaActionContent { if conversationViewItem.canCopyMedia() { @@ -109,8 +115,10 @@ class ConversationViewItemActions: NSObject { } } - let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(deleteAction) + if !isFailedOrSending { + let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(deleteAction) + } let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(showDetailsAction) @@ -119,18 +127,26 @@ class ConversationViewItemActions: NSObject { } @objc - class func quotedMessageActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] { - let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) - let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) + class func quotedMessageActions(conversationViewItem: ConversationViewItem, isFailedOrSending: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { + var actions: [MenuAction] = [] + + if !isFailedOrSending { + 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..12ed7e2fd 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 + isFailedOrSending:(BOOL)isFailedOrSending + didLongpressTextViewItem:(id)viewItem; +- (void)conversationCell:(ConversationViewCell *)cell + isFailedOrSending:(BOOL)isFailedOrSending + didLongpressMediaViewItem:(id)viewItem; +- (void)conversationCell:(ConversationViewCell *)cell + isFailedOrSending:(BOOL)isFailedOrSending + 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..da89b5656 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 isFailedOrSending = NO; 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. + isFailedOrSending = YES; } else if (outgoingMessage.messageState == TSOutgoingMessageStateSending) { - // Ignore long press on outgoing messages being sent. - return; + // Don't allow "delete" or "reply" on "sending" outgoing messages. + isFailedOrSending = YES; } } @@ -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 + isFailedOrSending:isFailedOrSending + didLongpressTextViewItem:self.viewItem]; break; } case OWSMessageGestureLocation_Media: { - [self.delegate conversationCell:self didLongpressMediaViewItem:self.viewItem]; + [self.delegate conversationCell:self + isFailedOrSending:isFailedOrSending + didLongpressMediaViewItem:self.viewItem]; break; } case OWSMessageGestureLocation_QuotedReply: { - [self.delegate conversationCell:self didLongpressQuoteViewItem:self.viewItem]; + [self.delegate conversationCell:self + isFailedOrSending:isFailedOrSending + didLongpressQuoteViewItem:self.viewItem]; break; } } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 1b6346221..91445cfd5 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 + isFailedOrSending:(BOOL)isFailedOrSending + didLongpressMediaViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions mediaActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions mediaActionsWithConversationViewItem:viewItem + isFailedOrSending:isFailedOrSending + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; } -- (void)conversationCell:(ConversationViewCell *)cell didLongpressTextViewItem:(id)viewItem +- (void)conversationCell:(ConversationViewCell *)cell + isFailedOrSending:(BOOL)isFailedOrSending + didLongpressTextViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions textActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions textActionsWithConversationViewItem:viewItem + isFailedOrSending:isFailedOrSending + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; } -- (void)conversationCell:(ConversationViewCell *)cell didLongpressQuoteViewItem:(id)viewItem +- (void)conversationCell:(ConversationViewCell *)cell + isFailedOrSending:(BOOL)isFailedOrSending + didLongpressQuoteViewItem:(id)viewItem { NSArray *messageActions = - [ConversationViewItemActions quotedMessageActionsWithConversationViewItem:viewItem delegate:self]; + [ConversationViewItemActions quotedMessageActionsWithConversationViewItem:viewItem + isFailedOrSending:isFailedOrSending + delegate:self]; [self presentMessageActions:messageActions withFocusedCell:cell]; }