Signal-iOS/SignalMessaging/ViewControllers/Stickers/StickerSharingViewController.swift
Michelle Linington 1f9b6906df IOS-807: Fetch link preview content directly
This change updates the link preview fetch flow to fetch content
directly rather than through the proxy. This means we can remove the
allowed domain list and fetch content from most provided domains.

This almost moves HTML content parsing outside of OWSLinkPreview.
Currently we'll still only fetch the same content, but it's extensible
enough to fetch all sorts of different opengraph tags.

AFHTTPSessionManager will no longer faildebug on a request failure.
Since we're going to be firing opportunistic fetch requests as we parse
a URL, it's expected that some will fail.
2020-08-26 16:47:49 -07:00

117 lines
3.5 KiB
Swift

//
// Copyright (c) 2020 Open Whisper Systems. All rights reserved.
//
import Foundation
import PromiseKit
@objc
public class StickerSharingViewController: SelectThreadViewController {
// MARK: Dependencies
private var databaseStorage: SDSDatabaseStorage {
return SDSDatabaseStorage.shared
}
var linkPreviewManager: OWSLinkPreviewManager {
return SSKEnvironment.shared.linkPreviewManager
}
// MARK: -
private let stickerPackInfo: StickerPackInfo
init(stickerPackInfo: StickerPackInfo) {
self.stickerPackInfo = stickerPackInfo
super.init()
self.selectThreadViewDelegate = self
}
public override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = NSLocalizedString("STICKERS_PACK_SHARE_VIEW_TITLE", comment: "Title of the 'share sticker pack' view.")
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(didPressCloseButton))
}
@objc
public class func shareStickerPack(_ stickerPackInfo: StickerPackInfo,
from fromViewController: UIViewController) {
AssertIsOnMainThread()
let view = StickerSharingViewController(stickerPackInfo: stickerPackInfo)
let modal = OWSNavigationController(rootViewController: view)
fromViewController.presentFormSheet(modal, animated: true)
}
private func shareTo(thread: TSThread) {
AssertIsOnMainThread()
let packUrl = stickerPackInfo.shareUrl()
// Try to include a link preview of the sticker pack.
firstly { () -> Promise<OWSLinkPreviewDraft> in
guard let url = URL(string: packUrl) else {
throw OWSAssertionError("Invalid URL")
}
return linkPreviewManager.fetchLinkPreview(for: url)
}.done { (linkPreviewDraft) in
self.shareAndDismiss(thread: thread,
packUrl: packUrl,
linkPreviewDraft: linkPreviewDraft)
}.catch { error in
owsFailDebug("Could not build link preview: \(error)")
self.shareAndDismiss(thread: thread,
packUrl: packUrl,
linkPreviewDraft: nil)
}
}
private func shareAndDismiss(thread: TSThread,
packUrl: String,
linkPreviewDraft: OWSLinkPreviewDraft?) {
AssertIsOnMainThread()
databaseStorage.read { transaction in
ThreadUtil.enqueueMessage(with: MessageBody(text: packUrl, ranges: .empty),
thread: thread,
quotedReplyModel: nil,
linkPreviewDraft: linkPreviewDraft,
transaction: transaction)
}
self.dismiss(animated: true)
}
// MARK: Helpers
@objc
private func didPressCloseButton(sender: UIButton) {
Logger.info("")
self.dismiss(animated: true)
}
}
// MARK: -
extension StickerSharingViewController: SelectThreadViewControllerDelegate {
public func threadWasSelected(_ thread: TSThread) {
shareTo(thread: thread)
}
public func canSelectBlockedContact() -> Bool {
return false
}
public func createHeader(with searchBar: UISearchBar) -> UIView? {
return nil
}
}