Merge pull request #47 from loki-project/link-previews

Link Previews
pull/49/head
gmbnt 6 years ago committed by GitHub
commit a92db64cd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,14 +6,10 @@
<dict> <dict>
<key>CarthageVersion</key> <key>CarthageVersion</key>
<string>0.33.0</string> <string>0.33.0</string>
<key>DateTime</key>
<string>Thu Sep 5 00:37:14 UTC 2019</string>
<key>OSXVersion</key> <key>OSXVersion</key>
<string>10.14.6</string> <string>10.14.6</string>
<key>WebRTCCommit</key> <key>WebRTCCommit</key>
<string>1445d719bf05280270e9f77576f80f973fd847f8 M73</string> <string>1445d719bf05280270e9f77576f80f973fd847f8 M73</string>
<key>XCodeVersion</key>
<string>1000.1030</string>
</dict> </dict>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>

@ -93,6 +93,15 @@ public final class LokiGroupChatPoller : NSObject {
guard let messageID = message.uniqueId else { return print("[Loki] Failed to save group message.") } guard let messageID = message.uniqueId else { return print("[Loki] Failed to save group message.") }
storage.setIDForMessageWithServerID(UInt(messageServerID), to: messageID, in: transaction) 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 // Poll
let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { messages in let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done { messages in

@ -6,6 +6,7 @@ final class QRCodeViewController : OWSViewController {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = UIColor.lokiDarkestGray()
let stackView = UIStackView(arrangedSubviews: []) let stackView = UIStackView(arrangedSubviews: [])
stackView.axis = .vertical stackView.axis = .vertical
stackView.spacing = 32 stackView.spacing = 32

@ -819,17 +819,16 @@ public class LinkPreviewView: UIStackView {
public func addBorderViews(bubbleView: OWSBubbleView) { public func addBorderViews(bubbleView: OWSBubbleView) {
if let heroImageView = self.heroImageView { if let heroImageView = self.heroImageView {
let borderView = OWSBubbleShapeView(draw: ()) let borderView = OWSBubbleShapeView(draw: ())
borderView.strokeColor = Theme.primaryColor borderView.strokeColor = UIColor.clear
borderView.strokeThickness = CGHairlineWidth() borderView.strokeThickness = 0
heroImageView.addSubview(borderView) heroImageView.addSubview(borderView)
bubbleView.addPartnerView(borderView) bubbleView.addPartnerView(borderView)
borderView.ows_autoPinToSuperviewEdges() borderView.ows_autoPinToSuperviewEdges()
} }
if let sentBodyView = self.sentBodyView { if let sentBodyView = self.sentBodyView {
let borderView = OWSBubbleShapeView(draw: ()) let borderView = OWSBubbleShapeView(draw: ())
let borderColor = UIColor(rgbHex: Theme.isDarkThemeEnabled ? 0x0F1012 : 0xD5D6D6) borderView.strokeColor = UIColor.clear
borderView.strokeColor = borderColor borderView.strokeThickness = 0
borderView.strokeThickness = CGHairlineWidth()
sentBodyView.addSubview(borderView) sentBodyView.addSubview(borderView)
bubbleView.addPartnerView(borderView) bubbleView.addPartnerView(borderView)
borderView.ows_autoPinToSuperviewEdges() borderView.ows_autoPinToSuperviewEdges()

@ -138,7 +138,6 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess
}]; }];
} }
// Loki: TODO Disable attachment and link preview for now
+ (TSOutgoingMessage *)buildOutgoingMessageWithText:(nullable NSString *)fullMessageText + (TSOutgoingMessage *)buildOutgoingMessageWithText:(nullable NSString *)fullMessageText
mediaAttachments:(NSArray<SignalAttachment *> *)mediaAttachments mediaAttachments:(NSArray<SignalAttachment *> *)mediaAttachments
thread:(TSThread *)thread thread:(TSThread *)thread

@ -159,6 +159,7 @@ public class OWSLinkPreview: MTLModel {
} }
} }
/*
var imageAttachmentId: String? var imageAttachmentId: String?
if let imageProto = previewProto.image { if let imageProto = previewProto.image {
if let imageAttachmentPointer = TSAttachmentPointer(fromProto: imageProto, albumMessage: nil) { if let imageAttachmentPointer = TSAttachmentPointer(fromProto: imageProto, albumMessage: nil) {
@ -169,8 +170,9 @@ public class OWSLinkPreview: MTLModel {
throw LinkPreviewError.invalidInput 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 { guard linkPreview.isValid() else {
Logger.error("Preview has neither title nor image.") Logger.error("Preview has neither title nor image.")
@ -433,6 +435,11 @@ public class OWSLinkPreview: MTLModel {
return previewUrl(forMessageBodyText: body, selectedRange: selectedRange) 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? { public class func previewUrl(forMessageBodyText body: String?, selectedRange: NSRange?) -> String? {
AssertIsOnMainThread() AssertIsOnMainThread()

@ -37,7 +37,7 @@ typedef NS_ENUM(NSInteger, LKMessageFriendRequestStatus) {
@property (nonatomic, readonly) BOOL isExpiringMessage; @property (nonatomic, readonly) BOOL isExpiringMessage;
@property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage; @property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage;
@property (nonatomic, readonly, nullable) OWSContact *contactShare; @property (nonatomic, readonly, nullable) OWSContact *contactShare;
@property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; @property (nonatomic, nullable) OWSLinkPreview *linkPreview;
// Loki friend request handling // Loki friend request handling
@property (nonatomic) LKMessageFriendRequestStatus friendRequestStatus; @property (nonatomic) LKMessageFriendRequestStatus friendRequestStatus;
@property (nonatomic, readonly) NSString *friendRequestStatusDescription; @property (nonatomic, readonly) NSString *friendRequestStatusDescription;

@ -48,8 +48,6 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
*/ */
@property (nonatomic, readonly) NSUInteger schemaVersion; @property (nonatomic, readonly) NSUInteger schemaVersion;
@property (nonatomic, nullable) OWSLinkPreview *linkPreview;
@end @end
#pragma mark - #pragma mark -

@ -1407,6 +1407,18 @@ NS_ASSUME_NONNULL_BEGIN
[self.primaryStorage setIDForMessageWithServerID:dataMessage.publicChatInfo.serverID to:incomingMessage.uniqueId in:transaction]; [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; return incomingMessage;
} }
default: { default: {
@ -1492,6 +1504,19 @@ NS_ASSUME_NONNULL_BEGIN
envelope:envelope envelope:envelope
transaction:transaction]; 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; return incomingMessage;
} }
} }

@ -1978,6 +1978,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} }
} }
/*
if (message.linkPreview.imageAttachmentId != nil) { if (message.linkPreview.imageAttachmentId != nil) {
TSAttachment *attachment = TSAttachment *attachment =
[TSAttachment fetchObjectWithUniqueID:message.linkPreview.imageAttachmentId transaction:transaction]; [TSAttachment fetchObjectWithUniqueID:message.linkPreview.imageAttachmentId transaction:transaction];
@ -1987,6 +1988,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSFailDebug(@"unexpected attachment: %@", attachment); OWSFailDebug(@"unexpected attachment: %@", attachment);
} }
} }
*/
// All outgoing messages should be saved at the time they are enqueued. // All outgoing messages should be saved at the time they are enqueued.
[message saveWithTransaction:transaction]; [message saveWithTransaction:transaction];

Loading…
Cancel
Save