mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			221 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			221 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
//
 | 
						|
//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
extension CGPoint {
 | 
						|
    
 | 
						|
    public func offsetBy(dx: CGFloat) -> CGPoint {
 | 
						|
        return CGPoint(x: x + dx, y: y)
 | 
						|
    }
 | 
						|
 | 
						|
    public func offsetBy(dy: CGFloat) -> CGPoint {
 | 
						|
        return CGPoint(x: x, y: y + dy)
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public enum LinkPreviewImageState: Int {
 | 
						|
    case none
 | 
						|
    case loading
 | 
						|
    case loaded
 | 
						|
    case invalid
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public protocol LinkPreviewState {
 | 
						|
    func isLoaded() -> Bool
 | 
						|
    func urlString() -> String?
 | 
						|
    func displayDomain() -> String?
 | 
						|
    func title() -> String?
 | 
						|
    func imageState() -> LinkPreviewImageState
 | 
						|
    func image() -> UIImage?
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public class LinkPreviewLoading: NSObject, LinkPreviewState {
 | 
						|
 | 
						|
    override init() {
 | 
						|
    }
 | 
						|
 | 
						|
    public func isLoaded() -> Bool {
 | 
						|
        return false
 | 
						|
    }
 | 
						|
 | 
						|
    public func urlString() -> String? {
 | 
						|
        return nil
 | 
						|
    }
 | 
						|
 | 
						|
    public func displayDomain() -> String? {
 | 
						|
        return nil
 | 
						|
    }
 | 
						|
 | 
						|
    public func title() -> String? {
 | 
						|
        return nil
 | 
						|
    }
 | 
						|
 | 
						|
    public func imageState() -> LinkPreviewImageState {
 | 
						|
        return .none
 | 
						|
    }
 | 
						|
 | 
						|
    public func image() -> UIImage? {
 | 
						|
        return nil
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public class LinkPreviewDraft: NSObject, LinkPreviewState {
 | 
						|
    private let linkPreviewDraft: OWSLinkPreviewDraft
 | 
						|
 | 
						|
    @objc
 | 
						|
    public required init(linkPreviewDraft: OWSLinkPreviewDraft) {
 | 
						|
        self.linkPreviewDraft = linkPreviewDraft
 | 
						|
    }
 | 
						|
 | 
						|
    public func isLoaded() -> Bool {
 | 
						|
        return true
 | 
						|
    }
 | 
						|
 | 
						|
    public func urlString() -> String? {
 | 
						|
        return linkPreviewDraft.urlString
 | 
						|
    }
 | 
						|
 | 
						|
    public func displayDomain() -> String? {
 | 
						|
        guard let displayDomain = linkPreviewDraft.displayDomain() else {
 | 
						|
            owsFailDebug("Missing display domain")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return displayDomain
 | 
						|
    }
 | 
						|
 | 
						|
    public func title() -> String? {
 | 
						|
        guard let value = linkPreviewDraft.title,
 | 
						|
            value.count > 0 else {
 | 
						|
                return nil
 | 
						|
        }
 | 
						|
        return value
 | 
						|
    }
 | 
						|
 | 
						|
    public func imageState() -> LinkPreviewImageState {
 | 
						|
        if linkPreviewDraft.jpegImageData != nil {
 | 
						|
            return .loaded
 | 
						|
        } else {
 | 
						|
            return .none
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public func image() -> UIImage? {
 | 
						|
        guard let jpegImageData = linkPreviewDraft.jpegImageData else {
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        guard let image = UIImage(data: jpegImageData) else {
 | 
						|
            owsFailDebug("Could not load image: \(jpegImageData.count)")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return image
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public class LinkPreviewSent: NSObject, LinkPreviewState {
 | 
						|
    private let linkPreview: OWSLinkPreview
 | 
						|
    private let imageAttachment: TSAttachment?
 | 
						|
 | 
						|
    @objc
 | 
						|
    public var imageSize: CGSize {
 | 
						|
        guard let attachmentStream = imageAttachment as? TSAttachmentStream else {
 | 
						|
            return CGSize.zero
 | 
						|
        }
 | 
						|
        return attachmentStream.imageSize()
 | 
						|
    }
 | 
						|
 | 
						|
    @objc
 | 
						|
    public required init(linkPreview: OWSLinkPreview,
 | 
						|
                  imageAttachment: TSAttachment?) {
 | 
						|
        self.linkPreview = linkPreview
 | 
						|
        self.imageAttachment = imageAttachment
 | 
						|
    }
 | 
						|
 | 
						|
    public func isLoaded() -> Bool {
 | 
						|
        return true
 | 
						|
    }
 | 
						|
 | 
						|
    public func urlString() -> String? {
 | 
						|
        guard let urlString = linkPreview.urlString else {
 | 
						|
            owsFailDebug("Missing url")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return urlString
 | 
						|
    }
 | 
						|
 | 
						|
    public func displayDomain() -> String? {
 | 
						|
        guard let displayDomain = linkPreview.displayDomain() else {
 | 
						|
            Logger.error("Missing display domain")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return displayDomain
 | 
						|
    }
 | 
						|
 | 
						|
    public func title() -> String? {
 | 
						|
        guard let value = linkPreview.title,
 | 
						|
            value.count > 0 else {
 | 
						|
                return nil
 | 
						|
        }
 | 
						|
        return value
 | 
						|
    }
 | 
						|
 | 
						|
    public func imageState() -> LinkPreviewImageState {
 | 
						|
        guard linkPreview.imageAttachmentId != nil else {
 | 
						|
            return .none
 | 
						|
        }
 | 
						|
        guard let imageAttachment = imageAttachment else {
 | 
						|
            owsFailDebug("Missing imageAttachment.")
 | 
						|
            return .none
 | 
						|
        }
 | 
						|
        guard let attachmentStream = imageAttachment as? TSAttachmentStream else {
 | 
						|
            return .loading
 | 
						|
        }
 | 
						|
        guard attachmentStream.isImage,
 | 
						|
            attachmentStream.isValidImage else {
 | 
						|
            return .invalid
 | 
						|
        }
 | 
						|
        return .loaded
 | 
						|
    }
 | 
						|
 | 
						|
    public func image() -> UIImage? {
 | 
						|
        guard let attachmentStream = imageAttachment as? TSAttachmentStream else {
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        guard attachmentStream.isImage,
 | 
						|
            attachmentStream.isValidImage else {
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        guard let imageFilepath = attachmentStream.originalFilePath else {
 | 
						|
            owsFailDebug("Attachment is missing file path.")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        guard let image = UIImage(contentsOfFile: imageFilepath) else {
 | 
						|
            owsFailDebug("Could not load image: \(imageFilepath)")
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return image
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: -
 | 
						|
 | 
						|
@objc
 | 
						|
public protocol LinkPreviewViewDraftDelegate {
 | 
						|
    func linkPreviewCanCancel() -> Bool
 | 
						|
    func linkPreviewDidCancel()
 | 
						|
}
 |