Index: ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm |
diff --git a/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm b/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..099d6825a94a99dfbf35dc6d704431f1d74227d4 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm |
@@ -0,0 +1,168 @@ |
+// Copyright 2014 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/first_run/first_run_chrome_signin_view_controller.h" |
+ |
+#import "base/mac/scoped_nsobject.h" |
+#include "base/metrics/user_metrics.h" |
+#include "components/signin/core/browser/signin_metrics.h" |
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h" |
+#import "ios/chrome/browser/first_run/first_run_configuration.h" |
+#import "ios/chrome/browser/tabs/tab_model.h" |
+#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" |
+#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" |
+#import "ios/chrome/browser/ui/first_run/first_run_util.h" |
+#import "ios/chrome/browser/ui/promos/signin_promo_view_controller.h" |
+#include "ios/chrome/browser/ui/ui_util.h" |
+#include "ios/chrome/grit/ios_strings.h" |
+#import "ios/public/provider/chrome/browser/chrome_browser_provider.h" |
+#import "ios/public/provider/chrome/browser/signin/chrome_identity.h" |
+#import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" |
+#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" |
+#import "ui/base/l10n/l10n_util.h" |
+ |
+NSString* const kSignInButtonAccessibilityIdentifier = |
+ @"SignInButtonAccessibilityIdentifier"; |
+NSString* const kSignInSkipButtonAccessibilityIdentifier = |
+ @"SkipButtonAccessibilityIdentifier"; |
+ |
+@interface FirstRunChromeSigninViewController ()< |
+ ChromeSigninViewControllerDelegate> { |
+ TabModel* _tabModel; // weak |
+ base::scoped_nsobject<FirstRunConfiguration> _firstRunConfig; |
+ ChromeIdentity* _identity; |
+ BOOL _hasRecordedSigninStarted; |
+} |
+ |
+@end |
+ |
+@implementation FirstRunChromeSigninViewController |
+ |
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState |
+ tabModel:(TabModel*)tabModel |
+ firstRunConfig:(FirstRunConfiguration*)firstRunConfig |
+ signInIdentity:(ChromeIdentity*)identity { |
+ self = [super |
+ initWithBrowserState:browserState |
+ isPresentedOnSettings:NO |
+ signInAccessPoint:signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE |
+ signInIdentity:identity]; |
+ if (self) { |
+ _tabModel = tabModel; |
+ _firstRunConfig.reset([firstRunConfig retain]); |
+ _identity = identity; |
+ self.delegate = self; |
+ } |
+ return self; |
+} |
+ |
+- (void)dealloc { |
+ self.delegate = nil; |
+ _tabModel = nil; |
+ [super dealloc]; |
+} |
+ |
+- (void)viewDidLoad { |
+ [super viewDidLoad]; |
+ [self.navigationController setNavigationBarHidden:YES]; |
+ self.primaryButton.accessibilityIdentifier = |
+ kSignInButtonAccessibilityIdentifier; |
+ self.secondaryButton.accessibilityIdentifier = |
+ kSignInSkipButtonAccessibilityIdentifier; |
+} |
+ |
+- (void)viewDidAppear:(BOOL)animated { |
+ [super viewDidAppear:animated]; |
+ |
+ if (!_hasRecordedSigninStarted) { |
+ _hasRecordedSigninStarted = YES; |
+ base::RecordAction(base::UserMetricsAction("Signin_Signin_FromStartPage")); |
+ signin_metrics::LogSigninAccessPointStarted( |
+ signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE); |
+ } |
+ |
+ // Save the version number to prevent showing the SSO Recall promo on the next |
+ // cold start. |
+ [SigninPromoViewController recordVersionSeen]; |
+} |
+ |
+- (BOOL)shouldAutorotate { |
+ return IsIPadIdiom() ? [super shouldAutorotate] : NO; |
+} |
+ |
+- (void)finishFirstRunAndDismiss { |
+ DCHECK(self.presentingViewController); |
+ ios_internal::FinishFirstRun(self.browserState, [_tabModel currentTab], |
+ _firstRunConfig); |
+ [self.presentingViewController |
+ dismissViewControllerAnimated:YES |
+ completion:^{ |
+ ios_internal::FirstRunDismissed(); |
+ }]; |
+} |
+ |
+#pragma mark ChromeSigninViewControllerDelegate |
+ |
+- (void)willStartSignIn:(ChromeSigninViewController*)controller { |
+ DCHECK_EQ(self, controller); |
+ controller.shouldClearData = SHOULD_CLEAR_DATA_CLEAR_DATA; |
+ [_firstRunConfig setSignInAttempted:YES]; |
+} |
+ |
+- (void)willStartAddAccount:(ChromeSigninViewController*)controller { |
+ DCHECK_EQ(self, controller); |
+ [_firstRunConfig setSignInAttempted:YES]; |
+} |
+ |
+- (void)didSkipSignIn:(ChromeSigninViewController*)controller { |
+ DCHECK_EQ(self, controller); |
+ // User is done with First Run after explicit skip. |
+ [self finishFirstRunAndDismiss]; |
+} |
+ |
+- (void)didFailSignIn:(ChromeSigninViewController*)controller { |
+ DCHECK_EQ(self, controller); |
+} |
+ |
+- (void)didSignIn:(ChromeSigninViewController*)controller { |
+ DCHECK_EQ(self, controller); |
+ |
+ // User is considered done with First Run only after successful sign-in. |
+ ios_internal::WriteFirstRunSentinelAndRecordMetrics( |
+ self.browserState, YES, [_firstRunConfig hasSSOAccount]); |
+} |
+ |
+- (void)didUndoSignIn:(ChromeSigninViewController*)controller |
+ identity:(ChromeIdentity*)identity { |
+ DCHECK_EQ(self, controller); |
+ |
+ if ([_identity isEqual:identity]) { |
+ _identity = nil; |
+ // This is best effort. If the operation fails, the account will be left on |
+ // the device. The user will not be warned either as this call is |
+ // asynchronous (but undo is not), the application might be in an unknown |
+ // state when the forget identity operation finishes. |
+ ios::GetChromeBrowserProvider()->GetChromeIdentityService()->ForgetIdentity( |
+ identity, nil); |
+ [self.navigationController popViewControllerAnimated:YES]; |
+ } |
+} |
+ |
+- (void)didAcceptSignIn:(ChromeSigninViewController*)controller |
+ executeCommand:(GenericChromeCommand*)command { |
+ DCHECK_EQ(self, controller); |
+ |
+ // User is done with First Run after explicit sign-in accept. |
+ [self finishFirstRunAndDismiss]; |
+ [command executeOnMainWindow]; |
+} |
+ |
+#pragma mark ChromeSigninViewController |
+ |
+- (NSString*)skipSigninButtonTitle { |
+ return l10n_util::GetNSString( |
+ IDS_IOS_FIRSTRUN_ACCOUNT_CONSISTENCY_SKIP_BUTTON); |
+} |
+ |
+@end |