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
		
	
| 
											7 years ago
										 | // | ||
|  | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | ||
|  | // | ||
|  | 
 | ||
|  | import Foundation | ||
|  | import PromiseKit | ||
|  | 
 | ||
| 
											7 years ago
										 | 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 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
| 
											7 years ago
										 | 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] | ||
| 
											7 years ago
										 |     let isAddMoreVisible: Bool | ||
|  |     init(attachmentItems: [SignalAttachmentItem], isAddMoreVisible: Bool) { | ||
| 
											7 years ago
										 |         self.attachmentItems = attachmentItems | ||
| 
											7 years ago
										 |         self.isAddMoreVisible = isAddMoreVisible | ||
| 
											7 years ago
										 |     } | ||
|  | 
 | ||
|  |     func itemAfter(item: SignalAttachmentItem) -> SignalAttachmentItem? { | ||
| 
											7 years ago
										 |         guard let currentIndex = attachmentItems.firstIndex(of: item) else { | ||
| 
											7 years ago
										 |             owsFailDebug("currentIndex was unexpectedly nil") | ||
|  |             return nil | ||
|  |         } | ||
|  | 
 | ||
|  |         let nextIndex = attachmentItems.index(after: currentIndex) | ||
|  | 
 | ||
|  |         return attachmentItems[safe: nextIndex] | ||
|  |     } | ||
|  | 
 | ||
|  |     func itemBefore(item: SignalAttachmentItem) -> SignalAttachmentItem? { | ||
| 
											7 years ago
										 |         guard let currentIndex = attachmentItems.firstIndex(of: item) else { | ||
| 
											7 years ago
										 |             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 | ||
|  |     } | ||
|  | } |