|  |  |  | @ -37,14 +37,23 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     self.title = NSLocalizedString(@"ENABLE_2FA_VIEW_TITLE", @"Title for the 'enable two factor auth PIN' views."); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [self createContents]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)createContents | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     for (UIView *subview in self.view.subviews) { | 
		
	
		
			
				|  |  |  |  |         [subview removeFromSuperview]; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_Status: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: | 
		
	
		
			
				|  |  |  |  |             [self createStatusContents]; | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |             [self createSelectCodeContents]; | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |             [self createConfirmCodeContents]; | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					|  |  |  | @ -52,10 +61,26 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | - (void)viewWillAppear:(BOOL)animated | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |             OWSAssert(![OWS2FAManager.sharedManager is2FAEnabled]); | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [super viewWillAppear:animated]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // If we're using a table, refresh its contents. | 
		
	
		
			
				|  |  |  |  |     [self updateTableContents]; | 
		
	
		
			
				|  |  |  |  |     if (self.mode == OWS2FASettingsMode_Status) { | 
		
	
		
			
				|  |  |  |  |         // Ever time we re-enter the "status" view, recreate its | 
		
	
		
			
				|  |  |  |  |         // contents wholesale since we may have just enabled or | 
		
	
		
			
				|  |  |  |  |         // disabled 2FA. | 
		
	
		
			
				|  |  |  |  |         [self createContents]; | 
		
	
		
			
				|  |  |  |  |     } else { | 
		
	
		
			
				|  |  |  |  |         // If we're using a table, refresh its contents. | 
		
	
		
			
				|  |  |  |  |         [self updateTableContents]; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     [self updateNavigationItems]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					|  |  |  | @ -86,15 +111,15 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  |     self.pinTextfield = [UITextField new]; | 
		
	
		
			
				|  |  |  |  |     self.pinTextfield.textColor = [UIColor blackColor]; | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |             self.pinTextfield.placeholder = NSLocalizedString(@"ENABLE_2FA_VIEW_SELECT_PIN_DEFAULT_TEXT", | 
		
	
		
			
				|  |  |  |  |                 @"Text field placeholder for 'two factor auth pin' when selecting a pin."); | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |             self.pinTextfield.placeholder = NSLocalizedString(@"ENABLE_2FA_VIEW_CONFIRM_PIN_DEFAULT_TEXT", | 
		
	
		
			
				|  |  |  |  |                 @"Text field placeholder for 'two factor auth pin' when confirming a pin."); | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_Status: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: | 
		
	
		
			
				|  |  |  |  |             OWSFail(@"%@ invalid mode.", self.logTag) break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     self.pinTextfield.font = [UIFont ows_mediumFontWithSize:ScaleFromIPhone5To7Plus(30.f, 36.f)]; | 
		
	
	
		
			
				
					|  |  |  | @ -198,7 +223,7 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Only some modes use a table. | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_Status: { | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: { | 
		
	
		
			
				|  |  |  |  |             OWSTableContents *contents = [OWSTableContents new]; | 
		
	
		
			
				|  |  |  |  |             OWSTableSection *section = [OWSTableSection new]; | 
		
	
		
			
				|  |  |  |  |             if ([OWS2FAManager.sharedManager is2FAEnabled]) { | 
		
	
	
		
			
				
					|  |  |  | @ -222,8 +247,8 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  |             self.tableViewController.contents = contents; | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |             return; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					|  |  |  | @ -231,10 +256,10 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  | - (BOOL)shouldHaveNextButton | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_Status: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: | 
		
	
		
			
				|  |  |  |  |             return NO; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: | 
		
	
		
			
				|  |  |  |  |             return [self hasValidPin]; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					|  |  |  | @ -325,20 +350,21 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  |     DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     switch (self.mode) { | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_Status: | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_Status: | 
		
	
		
			
				|  |  |  |  |             OWSFail(@"%@ status mode should not have a next button.", self.logTag); | 
		
	
		
			
				|  |  |  |  |             return; | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_SelectPIN: { | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_SelectPIN: { | 
		
	
		
			
				|  |  |  |  |             OWSAssert(self.hasValidPin); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             OWS2FASettingsViewController *vc = [OWS2FASettingsViewController new]; | 
		
	
		
			
				|  |  |  |  |             vc.mode = Enable2FAMode_ConfirmPIN; | 
		
	
		
			
				|  |  |  |  |             vc.mode = OWS2FASettingsMode_ConfirmPIN; | 
		
	
		
			
				|  |  |  |  |             vc.candidatePin = self.pinTextfield.text; | 
		
	
		
			
				|  |  |  |  |             vc.root2FAViewController = self; | 
		
	
		
			
				|  |  |  |  |             OWSAssert(self.root2FAViewController); | 
		
	
		
			
				|  |  |  |  |             vc.root2FAViewController = self.root2FAViewController; | 
		
	
		
			
				|  |  |  |  |             [self.navigationController pushViewController:vc animated:YES]; | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         case Enable2FAMode_ConfirmPIN: { | 
		
	
		
			
				|  |  |  |  |         case OWS2FASettingsMode_ConfirmPIN: { | 
		
	
		
			
				|  |  |  |  |             OWSAssert(self.hasValidPin); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             if ([self.pinTextfield.text isEqualToString:self.candidatePin]) { | 
		
	
	
		
			
				
					|  |  |  | @ -370,7 +396,7 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  |     DDLogInfo(@"%@ %s", self.logTag, __PRETTY_FUNCTION__); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     OWS2FASettingsViewController *vc = [OWS2FASettingsViewController new]; | 
		
	
		
			
				|  |  |  |  |     vc.mode = Enable2FAMode_SelectPIN; | 
		
	
		
			
				|  |  |  |  |     vc.mode = OWS2FASettingsMode_SelectPIN; | 
		
	
		
			
				|  |  |  |  |     vc.root2FAViewController = self; | 
		
	
		
			
				|  |  |  |  |     [self.navigationController pushViewController:vc animated:YES]; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					|  |  |  | @ -394,7 +420,7 @@ NS_ASSUME_NONNULL_BEGIN | 
		
	
		
			
				|  |  |  |  |                       } | 
		
	
		
			
				|  |  |  |  |                           failure:^(NSError *error) { | 
		
	
		
			
				|  |  |  |  |                               [modalActivityIndicator dismissWithCompletion:^{ | 
		
	
		
			
				|  |  |  |  |                                   [weakSelf updateTableContents]; | 
		
	
		
			
				|  |  |  |  |                                   [weakSelf createContents]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |                                   [OWSAlerts | 
		
	
		
			
				|  |  |  |  |                                       showAlertWithTitle:NSLocalizedString(@"ALERT_ERROR_TITLE", @"") | 
		
	
	
		
			
				
					|  |  |  | 
 |