mirror of https://github.com/oxen-io/session-ios
WIP
parent
a7ced7752f
commit
8faf099498
@ -1,18 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "OWSTableViewController.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class OWSNavigationController;
|
||||
|
||||
@interface AppSettingsViewController : OWSTableViewController
|
||||
|
||||
+ (OWSNavigationController *)inModalNavigationController;
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@ -1,619 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "AppDelegate.h"
|
||||
#import "AppSettingsViewController.h"
|
||||
#import "AboutTableViewController.h"
|
||||
#import "AdvancedSettingsTableViewController.h"
|
||||
#import "DebugUITableViewController.h"
|
||||
#import "NotificationSettingsViewController.h"
|
||||
#import "OWSBackup.h"
|
||||
#import "OWSBackupSettingsViewController.h"
|
||||
#import "OWSNavigationController.h"
|
||||
#import "PrivacySettingsTableViewController.h"
|
||||
#import "ProfileViewController.h"
|
||||
#import "Session-Swift.h"
|
||||
#import <SignalMessaging/Environment.h>
|
||||
#import <SignalMessaging/OWSContactsManager.h>
|
||||
#import <SignalMessaging/UIUtil.h>
|
||||
#import <SessionServiceKit/TSAccountManager.h>
|
||||
#import <SessionServiceKit/TSSocketManager.h>
|
||||
#import "Session-Swift.h"
|
||||
|
||||
@interface AppSettingsViewController ()
|
||||
|
||||
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
|
||||
@implementation AppSettingsViewController
|
||||
|
||||
/**
|
||||
* We always present the settings controller modally, from within an OWSNavigationController
|
||||
*/
|
||||
+ (OWSNavigationController *)inModalNavigationController
|
||||
{
|
||||
AppSettingsViewController *viewController = [AppSettingsViewController new];
|
||||
OWSNavigationController *navController =
|
||||
[[OWSNavigationController alloc] initWithRootViewController:viewController];
|
||||
|
||||
return navController;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (!self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
_contactsManager = Environment.shared.contactsManager;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (!self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
_contactsManager = Environment.shared.contactsManager;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)loadView
|
||||
{
|
||||
self.tableViewStyle = UITableViewStylePlain;
|
||||
[super loadView];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
[self.navigationItem setHidesBackButton:YES];
|
||||
|
||||
OWSAssertDebug([self.navigationController isKindOfClass:[OWSNavigationController class]]);
|
||||
|
||||
self.navigationItem.leftBarButtonItem =
|
||||
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
|
||||
target:self
|
||||
action:@selector(dismissWasPressed:)];
|
||||
// [self updateRightBarButtonForTheme];
|
||||
[self observeNotifications];
|
||||
|
||||
self.title = NSLocalizedString(@"SETTINGS_NAV_BAR_TITLE", @"Title for settings activity");
|
||||
|
||||
[self updateTableContents];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
[self updateTableContents];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
#pragma mark - Table Contents
|
||||
|
||||
- (void)updateTableContents
|
||||
{
|
||||
NSString *masterDeviceHexEncodedPublicKey = [NSUserDefaults.standardUserDefaults stringForKey:@"masterDeviceHexEncodedPublicKey"];
|
||||
BOOL isMasterDevice = (masterDeviceHexEncodedPublicKey == nil);
|
||||
OWSTableContents *contents = [OWSTableContents new];
|
||||
|
||||
__weak AppSettingsViewController *weakSelf = self;
|
||||
|
||||
#ifdef INTERNAL
|
||||
OWSTableSection *internalSection = [OWSTableSection new];
|
||||
[section addItem:[OWSTableItem softCenterLabelItemWithText:@"Internal Build"]];
|
||||
[contents addSection:internalSection];
|
||||
#endif
|
||||
|
||||
OWSTableSection *section = [OWSTableSection new];
|
||||
[section addItem:[OWSTableItem itemWithCustomCellBlock:^{
|
||||
return [weakSelf profileHeaderCell];
|
||||
} customRowHeight:100.f actionBlock:^{
|
||||
if (isMasterDevice) {
|
||||
[weakSelf showProfile];
|
||||
}
|
||||
}]];
|
||||
|
||||
if (OWSSignalService.sharedInstance.isCensorshipCircumventionActive) {
|
||||
[section
|
||||
addItem:[OWSTableItem disclosureItemWithText:
|
||||
NSLocalizedString(@"NETWORK_STATUS_CENSORSHIP_CIRCUMVENTION_ACTIVE",
|
||||
@"Indicates to the user that censorship circumvention has been activated.")
|
||||
actionBlock:^{
|
||||
[weakSelf showAdvanced];
|
||||
}]];
|
||||
} else {
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section addItem:[OWSTableItem
|
||||
// itemWithCustomCellBlock:^{
|
||||
// UITableViewCell *cell = [OWSTableItem newCell];
|
||||
// cell.textLabel.text = NSLocalizedString(@"NETWORK_STATUS_HEADER", @"");
|
||||
// cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
// UILabel *accessoryLabel = [UILabel new];
|
||||
// if (TSAccountManager.sharedInstance.isDeregistered) {
|
||||
// accessoryLabel.text = NSLocalizedString(@"NETWORK_STATUS_DEREGISTERED",
|
||||
// @"Error indicating that this device is no longer registered.");
|
||||
// accessoryLabel.textColor = [UIColor ows_redColor];
|
||||
// } else {
|
||||
// switch (TSSocketManager.shared.highestSocketState) {
|
||||
// case OWSWebSocketStateClosed:
|
||||
// accessoryLabel.text = NSLocalizedString(@"NETWORK_STATUS_OFFLINE", @"");
|
||||
// accessoryLabel.textColor = [UIColor ows_redColor];
|
||||
// break;
|
||||
// case OWSWebSocketStateConnecting:
|
||||
// accessoryLabel.text = NSLocalizedString(@"NETWORK_STATUS_CONNECTING", @"");
|
||||
// accessoryLabel.textColor = [UIColor ows_yellowColor];
|
||||
// break;
|
||||
// case OWSWebSocketStateOpen:
|
||||
// accessoryLabel.text = NSLocalizedString(@"NETWORK_STATUS_CONNECTED", @"");
|
||||
// accessoryLabel.textColor = [UIColor ows_greenColor];
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// [accessoryLabel sizeToFit];
|
||||
// cell.accessoryView = accessoryLabel;
|
||||
// cell.accessibilityIdentifier
|
||||
// = ACCESSIBILITY_IDENTIFIER_WITH_NAME(AppSettingsViewController, @"network_status");
|
||||
// return cell;
|
||||
// }
|
||||
// actionBlock:nil]];
|
||||
// ========
|
||||
}
|
||||
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_INVITE_TITLE",
|
||||
// @"Settings table view cell label")
|
||||
// accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"invite")
|
||||
// actionBlock:^{
|
||||
// [weakSelf showInviteFlow];
|
||||
// }]];
|
||||
// ========
|
||||
[section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_PRIVACY_TITLE",
|
||||
@"Settings table view cell label")
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"privacy")
|
||||
actionBlock:^{
|
||||
[weakSelf showPrivacy];
|
||||
}]];
|
||||
[section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_NOTIFICATIONS", nil)
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"notifications")
|
||||
actionBlock:^{
|
||||
[weakSelf showNotifications];
|
||||
}]];
|
||||
if (isMasterDevice) {
|
||||
[section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"Linked Devices", @"")
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"linked_devices")
|
||||
actionBlock:^{
|
||||
[weakSelf showLinkedDevices];
|
||||
}]];
|
||||
}
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_ADVANCED_TITLE", @"")
|
||||
// accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"advanced")
|
||||
// actionBlock:^{
|
||||
// [weakSelf showAdvanced];
|
||||
// }]];
|
||||
// ========
|
||||
BOOL isBackupEnabled = [OWSBackup.sharedManager isBackupEnabled];
|
||||
BOOL showBackup = (OWSBackup.isFeatureEnabled && isBackupEnabled);
|
||||
if (showBackup) {
|
||||
[section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_BACKUP",
|
||||
@"Label for the backup view in app settings.")
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"backup")
|
||||
actionBlock:^{
|
||||
[weakSelf showBackup];
|
||||
}]];
|
||||
}
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section addItem:[OWSTableItem disclosureItemWithText:NSLocalizedString(@"SETTINGS_ABOUT", @"")
|
||||
// accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"about")
|
||||
// actionBlock:^{
|
||||
// [weakSelf showAbout];
|
||||
// }]];
|
||||
// ========
|
||||
|
||||
#ifdef USE_DEBUG_UI
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section addItem:[OWSTableItem disclosureItemWithText:@"Debug UI"
|
||||
// accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"debugui")
|
||||
// actionBlock:^{
|
||||
// [weakSelf showDebugUI];
|
||||
// }]];
|
||||
// ========
|
||||
#endif
|
||||
|
||||
[section addItem:[OWSTableItem itemWithTitle:NSLocalizedString(@"Share Public Key", @"") actionBlock:^{ [weakSelf sharePublicKey]; }]];
|
||||
[section addItem:[OWSTableItem itemWithTitle:NSLocalizedString(@"Show QR Code", @"") actionBlock:^{ [weakSelf showQRCode]; }]];
|
||||
if (isMasterDevice) {
|
||||
[section addItem:[OWSTableItem itemWithTitle:NSLocalizedString(@"Show Seed", @"") actionBlock:^{ [weakSelf showSeed]; }]];
|
||||
}
|
||||
[section addItem:[OWSTableItem itemWithTitle:NSLocalizedString(@"Clear All Data", @"") actionBlock:^{ [weakSelf clearAllData]; }]];
|
||||
|
||||
if (TSAccountManager.sharedInstance.isDeregistered) {
|
||||
[section addItem:[self destructiveButtonItemWithTitle:NSLocalizedString(@"SETTINGS_REREGISTER_BUTTON",
|
||||
@"Label for re-registration button.")
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"reregister")
|
||||
selector:@selector(reregisterUser)
|
||||
color:[UIColor ows_materialBlueColor]]];
|
||||
[section addItem:[self destructiveButtonItemWithTitle:NSLocalizedString(@"SETTINGS_DELETE_DATA_BUTTON",
|
||||
@"Label for 'delete data' button.")
|
||||
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"delete_data")
|
||||
selector:@selector(deleteUnregisterUserData)
|
||||
color:[UIColor ows_destructiveRedColor]]];
|
||||
} else {
|
||||
// Loki: Original code
|
||||
// ========
|
||||
// [section
|
||||
// addItem:[self destructiveButtonItemWithTitle:NSLocalizedString(@"SETTINGS_DELETE_ACCOUNT_BUTTON", @"")
|
||||
// accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"delete_account")
|
||||
// selector:@selector(unregisterUser)
|
||||
// color:[UIColor ows_destructiveRedColor]]];
|
||||
// ========
|
||||
}
|
||||
|
||||
[contents addSection:section];
|
||||
|
||||
self.contents = contents;
|
||||
}
|
||||
|
||||
- (OWSTableItem *)destructiveButtonItemWithTitle:(NSString *)title
|
||||
accessibilityIdentifier:(NSString *)accessibilityIdentifier
|
||||
selector:(SEL)selector
|
||||
color:(UIColor *)color
|
||||
{
|
||||
__weak AppSettingsViewController *weakSelf = self;
|
||||
return [OWSTableItem
|
||||
itemWithCustomCellBlock:^{
|
||||
UITableViewCell *cell = [OWSTableItem newCell];
|
||||
cell.preservesSuperviewLayoutMargins = YES;
|
||||
cell.contentView.preservesSuperviewLayoutMargins = YES;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
|
||||
const CGFloat kButtonHeight = 40.f;
|
||||
OWSFlatButton *button = [OWSFlatButton buttonWithTitle:title
|
||||
font:[OWSFlatButton fontForHeight:kButtonHeight]
|
||||
titleColor:[UIColor whiteColor]
|
||||
backgroundColor:color
|
||||
target:weakSelf
|
||||
selector:selector];
|
||||
[cell.contentView addSubview:button];
|
||||
[button autoSetDimension:ALDimensionHeight toSize:kButtonHeight];
|
||||
[button autoVCenterInSuperview];
|
||||
[button autoPinLeadingAndTrailingToSuperviewMargin];
|
||||
button.accessibilityIdentifier = accessibilityIdentifier;
|
||||
|
||||
return cell;
|
||||
}
|
||||
customRowHeight:90.f
|
||||
actionBlock:nil];
|
||||
}
|
||||
|
||||
- (UITableViewCell *)profileHeaderCell
|
||||
{
|
||||
NSString *masterDeviceHexEncodedPublicKey = [NSUserDefaults.standardUserDefaults stringForKey:@"masterDeviceHexEncodedPublicKey"];
|
||||
NSString *hexEncodedPublicKey = masterDeviceHexEncodedPublicKey ?: TSAccountManager.localNumber;
|
||||
BOOL isMasterDevice = (masterDeviceHexEncodedPublicKey == nil);
|
||||
|
||||
UITableViewCell *cell = [OWSTableItem newCell];
|
||||
cell.preservesSuperviewLayoutMargins = YES;
|
||||
cell.contentView.preservesSuperviewLayoutMargins = YES;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
|
||||
UIImage *_Nullable localProfileAvatarImage = [OWSProfileManager.sharedManager profileAvatarForRecipientId:hexEncodedPublicKey];
|
||||
UIImage *avatarImage = (localProfileAvatarImage
|
||||
?: [[[OWSContactAvatarBuilder alloc] initForLocalUserWithDiameter:kLargeAvatarSize] buildDefaultImage]);
|
||||
OWSAssertDebug(avatarImage);
|
||||
|
||||
AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatarImage];
|
||||
[cell.contentView addSubview:avatarView];
|
||||
[avatarView autoVCenterInSuperview];
|
||||
[avatarView autoPinLeadingToSuperviewMargin];
|
||||
[avatarView autoSetDimension:ALDimensionWidth toSize:kLargeAvatarSize];
|
||||
[avatarView autoSetDimension:ALDimensionHeight toSize:kLargeAvatarSize];
|
||||
avatarView.contactID = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
|
||||
|
||||
if (isMasterDevice && !OWSProfileManager.sharedManager.localProfileAvatarImage) {
|
||||
UIImage *cameraImage = [UIImage imageNamed:@"settings-avatar-camera"];
|
||||
UIImageView *cameraImageView = [[UIImageView alloc] initWithImage:cameraImage];
|
||||
[cell.contentView addSubview:cameraImageView];
|
||||
[cameraImageView autoPinTrailingToEdgeOfView:avatarView];
|
||||
[cameraImageView autoPinEdge:ALEdgeBottom toEdge:ALEdgeBottom ofView:avatarView];
|
||||
}
|
||||
|
||||
UIView *nameView = [UIView containerView];
|
||||
[cell.contentView addSubview:nameView];
|
||||
[nameView autoVCenterInSuperview];
|
||||
[nameView autoPinLeadingToTrailingEdgeOfView:avatarView offset:16.f];
|
||||
|
||||
UILabel *titleLabel = [UILabel new];
|
||||
NSString *_Nullable localProfileName = [OWSProfileManager.sharedManager profileNameForRecipientWithID:hexEncodedPublicKey];
|
||||
if (localProfileName.length > 0) {
|
||||
titleLabel.text = localProfileName;
|
||||
titleLabel.textColor = [Theme primaryColor];
|
||||
titleLabel.font = [UIFont ows_dynamicTypeTitle2Font];
|
||||
} else if (isMasterDevice) {
|
||||
titleLabel.text = NSLocalizedString(
|
||||
@"APP_SETTINGS_EDIT_PROFILE_NAME_PROMPT", @"Text prompting user to edit their profile name.");
|
||||
titleLabel.textColor = [UIColor ows_materialBlueColor];
|
||||
titleLabel.font = [UIFont ows_dynamicTypeHeadlineFont];
|
||||
} else {
|
||||
titleLabel.hidden = YES;
|
||||
}
|
||||
titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
|
||||
[nameView addSubview:titleLabel];
|
||||
[titleLabel autoPinEdgeToSuperviewEdge:ALEdgeTop];
|
||||
[titleLabel autoPinWidthToSuperview];
|
||||
|
||||
const CGFloat kSubtitlePointSize = 12.f;
|
||||
UILabel *subtitleLabel = [UILabel new];
|
||||
subtitleLabel.textColor = [Theme secondaryColor];
|
||||
subtitleLabel.font = [UIFont ows_regularFontWithSize:kSubtitlePointSize];
|
||||
subtitleLabel.attributedText = [[NSAttributedString alloc] initWithString:hexEncodedPublicKey];
|
||||
subtitleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
|
||||
[nameView addSubview:subtitleLabel];
|
||||
[subtitleLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:titleLabel];
|
||||
if (isMasterDevice) {
|
||||
[subtitleLabel autoPinEdgeToSuperviewEdge:ALEdgeBottom];
|
||||
}
|
||||
[subtitleLabel autoPinWidthToSuperview];
|
||||
|
||||
if (!isMasterDevice) {
|
||||
UILabel *linkedDeviceLabel = [UILabel new];
|
||||
linkedDeviceLabel.textColor = [Theme secondaryColor];
|
||||
linkedDeviceLabel.font = [UIFont ows_regularFontWithSize:12.f];
|
||||
NSString *shortID = [LKMnemonic hashHexEncodedString:[TSAccountManager.localNumber removing05PrefixIfNeeded]];
|
||||
linkedDeviceLabel.attributedText = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:NSLocalizedString(@"Linked device (%@)", ""), shortID]];
|
||||
linkedDeviceLabel.lineBreakMode = NSLineBreakByTruncatingTail;
|
||||
[nameView addSubview:linkedDeviceLabel];
|
||||
[linkedDeviceLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:subtitleLabel];
|
||||
[linkedDeviceLabel autoPinEdgeToSuperviewEdge:ALEdgeBottom];
|
||||
[linkedDeviceLabel autoPinWidthToSuperview];
|
||||
[nameView autoPinTrailingToSuperviewMargin];
|
||||
}
|
||||
|
||||
if (isMasterDevice) {
|
||||
UIImage *disclosureImage = [UIImage imageNamed:(CurrentAppContext().isRTL ? @"NavBarBack" : @"NavBarBackRTL")];
|
||||
OWSAssertDebug(disclosureImage);
|
||||
UIImageView *disclosureButton =
|
||||
[[UIImageView alloc] initWithImage:[disclosureImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
|
||||
disclosureButton.tintColor = [UIColor colorWithRGBHex:0xcccccc];
|
||||
[cell.contentView addSubview:disclosureButton];
|
||||
[disclosureButton autoVCenterInSuperview];
|
||||
[disclosureButton autoPinTrailingToSuperviewMargin];
|
||||
[disclosureButton autoPinLeadingToTrailingEdgeOfView:nameView offset:16.f];
|
||||
[disclosureButton setContentCompressionResistancePriority:(UILayoutPriorityDefaultHigh + 1)
|
||||
forAxis:UILayoutConstraintAxisHorizontal];
|
||||
}
|
||||
|
||||
cell.accessibilityIdentifier = ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"profile");
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)showInviteFlow
|
||||
{
|
||||
OWSInviteFlow *inviteFlow = [[OWSInviteFlow alloc] initWithPresentingViewController:self];
|
||||
[self presentViewController:inviteFlow.actionSheetController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)showPrivacy
|
||||
{
|
||||
PrivacySettingsTableViewController *vc = [[PrivacySettingsTableViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (void)showNotifications
|
||||
{
|
||||
NotificationSettingsViewController *vc = [[NotificationSettingsViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (void)showLinkedDevices
|
||||
{
|
||||
LKDeviceLinksVC *deviceLinksVC = [LKDeviceLinksVC new];
|
||||
[self.navigationController pushViewController:deviceLinksVC animated:YES];
|
||||
}
|
||||
|
||||
- (void)showProfile
|
||||
{
|
||||
[ProfileViewController presentForAppSettings:self.navigationController];
|
||||
}
|
||||
|
||||
- (void)showAdvanced
|
||||
{
|
||||
AdvancedSettingsTableViewController *vc = [[AdvancedSettingsTableViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (void)showAbout
|
||||
{
|
||||
AboutTableViewController *vc = [[AboutTableViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (void)showBackup
|
||||
{
|
||||
OWSBackupSettingsViewController *vc = [OWSBackupSettingsViewController new];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (void)showDebugUI
|
||||
{
|
||||
[DebugUITableViewController presentDebugUIFromViewController:self];
|
||||
}
|
||||
|
||||
- (void)dismissWasPressed:(id)sender
|
||||
{
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
#pragma mark - Unregister & Re-register
|
||||
|
||||
- (void)unregisterUser
|
||||
{
|
||||
[self showDeleteAccountUI:YES];
|
||||
}
|
||||
|
||||
- (void)deleteUnregisterUserData
|
||||
{
|
||||
[self showDeleteAccountUI:NO];
|
||||
}
|
||||
|
||||
- (void)showDeleteAccountUI:(BOOL)isRegistered
|
||||
{
|
||||
__weak AppSettingsViewController *weakSelf = self;
|
||||
|
||||
UIAlertController *alert =
|
||||
[UIAlertController alertControllerWithTitle:NSLocalizedString(@"CONFIRM_ACCOUNT_DESTRUCTION_TITLE", @"")
|
||||
message:NSLocalizedString(@"CONFIRM_ACCOUNT_DESTRUCTION_TEXT", @"")
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"PROCEED_BUTTON", @"")
|
||||
style:UIAlertActionStyleDestructive
|
||||
handler:^(UIAlertAction *action) {
|
||||
[weakSelf deleteAccount:isRegistered];
|
||||
}]];
|
||||
[alert addAction:[OWSAlerts cancelAction]];
|
||||
|
||||
[self presentAlert:alert];
|
||||
}
|
||||
|
||||
- (void)deleteAccount:(BOOL)isRegistered
|
||||
{
|
||||
if (isRegistered) {
|
||||
[ModalActivityIndicatorViewController
|
||||
presentFromViewController:self
|
||||
canCancel:NO
|
||||
backgroundBlock:^(ModalActivityIndicatorViewController *modalActivityIndicator) {
|
||||
[TSAccountManager
|
||||
unregisterTextSecureWithSuccess:^{
|
||||
[SignalApp resetAppData];
|
||||
}
|
||||
failure:^(NSError *error) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[modalActivityIndicator dismissWithCompletion:^{
|
||||
[OWSAlerts
|
||||
showAlertWithTitle:NSLocalizedString(@"UNREGISTER_SIGNAL_FAIL", @"")];
|
||||
}];
|
||||
});
|
||||
}];
|
||||
}];
|
||||
} else {
|
||||
[SignalApp resetAppData];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sharePublicKey
|
||||
{
|
||||
NSString *hexEncodedPublicKey;
|
||||
NSString *masterDeviceHexEncodedPublicKey = [NSUserDefaults.standardUserDefaults stringForKey:@"masterDeviceHexEncodedPublicKey"];
|
||||
if (masterDeviceHexEncodedPublicKey != nil) {
|
||||
hexEncodedPublicKey = masterDeviceHexEncodedPublicKey;
|
||||
} else {
|
||||
hexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
|
||||
}
|
||||
UIActivityViewController *shareVC = [[UIActivityViewController alloc] initWithActivityItems:@[ hexEncodedPublicKey ] applicationActivities:nil];
|
||||
[self presentViewController:shareVC animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)showQRCode
|
||||
{
|
||||
// LKQRCodeModal *qrCodeModal = [LKQRCodeModal new];
|
||||
// qrCodeModal.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||||
// [self presentViewController:qrCodeModal animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)showSeed
|
||||
{
|
||||
LKSeedModal *seedModal = [LKSeedModal new];
|
||||
seedModal.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||||
[self presentViewController:seedModal animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)clearAllData
|
||||
{
|
||||
LKNukeDataModal *nukeDataModal = [LKNukeDataModal new];
|
||||
nukeDataModal.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||||
[self presentViewController:nukeDataModal animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)reregisterUser
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#pragma mark - Dark Theme
|
||||
|
||||
- (UIBarButtonItem *)darkThemeBarButton
|
||||
{
|
||||
UIBarButtonItem *barButtonItem;
|
||||
if (Theme.isDarkThemeEnabled) {
|
||||
barButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ic_dark_theme_on"]
|
||||
style:UIBarButtonItemStylePlain
|
||||
target:self
|
||||
action:@selector(didPressDisableDarkTheme:)];
|
||||
} else {
|
||||
barButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ic_dark_theme_off"]
|
||||
style:UIBarButtonItemStylePlain
|
||||
target:self
|
||||
action:@selector(didPressEnableDarkTheme:)];
|
||||
}
|
||||
barButtonItem.accessibilityIdentifier = ACCESSIBILITY_IDENTIFIER_WITH_NAME(self, @"dark_theme");
|
||||
return barButtonItem;
|
||||
}
|
||||
|
||||
- (void)didPressEnableDarkTheme:(id)sender
|
||||
{
|
||||
[Theme setIsDarkThemeEnabled:YES];
|
||||
[self updateRightBarButtonForTheme];
|
||||
[self updateTableContents];
|
||||
}
|
||||
|
||||
- (void)didPressDisableDarkTheme:(id)sender
|
||||
{
|
||||
[Theme setIsDarkThemeEnabled:NO];
|
||||
[self updateRightBarButtonForTheme];
|
||||
[self updateTableContents];
|
||||
}
|
||||
|
||||
- (void)updateRightBarButtonForTheme
|
||||
{
|
||||
self.navigationItem.rightBarButtonItem = [self darkThemeBarButton];
|
||||
}
|
||||
|
||||
#pragma mark - Socket Status Notifications
|
||||
|
||||
- (void)observeNotifications
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(socketStateDidChange)
|
||||
name:kNSNotification_OWSWebSocketStateDidChange
|
||||
object:nil];
|
||||
}
|
||||
|
||||
- (void)socketStateDidChange
|
||||
{
|
||||
OWSAssertIsOnMainThread();
|
||||
|
||||
[self updateTableContents];
|
||||
}
|
||||
|
||||
@end
|
@ -0,0 +1,31 @@
|
||||
|
||||
@objc(LKViewControllerUtilities)
|
||||
public final class ViewControllerUtilities : NSObject {
|
||||
|
||||
private override init() { }
|
||||
|
||||
@objc(setUpDefaultSessionStyleForVC:withTitle:)
|
||||
public static func setUpDefaultSessionStyle(for vc: UIViewController, title: String) {
|
||||
// Set gradient background
|
||||
vc.view.backgroundColor = .clear
|
||||
let gradient = Gradients.defaultLokiBackground
|
||||
vc.view.setGradient(gradient)
|
||||
// Set navigation bar background color
|
||||
if let navigationBar = vc.navigationController?.navigationBar {
|
||||
navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
|
||||
navigationBar.shadowImage = UIImage()
|
||||
navigationBar.isTranslucent = false
|
||||
navigationBar.barTintColor = Colors.navigationBarBackground
|
||||
}
|
||||
// Customize title
|
||||
let titleLabel = UILabel()
|
||||
titleLabel.text = title
|
||||
titleLabel.textColor = Colors.text
|
||||
titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize)
|
||||
vc.navigationItem.titleView = titleLabel
|
||||
// Set up back button
|
||||
let backButton = UIBarButtonItem(title: "Back", style: .plain, target: nil, action: nil)
|
||||
backButton.tintColor = Colors.text
|
||||
vc.navigationItem.backBarButtonItem = backButton
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue