Path: blob/main/SignalServiceKit/Messages/Interactions/TSInfoMessage.m
1 views
//1// Copyright 2017 Signal Messenger, LLC2// SPDX-License-Identifier: AGPL-3.0-only3//45#import "TSInfoMessage.h"6#import <SignalServiceKit/SignalServiceKit-Swift.h>78NS_ASSUME_NONNULL_BEGIN910const InfoMessageUserInfoKey InfoMessageUserInfoKeyLegacyGroupUpdateItems = @"InfoMessageUserInfoKeyUpdateMessages";11const InfoMessageUserInfoKey InfoMessageUserInfoKeyGroupUpdateItems = @"InfoMessageUserInfoKeyUpdateMessagesV2";12const InfoMessageUserInfoKey InfoMessageUserInfoKeyOldGroupModel = @"InfoMessageUserInfoKeyOldGroupModel";13const InfoMessageUserInfoKey InfoMessageUserInfoKeyNewGroupModel = @"InfoMessageUserInfoKeyNewGroupModel";14const InfoMessageUserInfoKey InfoMessageUserInfoKeyOldDisappearingMessageToken15= @"InfoMessageUserInfoKeyOldDisappearingMessageToken";16const InfoMessageUserInfoKey InfoMessageUserInfoKeyNewDisappearingMessageToken17= @"InfoMessageUserInfoKeyNewDisappearingMessageToken";18const InfoMessageUserInfoKey InfoMessageUserInfoKeyGroupUpdateSourceLegacyAddress19= @"InfoMessageUserInfoKeyGroupUpdateSourceAddress";20const InfoMessageUserInfoKey InfoMessageUserInfoKeyLegacyUpdaterKnownToBeLocalUser21= @"InfoMessageUserInfoKeyUpdaterWasLocalUser";22const InfoMessageUserInfoKey InfoMessageUserInfoKeyProfileChanges = @"InfoMessageUserInfoKeyProfileChanges";23const InfoMessageUserInfoKey InfoMessageUserInfoKeyChangePhoneNumberAciString24= @"InfoMessageUserInfoKeyChangePhoneNumberUuid";25const InfoMessageUserInfoKey InfoMessageUserInfoKeyChangePhoneNumberOld = @"InfoMessageUserInfoKeyChangePhoneNumberOld";26const InfoMessageUserInfoKey InfoMessageUserInfoKeyChangePhoneNumberNew = @"InfoMessageUserInfoKeyChangePhoneNumberNew";27const InfoMessageUserInfoKey InfoMessageUserInfoKeyPaymentActivationRequestSenderAci28= @"InfoMessageUserInfoKeyPaymentActivationRequestSenderAci";29const InfoMessageUserInfoKey InfoMessageUserInfoKeyPaymentActivatedAci = @"InfoMessageUserInfoKeyPaymentActivatedAci";30const InfoMessageUserInfoKey InfoMessageUserInfoKeyThreadMergePhoneNumber31= @"InfoMessageUserInfoKeyThreadMergePhoneNumber";32const InfoMessageUserInfoKey InfoMessageUserInfoKeySessionSwitchoverPhoneNumber33= @"InfoMessageUserInfoKeySessionSwitchoverPhoneNumber";34const InfoMessageUserInfoKey InfoMessageUserInfoKeyPhoneNumberDisplayNameBeforeLearningProfileName35= @"InfoMessageUserInfoKeyPhoneNumberDisplayNameBeforeLearningProfileName";36const InfoMessageUserInfoKey InfoMessageUserInfoKeyUsernameDisplayNameBeforeLearningProfileName37= @"InfoMessageUserInfoKeyUsernameDisplayNameBeforeLearningProfileName";38const InfoMessageUserInfoKey InfoMessageUserInfoKeyEndPoll = @"InfoMessageUserInfoKeyEndPoll";39const InfoMessageUserInfoKey InfoMessageUserInfoKeyPinnedMessage = @"InfoMessageUserInfoKeyPinnedMessage";4041@interface TSInfoMessage ()4243@property (nonatomic, getter=wasRead) BOOL read;4445@end4647#pragma mark -4849@implementation TSInfoMessage5051+ (NSArray<Class> *)infoMessageUserInfoObjectClasses52{53return @[54[DisappearingMessageToken class],55[NSDictionary class],56[NSNull class],57[NSNumber class],58[NSString class],59[PersistableEndPollItem class],60[PersistablePinnedMessageItem class],61[ProfileChanges class],62[SignalServiceAddress class],63[TSGroupModel class],64[TSInfoMessageUpdateMessages class],65[TSInfoMessageUpdateMessagesV2 class]66];67}6869- (NSUInteger)hash70{71NSUInteger result = [super hash];72result ^= self.customMessage.hash;73result ^= self.infoMessageUserInfo.hash;74result ^= (NSUInteger)self.messageType;75result ^= self.read;76result ^= self.serverGuid.hash;77result ^= self.unregisteredAddress.hash;78return result;79}8081- (BOOL)isEqual:(id)other82{83if (![super isEqual:other]) {84return NO;85}86TSInfoMessage *typedOther = (TSInfoMessage *)other;87if (![NSObject isObject:self.customMessage equalToObject:typedOther.customMessage]) {88return NO;89}90if (![NSObject isObject:self.infoMessageUserInfo equalToObject:typedOther.infoMessageUserInfo]) {91return NO;92}93if (self.messageType != typedOther.messageType) {94return NO;95}96if (self.read != typedOther.read) {97return NO;98}99if (![NSObject isObject:self.serverGuid equalToObject:typedOther.serverGuid]) {100return NO;101}102if (![NSObject isObject:self.unregisteredAddress equalToObject:typedOther.unregisteredAddress]) {103return NO;104}105return YES;106}107108- (instancetype)initWithThread:(TSThread *)thread109timestamp:(uint64_t)timestamp110serverGuid:(nullable NSString *)serverGuid111messageType:(TSInfoMessageType)messageType112expireTimerVersion:(nullable NSNumber *)expireTimerVersion113expiresInSeconds:(unsigned int)expiresInSeconds114infoMessageUserInfo:(nullable NSDictionary<InfoMessageUserInfoKey, id> *)infoMessageUserInfo115{116TSMessageBuilder *builder;117if (timestamp > 0) {118builder = [TSMessageBuilder messageBuilderWithThread:thread timestamp:timestamp];119} else {120builder = [TSMessageBuilder messageBuilderWithThread:thread];121}122123if (expiresInSeconds > 0 && expireTimerVersion != nil) {124builder.expiresInSeconds = expiresInSeconds;125builder.expireTimerVersion = expireTimerVersion;126}127128self = [super initMessageWithBuilder:builder];129if (!self) {130return self;131}132133_serverGuid = serverGuid;134_messageType = messageType;135_infoMessageUserInfo = infoMessageUserInfo;136137if (self.isDynamicInteraction) {138self.read = YES;139}140141if (_messageType == TSInfoMessageTypeGroupQuit) {142self.read = YES;143}144145return self;146}147148// --- CODE GENERATION MARKER149150// This snippet is generated by /Scripts/sds_codegen/sds_generate.py. Do not manually edit it, instead run151// `sds_codegen.sh`.152153// clang-format off154155- (instancetype)initWithGrdbId:(int64_t)grdbId156uniqueId:(NSString *)uniqueId157receivedAtTimestamp:(uint64_t)receivedAtTimestamp158sortId:(uint64_t)sortId159timestamp:(uint64_t)timestamp160uniqueThreadId:(NSString *)uniqueThreadId161body:(nullable NSString *)body162bodyRanges:(nullable MessageBodyRanges *)bodyRanges163contactShare:(nullable OWSContact *)contactShare164deprecated_attachmentIds:(nullable NSArray<NSString *> *)deprecated_attachmentIds165editState:(TSEditState)editState166expireStartedAt:(uint64_t)expireStartedAt167expireTimerVersion:(nullable NSNumber *)expireTimerVersion168expiresAt:(uint64_t)expiresAt169expiresInSeconds:(unsigned int)expiresInSeconds170giftBadge:(nullable OWSGiftBadge *)giftBadge171isGroupStoryReply:(BOOL)isGroupStoryReply172isPoll:(BOOL)isPoll173isSmsMessageRestoredFromBackup:(BOOL)isSmsMessageRestoredFromBackup174isViewOnceComplete:(BOOL)isViewOnceComplete175isViewOnceMessage:(BOOL)isViewOnceMessage176linkPreview:(nullable OWSLinkPreview *)linkPreview177messageSticker:(nullable MessageSticker *)messageSticker178quotedMessage:(nullable TSQuotedMessage *)quotedMessage179storedShouldStartExpireTimer:(BOOL)storedShouldStartExpireTimer180storyAuthorUuidString:(nullable NSString *)storyAuthorUuidString181storyReactionEmoji:(nullable NSString *)storyReactionEmoji182storyTimestamp:(nullable NSNumber *)storyTimestamp183wasRemotelyDeleted:(BOOL)wasRemotelyDeleted184customMessage:(nullable NSString *)customMessage185infoMessageUserInfo:(nullable NSDictionary<InfoMessageUserInfoKey, id> *)infoMessageUserInfo186messageType:(TSInfoMessageType)messageType187read:(BOOL)read188serverGuid:(nullable NSString *)serverGuid189unregisteredAddress:(nullable SignalServiceAddress *)unregisteredAddress190{191self = [super initWithGrdbId:grdbId192uniqueId:uniqueId193receivedAtTimestamp:receivedAtTimestamp194sortId:sortId195timestamp:timestamp196uniqueThreadId:uniqueThreadId197body:body198bodyRanges:bodyRanges199contactShare:contactShare200deprecated_attachmentIds:deprecated_attachmentIds201editState:editState202expireStartedAt:expireStartedAt203expireTimerVersion:expireTimerVersion204expiresAt:expiresAt205expiresInSeconds:expiresInSeconds206giftBadge:giftBadge207isGroupStoryReply:isGroupStoryReply208isPoll:isPoll209isSmsMessageRestoredFromBackup:isSmsMessageRestoredFromBackup210isViewOnceComplete:isViewOnceComplete211isViewOnceMessage:isViewOnceMessage212linkPreview:linkPreview213messageSticker:messageSticker214quotedMessage:quotedMessage215storedShouldStartExpireTimer:storedShouldStartExpireTimer216storyAuthorUuidString:storyAuthorUuidString217storyReactionEmoji:storyReactionEmoji218storyTimestamp:storyTimestamp219wasRemotelyDeleted:wasRemotelyDeleted];220221if (!self) {222return self;223}224225_customMessage = customMessage;226_infoMessageUserInfo = infoMessageUserInfo;227_messageType = messageType;228_read = read;229_serverGuid = serverGuid;230_unregisteredAddress = unregisteredAddress;231232return self;233}234235// clang-format on236237// --- CODE GENERATION MARKER238239- (OWSInteractionType)interactionType240{241return OWSInteractionType_Info;242}243244- (NSString *)conversationSystemMessageComponentTextWithTransaction:(DBReadTransaction *)transaction245{246switch (self.messageType) {247case TSInfoMessageSyncedThread:248// This particular string is here, and not in `infoMessagePreviewTextWithTransaction`,249// because we want it to be excluded from everywhere except chat list rendering.250// e.g. not in the conversation list preview.251return OWSLocalizedString(@"INFO_MESSAGE_SYNCED_THREAD",252@"Shown in inbox and conversation after syncing as a placeholder indicating why your message history "253@"is missing.");254default:255return [self infoMessagePreviewTextWithTransaction:transaction];256}257}258259- (NSString *)infoMessagePreviewTextWithTransaction:(DBReadTransaction *)transaction260{261return [self _infoMessagePreviewTextWithTx:transaction];262}263264#pragma mark - OWSReadTracking265266- (void)markAsReadAtTimestamp:(uint64_t)readTimestamp267thread:(TSThread *)thread268circumstance:(OWSReceiptCircumstance)circumstance269shouldClearNotifications:(BOOL)shouldClearNotifications270transaction:(DBWriteTransaction *)transaction271{272OWSAssertDebug(transaction);273274if (self.read) {275return;276}277278[self anyUpdateInfoMessageWithTransaction:transaction block:^(TSInfoMessage *message) { message.read = YES; }];279280// Ignore `circumstance` - we never send read receipts for info messages.281}282283@end284285NS_ASSUME_NONNULL_END286287288