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.
		
		
		
		
		
			
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
//
 | 
						|
//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
import Foundation
 | 
						|
import Photos
 | 
						|
import PromiseKit
 | 
						|
 | 
						|
protocol PhotoCollectionPickerDelegate: class {
 | 
						|
    func photoCollectionPicker(_ photoCollectionPicker: PhotoCollectionPickerController, didPickCollection collection: PhotoCollection)
 | 
						|
}
 | 
						|
 | 
						|
class PhotoCollectionPickerController: OWSTableViewController, PhotoLibraryDelegate {
 | 
						|
 | 
						|
    private weak var collectionDelegate: PhotoCollectionPickerDelegate?
 | 
						|
 | 
						|
    private let library: PhotoLibrary
 | 
						|
    private var photoCollections: [PhotoCollection]
 | 
						|
 | 
						|
    required init(library: PhotoLibrary,
 | 
						|
                  collectionDelegate: PhotoCollectionPickerDelegate) {
 | 
						|
        self.library = library
 | 
						|
        self.photoCollections = library.allPhotoCollections()
 | 
						|
        self.collectionDelegate = collectionDelegate
 | 
						|
        super.init()
 | 
						|
    }
 | 
						|
 | 
						|
    required init?(coder aDecoder: NSCoder) {
 | 
						|
        fatalError("init(coder:) has not been implemented")
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: View Lifecycle
 | 
						|
 | 
						|
    override func viewDidLoad() {
 | 
						|
        super.viewDidLoad()
 | 
						|
 | 
						|
        view.backgroundColor = .white
 | 
						|
        tableView.backgroundColor = .white
 | 
						|
        tableView.separatorColor = .clear
 | 
						|
 | 
						|
        library.add(delegate: self)
 | 
						|
 | 
						|
        updateContents()
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: -
 | 
						|
 | 
						|
    private func updateContents() {
 | 
						|
        photoCollections = library.allPhotoCollections()
 | 
						|
 | 
						|
        let sectionItems = photoCollections.map { collection in
 | 
						|
            return OWSTableItem(customCellBlock: { self.buildTableCell(collection: collection) },
 | 
						|
                                customRowHeight: UITableView.automaticDimension,
 | 
						|
                                actionBlock: { [weak self] in
 | 
						|
                                    guard let strongSelf = self else { return }
 | 
						|
                                    strongSelf.didSelectCollection(collection: collection)
 | 
						|
            })
 | 
						|
        }
 | 
						|
 | 
						|
        let section = OWSTableSection(title: nil, items: sectionItems)
 | 
						|
        let contents = OWSTableContents()
 | 
						|
        contents.addSection(section)
 | 
						|
        self.contents = contents
 | 
						|
    }
 | 
						|
 | 
						|
    private let numberFormatter: NumberFormatter = NumberFormatter()
 | 
						|
 | 
						|
    private func buildTableCell(collection: PhotoCollection) -> UITableViewCell {
 | 
						|
        let cell = OWSTableItem.newCell()
 | 
						|
 | 
						|
        cell.backgroundColor = .white
 | 
						|
        cell.contentView.backgroundColor = .white
 | 
						|
        cell.selectedBackgroundView?.backgroundColor = UIColor(white: 0.2, alpha: 1)
 | 
						|
 | 
						|
        let contents = collection.contents()
 | 
						|
 | 
						|
        let titleLabel = UILabel()
 | 
						|
        titleLabel.text = collection.localizedTitle()
 | 
						|
        titleLabel.font = .systemFont(ofSize: Values.mediumFontSize)
 | 
						|
        titleLabel.textColor = .black
 | 
						|
 | 
						|
        let countLabel = UILabel()
 | 
						|
        countLabel.text = numberFormatter.string(for: contents.assetCount)
 | 
						|
        countLabel.font = .systemFont(ofSize: Values.smallFontSize)
 | 
						|
        countLabel.textColor = .black
 | 
						|
 | 
						|
        let textStack = UIStackView(arrangedSubviews: [titleLabel, countLabel])
 | 
						|
        textStack.axis = .vertical
 | 
						|
        textStack.alignment = .leading
 | 
						|
        textStack.spacing = 2
 | 
						|
 | 
						|
        let imageView = UIImageView()
 | 
						|
        imageView.contentMode = .scaleAspectFill
 | 
						|
        imageView.clipsToBounds = true
 | 
						|
        let kImageSize = 80
 | 
						|
        imageView.autoSetDimensions(to: CGSize(width: kImageSize, height: kImageSize))
 | 
						|
 | 
						|
        let hStackView = UIStackView(arrangedSubviews: [imageView, textStack])
 | 
						|
        hStackView.axis = .horizontal
 | 
						|
        hStackView.alignment = .center
 | 
						|
        hStackView.spacing = Values.mediumSpacing
 | 
						|
 | 
						|
        let photoMediaSize = PhotoMediaSize(thumbnailSize: CGSize(width: kImageSize, height: kImageSize))
 | 
						|
        if let assetItem = contents.lastAssetItem(photoMediaSize: photoMediaSize) {
 | 
						|
            imageView.image = assetItem.asyncThumbnail { [weak imageView] image in
 | 
						|
                AssertIsOnMainThread()
 | 
						|
 | 
						|
                guard let imageView = imageView else {
 | 
						|
                    return
 | 
						|
                }
 | 
						|
 | 
						|
                guard let image = image else {
 | 
						|
                    owsFailDebug("image was unexpectedly nil")
 | 
						|
                    return
 | 
						|
                }
 | 
						|
 | 
						|
                imageView.image = image
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        cell.contentView.addSubview(hStackView)
 | 
						|
        hStackView.ows_autoPinToSuperviewMargins()
 | 
						|
 | 
						|
        return cell
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: Actions
 | 
						|
 | 
						|
    func didSelectCollection(collection: PhotoCollection) {
 | 
						|
        collectionDelegate?.photoCollectionPicker(self, didPickCollection: collection)
 | 
						|
    }
 | 
						|
 | 
						|
    // MARK: PhotoLibraryDelegate
 | 
						|
 | 
						|
    func photoLibraryDidChange(_ photoLibrary: PhotoLibrary) {
 | 
						|
        updateContents()
 | 
						|
    }
 | 
						|
}
 |