From 58eda67a792f241f0f94bdb4239835d811cc6d04 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 27 Nov 2018 16:41:04 -0700 Subject: [PATCH] show *most recent* thumbnail in album picker --- .../PhotoLibrary/ImagePickerController.swift | 4 +- .../PhotoCollectionPickerController.swift | 7 +-- .../PhotoLibrary/PhotoLibrary.swift | 48 +++++++++++++++---- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/Signal/src/ViewControllers/PhotoLibrary/ImagePickerController.swift b/Signal/src/ViewControllers/PhotoLibrary/ImagePickerController.swift index df01402df..ca7ef180e 100644 --- a/Signal/src/ViewControllers/PhotoLibrary/ImagePickerController.swift +++ b/Signal/src/ViewControllers/PhotoLibrary/ImagePickerController.swift @@ -159,7 +159,7 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat collectionView.reloadData() collectionView.layoutIfNeeded() - let count = photoCollectionContents.count + let count = photoCollectionContents.assetCount for index in 0.. Int { - return photoCollectionContents.count + return photoCollectionContents.assetCount } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { diff --git a/Signal/src/ViewControllers/PhotoLibrary/PhotoCollectionPickerController.swift b/Signal/src/ViewControllers/PhotoLibrary/PhotoCollectionPickerController.swift index 5e89b3f64..4e6c83a1a 100644 --- a/Signal/src/ViewControllers/PhotoLibrary/PhotoCollectionPickerController.swift +++ b/Signal/src/ViewControllers/PhotoLibrary/PhotoCollectionPickerController.swift @@ -112,14 +112,15 @@ class PhotoCollectionPickerController: OWSTableViewController, PhotoLibraryDeleg imageView.autoSetDimensions(to: CGSize(width: kImageSize, height: kImageSize)) let contents = collection.contents() - if contents.count > 0 { - let photoMediaSize = PhotoMediaSize(thumbnailSize: CGSize(width: kImageSize, height: kImageSize)) - let assetItem = contents.assetItem(at: 0, photoMediaSize: photoMediaSize) + + let photoMediaSize = PhotoMediaSize(thumbnailSize: CGSize(width: kImageSize, height: kImageSize)) + if let assetItem = contents.lastAssetItem(photoMediaSize: photoMediaSize) { imageView.image = assetItem.asyncThumbnail { [weak imageView] image in guard let strongImageView = imageView else { return } guard let image = image else { + owsFailDebug("image was unexpectedly nil") return } strongImageView.image = image diff --git a/Signal/src/ViewControllers/PhotoLibrary/PhotoLibrary.swift b/Signal/src/ViewControllers/PhotoLibrary/PhotoLibrary.swift index bbcbc45dc..7d183aa0e 100644 --- a/Signal/src/ViewControllers/PhotoLibrary/PhotoLibrary.swift +++ b/Signal/src/ViewControllers/PhotoLibrary/PhotoLibrary.swift @@ -25,12 +25,12 @@ class PhotoMediaSize { class PhotoPickerAssetItem: PhotoGridItem { let asset: PHAsset - let album: PhotoCollectionContents + let photoCollectionContents: PhotoCollectionContents let photoMediaSize: PhotoMediaSize - init(asset: PHAsset, album: PhotoCollectionContents, photoMediaSize: PhotoMediaSize) { + init(asset: PHAsset, photoCollectionContents: PhotoCollectionContents, photoMediaSize: PhotoMediaSize) { self.asset = asset - self.album = album + self.photoCollectionContents = photoCollectionContents self.photoMediaSize = photoMediaSize } @@ -47,7 +47,7 @@ class PhotoPickerAssetItem: PhotoGridItem { } func asyncThumbnail(completion: @escaping (UIImage?) -> Void) -> UIImage? { - album.requestThumbnail(for: self.asset, thumbnailSize: photoMediaSize.thumbnailSize) { image, _ in + photoCollectionContents.requestThumbnail(for: self.asset, thumbnailSize: photoMediaSize.thumbnailSize) { image, _ in completion(image) } return nil @@ -70,19 +70,51 @@ class PhotoCollectionContents { self.localizedTitle = localizedTitle } - var count: Int { + private let imageManager = PHCachingImageManager() + + // MARK: - Asset Accessors + + var assetCount: Int { return fetchResult.count } - private let imageManager = PHCachingImageManager() + var lastAsset: PHAsset? { + guard assetCount > 0 else { + return nil + } + return asset(at: assetCount - 1) + } + + var firstAsset: PHAsset? { + guard assetCount > 0 else { + return nil + } + return asset(at: 0) + } func asset(at index: Int) -> PHAsset { return fetchResult.object(at: index) } + // MARK: - AssetItem Accessors + func assetItem(at index: Int, photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem { let mediaAsset = asset(at: index) - return PhotoPickerAssetItem(asset: mediaAsset, album: self, photoMediaSize: photoMediaSize) + return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize) + } + + func firstAssetItem(photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem? { + guard let mediaAsset = firstAsset else { + return nil + } + return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize) + } + + func lastAssetItem(photoMediaSize: PhotoMediaSize) -> PhotoPickerAssetItem? { + guard let mediaAsset = lastAsset else { + return nil + } + return PhotoPickerAssetItem(asset: mediaAsset, photoCollectionContents: self, photoMediaSize: photoMediaSize) } // MARK: ImageManager @@ -242,7 +274,7 @@ class PhotoLibrary: NSObject, PHPhotoLibraryChangeObserver { } let photoCollection = PhotoCollection(collection: assetCollection) // Hide empty collections. - guard photoCollection.contents().count > 0 else { + guard photoCollection.contents().assetCount > 0 else { return } collections.append(photoCollection)