Index: ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm |
diff --git a/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..be5191f82aca71d92d8998691302aee02066bfcb |
--- /dev/null |
+++ b/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm |
@@ -0,0 +1,173 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.h" |
+ |
+#import <UIKit/UIKit.h> |
+ |
+#include "base/logging.h" |
+#import "base/mac/foundation_util.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "components/strings/grit/components_strings.h" |
+#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" |
+#import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
+#import "ios/chrome/browser/ui/settings/cells/byo_textfield_item.h" |
+#include "ios/chrome/grit/ios_strings.h" |
+#import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" |
+#include "ui/base/l10n/l10n_util_mac.h" |
+ |
+using namespace ios_internal::sync_encryption_passphrase; |
+ |
+@interface SyncCreatePassphraseCollectionViewController () { |
+ base::scoped_nsobject<UITextField> confirmPassphrase_; |
+} |
+// Returns a confirm passphrase item. |
+- (CollectionViewItem*)confirmPassphraseItem; |
+@end |
+ |
+@implementation SyncCreatePassphraseCollectionViewController |
+ |
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState { |
+ self = [super initWithBrowserState:browserState]; |
+ if (self) { |
+ self.title = |
+ l10n_util::GetNSString(IDS_IOS_SYNC_ENCRYPTION_CREATE_PASSPHRASE); |
+ self.headerMessage = nil; |
+ self.footerMessage = |
+ l10n_util::GetNSString(IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_INFO), |
+ self.processingMessage = |
+ l10n_util::GetNSString(IDS_IOS_SYNC_PASSPHRASE_ENCRYPTING); |
+ |
+ [self loadModel]; |
+ } |
+ return self; |
+} |
+ |
+#pragma mark - View lifecycle |
+ |
+- (void)didReceiveMemoryWarning { |
+ [super didReceiveMemoryWarning]; |
+ if (![self isViewLoaded]) { |
+ confirmPassphrase_.reset(); |
+ } |
+} |
+ |
+- (void)viewDidDisappear:(BOOL)animated { |
+ [super viewDidDisappear:animated]; |
+ if ([self isMovingFromParentViewController]) { |
+ [self unregisterTextField:self.confirmPassphrase]; |
+ } |
+} |
+ |
+#pragma mark - SettingsRootCollectionViewController |
+ |
+- (void)loadModel { |
+ [super loadModel]; |
+ CollectionViewModel* model = self.collectionViewModel; |
+ |
+ NSInteger enterPassphraseIndex = |
+ [model indexPathForItemType:ItemTypeEnterPassphrase |
+ sectionIdentifier:SectionIdentifierPassphrase] |
+ .item; |
+ [model insertItem:[self confirmPassphraseItem] |
+ inSectionWithIdentifier:SectionIdentifierPassphrase |
+ atIndex:enterPassphraseIndex + 1]; |
+} |
+ |
+#pragma mark - Items |
+ |
+- (CollectionViewItem*)confirmPassphraseItem { |
+ if (!confirmPassphrase_) { |
+ confirmPassphrase_.reset([[UITextField alloc] init]); |
+ [confirmPassphrase_ setFont:[MDCTypography body1Font]]; |
+ [confirmPassphrase_ setSecureTextEntry:YES]; |
+ [confirmPassphrase_ setBackgroundColor:[UIColor clearColor]]; |
+ [confirmPassphrase_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
+ [confirmPassphrase_ setAutocorrectionType:UITextAutocorrectionTypeNo]; |
+ [confirmPassphrase_ |
+ setPlaceholder:l10n_util::GetNSString( |
+ IDS_IOS_SYNC_CONFIRM_PASSPHRASE_LABEL)]; |
+ [self registerTextField:confirmPassphrase_]; |
+ } |
+ |
+ BYOTextFieldItem* item = [[[BYOTextFieldItem alloc] |
+ initWithType:ItemTypeConfirmPassphrase] autorelease]; |
+ item.textField = confirmPassphrase_; |
+ return item; |
+} |
+ |
+#pragma mark UICollectionViewDelegate |
+ |
+- (void)collectionView:(UICollectionView*)collectionView |
+ didSelectItemAtIndexPath:(NSIndexPath*)indexPath { |
+ [super collectionView:collectionView didSelectItemAtIndexPath:indexPath]; |
+ NSInteger itemType = |
+ [self.collectionViewModel itemTypeForIndexPath:indexPath]; |
+ if (itemType == ItemTypeConfirmPassphrase) { |
+ [confirmPassphrase_ becomeFirstResponder]; |
+ } |
+} |
+ |
+#pragma mark SyncEncryptionPassphraseCollectionViewController |
+ |
+- (BOOL)forDecryption { |
+ return NO; |
+} |
+ |
+- (void)signInPressed { |
+ NSString* passphraseText = [self.passphrase text]; |
+ NSString* confirmPassphraseText = [confirmPassphrase_ text]; |
+ if (![self areAllFieldsFilled]) { |
+ [self clearFieldsOnError:l10n_util::GetNSString( |
+ IDS_SYNC_EMPTY_PASSPHRASE_ERROR)]; |
+ [self reloadData]; |
+ return; |
+ } else if (![passphraseText isEqualToString:confirmPassphraseText]) { |
+ [self clearFieldsOnError:l10n_util::GetNSString( |
+ IDS_SYNC_PASSPHRASE_MISMATCH_ERROR)]; |
+ [self reloadData]; |
+ return; |
+ } |
+ |
+ [super signInPressed]; |
+} |
+ |
+- (BOOL)areAllFieldsFilled { |
+ return [super areAllFieldsFilled] && [self.confirmPassphrase text].length > 0; |
+} |
+ |
+- (void)clearFieldsOnError:(NSString*)errorMessage { |
+ [super clearFieldsOnError:errorMessage]; |
+ [self.confirmPassphrase setText:@""]; |
+} |
+ |
+#pragma mark - UIControl event listener |
+ |
+- (void)textFieldDidEndEditing:(id)sender { |
+ if (sender == self.passphrase) { |
+ [confirmPassphrase_ becomeFirstResponder]; |
+ } else if (sender == self.confirmPassphrase) { |
+ if ([self areAllFieldsFilled]) { |
+ // The right nav bar button is disabled when either of the text fields is |
+ // empty. Hitting return when a text field is empty should not cause the |
+ // password to be applied. |
+ [self signInPressed]; |
+ } else { |
+ [self clearFieldsOnError:l10n_util::GetNSString( |
+ IDS_SYNC_EMPTY_PASSPHRASE_ERROR)]; |
+ [self reloadData]; |
+ } |
+ } |
+} |
+ |
+@end |
+ |
+@implementation SyncCreatePassphraseCollectionViewController (UsedForTesting) |
+ |
+- (UITextField*)confirmPassphrase { |
+ return confirmPassphrase_; |
+} |
+ |
+@end |