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.
		
		
		
		
		
			
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Swift
		
	
| //
 | |
| //  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| import Foundation
 | |
| import PromiseKit
 | |
| 
 | |
| class AddMoreRailItem: GalleryRailItem {
 | |
|     func buildRailItemView() -> UIView {
 | |
|         let view = UIView()
 | |
|         view.backgroundColor = UIColor.black.withAlphaComponent(0.33)
 | |
| 
 | |
|         let iconView = UIImageView(image: #imageLiteral(resourceName: "ic_plus_24").withRenderingMode(.alwaysTemplate))
 | |
|         iconView.tintColor = .ows_white
 | |
|         view.addSubview(iconView)
 | |
|         iconView.setCompressionResistanceHigh()
 | |
|         iconView.setContentHuggingHigh()
 | |
|         iconView.autoCenterInSuperview()
 | |
| 
 | |
|         return view
 | |
|     }
 | |
| }
 | |
| 
 | |
| class SignalAttachmentItem: Hashable {
 | |
| 
 | |
|     enum SignalAttachmentItemError: Error {
 | |
|         case noThumbnail
 | |
|     }
 | |
| 
 | |
|     let attachment: SignalAttachment
 | |
| 
 | |
|     // This might be nil if the attachment is not a valid image.
 | |
|     var imageEditorModel: ImageEditorModel?
 | |
| 
 | |
|     init(attachment: SignalAttachment) {
 | |
|         self.attachment = attachment
 | |
| 
 | |
|         // Try and make a ImageEditorModel.
 | |
|         // This will only apply for valid images.
 | |
|         if ImageEditorModel.isFeatureEnabled,
 | |
|             let dataUrl: URL = attachment.dataUrl,
 | |
|             dataUrl.isFileURL {
 | |
|             let path = dataUrl.path
 | |
|             do {
 | |
|                 imageEditorModel = try ImageEditorModel(srcImagePath: path)
 | |
|             } catch {
 | |
|                 // Usually not an error; this usually indicates invalid input.
 | |
|                 Logger.warn("Could not create image editor: \(error)")
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // MARK: 
 | |
| 
 | |
|     var captionText: String? {
 | |
|         return attachment.captionText
 | |
|     }
 | |
| 
 | |
|     var imageSize: CGSize = .zero
 | |
| 
 | |
|     func getThumbnailImage() -> Promise<UIImage> {
 | |
|         return DispatchQueue.global().async(.promise) { () -> UIImage in
 | |
|             guard let image = self.attachment.staticThumbnail() else {
 | |
|                 throw SignalAttachmentItemError.noThumbnail
 | |
|             }
 | |
|             return image
 | |
|             }.tap { result in
 | |
|                 switch result {
 | |
|                 case .fulfilled(let image):
 | |
|                     self.imageSize = image.size
 | |
|                 case .rejected(let error):
 | |
|                     owsFailDebug("failed with error: \(error)")
 | |
|                 }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // MARK: Hashable
 | |
| 
 | |
|     public var hashValue: Int {
 | |
|         return attachment.hashValue
 | |
|     }
 | |
| 
 | |
|     // MARK: Equatable
 | |
| 
 | |
|     static func == (lhs: SignalAttachmentItem, rhs: SignalAttachmentItem) -> Bool {
 | |
|         return lhs.attachment == rhs.attachment
 | |
|     }
 | |
| }
 | |
| 
 | |
| // MARK: -
 | |
| 
 | |
| class AttachmentItemCollection {
 | |
|     private (set) var attachmentItems: [SignalAttachmentItem]
 | |
|     let isAddMoreVisible: Bool
 | |
|     init(attachmentItems: [SignalAttachmentItem], isAddMoreVisible: Bool) {
 | |
|         self.attachmentItems = attachmentItems
 | |
|         self.isAddMoreVisible = isAddMoreVisible
 | |
|     }
 | |
| 
 | |
|     func itemAfter(item: SignalAttachmentItem) -> SignalAttachmentItem? {
 | |
|         guard let currentIndex = attachmentItems.firstIndex(of: item) else {
 | |
|             owsFailDebug("currentIndex was unexpectedly nil")
 | |
|             return nil
 | |
|         }
 | |
| 
 | |
|         let nextIndex = attachmentItems.index(after: currentIndex)
 | |
| 
 | |
|         return attachmentItems[safe: nextIndex]
 | |
|     }
 | |
| 
 | |
|     func itemBefore(item: SignalAttachmentItem) -> SignalAttachmentItem? {
 | |
|         guard let currentIndex = attachmentItems.firstIndex(of: item) else {
 | |
|             owsFailDebug("currentIndex was unexpectedly nil")
 | |
|             return nil
 | |
|         }
 | |
| 
 | |
|         let prevIndex = attachmentItems.index(before: currentIndex)
 | |
| 
 | |
|         return attachmentItems[safe: prevIndex]
 | |
|     }
 | |
| 
 | |
|     func remove(item: SignalAttachmentItem) {
 | |
|         attachmentItems = attachmentItems.filter { $0 != item }
 | |
|     }
 | |
| 
 | |
|     var count: Int {
 | |
|         return attachmentItems.count
 | |
|     }
 | |
| }
 |