From 5569e87485cdccf6f76d69ec81caa03644a3f34d Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 11 Sep 2019 11:53:47 +1000 Subject: [PATCH 1/3] Implement receiving quotes in group chats --- Signal/src/Loki/LokiGroupChatPoller.swift | 6 +++++- .../src/Loki/API/LokiGroupChatAPI.swift | 13 +++++++++++-- .../src/Loki/API/LokiGroupMessage.swift | 12 ++++++++++-- .../src/Messages/Interactions/TSQuotedMessage.m | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index 029fe95cc..3f0fce66f 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -56,6 +56,11 @@ public final class LokiGroupChatPoller : NSObject { let x2 = SSKProtoDataMessage.builder() x2.setTimestamp(message.timestamp) x2.setGroup(try! x1.build()) + if let quote = message.quote { + let x5 = SSKProtoDataMessageQuote.builder(id: quote.quotedMessageTimestamp, author: quote.quoteeHexEncodedPublicKey) + x5.setText(quote.quotedMessageBody) + x2.setQuote(try! x5.build()) + } x2.setBody(message.body) if let messageServerID = message.serverID { let publicChatInfo = SSKProtoPublicChatInfo.builder() @@ -68,7 +73,6 @@ public final class LokiGroupChatPoller : NSObject { x4.setSource(senderHexEncodedPublicKey) x4.setSourceDevice(OWSDevicePrimaryDeviceId) x4.setContent(try! x3.build().serializedData()) - let storage = OWSPrimaryStorage.shared() storage.dbReadWriteConnection.readWrite { transaction in transaction.setObject(senderDisplayName, forKey: senderHexEncodedPublicKey, inCollection: group.id) diff --git a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift index e272aa506..8e59d42e4 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift @@ -139,6 +139,8 @@ public final class LokiGroupChatAPI : NSObject { throw Error.parsingFailed } return rawMessages.flatMap { message in + let isDeleted = (message["is_deleted"] as? Int == 1) + guard !isDeleted else { return nil } guard let annotations = message["annotations"] as? [JSON], let annotation = annotations.first, let value = annotation["value"] as? JSON, let serverID = message["id"] as? UInt64, let body = message["text"] as? String, let hexEncodedPublicKey = value["source"] as? String, let displayName = value["from"] as? String, let timestamp = value["timestamp"] as? UInt64 else { @@ -147,7 +149,13 @@ public final class LokiGroupChatAPI : NSObject { } let lastMessageServerID = getLastMessageServerID(for: group, on: server) if serverID > (lastMessageServerID ?? 0) { setLastMessageServerID(for: group, on: server, to: serverID) } - return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp) + let quote: LokiGroupMessage.Quote? + if let quoteAsJSON = value["quote"] as? JSON, let quotedMessageTimestamp = quoteAsJSON["id"] as? UInt64, let quoteeHexEncodedPublicKey = quoteAsJSON["author"] as? String, let quotedMessageBody = quoteAsJSON["text"] as? String { + quote = LokiGroupMessage.Quote(quotedMessageTimestamp: quotedMessageTimestamp, quoteeHexEncodedPublicKey: quoteeHexEncodedPublicKey, quotedMessageBody: quotedMessageBody) + } else { + quote = nil + } + return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp, quote: quote) } } } @@ -170,7 +178,8 @@ public final class LokiGroupChatAPI : NSObject { throw Error.parsingFailed } let timestamp = UInt64(date.timeIntervalSince1970) * 1000 - return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: userHexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp) + let quote: LokiGroupMessage.Quote? + return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: userHexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp, quote: nil) } }.recover { error -> Promise in if let error = error as? NetworkManagerError, error.statusCode == 401 { diff --git a/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift b/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift index 7d6d3b974..7b90bb092 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift @@ -9,22 +9,30 @@ public final class LokiGroupMessage : NSObject { /// - Note: Expressed as milliseconds since 00:00:00 UTC on 1 January 1970. public let timestamp: UInt64 public let type: String + public let quote: Quote? @objc(serverID) public var objc_serverID: UInt64 { return serverID ?? 0 } - public init(serverID: UInt64?, hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64) { + public struct Quote { + public let quotedMessageTimestamp: UInt64 + public let quoteeHexEncodedPublicKey: String + public let quotedMessageBody: String + } + + public init(serverID: UInt64?, hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quote: Quote?) { self.serverID = serverID self.hexEncodedPublicKey = hexEncodedPublicKey self.displayName = displayName self.body = body self.type = type self.timestamp = timestamp + self.quote = quote super.init() } @objc public convenience init(hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64) { - self.init(serverID: nil, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: type, timestamp: timestamp) + self.init(serverID: nil, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: type, timestamp: timestamp, quote: nil) } internal func toJSON() -> JSON { diff --git a/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m b/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m index c48f946f4..05223c84b 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSQuotedMessage.m @@ -157,7 +157,7 @@ NS_ASSUME_NONNULL_BEGIN } } - OWSAssertDebug(bodySource != TSQuotedMessageContentSourceUnknown); + // OWSAssertDebug(bodySource != TSQuotedMessageContentSourceUnknown); NSMutableArray *attachmentInfos = [NSMutableArray new]; for (SSKProtoDataMessageQuoteQuotedAttachment *quotedAttachment in quoteProto.attachments) { From f205767b9868bf3e8a85a4b1c33d593a4cc2b105 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 11 Sep 2019 14:07:51 +1000 Subject: [PATCH 2/3] Implement sending quotes in group chats --- Signal/src/Loki/LokiGroupChatPoller.swift | 8 +++++++- Signal/src/Models/MessageActions.swift | 5 +++-- .../ColorPickerViewController.swift | 1 + .../ConversationView/Cells/OWSQuotedMessageView.m | 2 +- .../ConversationView/ConversationViewController.m | 2 +- .../ConversationView/ConversationViewItem.h | 2 ++ .../ConversationView/ConversationViewItem.m | 3 +++ .../ConversationView/ConversationViewModel.h | 2 ++ .../ConversationView/ConversationViewModel.m | 4 ++++ .../src/ViewControllers/DebugUI/DebugUIMessages.m | 2 ++ .../ViewControllers/MediaPageViewController.swift | 1 + .../src/Loki/API/LokiGroupChatAPI.swift | 3 +-- .../src/Loki/API/LokiGroupMessage.swift | 15 ++++++++++++--- SignalServiceKit/src/Messages/OWSMessageSender.m | 4 +++- 14 files changed, 43 insertions(+), 11 deletions(-) diff --git a/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index 3f0fce66f..767a01c9c 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -91,8 +91,14 @@ public final class LokiGroupChatPoller : NSObject { guard !isDuplicate else { return } guard let groupID = group.id.data(using: .utf8) else { return } let thread = TSGroupThread.getOrCreateThread(withGroupId: groupID) + let signalQuote: TSQuotedMessage? + if let quote = message.quote { + signalQuote = TSQuotedMessage(timestamp: quote.quotedMessageTimestamp, authorId: quote.quoteeHexEncodedPublicKey, body: quote.quotedMessageBody, quotedAttachmentsForSending: []) + } else { + signalQuote = nil + } let message = TSOutgoingMessage(outgoingMessageWithTimestamp: message.timestamp, in: thread, messageBody: message.body, attachmentIds: [], expiresInSeconds: 0, - expireStartedAt: 0, isVoiceMessage: false, groupMetaMessage: .deliver, quotedMessage: nil, contactShare: nil, linkPreview: nil) + expireStartedAt: 0, isVoiceMessage: false, groupMetaMessage: .deliver, quotedMessage: signalQuote, contactShare: nil, linkPreview: nil) storage.dbReadWriteConnection.readWrite { transaction in message.update(withSentRecipient: group.server, wasSentByUD: false, transaction: transaction) message.saveGroupChatMessageID(messageServerID, in: transaction) diff --git a/Signal/src/Models/MessageActions.swift b/Signal/src/Models/MessageActions.swift index b190c05b7..044efd4ec 100644 --- a/Signal/src/Models/MessageActions.swift +++ b/Signal/src/Models/MessageActions.swift @@ -74,9 +74,10 @@ class ConversationViewItemActions: NSObject { class func textActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] - let isGroup = conversationViewItem.isGroupThread + let isGroup = conversationViewItem.isGroupThread; + let isRSSFeed = conversationViewItem.isRSSFeed; - if shouldAllowReply && !isGroup { + if shouldAllowReply && !isRSSFeed { let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(replyAction) } diff --git a/Signal/src/ViewControllers/ColorPickerViewController.swift b/Signal/src/ViewControllers/ColorPickerViewController.swift index f82137efd..1dd91f8cc 100644 --- a/Signal/src/ViewControllers/ColorPickerViewController.swift +++ b/Signal/src/ViewControllers/ColorPickerViewController.swift @@ -306,6 +306,7 @@ class ColorPickerView: UIView, ColorViewDelegate { @objc private class MockConversationViewItem: NSObject, ConversationViewItem { var userCanDeleteGroupMessage: Bool = false + var isRSSFeed: Bool = false var interaction: TSInteraction = TSMessage() var interactionType: OWSInteractionType = OWSInteractionType.unknown var quotedReply: OWSQuotedReplyModel? diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m index 4b9677630..aebc4db13 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m @@ -361,7 +361,7 @@ const CGFloat kRemotelySourcedContentRowSpacing = 3; OWSAssertDebug(CGSizeEqualToSize( CGSizeMake(kRemotelySourcedContentGlyphLength, kRemotelySourcedContentGlyphLength), glyphImage.size)); UIImageView *glyphView = [[UIImageView alloc] initWithImage:glyphImage]; - glyphView.tintColor = Theme.secondaryColor; + glyphView.tintColor = UIColor.whiteColor; [glyphView autoSetDimensionsToSize:CGSizeMake(kRemotelySourcedContentGlyphLength, kRemotelySourcedContentGlyphLength)]; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 79d855cca..8181d7c8c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -513,7 +513,7 @@ typedef enum : NSUInteger { _conversationStyle = [[ConversationStyle alloc] initWithThread:thread]; _conversationViewModel = - [[ConversationViewModel alloc] initWithThread:thread focusMessageIdOnOpen:focusMessageId delegate:self]; + [[ConversationViewModel alloc] initWithThread:thread focusMessageIdOnOpen:focusMessageId isRSSFeed:self.isRSSFeed delegate:self]; _searchController = [[ConversationSearchController alloc] initWithThread:thread]; _searchController.delegate = self; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h index 6504d0ef9..0ced1b753 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.h @@ -67,6 +67,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType); @property (nonatomic, readonly, nullable) OWSQuotedReplyModel *quotedReply; @property (nonatomic, readonly) BOOL isGroupThread; +@property (nonatomic, readonly) BOOL isRSSFeed; @property (nonatomic, readonly) BOOL userCanDeleteGroupMessage; @property (nonatomic, readonly) BOOL hasBodyText; @@ -162,6 +163,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType); - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithInteraction:(TSInteraction *)interaction isGroupThread:(BOOL)isGroupThread + isRSSFeed:(BOOL)isRSSFeed transaction:(YapDatabaseReadTransaction *)transaction conversationStyle:(ConversationStyle *)conversationStyle; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index f4de057f7..e3a575d1c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -119,6 +119,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) @synthesize interaction = _interaction; @synthesize isFirstInCluster = _isFirstInCluster; @synthesize isGroupThread = _isGroupThread; +@synthesize isRSSFeed = _isRSSFeed; @synthesize isLastInCluster = _isLastInCluster; @synthesize lastAudioMessageView = _lastAudioMessageView; @synthesize senderName = _senderName; @@ -126,6 +127,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) - (instancetype)initWithInteraction:(TSInteraction *)interaction isGroupThread:(BOOL)isGroupThread + isRSSFeed:(BOOL)isRSSFeed transaction:(YapDatabaseReadTransaction *)transaction conversationStyle:(ConversationStyle *)conversationStyle { @@ -141,6 +143,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) _interaction = interaction; _isGroupThread = isGroupThread; + _isRSSFeed = isRSSFeed; _conversationStyle = conversationStyle; [self updateAuthorConversationColorNameWithTransaction:transaction]; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.h b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.h index a4025f1f7..1b9c4d86a 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.h +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.h @@ -98,10 +98,12 @@ typedef NS_ENUM(NSUInteger, ConversationUpdateItemType) { @property (nonatomic, readonly) ConversationViewState *viewState; @property (nonatomic, nullable) NSString *focusMessageIdOnOpen; @property (nonatomic, readonly, nullable) ThreadDynamicInteractions *dynamicInteractions; +@property (nonatomic, readonly) BOOL isRSSFeed; - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithThread:(TSThread *)thread focusMessageIdOnOpen:(nullable NSString *)focusMessageIdOnOpen + isRSSFeed:(BOOL)isRSSFeed delegate:(id)delegate NS_DESIGNATED_INITIALIZER; - (void)ensureDynamicInteractionsAndUpdateIfNecessary:(BOOL)updateIfNecessary; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m index e9162562e..2eb7fdfaa 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewModel.m @@ -218,6 +218,7 @@ static const int kYapDatabaseRangeMaxLength = 25000; - (instancetype)initWithThread:(TSThread *)thread focusMessageIdOnOpen:(nullable NSString *)focusMessageIdOnOpen + isRSSFeed:(BOOL)isRSSFeed delegate:(id)delegate { self = [super init]; @@ -233,6 +234,7 @@ static const int kYapDatabaseRangeMaxLength = 25000; _persistedViewItems = @[]; _unsavedOutgoingMessages = @[]; self.focusMessageIdOnOpen = focusMessageIdOnOpen; + _isRSSFeed = isRSSFeed; _viewState = [[ConversationViewState alloc] initWithViewItems:@[]]; [self configure]; @@ -1205,6 +1207,7 @@ static const int kYapDatabaseRangeMaxLength = 25000; NSArray *loadedUniqueIds = [self.messageMapping loadedUniqueIds]; BOOL isGroupThread = self.thread.isGroupThread; + BOOL isRSSFeed = self.isRSSFeed; ConversationStyle *conversationStyle = self.delegate.conversationStyle; [self ensureConversationProfileState]; @@ -1218,6 +1221,7 @@ static const int kYapDatabaseRangeMaxLength = 25000; if (!viewItem) { viewItem = [[ConversationInteractionViewItem alloc] initWithInteraction:interaction isGroupThread:isGroupThread + isRSSFeed:isRSSFeed transaction:transaction conversationStyle:conversationStyle]; } diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 90fd5b4c4..a1e358a07 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -2012,6 +2012,7 @@ NS_ASSUME_NONNULL_BEGIN id viewItem = [[ConversationInteractionViewItem alloc] initWithInteraction:messageToQuote isGroupThread:thread.isGroupThread + isRSSFeed:NO transaction:transaction conversationStyle:conversationStyle]; quotedMessage = [ @@ -2033,6 +2034,7 @@ NS_ASSUME_NONNULL_BEGIN id viewItem = [[ConversationInteractionViewItem alloc] initWithInteraction:messageToQuote isGroupThread:thread.isGroupThread + isRSSFeed:NO transaction:transaction conversationStyle:conversationStyle]; quotedMessage = [ diff --git a/Signal/src/ViewControllers/MediaPageViewController.swift b/Signal/src/ViewControllers/MediaPageViewController.swift index e403c99d1..1c541676e 100644 --- a/Signal/src/ViewControllers/MediaPageViewController.swift +++ b/Signal/src/ViewControllers/MediaPageViewController.swift @@ -579,6 +579,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou let conversationStyle = ConversationStyle(thread: thread) fetchedItem = ConversationInteractionViewItem(interaction: message, isGroupThread: thread.isGroupThread(), + isRSSFeed: false, transaction: transaction, conversationStyle: conversationStyle) } diff --git a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift index 8e59d42e4..3bc8e638d 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift @@ -178,8 +178,7 @@ public final class LokiGroupChatAPI : NSObject { throw Error.parsingFailed } let timestamp = UInt64(date.timeIntervalSince1970) * 1000 - let quote: LokiGroupMessage.Quote? - return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: userHexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp, quote: nil) + return LokiGroupMessage(serverID: serverID, hexEncodedPublicKey: userHexEncodedPublicKey, displayName: displayName, body: body, type: publicChatMessageType, timestamp: timestamp, quote: message.quote) } }.recover { error -> Promise in if let error = error as? NetworkManagerError, error.statusCode == 401 { diff --git a/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift b/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift index 7b90bb092..f972039b8 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupMessage.swift @@ -31,12 +31,21 @@ public final class LokiGroupMessage : NSObject { super.init() } - @objc public convenience init(hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64) { - self.init(serverID: nil, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: type, timestamp: timestamp, quote: nil) + @objc public convenience init(hexEncodedPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quotedMessageTimestamp: UInt64, quoteeHexEncodedPublicKey: String?, quotedMessageBody: String?) { + let quote: Quote? + if quotedMessageTimestamp != 0, let quoteeHexEncodedPublicKey = quoteeHexEncodedPublicKey, let quotedMessageBody = quotedMessageBody { + quote = Quote(quotedMessageTimestamp: quotedMessageTimestamp, quoteeHexEncodedPublicKey: quoteeHexEncodedPublicKey, quotedMessageBody: quotedMessageBody) + } else { + quote = nil + } + self.init(serverID: nil, hexEncodedPublicKey: hexEncodedPublicKey, displayName: displayName, body: body, type: type, timestamp: timestamp, quote: quote) } internal func toJSON() -> JSON { - let value: JSON = [ "timestamp" : timestamp, "from" : displayName, "source" : hexEncodedPublicKey ] + var value: JSON = [ "timestamp" : timestamp, "from" : displayName, "source" : hexEncodedPublicKey ] + if let quote = quote { + value["quote"] = [ "id" : quote.quotedMessageTimestamp, "author" : quote.quoteeHexEncodedPublicKey, "text" : quote.quotedMessageBody ] + } return [ "text" : body, "annotations": [ [ "type" : type, "value" : value ] ] ] } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 3c7be02cc..ebde64588 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1113,7 +1113,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; NSString *displayName = SSKEnvironment.shared.profileManager.localProfileName; if (displayName == nil) { displayName = @"Anonymous"; } - LKGroupMessage *groupMessage = [[LKGroupMessage alloc] initWithHexEncodedPublicKey:userHexEncodedPublicKey displayName:displayName body:message.body type:LKGroupChatAPI.publicChatMessageType timestamp:message.timestamp]; + TSQuotedMessage *quote = message.quotedMessage; + LKGroupMessage *groupMessage = [[LKGroupMessage alloc] initWithHexEncodedPublicKey:userHexEncodedPublicKey displayName:displayName body:message.body type:LKGroupChatAPI.publicChatMessageType + timestamp:message.timestamp quotedMessageTimestamp:quote.timestamp quoteeHexEncodedPublicKey:quote.authorId quotedMessageBody:quote.body]; [[LKGroupChatAPI sendMessage:groupMessage toGroup:LKGroupChatAPI.publicChatServerID onServer:LKGroupChatAPI.publicChatServer] .thenOn(OWSDispatch.sendingQueue, ^(LKGroupMessage *groupMessage) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { From f7b66f05a0e562d97cf0642e52f3d87c322943f1 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 11 Sep 2019 16:25:33 +1000 Subject: [PATCH 3/3] Fix group chat quote display name --- .../ConversationView/Cells/OWSQuotedMessageView.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m index aebc4db13..92cdf5ec1 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSQuotedMessageView.m @@ -549,7 +549,16 @@ const CGFloat kRemotelySourcedContentRowSpacing = 3; } } else { OWSContactsManager *contactsManager = Environment.shared.contactsManager; - NSString *quotedAuthor = [contactsManager contactOrProfileNameForPhoneIdentifier:self.quotedMessage.authorId]; + __block NSString *quotedAuthor = [contactsManager contactOrProfileNameForPhoneIdentifier:self.quotedMessage.authorId]; + + if (quotedAuthor == self.quotedMessage.authorId) { + [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + NSString *collection = [NSString stringWithFormat:@"%@.%@", LKGroupChatAPI.publicChatServer, @(LKGroupChatAPI.publicChatServerID)]; + NSString *displayName = [transaction stringForKey:self.quotedMessage.authorId inCollection:collection]; + if (displayName != nil) { quotedAuthor = displayName; } + }]; + } + quotedAuthorText = [NSString stringWithFormat: NSLocalizedString(@"QUOTED_REPLY_AUTHOR_INDICATOR_FORMAT",