| 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
|
|
|