1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGSettingsController.m
2015-10-01 19:19:52 +03:00

585 lines
22 KiB
Objective-C

#import "TGSettingsController.h"
#import "TGMenuSection.h"
#import "TGAppDelegate.h"
#import "TGActionMenuItemCell.h"
#import "TGSwitchItemCell.h"
#import "ActionStage.h"
#import "TGTelegraph.h"
#import "TGInterfaceAssets.h"
#import "TGRemoteImageView.h"
#import <MessageUI/MessageUI.h>
#import "TGForwardTargetController.h"
#import "TGContentBubbleViewModel.h"
#import "TGAppDelegate.h"
#import "TGAlertView.h"
@interface TGSettingsController () <UITableViewDataSource, UITableViewDelegate, MFMailComposeViewControllerDelegate>
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *sectionList;
@end
@implementation TGSettingsController
- (id)init
{
self = [super initWithNibName:nil bundle:nil];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_sectionList = [[NSMutableArray alloc] init];
#ifndef EXTERNAL_INTERNAL_RELEASE
TGMenuSection *sessionSection = [[TGMenuSection alloc] init];
sessionSection.tag = 1;
sessionSection.title = @"Security";
[_sectionList addObject:sessionSection];
TGMenuSection *accountSection = [[TGMenuSection alloc] init];
accountSection.title = @"Account";
[_sectionList addObject:accountSection];
TGActionMenuItem *displayMids = [[TGActionMenuItem alloc] initWithTitle:@"Show message IDs"];
displayMids.action = @selector(displayMidsPressed);
[accountSection.items addObject:displayMids];
TGSwitchItem *doNotJump = [[TGSwitchItem alloc] initWithTitle:@"Don't jump in dialogs"];
doNotJump.isOn = [TGDialogListController debugDoNotJump];
doNotJump.action = @selector(switchDoNotJump);
[accountSection.items addObject:doNotJump];
TGSwitchItem *disableBackgroundItem = [[TGSwitchItem alloc] initWithTitle:@"Disable background mode"];
disableBackgroundItem.isOn = TGAppDelegateInstance.disableBackgroundMode;
disableBackgroundItem.action = @selector(switchDisableBackground);
[accountSection.items addObject:disableBackgroundItem];
#endif
TGMenuSection *miscSection = [[TGMenuSection alloc] init];
miscSection.title = @"Misc";
[_sectionList addObject:miscSection];
#ifndef EXTERNAL_INTERNAL_RELEASE
TGActionMenuItem *clearChannelsItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear channels"];
clearChannelsItem.action = @selector(clearChannelsButtonPressed);
[miscSection.items addObject:clearChannelsItem];
TGActionMenuItem *clearItemUriCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear item uri cache"];
clearItemUriCacheItem.action = @selector(clearItemUriButtonPressed);
[miscSection.items addObject:clearItemUriCacheItem];
TGActionMenuItem *clearAssetCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear asset cache"];
clearAssetCacheItem.action = @selector(clearAssetCacheButtonPressed);
[miscSection.items addObject:clearAssetCacheItem];
TGActionMenuItem *clearAvatarCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear avatar list cache"];
clearAvatarCacheItem.action = @selector(clearAvatarCacheButtonPressed);
[miscSection.items addObject:clearAvatarCacheItem];
TGActionMenuItem *clearCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear both caches"];
clearCacheItem.action = @selector(clearCacheButtonPressed);
[miscSection.items addObject:clearCacheItem];
TGActionMenuItem *clearMemoryCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear memory cache"];
clearMemoryCacheItem.action = @selector(clearMemoryCacheButtonPressed);
[miscSection.items addObject:clearMemoryCacheItem];
TGActionMenuItem *clearVideoCacheItem = [[TGActionMenuItem alloc] initWithTitle:@"Clear video cache"];
clearVideoCacheItem.action = @selector(clearVideoCacheButtonPressed);
[miscSection.items addObject:clearVideoCacheItem];
#endif
TGActionMenuItem *sendLogsItem = [[TGActionMenuItem alloc] initWithTitle:@"Send logs"];
sendLogsItem.action = @selector(sendLogsButtonPressed);
[miscSection.items addObject:sendLogsItem];
TGActionMenuItem *sendMoreLogsItem = [[TGActionMenuItem alloc] initWithTitle:@"Send more logs"];
sendMoreLogsItem.action = @selector(sendMoreLogsButtonPressed);
[miscSection.items addObject:sendMoreLogsItem];
TGActionMenuItem *sendDataItem = [[TGActionMenuItem alloc] initWithTitle:@"Send data"];
sendDataItem.action = @selector(sendDataButtonPressed);
[miscSection.items addObject:sendDataItem];
}
return self;
}
- (void)dealloc
{
[_actionHandle reset];
[ActionStageInstance() removeWatcher:self];
}
- (void)loadView
{
[super loadView];
self.view.backgroundColor = [UIColor whiteColor];
self.titleText = TGLocalized(@"Settings.Title");
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
_tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_tableView.backgroundColor = [UIColor clearColor];
_tableView.delegate = self;
_tableView.dataSource = self;
[self.view addSubview:_tableView];
}
- (void)doUnloadView
{
_tableView.delegate = nil;
_tableView.dataSource = nil;
_tableView = nil;
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
}
- (BOOL)shouldAutorotate
{
return true;
}
#pragma mark - Table
- (NSInteger)numberOfSectionsInTableView:(UITableView *)__unused tableView
{
return [_sectionList count];
}
- (NSInteger)tableView:(UITableView *)__unused tableView numberOfRowsInSection:(NSInteger)section
{
return [[(TGMenuSection *)[_sectionList objectAtIndex:section] items] count];
}
- (CGFloat)tableView:(UITableView *)__unused tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section < (int)_sectionList.count)
{
TGMenuSection *section = [_sectionList objectAtIndex:indexPath.section];
if (indexPath.row < (int)section.items.count)
{
TGMenuItem *item = [section.items objectAtIndex:indexPath.row];
if (item.type == TGActionMenuItemType || item.type == TGSwitchItemType)
return 44;
}
}
return 0;
}
- (NSString *)tableView:(UITableView *)__unused tableView titleForHeaderInSection:(NSInteger)section
{
return ((TGMenuSection *)[_sectionList objectAtIndex:section]).title;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TGMenuItem *item = nil;
bool firstInSection = false;
bool lastInSection = false;
if (indexPath.section < (int)_sectionList.count)
{
TGMenuSection *section = [_sectionList objectAtIndex:indexPath.section];
if (indexPath.row < (int)section.items.count)
{
item = [section.items objectAtIndex:indexPath.row];
if (indexPath.row == 0)
firstInSection = true;
if (indexPath.row + 1 == (int)section.items.count)
lastInSection = true;
}
}
if (item != nil)
{
UITableViewCell *cell = nil;
if (item.type == TGActionMenuItemType)
{
static NSString *actionItemCellIdentifier = @"AI";
TGActionMenuItemCell *actionItemCell = (TGActionMenuItemCell *)[tableView dequeueReusableCellWithIdentifier:actionItemCellIdentifier];
if (actionItemCell == nil)
{
actionItemCell = [[TGActionMenuItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:actionItemCellIdentifier];
UIImageView *backgroundView = [[UIImageView alloc] init];
actionItemCell.backgroundView = backgroundView;
UIImageView *selectedBackgroundView = [[UIImageView alloc] init];
actionItemCell.selectedBackgroundView = selectedBackgroundView;
}
TGActionMenuItem *actionItem = (TGActionMenuItem *)item;
actionItemCell.title = actionItem.title;
cell = actionItemCell;
}
else if (item.type == TGSwitchItemType)
{
static NSString *switchItemCellIdentifier = @"SI";
TGSwitchItemCell *switchItemCell = (TGSwitchItemCell *)[tableView dequeueReusableCellWithIdentifier:switchItemCellIdentifier];
if (switchItemCell == nil)
{
switchItemCell = [[TGSwitchItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:switchItemCellIdentifier];
UIImageView *backgroundView = [[UIImageView alloc] init];
switchItemCell.backgroundView = backgroundView;
UIImageView *selectedBackgroundView = [[UIImageView alloc] init];
switchItemCell.selectedBackgroundView = selectedBackgroundView;
switchItemCell.selectionStyle = UITableViewCellSelectionStyleNone;
switchItemCell.watcherHandle = _actionHandle;
}
TGSwitchItem *switchItem = (TGSwitchItem *)item;
switchItemCell.title = switchItem.title;
switchItemCell.isOn = switchItem.isOn;
switchItemCell.itemId = switchItem;
cell = switchItemCell;
}
if (cell != nil)
{
if (firstInSection && lastInSection)
{
[(TGGroupedCell *)cell setGroupedCellPosition:TGGroupedCellPositionFirst | TGGroupedCellPositionLast];
[(TGGroupedCell *)cell setExtendSelectedBackground:false];
((UIImageView *)cell.backgroundView).image = [TGInterfaceAssets groupedCellSingle];
((UIImageView *)cell.selectedBackgroundView).image = [TGInterfaceAssets groupedCellSingleHighlighted];
}
else if (firstInSection)
{
[(TGGroupedCell *)cell setGroupedCellPosition:TGGroupedCellPositionFirst];
[(TGGroupedCell *)cell setExtendSelectedBackground:true];
((UIImageView *)cell.backgroundView).image = [TGInterfaceAssets groupedCellTop];
((UIImageView *)cell.selectedBackgroundView).image = [TGInterfaceAssets groupedCellTopHighlighted];
}
else if (lastInSection)
{
[(TGGroupedCell *)cell setGroupedCellPosition:TGGroupedCellPositionLast];
[(TGGroupedCell *)cell setExtendSelectedBackground:true];
((UIImageView *)cell.backgroundView).image = [TGInterfaceAssets groupedCellBottom];
((UIImageView *)cell.selectedBackgroundView).image = [TGInterfaceAssets groupedCellBottomHighlighted];
}
else
{
[(TGGroupedCell *)cell setGroupedCellPosition:0];
[(TGGroupedCell *)cell setExtendSelectedBackground:true];
((UIImageView *)cell.backgroundView).image = [TGInterfaceAssets groupedCellMiddle];
((UIImageView *)cell.selectedBackgroundView).image = [TGInterfaceAssets groupedCellMiddleHighlighted];
}
return cell;
}
}
static NSString *emptyCellIdentifier = @"EC";
UITableViewCell *emptyCell = [tableView dequeueReusableCellWithIdentifier:emptyCellIdentifier];
if (emptyCell == nil)
emptyCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:emptyCellIdentifier];
return emptyCell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TGMenuItem *item = nil;
if (indexPath.section < (int)_sectionList.count)
{
TGMenuSection *section = [_sectionList objectAtIndex:indexPath.section];
if (indexPath.row < (int)section.items.count)
{
item = [section.items objectAtIndex:indexPath.row];
}
}
if (item != nil)
{
if (item.type == TGActionMenuItemType)
{
TGActionMenuItem *actionItem = (TGActionMenuItem *)item;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
if ([self respondsToSelector:actionItem.action])
[self performSelector:actionItem.action];
#pragma clang diagnostic pop
[tableView deselectRowAtIndexPath:indexPath animated:true];
}
else if (item.type == TGSwitchItemType)
{
TGSwitchItem *switchItem = (TGSwitchItem *)item;
switchItem.isOn = !switchItem.isOn;
[(TGSwitchItemCell *)[tableView cellForRowAtIndexPath:indexPath] setIsOn:switchItem.isOn animated:true];
[(TGSwitchItemCell *)[tableView cellForRowAtIndexPath:indexPath] fireChangeEvent];
}
}
}
#pragma mark - Actions
- (void)logoutButtonPressed
{
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/auth/logout/(%d)", TGTelegraphInstance.clientUserId] options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:true] forKey:@"force"] watcher:TGTelegraphInstance];
}
- (void)revokeButtonPressed
{
[ActionStageInstance() requestActor:@"/tg/service/revokesessions" options:nil watcher:self];
}
- (void)clearItemUriButtonPressed
{
[TGDatabaseInstance() clearServerAssetData];
}
- (void)clearAssetCacheButtonPressed
{
NSString *documentsPath = [TGAppDelegate documentsPath];
NSString *assetsPath = [[NSString alloc] initWithFormat:@"%@/assets", documentsPath];
[[NSFileManager defaultManager] removeItemAtPath:assetsPath error:nil];
}
- (void)clearAvatarCacheButtonPressed
{
[TGDatabaseInstance() clearPeerProfilePhotos];
}
- (void)clearChannelsButtonPressed {
[[[TGAlertView alloc] initWithTitle:nil message:@"Application will be force closed" cancelButtonTitle:TGLocalized(@"Common.Cancel") okButtonTitle:TGLocalized(@"Common.OK") completionBlock:^(bool okButtonPressed) {
if (okButtonPressed) {
[TGDatabaseInstance() _dropChannels];
TGDispatchAfter(1.0, dispatch_get_main_queue(), ^{
exit(0);
});
}
}] show];
}
- (void)clearCacheButtonPressed
{
[TGDatabaseInstance() setCustomProperty:@"cachedStickersByQuery" value:nil];
[[TGRemoteImageView sharedCache] clearCache:TGCacheBoth];
NSString *documentsPath = [TGAppDelegate documentsPath];
NSString *filesPath = [[NSString alloc] initWithFormat:@"%@/files", documentsPath];
[[NSFileManager defaultManager] removeItemAtPath:filesPath error:nil];
NSString *stickerCachePath = [[NSString alloc] initWithFormat:@"%@/sticker-cache", documentsPath];
[[NSFileManager defaultManager] removeItemAtPath:stickerCachePath error:nil];
}
- (void)clearMemoryCacheButtonPressed
{
[TGDatabaseInstance() clearCachedMedia];
}
- (void)clearVideoCacheButtonPressed
{
dispatch_async([TGCache diskCacheQueue], ^
{
NSString *videosPath = [[TGAppDelegate documentsPath] stringByAppendingPathComponent:@"video"];
for (NSString *fileName in [[TGCache diskFileManager] contentsOfDirectoryAtPath:videosPath error:nil])
{
if ([fileName hasPrefix:@"remote"])
[[TGCache diskFileManager] removeItemAtPath:[videosPath stringByAppendingPathComponent:fileName] error:nil];
}
});
}
- (void)sendLogsButtonPressed
{
NSMutableArray *uploadFileArray = [[NSMutableArray alloc] init];
for (NSString *filePath in TGGetLogFilePaths(4))
{
int64_t randomId = 0;
arc4random_buf(&randomId, 8);
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSString alloc] initWithFormat:@"%@_%" PRId64 ".txt", [filePath lastPathComponent], randomId]];
if ([[NSFileManager defaultManager] copyItemAtPath:filePath toPath:tempFilePath error:NULL])
{
[uploadFileArray addObject:@{@"url": [NSURL fileURLWithPath:tempFilePath]}];
}
}
[TGAppDelegateInstance.rootController clearContentControllers];
TGForwardTargetController *forwardController = [[TGForwardTargetController alloc] initWithDocumentFiles:uploadFileArray];
TGNavigationController *navigationController = [TGNavigationController navigationControllerWithControllers:@[forwardController]];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
navigationController.presentationStyle = TGNavigationControllerPresentationStyleInFormSheet;
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}
[TGAppDelegateInstance.rootController presentViewController:navigationController animated:false completion:nil];
}
- (void)sendMoreLogsButtonPressed
{
NSMutableArray *uploadFileArray = [[NSMutableArray alloc] init];
for (NSString *filePath in TGGetLogFilePaths(100))
{
int64_t randomId = 0;
arc4random_buf(&randomId, 8);
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSString alloc] initWithFormat:@"%@_%" PRId64 ".txt", [filePath lastPathComponent], ABS(randomId)]];
if ([[NSFileManager defaultManager] copyItemAtPath:filePath toPath:tempFilePath error:NULL])
{
[uploadFileArray addObject:@{@"url": [NSURL fileURLWithPath:tempFilePath]}];
}
}
[TGAppDelegateInstance.rootController clearContentControllers];
TGForwardTargetController *forwardController = [[TGForwardTargetController alloc] initWithDocumentFiles:uploadFileArray];
TGNavigationController *navigationController = [TGNavigationController navigationControllerWithControllers:@[forwardController]];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
navigationController.presentationStyle = TGNavigationControllerPresentationStyleInFormSheet;
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}
[TGAppDelegateInstance.rootController presentViewController:navigationController animated:false completion:nil];
}
- (void)sendDataButtonPressed
{
NSMutableArray *uploadFileArray = [[NSMutableArray alloc] init];
for (NSString *filePath in [TGDatabaseInstance() backedUpDatabasePaths])
{
int64_t randomId = 0;
arc4random_buf(&randomId, 8);
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSString alloc] initWithFormat:@"%@_%" PRIx64 "", [filePath lastPathComponent], ABS(randomId)]];
if ([[NSFileManager defaultManager] copyItemAtPath:filePath toPath:tempFilePath error:NULL])
{
[uploadFileArray addObject:@{@"url": [NSURL fileURLWithPath:tempFilePath]}];
}
}
[TGAppDelegateInstance.rootController clearContentControllers];
TGForwardTargetController *forwardController = [[TGForwardTargetController alloc] initWithDocumentFiles:uploadFileArray];
TGNavigationController *navigationController = [TGNavigationController navigationControllerWithControllers:@[forwardController]];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
navigationController.presentationStyle = TGNavigationControllerPresentationStyleInFormSheet;
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}
[TGAppDelegateInstance.rootController presentViewController:navigationController animated:false completion:nil];
}
- (void)mailComposeController:(MFMailComposeViewController *)__unused controller didFinishWithResult:(MFMailComposeResult)__unused result error:(NSError *)__unused error
{
[self dismissViewControllerAnimated:true completion:nil];
}
/*- (void)switchDisplayMids
{
[TGConversationMessageItemView setDisplayMids:![TGConversationMessageItemView displayMids]];
}
- (void)switchDoNotRead
{
[TGTelegraphConversationCompanion setDoNotRead:![TGTelegraphConversationCompanion doNotRead]];
}*/
- (void)switchDoNotJump
{
[TGDialogListController setDebugDoNotJump:![TGDialogListController debugDoNotJump]];
}
- (void)switchDisableBackground
{
TGAppDelegateInstance.disableBackgroundMode = !TGAppDelegateInstance.disableBackgroundMode;
}
- (void)actorCompleted:(int)resultCode path:(NSString *)path result:(id)__unused result
{
if ([path isEqualToString:@"/tg/service/revokesessions"])
{
dispatch_async(dispatch_get_main_queue(), ^
{
if (resultCode == ASStatusSuccess)
{
TGLog(@"===== Other sessions revoked");
}
else
{
TGLog(@"***** Failed to revoke other sessions");
}
});
}
}
- (void)actionStageActionRequested:(NSString *)action options:(NSDictionary *)options
{
if ([action isEqualToString:@"toggleSwitchItem"])
{
TGSwitchItem *switchItem = [options objectForKey:@"itemId"];
if (switchItem == nil)
return;
NSNumber *nValue = [options objectForKey:@"value"];
switchItem.isOn = [nValue boolValue];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
if ([self respondsToSelector:switchItem.action])
[self performSelector:switchItem.action];
#pragma clang diagnostic pop
}
}
- (void)displayMidsPressed
{
[TGContentBubbleViewModel debugEnableShowMessageIds];
}
@end