mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			186 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Matlab
		
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Matlab
		
	
| 
								 
											8 years ago
										 
									 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#import "SAEScreenLockViewController.h"
							 | 
						||
| 
								 | 
							
								#import "UIColor+OWS.h"
							 | 
						||
| 
								 | 
							
								#import <SignalMessaging/SignalMessaging-Swift.h>
							 | 
						||
| 
								 | 
							
								#import <SignalServiceKit/AppContext.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NS_ASSUME_NONNULL_BEGIN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@interface SAEScreenLockViewController () <ScreenLockViewDelegate>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@property (nonatomic, readonly, weak) id<ShareViewDelegate> shareViewDelegate;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@property (nonatomic) BOOL hasShownAuthUIOnce;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@property (nonatomic) BOOL isShowingAuthUI;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma mark -
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@implementation SAEScreenLockViewController
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (instancetype)initWithShareViewDelegate:(id<ShareViewDelegate>)shareViewDelegate
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    self = [super init];
							 | 
						||
| 
								 | 
							
								    if (!self) {
							 | 
						||
| 
								 | 
							
								        return self;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    _shareViewDelegate = shareViewDelegate;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.delegate = self;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return self;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)loadView
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [super loadView];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.view.backgroundColor = [UIColor ows_materialBlueColor];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.title = NSLocalizedString(@"SHARE_EXTENSION_VIEW_TITLE", @"Title for the 'share extension' view.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.navigationItem.leftBarButtonItem =
							 | 
						||
| 
								 | 
							
								        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
							 | 
						||
| 
								 | 
							
								                                                      target:self
							 | 
						||
| 
								 | 
							
								                                                      action:@selector(dismissPressed:)];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)viewWillAppear:(BOOL)animated
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [super viewWillAppear:animated];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [self ensureUI];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)viewDidAppear:(BOOL)animated
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [super viewDidAppear:animated];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [self ensureUI];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Auto-show the auth UI f
							 | 
						||
| 
								 | 
							
								    if (!self.hasShownAuthUIOnce) {
							 | 
						||
| 
								 | 
							
								        self.hasShownAuthUIOnce = YES;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [self tryToPresentAuthUIToUnlockScreenLock];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)dealloc
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // Surface memory leaks by logging the deallocation of view controllers.
							 | 
						||
| 
								 | 
							
								    DDLogVerbose(@"Dealloc: %@", self.class);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)tryToPresentAuthUIToUnlockScreenLock
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (self.isShowingAuthUI) {
							 | 
						||
| 
								 | 
							
								        // We're already showing the auth UI; abort.
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    DDLogInfo(@"%@, try to unlock screen lock", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    self.isShowingAuthUI = YES;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [OWSScreenLock.sharedManager tryToUnlockScreenLockWithSuccess:^{
							 | 
						||
| 
								 | 
							
								        OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        DDLogInfo(@"%@ unlock screen lock succeeded.", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.isShowingAuthUI = NO;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [self.shareViewDelegate shareViewWasUnlocked];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								        failure:^(NSError *error) {
							 | 
						||
| 
								 | 
							
								            OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            DDLogInfo(@"%@ unlock screen lock failed.", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            self.isShowingAuthUI = NO;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [self ensureUI];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [self showScreenLockFailureAlertWithMessage:error.localizedDescription];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        unexpectedFailure:^(NSError *error) {
							 | 
						||
| 
								 | 
							
								            OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            DDLogInfo(@"%@ unlock screen lock unexpectedly failed.", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            self.isShowingAuthUI = NO;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Local Authentication isn't working properly.
							 | 
						||
| 
								 | 
							
								            // This isn't covered by the docs or the forums but in practice
							 | 
						||
| 
								 | 
							
								            // it appears to be effective to retry again after waiting a bit.
							 | 
						||
| 
								 | 
							
								            dispatch_async(dispatch_get_main_queue(), ^{
							 | 
						||
| 
								 | 
							
								                [self ensureUI];
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        cancel:^{
							 | 
						||
| 
								 | 
							
								            OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            DDLogInfo(@"%@ unlock screen lock cancelled.", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            self.isShowingAuthUI = NO;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [self ensureUI];
							 | 
						||
| 
								 | 
							
								        }];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [self ensureUI];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)ensureUI
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [self updateUIWithState:ScreenLockUIStateScreenLock isLogoAtTop:NO animated:NO];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)showScreenLockFailureAlertWithMessage:(NSString *)message
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [OWSAlerts showAlertWithTitle:NSLocalizedString(@"SCREEN_LOCK_UNLOCK_FAILED",
							 | 
						||
| 
								 | 
							
								                                      @"Title for alert indicating that screen lock could not be unlocked.")
							 | 
						||
| 
								 | 
							
								                          message:message
							 | 
						||
| 
								 | 
							
								                      buttonTitle:nil
							 | 
						||
| 
								 | 
							
								                     buttonAction:^(UIAlertAction *action) {
							 | 
						||
| 
								 | 
							
								                         // After the alert, update the UI.
							 | 
						||
| 
								 | 
							
								                         [self ensureUI];
							 | 
						||
| 
								 | 
							
								                     }
							 | 
						||
| 
								 | 
							
								               fromViewController:self];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)dismissPressed:(id)sender
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    DDLogDebug(@"%@ tapped dismiss share button", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [self cancelShareExperience];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)cancelShareExperience
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    [self.shareViewDelegate shareViewWasCancelled];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma mark - ScreenLockViewDelegate
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								- (void)unlockButtonWasTapped
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    OWSAssertIsOnMainThread();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    DDLogInfo(@"%@ unlockButtonWasTapped", self.logTag);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    [self tryToPresentAuthUIToUnlockScreenLock];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								NS_ASSUME_NONNULL_END
							 |