2020-02-22 15:38:54 +04:00

381 lines
11 KiB
Objective-C

#import "TGMediaAssetGroup.h"
#import "LegacyComponentsInternal.h"
@interface TGMediaAssetGroup ()
{
NSString *_identifier;
NSString *_title;
NSArray *_latestAssets;
TGMediaAssetGroupSubtype _subtype;
NSNumber *_cachedAssetCount;
}
@end
@implementation TGMediaAssetGroup
- (instancetype)initWithPHFetchResult:(PHFetchResult *)fetchResult
{
self = [super init];
if (self != nil)
{
_backingFetchResult = fetchResult;
_isCameraRoll = true;
_title = TGLocalized(@"MediaPicker.CameraRoll");
}
return self;
}
- (instancetype)initWithPHAssetCollection:(PHAssetCollection *)collection fetchResult:(PHFetchResult *)fetchResult
{
self = [super init];
if (self != nil)
{
_backingAssetCollection = collection;
_backingFetchResult = fetchResult;
_isCameraRoll = (collection.assetCollectionType == PHAssetCollectionTypeSmartAlbum && collection.assetCollectionSubtype == PHAssetCollectionSubtypeSmartAlbumUserLibrary);
if (_backingFetchResult == nil)
{
PHFetchOptions *options = [[PHFetchOptions alloc] init];
//if (_assetType != TGMediaPickerAssetAnyType)
// options.predicate = [NSPredicate predicateWithFormat:@"mediaType = %i", [TGMediaAssetsLibrary _assetMediaTypeForAssetType:_assetType]];
_backingFetchResult = [PHAsset fetchAssetsInAssetCollection:_backingAssetCollection options:options];
}
}
return self;
}
- (instancetype)initWithALAssetsGroup:(ALAssetsGroup *)assetsGroup
{
bool isCameraRoll = ([[assetsGroup valueForProperty:ALAssetsGroupPropertyType] integerValue] == ALAssetsGroupSavedPhotos);
TGMediaAssetGroupSubtype subtype = isCameraRoll ? TGMediaAssetGroupSubtypeCameraRoll : TGMediaAssetGroupSubtypeNone;
return [self initWithALAssetsGroup:assetsGroup subtype:subtype];
}
- (instancetype)initWithALAssetsGroup:(ALAssetsGroup *)assetsGroup subtype:(TGMediaAssetGroupSubtype)subtype
{
self = [super init];
if (self != nil)
{
_backingAssetsGroup = assetsGroup;
_subtype = subtype;
if (subtype == TGMediaAssetGroupSubtypeVideos)
{
_title = TGLocalized(@"MediaPicker.Videos");
[self.backingAssetsGroup setAssetsFilter:[ALAssetsFilter allVideos]];
_cachedAssetCount = @(self.backingAssetsGroup.numberOfAssets);
[self.backingAssetsGroup setAssetsFilter:[ALAssetsFilter allAssets]];
}
else
{
_isCameraRoll = ([[assetsGroup valueForProperty:ALAssetsGroupPropertyType] integerValue] == ALAssetsGroupSavedPhotos);
if (_isCameraRoll)
{
_subtype = TGMediaAssetGroupSubtypeCameraRoll;
}
else
{
_isPhotoStream = ([[assetsGroup valueForProperty:ALAssetsGroupPropertyType] integerValue] == ALAssetsGroupPhotoStream);
_subtype = _isPhotoStream ? TGMediaAssetGroupSubtypeMyPhotoStream : TGMediaAssetGroupSubtypeRegular;
}
}
NSMutableArray *latestAssets = [[NSMutableArray alloc] init];
[assetsGroup enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, __unused NSUInteger index, BOOL *stop)
{
if (asset != nil && (_subtype != TGMediaAssetGroupSubtypeVideos || [[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]))
{
[latestAssets addObject:[[TGMediaAsset alloc] initWithALAsset:asset]];
}
if (latestAssets.count == 3 && stop != NULL)
*stop = true;
}];
_latestAssets = latestAssets;
}
return self;
}
- (NSString *)identifier
{
if (self.backingAssetCollection != nil)
return self.backingAssetCollection.localIdentifier;
else if (_backingAssetsGroup != nil)
return [self.backingAssetsGroup valueForProperty:ALAssetsGroupPropertyPersistentID];
return _identifier;
}
- (NSString *)title
{
if (_title != nil)
return _title;
if (_backingAssetCollection != nil)
return _backingAssetCollection.localizedTitle;
if (_backingAssetsGroup != nil)
return [_backingAssetsGroup valueForProperty:ALAssetsGroupPropertyName];
return nil;
}
- (NSInteger)assetCount
{
if (self.backingFetchResult != nil)
{
return self.backingFetchResult.count;
}
else if (self.backingAssetsGroup != nil)
{
if (self.subtype == TGMediaAssetGroupSubtypeVideos)
{
if (_cachedAssetCount != nil)
return _cachedAssetCount.integerValue;
return -1;
}
return self.backingAssetsGroup.numberOfAssets;
}
return 0;
}
- (TGMediaAssetGroupSubtype)subtype
{
if (self.backingAssetCollection != nil)
{
return [TGMediaAssetGroup _assetGroupSubtypeForCollectionSubtype:self.backingAssetCollection.assetCollectionSubtype];
}
else if (self.backingFetchResult != nil)
{
if (_isCameraRoll)
return TGMediaAssetGroupSubtypeCameraRoll;
}
else if (self.backingAssetsGroup != nil)
{
if (_isCameraRoll)
return TGMediaAssetGroupSubtypeCameraRoll;
else if (_subtype != TGMediaAssetGroupSubtypeNone)
return _subtype;
}
return TGMediaAssetGroupSubtypeRegular;
}
- (NSArray *)latestAssets
{
if (_backingFetchResult != nil)
{
if (_latestAssets != nil)
return _latestAssets;
NSMutableArray *latestAssets = [[NSMutableArray alloc] init];
NSInteger totalCount = _backingFetchResult.count;
if (totalCount == 0)
return nil;
NSInteger requiredCount = MIN(3, totalCount);
for (NSInteger i = 0; i < requiredCount; i++)
{
NSInteger index = (self.subtype != TGMediaAssetGroupSubtypeRegular) ? totalCount - i - 1 : i;
PHAsset *asset = [_backingFetchResult objectAtIndex:index];
TGMediaAsset *pickerAsset = [[TGMediaAsset alloc] initWithPHAsset:asset];
if (pickerAsset != nil)
[latestAssets addObject:pickerAsset];
}
_latestAssets = latestAssets;
}
return _latestAssets;
}
- (BOOL)isEqual:(id)object
{
if (object == self)
return YES;
if (!object || ![object isKindOfClass:[self class]])
return NO;
return [self.identifier isEqual:((TGMediaAssetGroup *)object).identifier];
}
+ (TGMediaAssetGroupSubtype)_assetGroupSubtypeForCollectionSubtype:(PHAssetCollectionSubtype)subtype
{
switch (subtype)
{
case PHAssetCollectionSubtypeSmartAlbumPanoramas:
return TGMediaAssetGroupSubtypePanoramas;
case PHAssetCollectionSubtypeSmartAlbumVideos:
return TGMediaAssetGroupSubtypeVideos;
case PHAssetCollectionSubtypeSmartAlbumFavorites:
return TGMediaAssetGroupSubtypeFavorites;
case PHAssetCollectionSubtypeSmartAlbumTimelapses:
return TGMediaAssetGroupSubtypeTimelapses;
case PHAssetCollectionSubtypeSmartAlbumBursts:
return TGMediaAssetGroupSubtypeBursts;
case PHAssetCollectionSubtypeSmartAlbumSlomoVideos:
return TGMediaAssetGroupSubtypeSlomo;
case PHAssetCollectionSubtypeSmartAlbumUserLibrary:
return TGMediaAssetGroupSubtypeCameraRoll;
case PHAssetCollectionSubtypeSmartAlbumScreenshots:
return TGMediaAssetGroupSubtypeScreenshots;
case PHAssetCollectionSubtypeSmartAlbumSelfPortraits:
return TGMediaAssetGroupSubtypeSelfPortraits;
case PHAssetCollectionSubtypeAlbumMyPhotoStream:
return TGMediaAssetGroupSubtypeMyPhotoStream;
case PHAssetCollectionSubtypeSmartAlbumAnimated:
return TGMediaAssetGroupSubtypeAnimated;
case PHAssetCollectionSubtypeSmartAlbumAllHidden:
return TGMediaAssetGroupSubtypeHidden;
default:
return TGMediaAssetGroupSubtypeRegular;
}
}
+ (bool)_isSmartAlbumCollectionSubtype:(PHAssetCollectionSubtype)subtype requiredForAssetType:(TGMediaAssetType)assetType
{
switch (subtype)
{
case PHAssetCollectionSubtypeSmartAlbumPanoramas:
{
switch (assetType)
{
case TGMediaAssetVideoType:
return false;
default:
return true;
}
}
break;
case PHAssetCollectionSubtypeSmartAlbumFavorites:
{
return true;
}
break;
case PHAssetCollectionSubtypeSmartAlbumTimelapses:
{
switch (assetType)
{
case TGMediaAssetPhotoType:
return false;
default:
return true;
}
}
break;
case PHAssetCollectionSubtypeSmartAlbumVideos:
{
switch (assetType)
{
case TGMediaAssetAnyType:
return true;
default:
return false;
}
}
case PHAssetCollectionSubtypeSmartAlbumSlomoVideos:
{
switch (assetType)
{
case TGMediaAssetPhotoType:
return false;
default:
return true;
}
}
break;
case PHAssetCollectionSubtypeSmartAlbumBursts:
{
switch (assetType)
{
case TGMediaAssetVideoType:
return false;
default:
return true;
}
}
break;
case PHAssetCollectionSubtypeSmartAlbumScreenshots:
{
switch (assetType)
{
case TGMediaAssetVideoType:
return false;
default:
return true;
}
}
case PHAssetCollectionSubtypeSmartAlbumSelfPortraits:
{
switch (assetType)
{
case TGMediaAssetVideoType:
return false;
default:
return true;
}
}
case PHAssetCollectionSubtypeSmartAlbumAnimated:
{
switch (assetType)
{
case TGMediaAssetAnyType:
return true;
default:
return false;
}
}
case PHAssetCollectionSubtypeSmartAlbumAllHidden:
{
return true;
}
break;
default:
{
return false;
}
}
}
@end