From 7490a55f617e322a4e50ec383091fdbbce35230d Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 27 Apr 2018 16:14:25 -0400 Subject: [PATCH] Sketch out "contact share" model. --- Pods | 2 +- .../ViewControllers/DebugUI/DebugUIMessages.m | 143 ++++++++++++++---- .../OWSIncomingSentMessageTranscript.m | 2 +- .../Interactions/OWSContactShare+Private.h | 65 ++++++++ .../Messages/Interactions/OWSContactShare.h | 4 +- .../Messages/Interactions/OWSContactShare.m | 57 +------ .../Messages/Interactions/TSErrorMessage.h | 3 +- .../Messages/Interactions/TSIncomingMessage.h | 3 +- .../Messages/Interactions/TSOutgoingMessage.h | 3 +- .../src/Messages/OWSMessageManager.m | 4 +- 10 files changed, 195 insertions(+), 91 deletions(-) create mode 100644 SignalServiceKit/src/Messages/Interactions/OWSContactShare+Private.h diff --git a/Pods b/Pods index 7f62033760..60da392e16 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 7f6203376010de8838e21a2c22546f10fc24f712 +Subproject commit 60da392e16648441b23dd3491e14d5bf4c94aaf9 diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index de90554589..df0f4220a5 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -13,6 +13,7 @@ #import #import #import +#import #import #import #import @@ -43,36 +44,11 @@ NS_ASSUME_NONNULL_BEGIN return @"Messages"; } -- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread +- (NSArray *)itemsForActions:(NSArray *)actions { - OWSAssert(thread); - NSMutableArray *items = [NSMutableArray new]; - [items addObject:[OWSTableItem itemWithTitle:@"Delete all messages in thread" - actionBlock:^{ - [DebugUIMessages deleteAllMessagesInThread:thread]; - }]]; - - for (DebugUIMessagesAction *action in @[ - [DebugUIMessages sendMessageVariationsAction:thread], - // Send Media - [DebugUIMessages sendAllMediaAction:thread], - [DebugUIMessages sendRandomMediaAction:thread], - // Fake Media - [DebugUIMessages fakeAllMediaAction:thread], - [DebugUIMessages fakeRandomMediaAction:thread], - // Fake Text - [DebugUIMessages fakeAllTextAction:thread], - [DebugUIMessages fakeRandomTextAction:thread], - // Sequences - [DebugUIMessages allFakeSequencesAction:thread], - // Quoted Replies - [DebugUIMessages allQuotedReplyAction:thread], - // Exemplary - [DebugUIMessages allFakeAction:thread], - [DebugUIMessages allFakeBackDatedAction:thread], - ]) { + for (DebugUIMessagesAction *action in actions) { [items addObject:[OWSTableItem itemWithTitle:action.label actionBlock:^{ // For "all in group" actions, do each subaction in the group @@ -89,6 +65,41 @@ NS_ASSUME_NONNULL_BEGIN }]]; } + return items; +} + +- (nullable OWSTableSection *)sectionForThread:(nullable TSThread *)thread +{ + OWSAssert(thread); + + NSMutableArray *items = [NSMutableArray new]; + + [items addObject:[OWSTableItem itemWithTitle:@"Delete all messages in thread" + actionBlock:^{ + [DebugUIMessages deleteAllMessagesInThread:thread]; + }]]; + + [items addObjectsFromArray:[self itemsForActions:@[ + [DebugUIMessages sendMessageVariationsAction:thread], + // Send Media + [DebugUIMessages sendAllMediaAction:thread], + [DebugUIMessages sendRandomMediaAction:thread], + // Fake Media + [DebugUIMessages fakeAllMediaAction:thread], + [DebugUIMessages fakeRandomMediaAction:thread], + // Fake Text + [DebugUIMessages fakeAllTextAction:thread], + [DebugUIMessages fakeRandomTextAction:thread], + // Sequences + [DebugUIMessages allFakeSequencesAction:thread], + // Quoted Replies + [DebugUIMessages allQuotedReplyAction:thread], + // Exemplary + [DebugUIMessages allFakeAction:thread], + [DebugUIMessages allFakeBackDatedAction:thread], + [DebugUIMessages allShareContactAction:thread], + ]]]; + [items addObjectsFromArray:@[ #pragma mark - Actions @@ -809,6 +820,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:YES isRead:NO quotedMessage:nil + contactShare:nil transaction:transaction]; // This is a hack to "back-date" the message. @@ -1741,6 +1753,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:NO isRead:NO quotedMessage:nil + contactShare:nil transaction:transaction]; }]; } @@ -1788,6 +1801,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:isDelivered isRead:isRead quotedMessage:nil + contactShare:nil transaction:transaction]; }]; } @@ -1961,6 +1975,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:quotedMessageIsDelivered isRead:quotedMessageIsRead quotedMessage:nil + contactShare:nil transaction:transaction]; OWSAssert(messageToQuote); quotedMessage = [[OWSQuotedReplyModel quotedReplyForMessage:messageToQuote transaction:transaction] @@ -1985,6 +2000,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:replyIsDelivered isRead:replyIsRead quotedMessage:quotedMessage + contactShare:nil transaction:transaction]; } } @@ -2642,6 +2658,7 @@ NS_ASSUME_NONNULL_BEGIN [actions addObjectsFromArray:[self allFakeSequenceActions:thread includeLabels:includeLabels]]; [actions addObjectsFromArray:[self allFakeQuotedReplyActions:thread includeLabels:includeLabels]]; [actions addObjectsFromArray:[self allFakeBackDatedActions:thread includeLabels:includeLabels]]; + [actions addObjectsFromArray:[self allShareContactActions:thread includeLabels:includeLabels]]; return actions; } @@ -2832,6 +2849,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:NO isRead:NO quotedMessage:nil + contactShare:nil transaction:transaction]; [message setReceivedAtTimestamp:(uint64_t)((int64_t)[NSDate ows_millisecondTimeStamp] + dateOffset)]; [message saveWithTransaction:transaction]; @@ -2882,6 +2900,70 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - +typedef OWSContactShare * (^OWSContactShareBlock)(void); + ++ (DebugUIMessagesAction *)fakeShareContactMessageAction:(TSThread *)thread + label:(NSString *)label + contactShareBlock:(OWSContactShareBlock)contactShareBlock +{ + OWSAssert(thread); + + return [DebugUIMessagesSingleAction + actionWithLabel:[NSString stringWithFormat:@"Fake Contact Share (%@)", label] + unstaggeredActionBlock:^(NSUInteger index, YapDatabaseReadWriteTransaction *transaction) { + OWSContactShare *contactShare = contactShareBlock(); + TSOutgoingMessage *message = [self createFakeOutgoingMessage:thread + messageBody:nil + fakeAssetLoader:nil + messageState:TSOutgoingMessageStateSent + isDelivered:NO + isRead:NO + quotedMessage:nil + contactShare:contactShare + transaction:transaction]; + [message saveWithTransaction:transaction]; + }]; +} + ++ (NSArray *)allShareContactActions:(TSThread *)thread includeLabels:(BOOL)includeLabels +{ + OWSAssert(thread); + + NSMutableArray *actions = [NSMutableArray new]; + + if (includeLabels) { + [actions addObject:[self fakeOutgoingTextMessageAction:thread + messageState:TSOutgoingMessageStateSent + text:@"⚠️ Share Contact ⚠️"]]; + } + + [actions addObject:[self fakeShareContactMessageAction:thread + label:@"Name & Number" + contactShareBlock:^{ + OWSContactShare *contactShare = [OWSContactShare new]; + contactShare.givenName = @"Alice"; + OWSContactSharePhoneNumber *phoneNumber = [OWSContactSharePhoneNumber new]; + phoneNumber.phoneType = OWSContactSharePhoneType_Home; + phoneNumber.phoneNumber = @"+13213214321"; + contactShare.phoneNumbers = @[ + phoneNumber, + ]; + return contactShare; + }]]; + + return actions; +} + ++ (DebugUIMessagesAction *)allShareContactAction:(TSThread *)thread +{ + OWSAssert(thread); + + return [DebugUIMessagesGroupAction allGroupActionWithLabel:@"All Fake Share Contact" + subactions:[self allShareContactActions:thread includeLabels:YES]]; +} + +#pragma mark - + + (NSString *)randomOversizeText { NSMutableString *message = [NSMutableString new]; @@ -3270,6 +3352,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:NO isRead:NO quotedMessage:nil + contactShare:nil transaction:transaction]; break; } @@ -3323,6 +3406,7 @@ NS_ASSUME_NONNULL_BEGIN isRead:NO isVoiceMessage:NO quotedMessage:nil + contactShare:nil transaction:transaction]; break; } @@ -3943,6 +4027,7 @@ NS_ASSUME_NONNULL_BEGIN isDelivered:(BOOL)isDelivered isRead:(BOOL)isRead quotedMessage:(nullable TSQuotedMessage *)quotedMessage + contactShare:(nullable OWSContactShare *)contactShare transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssert(thread); @@ -3968,6 +4053,7 @@ NS_ASSUME_NONNULL_BEGIN isRead:isRead isVoiceMessage:attachment.isVoiceMessage quotedMessage:quotedMessage + contactShare:contactShare transaction:transaction]; } @@ -3980,6 +4066,7 @@ NS_ASSUME_NONNULL_BEGIN isRead:(BOOL)isRead isVoiceMessage:(BOOL)isVoiceMessage quotedMessage:(nullable TSQuotedMessage *)quotedMessage + contactShare:(nullable OWSContactShare *)contactShare transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssert(thread); @@ -4001,7 +4088,7 @@ NS_ASSUME_NONNULL_BEGIN isVoiceMessage:isVoiceMessage groupMetaMessage:TSGroupMessageUnspecified quotedMessage:quotedMessage - contactShare:nil]; + contactShare:contactShare]; if (attachmentId.length > 0 && filename.length > 0) { message.attachmentFilenameMap[attachmentId] = filename; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m index aae5030223..d971db727d 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m @@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN _quotedMessage = [TSQuotedMessage quotedMessageForDataMessage:_dataMessage thread:_thread relay:relay transaction:transaction]; - _contactShare = [OWSContactShare contactShareMessageForDataMessage:_dataMessage transaction:transaction]; + _contactShare = [OWSContactShare contactShareForDataMessage:_dataMessage transaction:transaction]; return self; } diff --git a/SignalServiceKit/src/Messages/Interactions/OWSContactShare+Private.h b/SignalServiceKit/src/Messages/Interactions/OWSContactShare+Private.h new file mode 100644 index 0000000000..0e59228227 --- /dev/null +++ b/SignalServiceKit/src/Messages/Interactions/OWSContactShare+Private.h @@ -0,0 +1,65 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +#import "OWSContactShare.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSContactSharePhoneNumber (Private) + +@property (nonatomic) OWSContactSharePhoneType phoneType; +@property (nonatomic, nullable) NSString *label; + +@property (nonatomic) NSString *phoneNumber; + +@end + +#pragma mark - + +@interface OWSContactShareEmail (Private) + +@property (nonatomic) OWSContactShareEmailType emailType; +@property (nonatomic, nullable) NSString *label; + +@property (nonatomic) NSString *email; + +@end + +#pragma mark - + +@interface OWSContactShareAddress (Private) + +@property (nonatomic) OWSContactShareAddressType addressType; +@property (nonatomic, nullable) NSString *label; + +@property (nonatomic, nullable) NSString *street; +@property (nonatomic, nullable) NSString *pobox; +@property (nonatomic, nullable) NSString *neighborhood; +@property (nonatomic, nullable) NSString *city; +@property (nonatomic, nullable) NSString *region; +@property (nonatomic, nullable) NSString *postcode; +@property (nonatomic, nullable) NSString *country; + +@end + +#pragma mark - + +@interface OWSContactShare (Private) + +@property (nonatomic, nullable) NSString *givenName; +@property (nonatomic, nullable) NSString *familyName; +@property (nonatomic, nullable) NSString *nameSuffix; +@property (nonatomic, nullable) NSString *namePrefix; +@property (nonatomic, nullable) NSString *middleName; + +@property (nonatomic, nullable) NSArray *phoneNumbers; +@property (nonatomic, nullable) NSArray *emails; +@property (nonatomic, nullable) NSArray *addresses; + +@property (nonatomic, nullable) TSAttachment *avatar; +@property (nonatomic) BOOL isProfileAvatar; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/Interactions/OWSContactShare.h b/SignalServiceKit/src/Messages/Interactions/OWSContactShare.h index 2090a0c374..f4b272574c 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSContactShare.h +++ b/SignalServiceKit/src/Messages/Interactions/OWSContactShare.h @@ -91,8 +91,8 @@ typedef NS_ENUM(NSUInteger, OWSContactShareAddressType) { - (instancetype)init NS_UNAVAILABLE; -+ (OWSContactShare *_Nullable)contactShareMessageForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage - transaction:(YapDatabaseReadWriteTransaction *)transaction; ++ (OWSContactShare *_Nullable)contactShareForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage + transaction:(YapDatabaseReadWriteTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Messages/Interactions/OWSContactShare.m b/SignalServiceKit/src/Messages/Interactions/OWSContactShare.m index 25072ed3c4..e04ea2f104 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSContactShare.m +++ b/SignalServiceKit/src/Messages/Interactions/OWSContactShare.m @@ -3,63 +3,25 @@ // #import "OWSContactShare.h" +#import "OWSContactShare+Private.h" #import "OWSSignalServiceProtos.pb.h" #import "TSAttachment.h" #import NS_ASSUME_NONNULL_BEGIN -@interface OWSContactSharePhoneNumber () - -@property (nonatomic) OWSContactSharePhoneType phoneType; -@property (nonatomic, nullable) NSString *label; - -@property (nonatomic) NSString *phoneNumber; - -@end - -#pragma mark - - @implementation OWSContactSharePhoneNumber @end #pragma mark - -@interface OWSContactShareEmail () - -@property (nonatomic) OWSContactShareEmailType emailType; -@property (nonatomic, nullable) NSString *label; - -@property (nonatomic) NSString *email; - -@end - -#pragma mark - - @implementation OWSContactShareEmail @end #pragma mark - -@interface OWSContactShareAddress () - -@property (nonatomic) OWSContactShareAddressType addressType; -@property (nonatomic, nullable) NSString *label; - -@property (nonatomic, nullable) NSString *street; -@property (nonatomic, nullable) NSString *pobox; -@property (nonatomic, nullable) NSString *neighborhood; -@property (nonatomic, nullable) NSString *city; -@property (nonatomic, nullable) NSString *region; -@property (nonatomic, nullable) NSString *postcode; -@property (nonatomic, nullable) NSString *country; - -@end - -#pragma mark - - @implementation OWSContactShareAddress @end @@ -68,27 +30,14 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSContactShare () -@property (nonatomic, nullable) NSString *givenName; -@property (nonatomic, nullable) NSString *familyName; -@property (nonatomic, nullable) NSString *nameSuffix; -@property (nonatomic, nullable) NSString *namePrefix; -@property (nonatomic, nullable) NSString *middleName; - -@property (nonatomic, nullable) NSArray *phoneNumbers; -@property (nonatomic, nullable) NSArray *emails; -@property (nonatomic, nullable) NSArray *addresses; - -@property (nonatomic, nullable) TSAttachment *avatar; -@property (nonatomic) BOOL isProfileAvatar; - @end #pragma mark - @implementation OWSContactShare -+ (OWSContactShare *_Nullable)contactShareMessageForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage - transaction:(YapDatabaseReadWriteTransaction *)transaction ++ (OWSContactShare *_Nullable)contactShareForDataMessage:(OWSSignalServiceProtosDataMessage *)dataMessage + transaction:(YapDatabaseReadWriteTransaction *)transaction { OWSAssert(dataMessage); diff --git a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h index 91523a1a7a..8af80ed92e 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSErrorMessage.h @@ -33,7 +33,8 @@ typedef NS_ENUM(int32_t, TSErrorMessageType) { attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds expireStartedAt:(uint64_t)expireStartedAt - quotedMessage:(nullable TSQuotedMessage *)quotedMessage NS_UNAVAILABLE; + quotedMessage:(nullable TSQuotedMessage *)quotedMessage + contactShare:(nullable OWSContactShare *)contactShare NS_UNAVAILABLE; - (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; diff --git a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h index 51811193ef..3e0cff6639 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSIncomingMessage.h @@ -18,7 +18,8 @@ NS_ASSUME_NONNULL_BEGIN attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds expireStartedAt:(uint64_t)expireStartedAt - quotedMessage:(nullable TSQuotedMessage *)quotedMessage NS_UNAVAILABLE; + quotedMessage:(nullable TSQuotedMessage *)quotedMessage + contactShare:(nullable OWSContactShare *)contactShare NS_UNAVAILABLE; /** * Inits an incoming group message that expires. diff --git a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h index cdcf8c8521..d56f6d89c1 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSOutgoingMessage.h @@ -74,7 +74,8 @@ typedef NS_ENUM(NSInteger, TSGroupMetaMessage) { attachmentIds:(NSArray *)attachmentIds expiresInSeconds:(uint32_t)expiresInSeconds expireStartedAt:(uint64_t)expireStartedAt - quotedMessage:(nullable TSQuotedMessage *)quotedMessage NS_UNAVAILABLE; + quotedMessage:(nullable TSQuotedMessage *)quotedMessage + contactShare:(nullable OWSContactShare *)contactShare NS_UNAVAILABLE; - (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp inThread:(nullable TSThread *)thread diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 0804cc2508..406ff68498 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -998,7 +998,7 @@ NS_ASSUME_NONNULL_BEGIN transaction:transaction]; OWSContactShare *_Nullable contactShare = - [OWSContactShare contactShareMessageForDataMessage:dataMessage transaction:transaction]; + [OWSContactShare contactShareForDataMessage:dataMessage transaction:transaction]; DDLogDebug(@"%@ incoming message from: %@ for group: %@ with timestamp: %lu", self.logTag, @@ -1050,7 +1050,7 @@ NS_ASSUME_NONNULL_BEGIN relay:envelope.relay transaction:transaction]; OWSContactShare *_Nullable contactShare = - [OWSContactShare contactShareMessageForDataMessage:dataMessage transaction:transaction]; + [OWSContactShare contactShareForDataMessage:dataMessage transaction:transaction]; TSIncomingMessage *incomingMessage = [[TSIncomingMessage alloc] initIncomingMessageWithTimestamp:timestamp