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.
		
		
		
		
		
			
		
			
				
	
	
		
			156 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			156 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
| //
 | |
| //  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| import UIKit
 | |
| import SessionUIKit
 | |
| import SignalCoreKit
 | |
| 
 | |
| public enum PhotoGridItemType {
 | |
|     case photo, animated, video
 | |
| }
 | |
| 
 | |
| public protocol PhotoGridItem: AnyObject {
 | |
|     var type: PhotoGridItemType { get }
 | |
|     
 | |
|     func asyncThumbnail(completion: @escaping (UIImage?) -> Void)
 | |
| }
 | |
| 
 | |
| public class PhotoGridViewCell: UICollectionViewCell {
 | |
|     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 = UIImage(systemName: "checkmark.circle.fill")
 | |
| 
 | |
|     public var loadingColor: ThemeValue = .textSecondary
 | |
| 
 | |
|     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
 | |
| 
 | |
|         let kSelectedBadgeSize = CGSize(width: 32, height: 32)
 | |
|         self.selectedBadgeView = UIImageView()
 | |
|         selectedBadgeView.image = PhotoGridViewCell.selectedBadgeImage?.withRenderingMode(.alwaysTemplate)
 | |
|         selectedBadgeView.themeTintColor = .primary
 | |
|         selectedBadgeView.themeBorderColor = .textPrimary
 | |
|         selectedBadgeView.themeBackgroundColor = .textPrimary
 | |
|         selectedBadgeView.isHidden = true
 | |
|         selectedBadgeView.layer.cornerRadius = (kSelectedBadgeSize.width / 2)
 | |
| 
 | |
|         self.highlightedView = UIView()
 | |
|         highlightedView.alpha = 0.2
 | |
|         highlightedView.themeBackgroundColor = .black
 | |
|         highlightedView.isHidden = true
 | |
| 
 | |
|         self.selectedView = UIView()
 | |
|         selectedView.alpha = 0.3
 | |
|         selectedView.themeBackgroundColor = .black
 | |
|         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)
 | |
| 
 | |
|         selectedBadgeView.autoPinEdge(toSuperviewEdge: .trailing, withInset: Values.verySmallSpacing)
 | |
|         selectedBadgeView.autoPinEdge(toSuperviewEdge: .bottom, withInset: Values.verySmallSpacing)
 | |
|         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
 | |
|             imageView.themeBackgroundColor = (newValue == nil ? loadingColor : .clear)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     var contentTypeBadgeImage: UIImage? {
 | |
|         get { return contentTypeBadgeView.image }
 | |
|         set {
 | |
|             contentTypeBadgeView.image = newValue
 | |
|             contentTypeBadgeView.isHidden = newValue == nil
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public func configure(item: PhotoGridItem) {
 | |
|         self.item = item
 | |
| 
 | |
|         item.asyncThumbnail { [weak self] image in
 | |
|             guard let currentItem = self?.item else { return }
 | |
|             guard currentItem === item else { return }
 | |
| 
 | |
|             if image == nil {
 | |
|                 Logger.debug("image == nil")
 | |
|             }
 | |
|             
 | |
|             DispatchQueue.main.async {
 | |
|                 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
 | |
|     }
 | |
| }
 |