123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660 |
- // _____ _
- // |_ _| |_ _ _ ___ ___ _ __ __ _
- // | | | ' \| '_/ -_) -_) ' \/ _` |_
- // |_| |_||_|_| \___\___|_|_|_\__,_(_)
- //
- // Threema iOS Client
- // Copyright (c) 2012-2020 Threema GmbH
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Affero General Public License, version 3,
- // as published by the Free Software Foundation.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Affero General Public License for more details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
- #import <MobileCoreServices/UTCoreTypes.h>
- #import "MyIdentityViewController.h"
- #import "MyIdentityStore.h"
- #import "ScanIdentityController.h"
- #import "ServerAPIConnector.h"
- #import "KKPasscodeLock.h"
- #import "ContactStore.h"
- #import "PasswordCallback.h"
- #import "CreatePasswordTrigger.h"
- #import "BackupIdentityViewController.h"
- #import "MBProgressHUD.h"
- #import "RevocationKeyHandler.h"
- #import "QRCodeGenerator.h"
- #import "NSString+Hex.h"
- #import "UserReminder.h"
- #import "AppDelegate.h"
- #import "UIImage+ColoredImage.h"
- #import "BundleUtil.h"
- #import "LicenseStore.h"
- #import "BrandingUtils.h"
- #import "UserSettings.h"
- #import "AvatarMaker.h"
- #import "FullscreenImageViewController.h"
- #import "ModalNavigationController.h"
- #import "ValidationLogger.h"
- #import "MDMSetup.h"
- #import "Threema-Swift.h"
- #import "ActivityUtil.h"
- #define SEGUE_NICKNAME @"EditProfile"
- #define SEGUE_SAFE_SETUP @"segueSafeSetup"
- #define THREEMA_ID_SHARE_LINK @"https://threema.id/"
- @interface MyIdentityViewController () <PasswordCallback, UIScrollViewDelegate, ModalNavigationControllerDelegate>
- @property RevocationKeyHandler *revocationKeyHandler;
- @end
- @implementation MyIdentityViewController {
- UIView *coverView;
- UIImageView *zoomingQrImageView;
- CGRect qrRect;
- CGRect qrZoomedRect;
- UIAlertController *deleteActionSheet;
-
- MDMSetup *mdmSetup;
- }
- @synthesize nickNameTitleLabel;
- @synthesize threemaIdTitleLabel;
- @synthesize threemaIdLabel;
- @synthesize threemaSafeLabel;
- @synthesize nickNameLabel;
- @synthesize keyFingerprintLabel;
- @synthesize qrBackgroundImageView;
- - (instancetype)initWithCoder:(NSCoder *)coder
- {
- self = [super initWithCoder:coder];
- if (self) {
- mdmSetup = [[MDMSetup alloc] initWithSetup:NO];
- }
- return self;
- }
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- if ([segue.destinationViewController isKindOfClass:[ModalNavigationController class]]) {
- ModalNavigationController *nav = segue.destinationViewController;
- nav.modalDelegate = self;
- }
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.navigationController.interactivePopGestureRecognizer.enabled = YES;
- self.navigationController.interactivePopGestureRecognizer.delegate = nil;
- if (![ScanIdentityController canScan])
- self.navigationItem.rightBarButtonItem = nil;
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ThreemaIdentityLinkedWithMobileNo" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(colorThemeChanged:) name:kNotificationColorThemeChanged object:nil];
- _revocationKeyHandler = [[RevocationKeyHandler alloc] init];
- [BrandingUtils updateTitleLogoOfNavigationItem:self.navigationItem navigationController:self.navigationController];
- UITapGestureRecognizer *imageTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedHeaderView)];
- [_imageView addGestureRecognizer:imageTapRecognizer];
- _imageView.accessibilityTraits = UIAccessibilityTraitButton;
- _imageView.isAccessibilityElement = NO;
- UITapGestureRecognizer *editTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedHeaderView)];
- [_editButton addGestureRecognizer:editTapRecognizer];
- _editButton.accessibilityTraits = UIAccessibilityTraitNone;
- _editButton.accessibilityLabel = [BundleUtil localizedStringForKey:@"edit_profile"];
-
- UITapGestureRecognizer *qrCodeTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showFullScreenQrView)];
- [_qrCodeButton addGestureRecognizer:qrCodeTapRecognizer];
- _qrCodeButton.accessibilityTraits = UIAccessibilityTraitNone;
- _qrCodeButton.accessibilityLabel = [BundleUtil localizedStringForKey:@"qr_code"];
-
- UITapGestureRecognizer *shareIdTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedShareThreemaId)];
- [_shareIdButton addGestureRecognizer:shareIdTapRecognizer];
- _shareIdButton.accessibilityTraits = UIAccessibilityTraitNone;
- _shareIdButton.accessibilityLabel = [BundleUtil localizedStringForKey:@"share_id"];
-
- if (@available(iOS 11.0, *)) {
- _imageView.accessibilityIgnoresInvertColors = true;
- }
- }
- - (void)dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- - (BOOL)shouldAutorotate {
- return YES;
- }
- -(UIInterfaceOrientationMask)supportedInterfaceOrientations {
- if (SYSTEM_IS_IPAD) {
- return UIInterfaceOrientationMaskAll;
- }
- return UIInterfaceOrientationMaskAllButUpsideDown;
- }
- - (void)appForeground:(NSNotification*)notification {
- /* must update view as the user may have come back from doing e-mail verification */
- [self updateView];
- }
- - (void)appResignActive:(NSNotification*)notification {
- [self hideFullScreenQrViewAnimated:NO];
- }
- - (void)colorThemeChanged:(NSNotification*)notification {
- [BrandingUtils updateTitleLogoOfNavigationItem:self.navigationItem navigationController:self.navigationController];
- [self updateColors];
- }
- - (void)viewWillAppear:(BOOL)animated {
- [super viewWillAppear:animated];
- [self hideFullScreenQrViewAnimated:NO];
- [self updateView];
- if (@available(iOS 11.0, *)) {
- self.navigationItem.largeTitleDisplayMode = [UserSettings sharedUserSettings].largeTitleDisplayMode;
- }
-
- // iOS fix where the logo is moved to the right sometimes
- if (self.navigationController.navigationBar.frame.size.height == 44.0 && [LicenseStore requiresLicenseKey]) {
- [BrandingUtils updateTitleLogoOfNavigationItem:self.navigationItem navigationController:self.navigationController];
- }
- else if (self.navigationController.navigationBar.frame.size.height == 44.0 && ![LicenseStore requiresLicenseKey] && self.navigationItem.titleView != nil) {
- [BrandingUtils updateTitleLogoOfNavigationItem:self.navigationItem navigationController:self.navigationController];
- }
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [self hideFullScreenQrViewAnimated:NO];
- [super viewWillDisappear:animated];
- }
- - (void)viewWillLayoutSubviews {
- [super viewWillLayoutSubviews];
- UIView *header = self.tableView.tableHeaderView;
- if (header) {
- CGSize newSize = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
- header.frame = CGRectMake(header.frame.origin.x, header.frame.origin.y, header.frame.size.width, newSize.height);
- }
- }
- - (void)updatePendingEmailLink {
- /* check status of e-mail link */
- ServerAPIConnector *conn = [[ServerAPIConnector alloc] init];
- [conn checkLinkEmailStatus:[MyIdentityStore sharedMyIdentityStore] email:[MyIdentityStore sharedMyIdentityStore].linkedEmail onCompletion:^(BOOL linked) {
- if (linked) {
- [MyIdentityStore sharedMyIdentityStore].linkEmailPending = NO;
- self.linkedEmailLabel.text = [MyIdentityStore sharedMyIdentityStore].linkedEmail;
- }
- } onError:^(NSError *error) {}];
- }
- - (void)updateView {
- _scanQrCodeBarButtonItem.accessibilityLabel = [BundleUtil localizedStringForKey:@"scan_identity"];
- threemaIdLabel.text = [MyIdentityStore sharedMyIdentityStore].identity;
- threemaIdLabel.accessibilityLabel = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"my_threema_id", @""), [MyIdentityStore sharedMyIdentityStore].identity];
- keyFingerprintLabel.text = [MyIdentityStore sharedMyIdentityStore].keyFingerprint;
- UIImage *qrCodeImage = [self renderQrCodeWithDimension:self.qrCodeButton.frame.size.width * [UIScreen mainScreen].scale];
- switch ([Colors getTheme]) {
- case ColorThemeDark:
- case ColorThemeDarkWork:
- qrCodeImage = [qrCodeImage imageWithTint:[UIColor whiteColor]];
- break;
- default:
- qrCodeImage = [qrCodeImage imageWithTint:[UIColor blackColor]];
- break;
- }
- [self.qrCodeButton setImage:qrCodeImage forState:UIControlStateNormal];
- /* linked e-mail */
- if ([MyIdentityStore sharedMyIdentityStore].linkedEmail != nil) {
- if ([MyIdentityStore sharedMyIdentityStore].linkEmailPending) {
- self.linkedEmailLabel.text = NSLocalizedString(@"(pending)", nil);
- [self updatePendingEmailLink];
- } else {
- self.linkedEmailLabel.text = [MyIdentityStore sharedMyIdentityStore].linkedEmail;
- }
- } else {
- self.linkedEmailLabel.text = @" ";
- }
- /* linked mobile number */
- if ([MyIdentityStore sharedMyIdentityStore].linkMobileNoPending) {
- self.linkedMobileNoLabel.text = NSLocalizedString(@"enter_code", nil);
- } else {
- if ([MyIdentityStore sharedMyIdentityStore].linkedMobileNo != nil)
- self.linkedMobileNoLabel.text = [NSString stringWithFormat:@"+%@", [MyIdentityStore sharedMyIdentityStore].linkedMobileNo];
- else
- self.linkedMobileNoLabel.text = @" ";
- }
- [self updateNickname];
- [self updateProfilePicture];
- [self updateColors];
- [self triggerRevocationKeyCheck];
- [self disabledCellsForMDM];
-
- [self updateThreemaSafe];
- }
- - (void)updateNickname {
- if ([MyIdentityStore sharedMyIdentityStore].pushFromName != nil && [MyIdentityStore sharedMyIdentityStore].pushFromName.length > 0) {
- self.nickNameLabel.text = [MyIdentityStore sharedMyIdentityStore].pushFromName;
- self.nickNameLabel.accessibilityLabel = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"id_completed_nickname", @""), [MyIdentityStore sharedMyIdentityStore].pushFromName];
- } else {
- self.nickNameLabel.text = [MyIdentityStore sharedMyIdentityStore].identity;
- self.nickNameLabel.accessibilityLabel = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"id_completed_nickname", @""), [MyIdentityStore sharedMyIdentityStore].identity];
- }
- }
- - (void)updateProfilePicture {
- NSData *profilePicture = [[MyIdentityStore sharedMyIdentityStore] profilePicture][@"ProfilePicture"];
- if (profilePicture) {
- _imageView.image = [UIImage imageWithData:profilePicture];
- _imageView.contentMode = UIViewContentModeScaleAspectFill;
- _imageView.layer.masksToBounds = YES;
- _imageView.layer.cornerRadius = _imageView.bounds.size.width / 2;
- } else {
- _imageView.image = [[AvatarMaker sharedAvatarMaker] unknownPersonImage];
- }
- _imageView.accessibilityLabel = NSLocalizedString(@"my_profilepicture", @"");
- }
- - (void)updateColors {
- nickNameTitleLabel.textColor = [Colors fontVeryLight];
- nickNameTitleLabel.shadowColor = nil;
- threemaIdTitleLabel.textColor = [Colors fontVeryLight];
- threemaIdTitleLabel.shadowColor = nil;
- nickNameLabel.textColor = [Colors fontNormal];
- nickNameLabel.shadowColor = nil;
- threemaIdLabel.textColor = [Colors fontNormal];
- threemaIdLabel.shadowColor = nil;
-
- UIImage *editImage = [self.editButton.imageView.image imageWithTint:[Colors main]];
- [self.editButton setImage:editImage forState:UIControlStateNormal];
-
- UIImage *shareIdImage = [self.shareIdButton.imageView.image imageWithTint:[Colors main]];
- [self.shareIdButton setImage:shareIdImage forState:UIControlStateNormal];
-
- UIColor *qrBackgroundColor;
- if ([Colors getTheme] == ColorThemeDark || [Colors getTheme] == ColorThemeDarkWork) {
- qrBackgroundColor = [Colors chatBarBackground];
- } else {
- qrBackgroundColor = [Colors fontInverted];
- }
- UIImage *qrBackgroundImage = [self.qrBackgroundImageView.image imageWithTint:qrBackgroundColor];
- qrBackgroundImageView.image = qrBackgroundImage;
-
- UIImage *qrCodeImage = self.qrCodeButton.imageView.image;
- switch ([Colors getTheme]) {
- case ColorThemeDark:
- case ColorThemeDarkWork:
- qrCodeImage = [qrCodeImage imageWithTint:[UIColor whiteColor]];
- break;
- default:
- qrCodeImage = [qrCodeImage imageWithTint:[UIColor blackColor]];
- break;
- }
- [self.qrCodeButton setImage:qrCodeImage forState:UIControlStateNormal];
- }
- - (void)updateThreemaSafe {
- SafeConfigManager *safeConfigManager = [[SafeConfigManager alloc] init];
- SafeStore *safeStore = [[SafeStore alloc] initWithSafeConfigManagerAsObject:safeConfigManager serverApiConnector:[[ServerAPIConnector alloc] init]];
- SafeManager *safeManager = [[SafeManager alloc] initWithSafeConfigManagerAsObject:safeConfigManager safeStore:safeStore safeApiService:[[SafeApiService alloc] init]];
- if ([safeManager isActivated]) {
- self.threemaSafeLabel.text = [BundleUtil localizedStringForKey:@"On"];
- } else {
- self.threemaSafeLabel.text = [BundleUtil localizedStringForKey:@"Off"];
- }
- }
- - (void)triggerRevocationKeyCheck {
- [_revocationKeyHandler updateLastSetDateForLabel:_revocationLabelDetail];
- }
- - (void)fullScreenQrCodeTapped:(UITapGestureRecognizer *)sender {
- if (sender.state == UIGestureRecognizerStateEnded) {
- [self hideFullScreenQrViewAnimated:YES];
- }
- }
- - (void)showFullScreenQrView {
- /* QR code */
- qrRect = _qrCodeButton.frame;
- qrZoomedRect = [_qrCodeButton.superview convertRect:qrRect toView:self.view.superview];
- /* Center in view with margin */
- CGRect contentRect = self.view.superview.frame;
- int maxw = contentRect.size.width - 40;
- int maxh = contentRect.size.height - 40;
- int dim = MIN(maxw, maxh);
- CGRect qrZoomedTargetRect = CGRectMake((contentRect.size.width - dim) / 2, (contentRect.size.height - dim) / 2, dim, dim);
- coverView = [[UIView alloc] initWithFrame:self.view.frame];
- coverView.alpha = 0.0;
- coverView.backgroundColor = [UIColor whiteColor];
- coverView.accessibilityLabel = @"CoverView";
- zoomingQrImageView = [[UIImageView alloc] initWithFrame:qrZoomedRect];
- zoomingQrImageView.image = [self renderQrCodeWithDimension:self.view.frame.size.width * [UIScreen mainScreen].scale];
- zoomingQrImageView.alpha = 0.0;
- zoomingQrImageView.accessibilityLabel = @"Big qr code";
- [coverView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fullScreenQrCodeTapped:)]];
- [self.view.superview addSubview:coverView];
- [self.view.superview addSubview:zoomingQrImageView];
- [UIView animateWithDuration:0.5 animations:^{
- coverView.alpha = 1.0;
- zoomingQrImageView.frame = qrZoomedTargetRect;
- zoomingQrImageView.alpha = 1.0;
- }];
- }
- - (void)hideFullScreenQrViewAnimated:(BOOL)animated {
- if (coverView == nil)
- return;
- if (animated) {
- [UIView animateWithDuration:0.5 animations:^{
- coverView.alpha = 0.0;
- zoomingQrImageView.frame = qrZoomedRect;
- zoomingQrImageView.alpha = 0.0;
- } completion:^(BOOL finished) {
- [coverView removeFromSuperview];
- [zoomingQrImageView removeFromSuperview];
- coverView = nil;
- zoomingQrImageView = nil;
- }];
- } else {
- [coverView removeFromSuperview];
- [zoomingQrImageView removeFromSuperview];
- coverView = nil;
- zoomingQrImageView = nil;
- }
- }
- - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
- [self hideFullScreenQrViewAnimated:NO];
- }
- - (void)createBackup {
- CreatePasswordTrigger *passwordTrigger = [CreatePasswordTrigger createPasswordTriggerOn: self];
- passwordTrigger.passwordCallback = self;
- passwordTrigger.passwordAdditionalText = NSLocalizedString(@"password_description_backup", nil);
- [passwordTrigger presentPasswordUI];
- }
- - (void)createRevocationKey {
- CreatePasswordTrigger *passwordTrigger = [CreatePasswordTrigger createPasswordTriggerOn: self];
- passwordTrigger.passwordCallback = _revocationKeyHandler;
- passwordTrigger.passwordTitle = NSLocalizedString(@"revocation_password", nil);
- passwordTrigger.passwordAdditionalText = NSLocalizedString(@"revocation_password_description", nil);
- [passwordTrigger presentPasswordUI];
- }
- - (void)scrollToLinkSection {
- [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
- }
- - (void)startSetPublicNickname {
- [self performSegueWithIdentifier:SEGUE_NICKNAME sender:self];
- }
- - (void)showSafeSetup {
- [self performSegueWithIdentifier:SEGUE_SAFE_SETUP sender:self];
- }
- - (UIImage*)renderQrCodeWithDimension:(int)dimension {
- MyIdentityStore *myIdentityStore = [MyIdentityStore sharedMyIdentityStore];
- if (!myIdentityStore.isProvisioned) {
- return nil;
- }
- NSMutableString *qrString = [NSMutableString stringWithString:@"3mid:"];
- [qrString appendString:myIdentityStore.identity];
- [qrString appendString:@","];
- [qrString appendString:[NSString stringWithHexData:myIdentityStore.publicKey]];
- return [QRCodeGenerator renderQrCodeString:qrString withDimension:dimension];
- }
- - (void)disabledCellsForMDM {
-
- // isReadonlyProfile
- self.linkEmailCell.userInteractionEnabled = ![mdmSetup readonlyProfile];
- self.linkEmailCell.textLabel.enabled = ![mdmSetup readonlyProfile];
- self.linkPhoneCell.userInteractionEnabled = ![mdmSetup readonlyProfile];
- self.linkPhoneCell.textLabel.enabled = ![mdmSetup readonlyProfile];
-
- self.idRecoveryCell.userInteractionEnabled = ![mdmSetup readonlyProfile];
- self.idRecoveryCell.textLabel.enabled = ![mdmSetup readonlyProfile];
- self.deleteIdCell.userInteractionEnabled = ![mdmSetup readonlyProfile];
- self.deleteIdCell.textLabel.enabled = ![mdmSetup readonlyProfile];
- self.deleteIdCell.textLabel.text = [BundleUtil localizedStringForKey:@"delete_identity"];
- // disableBackups
- self.backupCell.userInteractionEnabled = !(mdmSetup.disableBackups || mdmSetup.disableIdExport);
- self.backupCell.textLabel.enabled = !(mdmSetup.disableBackups || mdmSetup.disableIdExport);
-
- self.threemaSafeCell.userInteractionEnabled = ![mdmSetup isSafeBackupDisable];
- self.threemaSafeCell.textLabel.enabled = ![mdmSetup isSafeBackupDisable];
- }
- - (void)tappedHeaderView {
- [self performSegueWithIdentifier:@"EditProfile" sender:nil];
- }
- - (void)tappedShareThreemaId {
- NSString *threemaShareText = [BundleUtil localizedStringForKey:@"profile_share_id_text"];
- NSString *threemaShareLink = [NSString stringWithFormat:@"%@: %@%@", threemaShareText, THREEMA_ID_SHARE_LINK, [[MyIdentityStore sharedMyIdentityStore] identity]];
- UIActivityViewController *activityViewController = [ActivityUtil activityViewControllerWithActivityItems:@[threemaShareLink] applicationActivities:nil];
- if (SYSTEM_IS_IPAD == YES) {
- activityViewController.popoverPresentationController.sourceRect = _shareIdButton.frame;
- activityViewController.popoverPresentationController.sourceView = self.view;
- }
- [self presentViewController:activityViewController animated:YES completion:nil];
- }
- #pragma mark - Table view delegate
- - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (indexPath.section == 3 && indexPath.row == 0) {
- // handle custom table cells
- [Colors updateTableViewCellBackground:cell];
- [Colors setTextColor:[Colors red] inView:cell.contentView];
- } else {
- [Colors updateTableViewCell:cell];
- }
- if (indexPath.section == 0) {
- self.keyFingerprintLabel.textColor = [Colors fontLight];
- }
- }
- - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
- if (section == 0 && ![mdmSetup readonlyProfile] && ![mdmSetup disableBackups] && [mdmSetup disableAddContact]) {
- return NSLocalizedString(@"disabled_by_device_policy", nil);
- }
- else if (section == 1) {
- return NSLocalizedString(![mdmSetup isSafeBackupDisable] ? @"safe_enable_explain_short" : @"disabled_by_device_policy", nil);
- }
- else if (section == 2 && ([mdmSetup readonlyProfile] || [mdmSetup disableBackups] || [mdmSetup disableIdExport])) {
- return NSLocalizedString(@"disabled_by_device_policy", nil);
- }
- return nil;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
- if (section == 0) {
- return 0.0;
- }
- return UITableViewAutomaticDimension;
- }
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
-
- if (indexPath.section == 0 && indexPath.row == 0) {
- /* Link mobile no */
- if ([MyIdentityStore sharedMyIdentityStore].linkMobileNoPending)
- [self performSegueWithIdentifier:@"EnterCode" sender:self];
- else
- [self performSegueWithIdentifier:@"LinkMobileNo" sender:self];
- } else if (indexPath.section == 2 && indexPath.row == 1) {
- [self createBackup];
- } else if (indexPath.section == 2 && indexPath.row == 2) {
- [self createRevocationKey];
- } else if (indexPath.section == 3 && indexPath.row == 0) {
- UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
- [self deleteIdentity:cell];
- }
- [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
- }
- - (IBAction)deleteIdentity:(id)sender {
- if ([KKPasscodeLock sharedLock].isPasscodeRequired) {
- [UIAlertTemplate showAlertWithOwner:self title:NSLocalizedString(@"delete_identity_passcode_title", nil) message:NSLocalizedString(@"delete_identity_passcode_message", nil) actionOk:nil];
- return;
- }
- deleteActionSheet = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"delete_identity_warning", nil) message:nil preferredStyle:UIAlertControllerStyleActionSheet];
- [deleteActionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"delete_identity", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {
- UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"delete_identity", nil) message:NSLocalizedString(@"delete_identity_warning2", nil) preferredStyle:UIAlertControllerStyleAlert];
- [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
- }]];
- [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"delete_identity", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {
- /* they wanted it that way... */
- [[MyIdentityStore sharedMyIdentityStore] destroy];
- SafeConfigManager *safeConfigManager = [[SafeConfigManager alloc] init];
- [safeConfigManager destroy];
- SafeStore *safeStore = [[SafeStore alloc] initWithSafeConfigManagerAsObject:safeConfigManager serverApiConnector:[[ServerAPIConnector alloc] init]];
- SafeManager *safeManager = [[SafeManager alloc] initWithSafeConfigManagerAsObject:safeConfigManager safeStore:safeStore safeApiService:[[SafeApiService alloc] init]];
- [safeManager setBackupReminder];
- if ([LicenseStore requiresLicenseKey]) {
- // Delete the license when we delete the ID, to give the user a chance to use a new license.
- // The license may have been supplied by MDM, so we load it again.
- [[LicenseStore sharedLicenseStore] deleteLicense];
- [mdmSetup loadLicenseInfo];
- if ([LicenseStore sharedLicenseStore].licenseUsername == nil || [LicenseStore sharedLicenseStore].licensePassword == nil)
- [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationLicenseMissing object:nil];
- [mdmSetup deleteThreemaMdm];
- }
- // Show information about delete all data
- UIStoryboard *storyboard = [AppDelegate getMyIdentityStoryboard];
- UIViewController *deleteIdViewControiller = [storyboard instantiateViewControllerWithIdentifier:@"DeleteIdViewController"];
- deleteIdViewControiller.modalPresentationStyle = UIModalPresentationFullScreen;
- [self presentViewController:deleteIdViewControiller animated:YES completion:nil];
- }]];
- [self presentViewController:alert animated:YES completion:nil];
- }]];
- [deleteActionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
- }]];
- if ([sender isKindOfClass:[UIView class]]) {
- UIView *senderView = (UIView *)sender;
- deleteActionSheet.popoverPresentationController.sourceRect = senderView.frame;
- deleteActionSheet.popoverPresentationController.sourceView = self.view;
- }
- [self presentViewController:deleteActionSheet animated:YES completion:nil];
- }
- - (IBAction)scanIdentity:(id)sender {
- if ([mdmSetup disableAddContact]) {
- [UIAlertTemplate showAlertWithOwner:self title:@"" message:NSLocalizedString(@"disabled_by_device_policy", nil) actionOk:nil];
- return;
- }
- ScanIdentityController *scanIdentityController = [[ScanIdentityController alloc] init];
- scanIdentityController.containingViewController = self;
- [scanIdentityController startScan];
- /* a good opportunity to sync contacts - maybe we find the contact
- that the user is about to scan */
- [[ContactStore sharedContactStore] synchronizeAddressBookForceFullSync:YES onCompletion:nil onError:nil];
- }
- #pragma mark - PasswordCallback
- -(void)passwordResult:(NSString *)password fromViewController:(UIViewController *)viewController {
- [MBProgressHUD showHUDAddedTo:viewController.view animated:YES];
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- NSString *backupData = [[MyIdentityStore sharedMyIdentityStore] backupIdentityWithPassword:password];
-
- dispatch_async(dispatch_get_main_queue(), ^{
- [MBProgressHUD hideHUDForView:viewController.view animated:YES];
- UIStoryboard *storyboard = [AppDelegate getMainStoryboard];
- BackupIdentityViewController *idVc = [storyboard instantiateViewControllerWithIdentifier: @"BackupIdentityViewController"];
- idVc.backupData = backupData;
- [viewController.navigationController pushViewController:idVc animated:YES];
- });
- });
- }
- #pragma mark - UIScrollViewDelegate
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
- if (![LicenseStore requiresLicenseKey]) {
- if ([[self.navigationController navigationBar] frame].size.height < 60.0 && self.navigationItem.titleView != nil) {
- self.navigationItem.titleView = nil;
- self.navigationItem.title = [BundleUtil localizedStringForKey:@"myIdentity"];
- }
- else if ([[self.navigationController navigationBar] frame].size.height >= 59.5 && self.navigationItem.titleView == nil) {
- [BrandingUtils updateTitleLogoOfNavigationItem:self.navigationItem navigationController:self.navigationController];
- }
- }
- }
- - (void)willDismissModalNavigationController {
- [self updateView];
- }
- @end
|