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/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index 56f43e51f..40a42708e 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -93,6 +93,15 @@ public final class LokiGroupChatPoller : NSObject { guard let messageID = message.uniqueId else { return print("[Loki] Failed to save group message.") } storage.setIDForMessageWithServerID(UInt(messageServerID), to: messageID, in: transaction) } + if let url = OWSLinkPreview.previewUrl(forMessageBodyText: message.body, selectedRange: nil) { + let _ = OWSLinkPreview.tryToBuildPreviewInfo(previewUrl: url).done { linkPreviewDraft in + OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite { transaction in + guard let linkPreview = try? OWSLinkPreview.buildValidatedLinkPreview(fromInfo: linkPreviewDraft, transaction: transaction) else { return } + message.linkPreview = linkPreview + message.save(with: transaction) + } + } + } } // Poll let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { messages in diff --git a/Signal/src/Loki/QRCodeViewController.swift b/Signal/src/Loki/QRCodeViewController.swift index ee512ee9e..af269d67a 100644 --- a/Signal/src/Loki/QRCodeViewController.swift +++ b/Signal/src/Loki/QRCodeViewController.swift @@ -6,6 +6,7 @@ final class QRCodeViewController : OWSViewController { override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = UIColor.lokiDarkestGray() let stackView = UIStackView(arrangedSubviews: []) stackView.axis = .vertical stackView.spacing = 32 diff --git a/Signal/src/views/LinkPreviewView.swift b/Signal/src/views/LinkPreviewView.swift index 6b5e7b277..ab28a1ce5 100644 --- a/Signal/src/views/LinkPreviewView.swift +++ b/Signal/src/views/LinkPreviewView.swift @@ -819,17 +819,16 @@ public class LinkPreviewView: UIStackView { public func addBorderViews(bubbleView: OWSBubbleView) { if let heroImageView = self.heroImageView { let borderView = OWSBubbleShapeView(draw: ()) - borderView.strokeColor = Theme.primaryColor - borderView.strokeThickness = CGHairlineWidth() + borderView.strokeColor = UIColor.clear + borderView.strokeThickness = 0 heroImageView.addSubview(borderView) bubbleView.addPartnerView(borderView) borderView.ows_autoPinToSuperviewEdges() } if let sentBodyView = self.sentBodyView { let borderView = OWSBubbleShapeView(draw: ()) - let borderColor = UIColor(rgbHex: Theme.isDarkThemeEnabled ? 0x0F1012 : 0xD5D6D6) - borderView.strokeColor = borderColor - borderView.strokeThickness = CGHairlineWidth() + borderView.strokeColor = UIColor.clear + borderView.strokeThickness = 0 sentBodyView.addSubview(borderView) bubbleView.addPartnerView(borderView) borderView.ows_autoPinToSuperviewEdges() 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..5c639d05a 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.") @@ -433,6 +435,11 @@ public class OWSLinkPreview: MTLModel { return previewUrl(forMessageBodyText: body, selectedRange: selectedRange) } + @objc + public class func previewURL(forRawBodyText body: String?) -> String? { + return previewUrl(forMessageBodyText: body, selectedRange: nil) + } + public class func previewUrl(forMessageBodyText body: String?, selectedRange: NSRange?) -> String? { AssertIsOnMainThread() 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..8694623aa 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1406,7 +1406,19 @@ NS_ASSUME_NONNULL_BEGIN if (dataMessage.publicChatInfo != nil && dataMessage.publicChatInfo.hasServerID) { [self.primaryStorage setIDForMessageWithServerID:dataMessage.publicChatInfo.serverID to:incomingMessage.uniqueId in:transaction]; } - + + NSString *url = [OWSLinkPreview previewURLForRawBodyText:incomingMessage.body]; + if (url != nil) { + [OWSLinkPreview tryToBuildPreviewInfoObjcWithPreviewUrl:url] + .thenOn(dispatch_get_main_queue(), ^(OWSLinkPreviewDraft *linkPreviewDraft) { + [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + OWSLinkPreview *linkPreview = [OWSLinkPreview buildValidatedLinkPreviewFromInfo:linkPreviewDraft transaction:transaction error:nil]; + incomingMessage.linkPreview = linkPreview; + [incomingMessage saveWithTransaction:transaction]; + }]; + }); + } + return incomingMessage; } default: { @@ -1491,6 +1503,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/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 1adf7b43d..f055bf0ae 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1978,6 +1978,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } } + /* if (message.linkPreview.imageAttachmentId != nil) { TSAttachment *attachment = [TSAttachment fetchObjectWithUniqueID:message.linkPreview.imageAttachmentId transaction:transaction]; @@ -1987,6 +1988,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSFailDebug(@"unexpected attachment: %@", attachment); } } + */ // All outgoing messages should be saved at the time they are enqueued. [message saveWithTransaction:transaction];