1
0
mirror of https://github.com/danog/Telegram.git synced 2025-01-22 05:52:06 +01:00
Telegram/Telegraph/TGWallpaperListController.m
2015-10-01 19:19:52 +03:00

423 lines
14 KiB
Objective-C

/*
* This is the source code of Telegram for iOS v. 1.1
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Peter Iakovlev, 2013.
*/
#import "TGWallpaperListController.h"
#import "ActionStage.h"
#import "TGWallpaperListLayout.h"
#import "TGWallpaperItemCell.h"
#import "TGCollectionItemView.h"
#import "TGDisclosureActionCollectionItem.h"
#import "TGImageUtils.h"
#import "TGWallpaperManager.h"
#import "TGWallpaperInfo.h"
#import "TGCustomImageWallpaperInfo.h"
#import "TGRemoteWallpaperInfo.h"
#import "TGModernRemoteWallpaperListActor.h"
#import "TGWallpaperController.h"
#import "TGOverlayFormsheetWindow.h"
#import "TGOverlayFormsheetController.h"
#import "TGAccessChecker.h"
#import "TGNavigationController.h"
#import "TGMediaFoldersController.h"
#import "TGModernMediaPickerController.h"
#import "TGLegacyCameraController.h"
#import "TGImagePickerController.h"
#import "TGNavigationBar.h"
@interface TGWallpaperListController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, TGWallpaperControllerDelegate, TGLegacyCameraControllerDelegate, TGImagePickerControllerDelegate>
{
UICollectionView *_collectionView;
TGWallpaperListLayout *_collectionLayout;
NSMutableSet *_collectionRegisteredItemIdentifiers;
CGFloat _currentLayoutWidth;
NSArray *_wallpaperItems;
TGDisclosureActionCollectionItem *_photoLibraryItem;
__weak TGOverlayFormsheetWindow *_photoLibraryWindow;
}
@end
@implementation TGWallpaperListController
- (id)init
{
self = [super init];
if (self != nil)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
[self setTitleText:TGLocalized(@"Wallpaper.Title")];
_photoLibraryItem = [[TGDisclosureActionCollectionItem alloc] initWithTitle:TGLocalized(@"Wallpaper.PhotoLibrary") action:@selector(photoLibraryPressed)];
_photoLibraryItem.deselectAutomatically = TGIsPad();
NSMutableArray *wallpaperItems = [[NSMutableArray alloc] init];
[wallpaperItems addObjectsFromArray:[[TGWallpaperManager instance] builtinWallpaperList]];
[wallpaperItems addObjectsFromArray:[TGModernRemoteWallpaperListActor cachedList]];
_wallpaperItems = wallpaperItems;
[ActionStageInstance() requestActor:@"/tg/remoteWallpapers/(cached)" options:nil flags:0 watcher:self];
}
return self;
}
- (void)dealloc
{
_collectionView.delegate = nil;
_collectionView.dataSource = nil;
[_actionHandle reset];
[ActionStageInstance() removeWatcher:self];
}
- (void)loadView
{
[super loadView];
self.view.backgroundColor = UIColorRGB(0xefeff4);
_currentLayoutWidth = self.view.frame.size.width;
_collectionRegisteredItemIdentifiers = [[NSMutableSet alloc] init];
_collectionLayout = [[TGWallpaperListLayout alloc] init];
_collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:_collectionLayout];
_collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_collectionView.backgroundColor = nil;
_collectionView.opaque = false;
_collectionView.delegate = self;
_collectionView.dataSource = self;
_collectionView.alwaysBounceVertical = true;
[_collectionView registerClass:[TGCollectionItemView class] forCellWithReuseIdentifier:@"_empty"];
[_collectionView registerClass:[TGWallpaperItemCell class] forCellWithReuseIdentifier:@"_wallpaper"];
[self.view addSubview:_collectionView];
[self setExplicitTableInset:UIEdgeInsetsMake(-(TGIsRetina() ? 0.5f : 1.0f), 0, 0, 0)];
if (![self _updateControllerInset:false])
[self controllerInsetUpdated:UIEdgeInsetsZero];
}
#pragma mark -
- (void)viewWillAppear:(BOOL)animated
{
CGFloat currentLayoutWidth = [TGViewController screenSizeForInterfaceOrientation:self.interfaceOrientation].width;
if (ABS(currentLayoutWidth - _currentLayoutWidth) > FLT_EPSILON)
{
_currentLayoutWidth = currentLayoutWidth;
[_collectionLayout invalidateLayout];
}
for (NSIndexPath *indexPath in [_collectionView indexPathsForSelectedItems])
{
[_collectionView deselectItemAtIndexPath:indexPath animated:animated];
}
[super viewWillAppear:animated];
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
_currentLayoutWidth = [TGViewController screenSizeForInterfaceOrientation:toInterfaceOrientation].width;
[_collectionLayout invalidateLayout];
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
#pragma mark -
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)__unused collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
return CGSizeMake(collectionView.frame.size.width, 44.0f);
else
{
if (TGIsPad())
{
CGSize layoutSize = collectionView.frame.size;
if ([self inPopover])
layoutSize.width = 320.0f;
else if ([self inFormSheet])
layoutSize.width = 540.0f;
if (layoutSize.width > 320.0f + FLT_EPSILON)
return CGSizeMake(110.0f, 146.0f);
else
return CGSizeMake(91.0f, 121.0f);
}
else
{
CGSize screenSize = TGScreenSize();
CGFloat widescreenWidth = MAX(screenSize.width, screenSize.height);
if ([UIScreen mainScreen].scale >= 2.0f - FLT_EPSILON)
{
if (widescreenWidth >= 736.0f - FLT_EPSILON)
{
return CGSizeMake(122.0f, 216.0f);
}
else if (widescreenWidth >= 667.0f - FLT_EPSILON)
{
return CGSizeMake(108.0f, 163.0f);
}
else
{
return CGSizeMake(91.0f, 162.0f);
}
}
else
{
return CGSizeMake(91.0f, 162.0f);
}
}
return CGSizeMake(91.0f, 162.0f);
}
}
- (UIEdgeInsets)collectionView:(UICollectionView *)__unused collectionView layout:(UICollectionViewLayout *)__unused collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
if (section == 0)
return UIEdgeInsetsMake(32.0f, 0.0f, 0.0f, 0.0f);
return UIEdgeInsetsMake(32.0f + 15.0f, 15.0f, 15.0f + 32.0f, 15.0f);
}
- (CGFloat)collectionView:(UICollectionView *)__unused collectionView layout:(UICollectionViewLayout *)__unused collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
if (section == 0)
return 0.0f;
if (TGIsPad())
{
CGSize layoutSize = collectionView.frame.size;
if ([self inPopover])
layoutSize.width = 320.0f;
else if ([self inFormSheet])
layoutSize.width = 540.0f;
if (layoutSize.width > 320.0f + FLT_EPSILON)
return 14.0f;
else
return 8.0f;
}
return 8.0f;
}
- (CGFloat)collectionView:(UICollectionView *)__unused collectionView layout:(UICollectionViewLayout*)__unused collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{
if (section == 0)
return 0.0f;
return 8.0f;
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)__unused collectionView
{
return 2;
}
- (NSInteger)collectionView:(UICollectionView *)__unused collectionView numberOfItemsInSection:(NSInteger)section
{
if (section == 0)
return 1;
return _wallpaperItems.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
TGCollectionItemView *itemView = [_photoLibraryItem dequeueItemView:collectionView registeredIdentifiers:_collectionRegisteredItemIdentifiers forIndexPath:indexPath];
[itemView setItemPosition:TGCollectionItemViewPositionFirstInBlock | TGCollectionItemViewPositionLastInBlock];
[_photoLibraryItem bindView:itemView];
return itemView;
}
else if (indexPath.item < (NSInteger)_wallpaperItems.count)
{
TGWallpaperItemCell *wallpaperCell = (TGWallpaperItemCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"_wallpaper" forIndexPath:indexPath];
TGWallpaperInfo *wallpaperInfo = _wallpaperItems[indexPath.item];
[wallpaperCell setWallpaperInfo:wallpaperInfo];
[wallpaperCell setIsSelected:[wallpaperInfo isEqual:[[TGWallpaperManager instance] currentWallpaperInfo]]];
return wallpaperCell;
}
return [collectionView dequeueReusableCellWithReuseIdentifier:@"_empty" forIndexPath:indexPath];
}
#pragma mark -
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
TGCollectionItem *item = _photoLibraryItem;
if (item != nil)
{
if (item.deselectAutomatically)
[collectionView deselectItemAtIndexPath:indexPath animated:true];
[item itemSelected:self];
}
}
else
{
TGWallpaperItemCell *wallpaperCell = (TGWallpaperItemCell *)[collectionView cellForItemAtIndexPath:indexPath];
UIImage *currentImage = [wallpaperCell currentImage];
if (currentImage)
{
TGWallpaperController *wallpaperController = [[TGWallpaperController alloc] initWithWallpaperInfo:_wallpaperItems[indexPath.item] thumbnailImage:currentImage];
wallpaperController.delegate = self;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
wallpaperController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:wallpaperController animated:true completion:nil];
}
}
}
- (void)wallpaperController:(TGWallpaperController *)__unused wallpaperController didSelectWallpaperWithInfo:(TGWallpaperInfo *)wallpaperInfo
{
if (wallpaperInfo != nil)
{
[[TGWallpaperManager instance] setCurrentWallpaperWithInfo:wallpaperInfo];
for (id cell in [_collectionView visibleCells])
{
if ([cell isKindOfClass:[TGWallpaperItemCell class]])
{
[(TGWallpaperItemCell *)cell setIsSelected:[((TGWallpaperItemCell *)cell).wallpaperInfo isEqual:[[TGWallpaperManager instance] currentWallpaperInfo]]];
}
}
[self _dismissPhotoLibrary];
}
}
- (void)photoLibraryPressed
{
TGLegacyCameraController *imagePickerController = [[TGLegacyCameraController alloc] init];
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.completionDelegate = self;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
imagePickerController.modalPresentationStyle = UIModalPresentationFormSheet;
TGOverlayFormsheetWindow *formSheetWindow = [[TGOverlayFormsheetWindow alloc] initWithParentController:self contentController:imagePickerController];
[formSheetWindow showAnimated:true];
_photoLibraryWindow = formSheetWindow;
}
else
{
[self presentViewController:imagePickerController animated:true completion:nil];
}
}
- (void)_dismissPhotoLibrary
{
TGOverlayFormsheetWindow *photoLibraryWindow = _photoLibraryWindow;
if (photoLibraryWindow != nil)
[photoLibraryWindow dismissAnimated:true];
else
[self dismissViewControllerAnimated:true completion:nil];
}
- (void)legacyCameraControllerCompletedWithNoResult
{
[self _dismissPhotoLibrary];
}
- (void)imagePickerController:(TGImagePickerController *)__unused imagePicker didFinishPickingWithAssets:(NSArray *)assets
{
TGOverlayFormsheetWindow *photoLibraryWindow = _photoLibraryWindow;
UINavigationController *controller = (UINavigationController *)((photoLibraryWindow != nil) ? [(TGOverlayFormsheetController *)[photoLibraryWindow rootViewController] viewController] : self.presentedViewController);
if ([controller isKindOfClass:[UINavigationController class]] && assets.count != 0 && [assets[0] isKindOfClass:[UIImage class]])
{
UIImage *wallpaperImage = assets[0];
TGWallpaperController *wallpaperController = [[TGWallpaperController alloc] initWithWallpaperInfo:[[TGCustomImageWallpaperInfo alloc] initWithImage:wallpaperImage] thumbnailImage:nil];
wallpaperController.delegate = self;
wallpaperController.enableWallpaperAdjustment = true;
wallpaperController.doNotFlipIfRTL = true;
[controller pushViewController:wallpaperController animated:true];
}
else
{
[self _dismissPhotoLibrary];
}
}
#pragma mark -
- (void)actorCompleted:(int)status path:(NSString *)path result:(id)result
{
if ([path hasPrefix:@"/tg/remoteWallpapers/"])
{
if (status == ASStatusSuccess)
{
NSArray *wallpaperInfos = result[@"wallpaperInfos"];
TGDispatchOnMainThread(^
{
NSMutableArray *wallpaperItems = [[NSMutableArray alloc] init];
for (TGWallpaperInfo *wallpaperInfo in _wallpaperItems)
{
if (![wallpaperInfo isKindOfClass:[TGRemoteWallpaperInfo class]])
[wallpaperItems addObject:wallpaperInfo];
}
[wallpaperItems addObjectsFromArray:wallpaperInfos];
bool changed = false;
if (wallpaperItems.count != _wallpaperItems.count)
changed = true;
else
{
for (int i = 0; i < (int)_wallpaperItems.count; i++)
{
if (![_wallpaperItems[i] isEqual:wallpaperItems[i]])
{
changed = true;
break;
}
}
}
if (changed)
{
_wallpaperItems = wallpaperItems;
[_collectionView reloadData];
}
});
}
}
}
@end