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

245 lines
9.2 KiB
Objective-C

//
// SettingsTableViewController.m
// Signal
//
// Created by Dylan Bourgeois on 03/11/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "SettingsTableViewController.h"
#import "TSAccountManager.h"
#import "Environment.h"
#import "PreferencesUtil.h"
#import "UIUtil.h"
#import "RPServerRequestsManager.h"
#import "TSSocketManager.h"
#import "ContactsManager.h"
#import "PrivacySettingsTableViewController.h"
#import "AdvancedSettingsTableViewController.h"
#import "AboutTableViewController.h"
#import "PushManager.h"
#import "NotificationSettingsViewController.h"
#define kProfileCellHeight 87.0f
#define kStandardCellHeight 44.0f
#define kNumberOfSections 4
#define kRegisteredNumberRow 0
#define kPrivacyRow 0
#define kNotificationRow 1
#define kAdvancedRow 2
#define kAboutRow 3
#define kNetworkRow 0
#define kUnregisterRow 0
typedef enum {
kRegisteredRows = 1,
kGeneralRows = 4,
kNetworkStatusRows = 1,
kUnregisterRows = 1,
} kRowsForSection;
typedef enum {
kRegisteredNumberSection=0,
kNetworkStatusSection=1,
kGeneralSection=2,
kUnregisterSection=3,
} kSection;
@interface SettingsTableViewController () <UIAlertViewDelegate>
@end
@implementation SettingsTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.navigationItem setHidesBackButton:YES];
[self.navigationController.navigationBar setTranslucent:NO];
self.tableView.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero];
self.registeredNumber.text = [PhoneNumber bestEffortFormatPartialUserSpecifiedTextToLookLikeAPhoneNumber:[TSAccountManager registeredNumber]];
[self findAndSetRegisteredName];
[self initializeObserver];
[TSSocketManager sendNotification];
self.title = NSLocalizedString(@"SETTINGS_NAV_BAR_TITLE",@"");
_networkStatusHeader.text = NSLocalizedString(@"NETWORK_STATUS_HEADER",@"");
_settingsPrivacyTitle.text = NSLocalizedString(@"SETTINGS_PRIVACY_TITLE",@"");
_settingsAdvancedTitle.text = NSLocalizedString(@"SETTINGS_ADVANCED_TITLE",@"");
_settingsAboutTitle.text = NSLocalizedString(@"SETTINGS_ABOUT",@"");
_settingsNotifications.text = NSLocalizedString(@"SETTINGS_NOTIFICATIONS", nil);
[_destroyAccountButton setTitle:NSLocalizedString(@"SETTINGS_DELETE_ACCOUNT_BUTTON", @"") forState:UIControlStateNormal];
}
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:SocketOpenedNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:SocketClosedNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:SocketConnectingNotification object:nil];
}
-(void) findAndSetRegisteredName {
NSString *name = NSLocalizedString(@"REGISTERED_NUMBER_TEXT", @"");
PhoneNumber* myNumber = [PhoneNumber phoneNumberFromE164:[TSAccountManager registeredNumber]];
Contact *me = [[Environment.getCurrent contactsManager] latestContactForPhoneNumber:myNumber];
self.registeredName.text = [me fullName] ? [me fullName] : name;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return kNumberOfSections;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case kRegisteredNumberSection:
return kRegisteredRows;
case kGeneralSection:
return kGeneralRows;
case kNetworkStatusSection:
return kNetworkStatusRows;
case kUnregisterSection:
return kUnregisterRows;
default:
return 0;
}
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
switch (indexPath.section) {
case kGeneralSection:
{
switch (indexPath.row) {
case kPrivacyRow:
{
PrivacySettingsTableViewController *vc = [[PrivacySettingsTableViewController alloc]init];
NSAssert(self.navigationController != nil, @"Navigation controller must not be nil");
NSAssert(vc != nil, @"Privacy Settings View Controller must not be nil");
[self.navigationController pushViewController:vc animated:YES];
break;
}
case kNotificationRow:
{
NotificationSettingsViewController *vc = [[NotificationSettingsViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
break;
}
case kAdvancedRow:
{
AdvancedSettingsTableViewController *vc = [[AdvancedSettingsTableViewController alloc]init];
NSAssert(self.navigationController != nil, @"Navigation controller must not be nil");
NSAssert(vc != nil, @"Advanced Settings View Controller must not be nil");
[self.navigationController pushViewController:vc animated:YES];
break;
}
case kAboutRow:
{
AboutTableViewController * vc = [[AboutTableViewController alloc]init];
NSAssert(self.navigationController != nil, @"Navigation controller must not be nil");
NSAssert(vc != nil, @"About View Controller must not be nil");
[self.navigationController pushViewController:vc animated:YES];
break;
}
default:
break;
}
break;
}
case kNetworkStatusSection:
{
break;
}
case kUnregisterSection:
{
[self unregisterUser:nil];
break;
}
default:
break;
}
}
-(IBAction)unregisterUser:(id)sender {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"CONFIRM_ACCOUNT_DESTRUCTION_TITLE", @"") message:NSLocalizedString(@"CONFIRM_ACCOUNT_DESTRUCTION_TEXT", @"") preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"PROCEED_BUTTON", @"") style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
[self proceedToUnregistration];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"TXT_CANCEL_TITLE", @"") style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
- (void)proceedToUnregistration{
[TSAccountManager unregisterTextSecureWithSuccess:^{
[PushManager.sharedManager requestPushTokenWithSuccess:^(NSData* pushToken, NSData *voipToken){
[[RPServerRequestsManager sharedInstance]performRequest:[RPAPICall unregisterWithPushToken:pushToken] success:^(NSURLSessionDataTask *task, id responseObject) {
[Environment resetAppData];
exit(0);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
SignalAlertView(NSLocalizedString(@"UNREGISTER_REDPHONE_FAIL", @""), @"");
}];
} failure:^(NSError *error) {
SignalAlertView(NSLocalizedString(@"UNREGISTER_REDPHONE_FAIL", @""), @"");
}];
} failure:^(NSError *error) {
SignalAlertView(NSLocalizedString(@"UNREGISTER_TEXTSECURE_FAIL", @""), @"");
}];
}
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == kNetworkStatusSection) {
UIAlertView * info = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"NETWORK_STATUS_HEADER", @"") message:NSLocalizedString(@"NETWORK_STATUS_TEXT",@"") delegate:self cancelButtonTitle:NSLocalizedString(@"OK",@"") otherButtonTitles: nil];
[info show];
}
}
#pragma mark - Socket Status Notifications
-(void)initializeObserver
{
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(socketDidOpen) name:SocketOpenedNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(socketDidClose) name:SocketClosedNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(socketIsConnecting) name:SocketConnectingNotification object:nil];
}
-(void)socketDidOpen {
self.networkStatusLabel.text = NSLocalizedString(@"NETWORK_STATUS_CONNECTED", @"");
self.networkStatusLabel.textColor = [UIColor ows_greenColor];
}
-(void)socketDidClose {
self.networkStatusLabel.text = NSLocalizedString(@"NETWORK_STATUS_OFFLINE", @"");
self.networkStatusLabel.textColor = [UIColor ows_redColor];
}
-(void)socketIsConnecting {
self.networkStatusLabel.text = NSLocalizedString(@"NETWORK_STATUS_CONNECTING", @"");
self.networkStatusLabel.textColor = [UIColor ows_yellowColor];
}
- (IBAction)unwindToUserCancelledChangeNumber:(UIStoryboardSegue *)segue {
}
@end