|
|
|
//
|
|
|
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
import Photos
|
|
|
|
import PromiseKit
|
|
|
|
|
|
|
|
protocol PhotoCollectionPickerDelegate: AnyObject {
|
|
|
|
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) {
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
}
|