From 2cc3eabdb8601993e2bbb253c86e82ba42534b0d Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 10 May 2018 13:53:45 -0400 Subject: [PATCH] quote reply to contact share (no avatar) // FREEBIE --- .../ConversationViewController.m | 8 +--- .../ViewControllers/DebugUI/DebugUIMessages.m | 9 ++-- .../ViewModels/OWSQuotedReplyModel.h | 15 ++++-- .../ViewModels/OWSQuotedReplyModel.m | 47 +++++++++++++++++-- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index a3cb40789..378c9052a 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2341,15 +2341,9 @@ typedef enum : NSUInteger { { DDLogDebug(@"%@ user did tap reply", self.logTag); - TSMessage *message = (TSMessage *)conversationItem.interaction; - if (![message isKindOfClass:[TSMessage class]]) { - OWSFail(@"%@ unexpected reply message: %@", self.logTag, message); - return; - } - __block OWSQuotedReplyModel *quotedReply; [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { - quotedReply = [OWSQuotedReplyModel quotedReplyForMessage:message transaction:transaction]; + quotedReply = [OWSQuotedReplyModel quotedReplyForConversationViewItem:conversationItem transaction:transaction]; }]; if (![quotedReply isKindOfClass:[OWSQuotedReplyModel class]]) { diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 2076f574a..1b02fe789 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -1980,8 +1980,8 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(messageToQuote); DDLogVerbose(@"%@ %@", self.logTag, label); [DDLog flushLog]; - quotedMessage = [[OWSQuotedReplyModel quotedReplyForMessage:messageToQuote transaction:transaction] - buildQuotedMessage]; + ConversationViewItem *viewItem = [[ConversationViewItem alloc] initWithInteraction:messageToQuote isGroupThread:thread.isGroupThread transaction:transaction]; + quotedMessage = [[OWSQuotedReplyModel quotedReplyForConversationViewItem:viewItem transaction:transaction] buildQuotedMessage]; } else { TSOutgoingMessage *_Nullable messageToQuote = [self createFakeOutgoingMessage:thread messageBody:quotedMessageBodyWIndex @@ -1993,8 +1993,9 @@ NS_ASSUME_NONNULL_BEGIN contactShare:nil transaction:transaction]; OWSAssert(messageToQuote); - quotedMessage = [[OWSQuotedReplyModel quotedReplyForMessage:messageToQuote transaction:transaction] - buildQuotedMessage]; + + ConversationViewItem *viewItem = [[ConversationViewItem alloc] initWithInteraction:messageToQuote isGroupThread:thread.isGroupThread transaction:transaction]; + quotedMessage = [[OWSQuotedReplyModel quotedReplyForConversationViewItem:viewItem transaction:transaction] buildQuotedMessage]; } OWSAssert(quotedMessage); diff --git a/SignalMessaging/ViewModels/OWSQuotedReplyModel.h b/SignalMessaging/ViewModels/OWSQuotedReplyModel.h index 1cd284de0..cbfcfeb4c 100644 --- a/SignalMessaging/ViewModels/OWSQuotedReplyModel.h +++ b/SignalMessaging/ViewModels/OWSQuotedReplyModel.h @@ -2,6 +2,7 @@ // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // +@class ConversationViewItem; @class TSAttachmentPointer; @class TSAttachmentStream; @class TSMessage; @@ -32,19 +33,25 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly, nullable) NSString *sourceFilename; @property (nonatomic, readonly, nullable) UIImage *thumbnailImage; -// Used for building an outgoing quoted reply preview, before it's sent +// Convenience initializer for building an outgoing quoted reply preview, before it's sent - (instancetype)initWithTimestamp:(uint64_t)timestamp authorId:(NSString *)authorId body:(NSString *_Nullable)body - attachmentStream:(nullable TSAttachmentStream *)attachment; + attachmentStream:(nullable TSAttachmentStream *)attachment; //TODO quotedAttachmentStream? + +// Convenience initializer for building an outgoing quoted reply preview, before it's sent +- (instancetype)initWithTimestamp:(uint64_t)timestamp + authorId:(NSString *)authorId + body:(NSString *_Nullable)body + thumbnailImage:(nullable UIImage *)thumbnailImage; // Used for persisted quoted replies, both incoming and outgoing. - (instancetype)initWithQuotedMessage:(TSQuotedMessage *)quotedMessage transaction:(YapDatabaseReadTransaction *)transaction; // Builds a not-yet-sent QuotedReplyModel -+ (nullable instancetype)quotedReplyForMessage:(TSMessage *)message - transaction:(YapDatabaseReadTransaction *)transaction; ++ (nullable instancetype)quotedReplyForConversationViewItem:(ConversationViewItem *)conversationItem + transaction:(YapDatabaseReadTransaction *)transaction; - (TSQuotedMessage *)buildQuotedMessage; diff --git a/SignalMessaging/ViewModels/OWSQuotedReplyModel.m b/SignalMessaging/ViewModels/OWSQuotedReplyModel.m index 57ed325c0..ef1c01cce 100644 --- a/SignalMessaging/ViewModels/OWSQuotedReplyModel.m +++ b/SignalMessaging/ViewModels/OWSQuotedReplyModel.m @@ -3,6 +3,8 @@ // #import "OWSQuotedReplyModel.h" +#import "ConversationViewItem.h" +#import #import #import #import @@ -33,6 +35,22 @@ thumbnailDownloadFailed:NO]; } +- (instancetype)initWithTimestamp:(uint64_t)timestamp + authorId:(NSString *)authorId + body:(NSString *_Nullable)body + thumbnailImage:(nullable UIImage *)thumbnailImage; +{ + return [self initWithTimestamp:timestamp + authorId:authorId + body:body + thumbnailImage:thumbnailImage + contentType:nil + sourceFilename:nil + attachmentStream:nil + thumbnailAttachmentPointer:nil + thumbnailDownloadFailed:NO]; +} + - (instancetype)initWithQuotedMessage:(TSQuotedMessage *)quotedMessage transaction:(YapDatabaseReadTransaction *)transaction { @@ -113,15 +131,23 @@ quotedAttachmentsForSending:attachments]; } -+ (nullable OWSQuotedReplyModel *)quotedReplyForMessage:(TSMessage *)message - transaction:(YapDatabaseReadTransaction *)transaction; ++ (nullable instancetype)quotedReplyForConversationViewItem:(ConversationViewItem *)conversationItem + transaction:(YapDatabaseReadTransaction *)transaction; { - OWSAssert(message); + OWSAssert(conversationItem); OWSAssert(transaction); + TSMessage *message = (TSMessage *)conversationItem.interaction; + if (![message isKindOfClass:[TSMessage class]]) { + OWSFail(@"%@ unexpected reply message: %@", self.logTag, message); + return nil; + } + TSThread *thread = [message threadWithTransaction:transaction]; OWSAssert(thread); + uint64_t timestamp = message.timestamp; + NSString *_Nullable authorId = ^{ if ([message isKindOfClass:[TSOutgoingMessage class]]) { return [TSAccountManager localNumber]; @@ -133,8 +159,21 @@ } }(); OWSAssert(authorId.length > 0); + + if (conversationItem.contactShare) { + ContactShareViewModel *contactShare = conversationItem.contactShare; + + // TODO We deliberately always pass `nil` for `thumbnailImage`, even though we might have a contactShare.avatarImage + // because the QuotedReplyViewModel has some hardcoded assumptions that only quoted attachments have + // thumbnails. Until we address that we want to be consistent about neither showing nor sending the + // contactShare avatar in the quoted reply. + return [[OWSQuotedReplyModel alloc] initWithTimestamp:timestamp + authorId:authorId + body:[@"👤 " stringByAppendingString:contactShare.displayName] + thumbnailImage:nil]; + + } - uint64_t timestamp = message.timestamp; NSString *_Nullable quotedText = message.body; BOOL hasText = quotedText.length > 0; BOOL hasAttachment = NO;