session-ios/Signal/src/view controllers/SettingsViewController.m

320 lines
11 KiB
Objective-C

#import "DebugLogger.h"
#import "Environment.h"
#import "FutureUtil.h"
#import "LocalizableText.h"
#import "Operation.h"
#import "PreferencesUtil.h"
#import "PhoneNumber.h"
#import "RecentCallManager.h"
#import "RegisterViewController.h"
#import "SettingsViewController.h"
#import "Pastelog.h"
#import "SGNKeychainUtil.h"
#import "UIViewController+MMDrawerController.h"
#define SECTION_HEADER_VIEW_HEIGHT 27
#define PRIVACY_SECTION_INDEX 0
#define DEBUG_SECTION_INDEX 1
static NSString *const CHECKBOX_CHECKMARK_IMAGE_NAME = @"checkbox_checkmark";
static NSString *const CHECKBOX_EMPTY_IMAGE_NAME = @"checkbox_empty";
@interface SettingsViewController () {
NSArray *_sectionHeaderViews;
NSArray *_privacyTableViewCells;
NSArray *_debuggingTableViewCells;
NSString *gistURL;
}
@end
@implementation SettingsViewController
- (void)viewDidLoad {
[super viewDidLoad];
_sectionHeaderViews = @[_privacyAndSecurityHeaderView , self.debuggingHeaderView];
_titleLabel.text = SETTINGS_NAV_BAR_TITLE;
}
- (void)viewWillAppear:(BOOL)animated {
[self configureLocalNumber];
[self configureAllCells];
[self configureCheckboxPreferences];
[self.navigationController setNavigationBarHidden:YES animated:NO];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self saveExpandedSectionPreferences];
if (self.navigationController.viewControllers.count > 1) {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
[super viewWillDisappear:animated];
}
- (void)menuButtonTapped {
[self.mm_drawerController openDrawerSide:MMDrawerSideLeft animated:YES completion:nil];
}
#pragma mark - Local number
- (void)configureLocalNumber {
PhoneNumber *localNumber = SGNKeychainUtil.localNumber;
if (localNumber) {
_phoneNumberLabel.attributedText = [self localNumberAttributedStringForNumber:localNumber];
} else {
_phoneNumberLabel.text = @"";
}
}
- (NSAttributedString *)localNumberAttributedStringForNumber:(PhoneNumber *)number {
NSString *numberPrefixString = SETTINGS_NUMBER_PREFIX;
NSString *localNumberString = number.toE164;
NSString *displayString = [NSString stringWithFormat:@"%@ %@", numberPrefixString, localNumberString];
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:displayString];
UIFont *prefixFont = [UIUtil helveticaNeueLTStdLightFontWithSize:_phoneNumberLabel.font.pointSize];
UIFont *numberFont = [UIUtil helveticaNeueLTStdBoldFontWithSize:_phoneNumberLabel.font.pointSize];
[attributedString addAttribute:NSFontAttributeName
value:prefixFont
range:NSMakeRange(0, numberPrefixString.length)];
[attributedString addAttribute:NSFontAttributeName
value:numberFont
range:NSMakeRange(numberPrefixString.length + 1, localNumberString.length)];
return attributedString;
}
#pragma mark - Preferences
- (void)configureCheckboxPreferences {
NSArray *buttons = @[_hideContactImagesButton,
_enableScreenSecurityButton,
_disableAutocorrectButton,
_disableHistoryButton,
_disableDebugLogsButton];
for (UIButton *button in buttons) {
[button setImage:[UIImage imageNamed:CHECKBOX_EMPTY_IMAGE_NAME]
forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:CHECKBOX_CHECKMARK_IMAGE_NAME]
forState:UIControlStateSelected];
}
PropertyListPreferences *prefs = Environment.preferences;
_hideContactImagesButton.selected = !prefs.getContactImagesEnabled;
_enableScreenSecurityButton.selected = prefs.screenSecurityIsEnabled;
_disableAutocorrectButton.selected = !prefs.getAutocorrectEnabled;
_disableHistoryButton.selected = !prefs.getHistoryLogEnabled;
_disableLogsCell.selected = !prefs.loggingIsEnabled;
}
- (void)configureAllCells {
_privacyTableViewCells = [self privacyAndSecurityCells];
_debuggingTableViewCells = [self debugCells];
[_privacyAndSecurityHeaderView setColumnStateExpanded:YES andIsAnimated:NO];
[_debuggingHeaderView setColumnStateExpanded:YES andIsAnimated:NO];
}
- (void)saveExpandedSectionPreferences {
NSMutableArray *expandedSectionPrefs = [NSMutableArray array];
NSNumber *numberBoolYes = @YES;
NSNumber *numberBoolNo = @NO;
[expandedSectionPrefs addObject:(_privacyTableViewCells ? numberBoolYes : numberBoolNo)];
}
#pragma mark - Table View Helpers
- (NSArray *)privacyAndSecurityCells {
return @[_hideContactImagesCell,
_enableScreenSecurityCell,
_disableAutocorrectCell,
_disableHistoryCell,
_clearHistoryLogCell];
}
- (NSArray *)debugCells{
NSMutableArray *cells = [@[_disableLogsCell] mutableCopy];
if (Environment.preferences.loggingIsEnabled) {
[cells addObject:_sendDebugLog];
}
return cells;
}
- (NSArray *)indexPathsForCells:(NSArray *)cells forRow:(NSInteger)row {
NSMutableArray *indexPaths = [NSMutableArray array];
for (NSUInteger i = 0; i < cells.count; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(NSInteger)i inSection:row];
[indexPaths addObject:indexPath];
}
return indexPaths;
}
- (NSArray *)cellsForRow:(NSInteger)row {
if (row == PRIVACY_SECTION_INDEX) {
return [self privacyAndSecurityCells];
} else if (row == DEBUG_SECTION_INDEX){
return [self debugCells];
}else {
return @[];
}
}
#pragma mark - Actions
- (void)registerTapped {
RegisterViewController *registerViewController = [RegisterViewController registerViewController];
[self presentViewController:registerViewController animated:YES completion:nil];
}
- (void)privacyAndSecurityTapped {
[self toggleCells:&_privacyTableViewCells forRow:PRIVACY_SECTION_INDEX];
BOOL columnExpanded = _privacyTableViewCells != nil;
[_privacyAndSecurityHeaderView setColumnStateExpanded:columnExpanded andIsAnimated:YES];
}
- (void)debuggingTapped:(id)sender{
[self toggleCells:&_debuggingTableViewCells forRow:DEBUG_SECTION_INDEX];
BOOL columnExpanded = _debuggingTableViewCells != nil;
[_debuggingHeaderView setColumnStateExpanded:columnExpanded andIsAnimated:YES];
}
- (void)toggleCells:(NSArray *__strong*)cells forRow:(NSInteger)row {
[_settingsTableView beginUpdates];
if (*cells) {
[_settingsTableView deleteRowsAtIndexPaths:[self indexPathsForCells:*cells forRow:row]
withRowAnimation:UITableViewRowAnimationFade];
*cells = nil;
} else {
*cells = [self cellsForRow:row];
[_settingsTableView insertRowsAtIndexPaths:[self indexPathsForCells:*cells forRow:row]
withRowAnimation:UITableViewRowAnimationFade];
}
[_settingsTableView endUpdates];
}
- (IBAction)hideContactImagesButtonTapped {
_hideContactImagesButton.selected = !_hideContactImagesButton.selected;
[Environment.preferences setContactImagesEnabled:!_hideContactImagesButton.selected];
}
- (IBAction)disableAutocorrectButtonTapped {
_disableAutocorrectButton.selected = !_disableAutocorrectButton.selected;
[Environment.preferences setAutocorrectEnabled:!_disableAutocorrectButton.selected];
}
- (IBAction)disableHistoryButtonTapped {
_disableHistoryButton.selected = !_disableHistoryButton.selected;
[Environment.preferences setHistoryLogEnabled:!_disableHistoryButton.selected];
}
- (IBAction)enableScreenSecurityTapped:(id)sender{
_enableScreenSecurityButton.selected = !_enableScreenSecurityButton.selected;
[Environment.preferences setScreenSecurity:_enableScreenSecurityButton.selected];
}
- (IBAction)disableLogTapped:(id)sender{
_disableDebugLogsButton.selected = !_disableDebugLogsButton.selected;
BOOL loggingEnabled = !_disableDebugLogsButton.selected;
if (!loggingEnabled) {
[DebugLogger.sharedInstance disableFileLogging];
[DebugLogger.sharedInstance wipeLogs];
} else{
[DebugLogger.sharedInstance enableFileLogging];
}
[Environment.preferences setLoggingEnabled:loggingEnabled];
_debuggingTableViewCells = [self debugCells];
[_settingsTableView reloadData];
}
- (void)clearHistory {
[Environment.getCurrent.recentCallManager clearRecentCalls];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:SETTINGS_LOG_CLEAR_TITLE
message:SETTINGS_LOG_CLEAR_MESSAGE
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:SETTINGS_LOG_CLEAR_CONFIRM, nil];
[alertView show];
}
#pragma mark - UITableViewDelegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return (NSInteger)_sectionHeaderViews.count;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
return _sectionHeaderViews[(NSUInteger)section];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return SECTION_HEADER_VIEW_HEIGHT;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
UIView *headerView = _sectionHeaderViews[(NSUInteger)section];
if (headerView == _privacyAndSecurityHeaderView) {
return (NSInteger)_privacyTableViewCells.count;
} else if (headerView == _debuggingHeaderView){
return (NSInteger)_debuggingTableViewCells.count;
}else {
return 0;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UIView *headerView = _sectionHeaderViews[(NSUInteger)indexPath.section];
UITableViewCell *cell = nil;
if (headerView == _privacyAndSecurityHeaderView) {
cell = _privacyTableViewCells[(NSUInteger)indexPath.row];
} else if (headerView ==_debuggingHeaderView){
cell = _debuggingTableViewCells[(NSUInteger)indexPath.row];
}
[self findAndLocalizeLabelsForView:cell];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell == _clearHistoryLogCell) {
[self clearHistory];
}
if (cell == _sendDebugLog) {
[Pastelog submitLogs];
}
}
- (void)findAndLocalizeLabelsForView:(UIView *)view {
for (UIView *subview in view.subviews) {
if ([subview respondsToSelector:@selector(localizationKey)]) {
LocalizableCustomFontLabel *label = (LocalizableCustomFontLabel *)subview;
if (label.localizationKey) {
label.text = NSLocalizedString(label.localizationKey, @"");
}
}
[self findAndLocalizeLabelsForView:subview];
}
}
@end