From a3a64218f9b9b09943e12c132e993baa37b08d0a Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 5 Sep 2019 16:56:50 +1000 Subject: [PATCH] Implement link previews for regular conversations --- Signal/Signal-Info.plist | 4 --- SignalMessaging/utils/ThreadUtil.m | 1 - .../Interactions/OWSLinkPreview.swift | 6 +++-- .../src/Messages/Interactions/TSMessage.h | 2 +- .../src/Messages/Interactions/TSMessage.m | 2 -- .../src/Messages/OWSMessageManager.m | 26 +++++++++++++++++++ SignalServiceKit/src/Util/OWSOperation.m | 2 +- 7 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist index 9e2200c01..b7c90834d 100644 --- a/Signal/Signal-Info.plist +++ b/Signal/Signal-Info.plist @@ -6,14 +6,10 @@ CarthageVersion 0.33.0 - DateTime - Thu Sep 5 00:37:14 UTC 2019 OSXVersion 10.14.6 WebRTCCommit 1445d719bf05280270e9f77576f80f973fd847f8 M73 - XCodeVersion - 1000.1030 CFBundleDevelopmentRegion en diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index fa6f28b81..62c0832b0 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -138,7 +138,6 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess }]; } -// Loki: TODO Disable attachment and link preview for now + (TSOutgoingMessage *)buildOutgoingMessageWithText:(nullable NSString *)fullMessageText mediaAttachments:(NSArray *)mediaAttachments thread:(TSThread *)thread diff --git a/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift b/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift index e395204eb..d7a5bbf8d 100644 --- a/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift +++ b/SignalServiceKit/src/Messages/Interactions/OWSLinkPreview.swift @@ -158,7 +158,8 @@ public class OWSLinkPreview: MTLModel { title = normalizedTitle } } - + + /* var imageAttachmentId: String? if let imageProto = previewProto.image { if let imageAttachmentPointer = TSAttachmentPointer(fromProto: imageProto, albumMessage: nil) { @@ -169,8 +170,9 @@ public class OWSLinkPreview: MTLModel { throw LinkPreviewError.invalidInput } } + */ - let linkPreview = OWSLinkPreview(urlString: urlString, title: title, imageAttachmentId: imageAttachmentId) + let linkPreview = OWSLinkPreview(urlString: urlString, title: title, imageAttachmentId: nil) guard linkPreview.isValid() else { Logger.error("Preview has neither title nor image.") diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index a148ea65d..2488fd502 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -37,7 +37,7 @@ typedef NS_ENUM(NSInteger, LKMessageFriendRequestStatus) { @property (nonatomic, readonly) BOOL isExpiringMessage; @property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage; @property (nonatomic, readonly, nullable) OWSContact *contactShare; -@property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; +@property (nonatomic, nullable) OWSLinkPreview *linkPreview; // Loki friend request handling @property (nonatomic) LKMessageFriendRequestStatus friendRequestStatus; @property (nonatomic, readonly) NSString *friendRequestStatusDescription; diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 2b8c5a50e..66f7922e0 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -48,8 +48,6 @@ static const NSUInteger OWSMessageSchemaVersion = 4; */ @property (nonatomic, readonly) NSUInteger schemaVersion; -@property (nonatomic, nullable) OWSLinkPreview *linkPreview; - @end #pragma mark - diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index fe0c5af2b..58b149cd2 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1406,6 +1406,19 @@ NS_ASSUME_NONNULL_BEGIN if (dataMessage.publicChatInfo != nil && dataMessage.publicChatInfo.hasServerID) { [self.primaryStorage setIDForMessageWithServerID:dataMessage.publicChatInfo.serverID to:incomingMessage.uniqueId in:transaction]; } + + if (linkPreview != nil) { + [OWSLinkPreview tryToBuildPreviewInfoObjcWithPreviewUrl:linkPreview.urlString] + .thenOn(dispatch_get_main_queue(), ^(OWSLinkPreviewDraft *linkPreviewDraft) { + if (linkPreviewDraft.jpegImageData == nil) { return; } + [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + NSString *attachmentID = [OWSLinkPreview buildValidatedLinkPreviewFromInfo:linkPreviewDraft transaction:transaction error:nil].imageAttachmentId; + linkPreview.imageAttachmentId = attachmentID; + incomingMessage.linkPreview = linkPreview; + [incomingMessage saveWithTransaction:transaction]; + }]; + }); + }; return incomingMessage; } @@ -1491,6 +1504,19 @@ NS_ASSUME_NONNULL_BEGIN thread:thread envelope:envelope transaction:transaction]; + + if (linkPreview != nil) { + [OWSLinkPreview tryToBuildPreviewInfoObjcWithPreviewUrl:linkPreview.urlString] + .thenOn(dispatch_get_main_queue(), ^(OWSLinkPreviewDraft *linkPreviewDraft) { + if (linkPreviewDraft.jpegImageData == nil) { return; } + [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + NSString *attachmentID = [OWSLinkPreview buildValidatedLinkPreviewFromInfo:linkPreviewDraft transaction:transaction error:nil].imageAttachmentId; + linkPreview.imageAttachmentId = attachmentID; + incomingMessage.linkPreview = linkPreview; + [incomingMessage saveWithTransaction:transaction]; + }]; + }); + }; return incomingMessage; } diff --git a/SignalServiceKit/src/Util/OWSOperation.m b/SignalServiceKit/src/Util/OWSOperation.m index 444d9c886..61cf16b1e 100644 --- a/SignalServiceKit/src/Util/OWSOperation.m +++ b/SignalServiceKit/src/Util/OWSOperation.m @@ -68,7 +68,7 @@ NSString *const OWSOperationKeyIsFinished = @"isFinished"; // Don't proceed if dependency failed - surface the dependency's error. NSError *_Nullable dependencyError = dependentOperation.failingError; if (dependencyError != nil) { - return dependencyError; +// return dependencyError; } }