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.
		
		
		
		
		
			
		
			
	
	
		
			155 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Swift
		
	
| 
								 
											7 years ago
										 
									 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public enum PhotoGridItemType {
							 | 
						||
| 
								 | 
							
								    case photo, animated, video
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public protocol PhotoGridItem: class {
							 | 
						||
| 
								 | 
							
								    var type: PhotoGridItemType { get }
							 | 
						||
| 
								 | 
							
								    func asyncThumbnail(completion: @escaping (UIImage?) -> Void) -> UIImage?
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class PhotoGridViewCell: UICollectionViewCell {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    static let reuseIdentifier = "PhotoGridViewCell"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public let imageView: UIImageView
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private let contentTypeBadgeView: UIImageView
							 | 
						||
| 
								 | 
							
								    private let selectedBadgeView: UIImageView
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private let highlightedView: UIView
							 | 
						||
| 
								 | 
							
								    private let selectedView: UIView
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var item: PhotoGridItem?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static let videoBadgeImage = #imageLiteral(resourceName: "ic_gallery_badge_video")
							 | 
						||
| 
								 | 
							
								    private static let animatedBadgeImage = #imageLiteral(resourceName: "ic_gallery_badge_gif")
							 | 
						||
| 
								 | 
							
								    private static let selectedBadgeImage = #imageLiteral(resourceName: "selected_blue_circle")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								    public var loadingColor = Theme.offBackgroundColor
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								    override public var isSelected: Bool {
							 | 
						||
| 
								 | 
							
								        didSet {
							 | 
						||
| 
								 | 
							
								            self.selectedBadgeView.isHidden = !self.isSelected
							 | 
						||
| 
								 | 
							
								            self.selectedView.isHidden = !self.isSelected
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    override public var isHighlighted: Bool {
							 | 
						||
| 
								 | 
							
								        didSet {
							 | 
						||
| 
								 | 
							
								            self.highlightedView.isHidden = !self.isHighlighted
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    override init(frame: CGRect) {
							 | 
						||
| 
								 | 
							
								        self.imageView = UIImageView()
							 | 
						||
| 
								 | 
							
								        imageView.contentMode = .scaleAspectFill
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.contentTypeBadgeView = UIImageView()
							 | 
						||
| 
								 | 
							
								        contentTypeBadgeView.isHidden = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.selectedBadgeView = UIImageView()
							 | 
						||
| 
								 | 
							
								        selectedBadgeView.image = PhotoGridViewCell.selectedBadgeImage
							 | 
						||
| 
								 | 
							
								        selectedBadgeView.isHidden = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.highlightedView = UIView()
							 | 
						||
| 
								 | 
							
								        highlightedView.alpha = 0.2
							 | 
						||
| 
								 
											6 years ago
										 
									 | 
							
								        highlightedView.backgroundColor = Colors.cellSelected
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								        highlightedView.isHidden = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.selectedView = UIView()
							 | 
						||
| 
								 | 
							
								        selectedView.alpha = 0.3
							 | 
						||
| 
								 
											6 years ago
										 
									 | 
							
								        selectedView.backgroundColor = Colors.cellSelected
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								        selectedView.isHidden = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        super.init(frame: frame)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.clipsToBounds = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.contentView.addSubview(imageView)
							 | 
						||
| 
								 | 
							
								        self.contentView.addSubview(contentTypeBadgeView)
							 | 
						||
| 
								 | 
							
								        self.contentView.addSubview(highlightedView)
							 | 
						||
| 
								 | 
							
								        self.contentView.addSubview(selectedView)
							 | 
						||
| 
								 | 
							
								        self.contentView.addSubview(selectedBadgeView)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        imageView.autoPinEdgesToSuperviewEdges()
							 | 
						||
| 
								 | 
							
								        highlightedView.autoPinEdgesToSuperviewEdges()
							 | 
						||
| 
								 | 
							
								        selectedView.autoPinEdgesToSuperviewEdges()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Note assets were rendered to match exactly. We don't want to re-size with
							 | 
						||
| 
								 | 
							
								        // content mode lest they become less legible.
							 | 
						||
| 
								 | 
							
								        let kContentTypeBadgeSize = CGSize(width: 18, height: 12)
							 | 
						||
| 
								 | 
							
								        contentTypeBadgeView.autoPinEdge(toSuperviewEdge: .leading, withInset: 3)
							 | 
						||
| 
								 | 
							
								        contentTypeBadgeView.autoPinEdge(toSuperviewEdge: .bottom, withInset: 3)
							 | 
						||
| 
								 | 
							
								        contentTypeBadgeView.autoSetDimensions(to: kContentTypeBadgeSize)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        let kSelectedBadgeSize = CGSize(width: 31, height: 31)
							 | 
						||
| 
								 | 
							
								        selectedBadgeView.autoPinEdge(toSuperviewEdge: .trailing, withInset: 0)
							 | 
						||
| 
								 | 
							
								        selectedBadgeView.autoPinEdge(toSuperviewEdge: .bottom, withInset: 0)
							 | 
						||
| 
								 | 
							
								        selectedBadgeView.autoSetDimensions(to: kSelectedBadgeSize)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @available(*, unavailable, message: "Unimplemented")
							 | 
						||
| 
								 | 
							
								    required public init?(coder aDecoder: NSCoder) {
							 | 
						||
| 
								 | 
							
								        notImplemented()
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var image: UIImage? {
							 | 
						||
| 
								 | 
							
								        get { return imageView.image }
							 | 
						||
| 
								 | 
							
								        set {
							 | 
						||
| 
								 | 
							
								            imageView.image = newValue
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								            imageView.backgroundColor = newValue == nil ? loadingColor : .clear
							 | 
						||
| 
								 
											7 years ago
										 
									 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var contentTypeBadgeImage: UIImage? {
							 | 
						||
| 
								 | 
							
								        get { return contentTypeBadgeView.image }
							 | 
						||
| 
								 | 
							
								        set {
							 | 
						||
| 
								 | 
							
								            contentTypeBadgeView.image = newValue
							 | 
						||
| 
								 | 
							
								            contentTypeBadgeView.isHidden = newValue == nil
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public func configure(item: PhotoGridItem) {
							 | 
						||
| 
								 | 
							
								        self.item = item
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.image = item.asyncThumbnail { image in
							 | 
						||
| 
								 | 
							
								            guard let currentItem = self.item else {
							 | 
						||
| 
								 | 
							
								                return
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            guard currentItem === item else {
							 | 
						||
| 
								 | 
							
								                return
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if image == nil {
							 | 
						||
| 
								 | 
							
								                Logger.debug("image == nil")
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            self.image = image
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        switch item.type {
							 | 
						||
| 
								 | 
							
								        case .video:
							 | 
						||
| 
								 | 
							
								            self.contentTypeBadgeImage = PhotoGridViewCell.videoBadgeImage
							 | 
						||
| 
								 | 
							
								        case .animated:
							 | 
						||
| 
								 | 
							
								            self.contentTypeBadgeImage = PhotoGridViewCell.animatedBadgeImage
							 | 
						||
| 
								 | 
							
								        case .photo:
							 | 
						||
| 
								 | 
							
								            self.contentTypeBadgeImage = nil
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    override public func prepareForReuse() {
							 | 
						||
| 
								 | 
							
								        super.prepareForReuse()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.item = nil
							 | 
						||
| 
								 | 
							
								        self.imageView.image = nil
							 | 
						||
| 
								 | 
							
								        self.contentTypeBadgeView.isHidden = true
							 | 
						||
| 
								 | 
							
								        self.highlightedView.isHidden = true
							 | 
						||
| 
								 | 
							
								        self.selectedView.isHidden = true
							 | 
						||
| 
								 | 
							
								        self.selectedBadgeView.isHidden = true
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |