Commit 87981061 authored by Jérôme Lebel's avatar Jérôme Lebel Committed by Commit Bot

[iOS] Implementation of AdvancedSettingsSigninCoordinator

AdvancedSettingsSigninCoordinator present the advanced settings during
sign-in process.
This patch add the implementation of AdvancedSettingsSigninCoordinator,
and removes the old implementation.

See http://go/chrome-ios-signin-migration

Bug: 971989
Change-Id: Id60834f575284ba48cdafc4a3b9a8e227a2a43ee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2050568
Commit-Queue: Jérôme Lebel <jlebel@chromium.org>
Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746448}
parent ea2e86bb
...@@ -9,7 +9,34 @@ source_set("advanced_settings_signin") { ...@@ -9,7 +9,34 @@ source_set("advanced_settings_signin") {
sources = [ sources = [
"advanced_settings_signin_coordinator.h", "advanced_settings_signin_coordinator.h",
"advanced_settings_signin_coordinator.mm", "advanced_settings_signin_coordinator.mm",
"advanced_settings_signin_mediator.h",
"advanced_settings_signin_mediator.mm",
"advanced_settings_signin_navigation_controller.h",
"advanced_settings_signin_navigation_controller.mm",
] ]
public_deps = public_deps =
[ "//ios/chrome/browser/ui/authentication/signin:signin_headers" ] [ "//ios/chrome/browser/ui/authentication/signin:signin_headers" ]
deps = [
":constants",
"//components/sync",
"//components/unified_consent",
"//ios/chrome/app/strings",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/signin",
"//ios/chrome/browser/sync",
"//ios/chrome/browser/ui/alert_coordinator",
"//ios/chrome/browser/ui/authentication/signin:signin_protected",
"//ios/chrome/browser/ui/settings:settings_controller_protocol",
"//ios/chrome/browser/ui/settings/google_services:constants",
"//ios/web/public",
"//ui/base",
]
}
source_set("constants") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"advanced_settings_signin_constants.h",
"advanced_settings_signin_constants.mm",
]
} }
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_ #ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_CONSTANTS_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_ #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_CONSTANTS_H_
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
...@@ -13,4 +13,4 @@ extern NSString* const kSyncSettingsConfirmButtonId; ...@@ -13,4 +13,4 @@ extern NSString* const kSyncSettingsConfirmButtonId;
// The accessibility identifier for the navigation "Cancel" button. // The accessibility identifier for the navigation "Cancel" button.
extern NSString* const kSyncSettingsCancelButtonId; extern NSString* const kSyncSettingsCancelButtonId;
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_ #endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_CONSTANTS_H_
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h" #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
......
...@@ -4,20 +4,241 @@ ...@@ -4,20 +4,241 @@
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h" #import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_coordinator.h"
#import "base/metrics/user_metrics.h"
#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/signin/authentication_service.h"
#import "ios/chrome/browser/signin/authentication_service_factory.h"
#import "ios/chrome/browser/sync/profile_sync_service_factory.h"
#import "ios/chrome/browser/sync/sync_setup_service.h"
#import "ios/chrome/browser/sync/sync_setup_service_factory.h"
#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.h"
#import "ios/chrome/browser/ui/authentication/signin/signin_coordinator+protected.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_mode.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
using base::RecordAction;
using base::UserMetricsAction;
using l10n_util::GetNSString;
@interface AdvancedSettingsSigninCoordinator () <
AdvancedSettingsSigninNavigationControllerNavigationDelegate,
UIAdaptivePresentationControllerDelegate>
// Advanced settings sign-in mediator.
@property(nonatomic, strong)
AdvancedSettingsSigninMediator* advancedSettingsSigninMediator;
// View controller presented by this coordinator.
@property(nonatomic, strong) AdvancedSettingsSigninNavigationController*
advancedSettingsSigninNavigationController;
// Google services settings coordinator.
@property(nonatomic, strong)
GoogleServicesSettingsCoordinator* googleServicesSettingsCoordinator;
// Confirm cancel sign-in/sync dialog.
@property(nonatomic, strong)
AlertCoordinator* cancelConfirmationAlertCoordinator;
@end
@implementation AdvancedSettingsSigninCoordinator @implementation AdvancedSettingsSigninCoordinator
- (instancetype)initWithBaseViewController:(UIViewController*)viewController #pragma mark - SigninCoordinator
browser:(Browser*)browser {
self = [super initWithBaseViewController:viewController browser:browser]; - (void)start {
if (self) { [super start];
// TODO(crbug.com/971989): Needs implementation. self.advancedSettingsSigninNavigationController =
NOTIMPLEMENTED(); [[AdvancedSettingsSigninNavigationController alloc] init];
self.advancedSettingsSigninNavigationController.modalPresentationStyle =
UIModalPresentationFormSheet;
self.advancedSettingsSigninNavigationController.navigationDelegate = self;
// Init and start Google settings coordinator.
GoogleServicesSettingsMode mode =
GoogleServicesSettingsModeAdvancedSigninSettings;
self.googleServicesSettingsCoordinator = [[GoogleServicesSettingsCoordinator
alloc]
initWithBaseViewController:self.advancedSettingsSigninNavigationController
browser:self.browser
mode:mode];
self.googleServicesSettingsCoordinator.navigationController =
self.advancedSettingsSigninNavigationController;
[self.googleServicesSettingsCoordinator start];
// Create the mediator.
SyncSetupService* syncSetupService =
SyncSetupServiceFactory::GetForBrowserState(self.browserState);
AuthenticationService* authenticationService =
AuthenticationServiceFactory::GetForBrowserState(self.browserState);
syncer::SyncService* syncService =
ProfileSyncServiceFactory::GetForBrowserState(self.browserState);
self.advancedSettingsSigninMediator = [[AdvancedSettingsSigninMediator alloc]
initWithSyncSetupService:syncSetupService
authenticationService:authenticationService
syncService:syncService
prefService:self.browserState->GetPrefs()];
self.advancedSettingsSigninNavigationController.presentationController
.delegate = self;
// Present the navigation controller that now contains the Google settings
// view controller.
[self.baseViewController
presentViewController:self.advancedSettingsSigninNavigationController
animated:YES
completion:nil];
}
- (void)interruptWithAction:(SigninCoordinatorInterruptAction)action
completion:(ProceduralBlock)completion {
DCHECK(self.advancedSettingsSigninNavigationController);
[self.googleServicesSettingsCoordinator stop];
self.googleServicesSettingsCoordinator = nil;
switch (action) {
case SigninCoordinatorInterruptActionNoDismiss:
[self finishedWithSigninResult:SigninCoordinatorResultInterrupted];
if (completion) {
completion();
}
break;
case SigninCoordinatorInterruptActionDismissWithoutAnimation:
[self dismissViewControllerAndFinishWithResult:
SigninCoordinatorResultInterrupted
animated:NO
completion:completion];
break;
case SigninCoordinatorInterruptActionDismissWithAnimation:
[self dismissViewControllerAndFinishWithResult:
SigninCoordinatorResultInterrupted
animated:YES
completion:completion];
break;
}
}
- (BOOL)isSettingsViewPresented {
// TODO(crbug.com/971989): Remove this method.
return YES;
}
#pragma mark - Private
// Called when a button of |self.cancelConfirmationAlertCoordinator| is pressed.
- (void)cancelConfirmationWithShouldCancelSignin:(BOOL)shouldCancelSignin {
DCHECK(self.cancelConfirmationAlertCoordinator);
[self.cancelConfirmationAlertCoordinator stop];
self.cancelConfirmationAlertCoordinator = nil;
if (shouldCancelSignin) {
[self dismissViewControllerAndFinishWithResult:
SigninCoordinatorResultCanceledByUser
animated:YES
completion:nil];
} else {
RecordAction(
UserMetricsAction("Signin_Signin_CancelCancelAdvancedSyncSettings"));
} }
return self; }
// Dismisses the current view controller with |animated|, triggers the
// coordinator cleanup and then calls |completion|.
- (void)dismissViewControllerAndFinishWithResult:(SigninCoordinatorResult)result
animated:(BOOL)animated
completion:(ProceduralBlock)completion {
DCHECK_EQ(self.advancedSettingsSigninNavigationController,
self.baseViewController.presentedViewController);
__weak __typeof(self) weakSelf = self;
ProceduralBlock dismissCompletion = ^() {
[weakSelf finishedWithSigninResult:result];
if (completion) {
completion();
}
};
[self.baseViewController dismissViewControllerAnimated:animated
completion:dismissCompletion];
}
// Does the cleanup once the view has been dismissed, calls the metrics and
// calls |runCompletionCallbackWithSigninResult:identity:| to finish the
// sign-in.
- (void)finishedWithSigninResult:(SigninCoordinatorResult)signinResult {
DCHECK(self.advancedSettingsSigninNavigationController);
DCHECK(self.advancedSettingsSigninMediator);
[self.advancedSettingsSigninMediator
saveUserPreferenceForSigninResult:signinResult];
self.advancedSettingsSigninNavigationController = nil;
self.advancedSettingsSigninMediator = nil;
[self.googleServicesSettingsCoordinator stop];
self.googleServicesSettingsCoordinator = nil;
SyncSetupService* syncSetupService =
SyncSetupServiceFactory::GetForBrowserState(self.browserState);
DCHECK(!syncSetupService->HasUncommittedChanges())
<< "-[GoogleServicesSettingsCoordinator stop] should commit sync "
"changes.";
AuthenticationService* authService =
AuthenticationServiceFactory::GetForBrowserState(self.browserState);
ChromeIdentity* identity = authService->GetAuthenticatedIdentity();
[self runCompletionCallbackWithSigninResult:signinResult identity:identity];
}
- (void)showCancelConfirmationAlert {
DCHECK(!self.cancelConfirmationAlertCoordinator);
RecordAction(UserMetricsAction("Signin_Signin_CancelAdvancedSyncSettings"));
self.cancelConfirmationAlertCoordinator = [[AlertCoordinator alloc]
initWithBaseViewController:self.advancedSettingsSigninNavigationController
title:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE)
message:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE)];
__weak __typeof(self) weakSelf = self;
[self.cancelConfirmationAlertCoordinator
addItemWithTitle:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON)
action:^{
[weakSelf cancelConfirmationWithShouldCancelSignin:NO];
}
style:UIAlertActionStyleCancel];
[self.cancelConfirmationAlertCoordinator
addItemWithTitle:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON)
action:^{
[weakSelf cancelConfirmationWithShouldCancelSignin:YES];
}
style:UIAlertActionStyleDefault];
[self.cancelConfirmationAlertCoordinator start];
}
#pragma mark - AdvancedSettingsSigninNavigationControllerNavigationDelegate
- (void)navigationCancelButtonWasTapped {
[self showCancelConfirmationAlert];
}
- (void)navigationConfirmButtonWasTapped {
DCHECK(!self.cancelConfirmationAlertCoordinator);
[self dismissViewControllerAndFinishWithResult:SigninCoordinatorResultSuccess
animated:YES
completion:nil];
}
#pragma mark - UIAdaptivePresentationControllerDelegate
- (BOOL)presentationControllerShouldDismiss:
(UIPresentationController*)presentationController {
return NO;
}
- (void)presentationControllerDidAttemptToDismiss:
(UIPresentationController*)presentationController {
[self showCancelConfirmationAlert];
} }
@end @end
// Copyright 2020 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.
#ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_MEDIATOR_H_
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/authentication/signin/signin_enums.h"
@class AdvancedSettingsSigninMediator;
@class AdvancedSettingsSigninNavigationController;
class AuthenticationService;
class PrefService;
class SyncSetupService;
namespace syncer {
class SyncService;
}
// Mediator for the advanced settings sign-in flow.
@interface AdvancedSettingsSigninMediator : NSObject
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithSyncSetupService:(SyncSetupService*)syncSetupService
authenticationService:
(AuthenticationService*)authenticationService
syncService:(syncer::SyncService*)syncService
prefService:(PrefService*)prefService
NS_DESIGNATED_INITIALIZER;
// Saves the user sync preferences.
- (void)saveUserPreferenceForSigninResult:(SigninCoordinatorResult)signinResult;
@end
#endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_MEDIATOR_H_
// Copyright 2020 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/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator.h"
#import "base/metrics/user_metrics.h"
#import "components/sync/driver/sync_service.h"
#import "components/unified_consent/unified_consent_metrics.h"
#import "ios/chrome/browser/signin/authentication_service.h"
#import "ios/chrome/browser/sync/sync_setup_service.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using base::RecordAction;
using base::UserMetricsAction;
using syncer::SyncFirstSetupCompleteSource;
using unified_consent::metrics::RecordSyncSetupDataTypesHistrogam;
@interface AdvancedSettingsSigninMediator ()
@property(nonatomic, assign, readonly) SyncSetupService* syncSetupService;
@property(nonatomic, assign, readonly)
AuthenticationService* authenticationService;
@property(nonatomic, assign, readonly) syncer::SyncService* syncService;
// Browser state preference service.
@property(nonatomic, assign, readonly) PrefService* prefService;
@end
@implementation AdvancedSettingsSigninMediator
#pragma mark - Public
- (instancetype)initWithSyncSetupService:(SyncSetupService*)syncSetupService
authenticationService:
(AuthenticationService*)authenticationService
syncService:(syncer::SyncService*)syncService
prefService:(PrefService*)prefService {
self = [super init];
if (self) {
DCHECK(syncSetupService);
DCHECK(authenticationService);
DCHECK(syncService);
DCHECK(prefService);
_syncSetupService = syncSetupService;
_authenticationService = authenticationService;
_syncService = syncService;
_prefService = prefService;
}
return self;
}
- (void)saveUserPreferenceForSigninResult:
(SigninCoordinatorResult)signinResult {
switch (signinResult) {
case SigninCoordinatorResultSuccess: {
RecordAction(
UserMetricsAction("Signin_Signin_ConfirmAdvancedSyncSettings"));
RecordSyncSetupDataTypesHistrogam(self.syncService->GetUserSettings(),
self.prefService);
if (self.syncSetupService->IsSyncEnabled()) {
// FirstSetupComplete flag should be only turned on when the user agrees
// to start Sync.
self.syncSetupService->PrepareForFirstSyncSetup();
self.syncSetupService->SetFirstSetupComplete(
SyncFirstSetupCompleteSource::ADVANCED_FLOW_CONFIRM);
}
break;
}
case SigninCoordinatorResultCanceledByUser:
RecordAction(
UserMetricsAction("Signin_Signin_ConfirmCancelAdvancedSyncSettings"));
self.syncSetupService->CommitSyncChanges();
self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN,
/*force_clear_browsing_data=*/false,
nil);
break;
case SigninCoordinatorResultInterrupted:
RecordAction(
UserMetricsAction("Signin_Signin_AbortAdvancedSyncSettings"));
break;
}
}
@end
// Copyright 2018 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.
#ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_NAVIGATION_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_NAVIGATION_CONTROLLER_H_
#import <UIKit/UIKit.h>
// Delegate for AdvancedSettingsSigninNavigationController to receive navigation
// button events.
@protocol
AdvancedSettingsSigninNavigationControllerNavigationDelegate <NSObject>
// Called when the navigation canceled button was tapped.
- (void)navigationCancelButtonWasTapped;
// Called when the navigation confirm button was tapped.
- (void)navigationConfirmButtonWasTapped;
@end
// View controller to present the Google services settings.
@interface AdvancedSettingsSigninNavigationController : UINavigationController
@property(nonatomic, weak)
id<AdvancedSettingsSigninNavigationControllerNavigationDelegate>
navigationDelegate;
@end
#endif // IOS_CHROME_BROWSER_UI_AUTHENTICATION_SIGNIN_ADVANCED_SETTINGS_SIGNIN_ADVANCED_SETTINGS_SIGNIN_NAVIGATION_CONTROLLER_H_
// Copyright 2018 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/authentication/signin/advanced_settings_signin/advanced_settings_signin_navigation_controller.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h"
#import "ios/chrome/browser/ui/settings/settings_controller_protocol.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using l10n_util::GetNSString;
@implementation AdvancedSettingsSigninNavigationController
#pragma mark - UINavigationController
// Calls |viewControllerWasPopped| for the popped view controller.
- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
UIViewController* poppedViewController =
[super popViewControllerAnimated:animated];
if ([poppedViewController
respondsToSelector:@selector(viewControllerWasPopped)]) {
[poppedViewController performSelector:@selector(viewControllerWasPopped)];
}
return poppedViewController;
}
- (void)pushViewController:(UIViewController*)viewController
animated:(BOOL)animated {
[super pushViewController:viewController animated:animated];
if (self.viewControllers.count == 1) {
viewController.navigationItem.leftBarButtonItem =
[self navigationCancelButton];
viewController.navigationItem.rightBarButtonItem =
[self navigationConfirmButton];
}
}
#pragma mark - Private
// Creates a cancel button for the navigation item.
- (UIBarButtonItem*)navigationCancelButton {
UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self
action:@selector(onNavigationCancelButton)];
cancelButton.accessibilityIdentifier = kSyncSettingsCancelButtonId;
return cancelButton;
}
// Creates a confirmation button for the navigation item.
- (UIBarButtonItem*)navigationConfirmButton {
UIBarButtonItem* confirmButton = [[UIBarButtonItem alloc]
initWithTitle:GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON)
style:UIBarButtonItemStyleDone
target:self
action:@selector(onNavigationConfirmButton)];
confirmButton.accessibilityIdentifier = kSyncSettingsConfirmButtonId;
return confirmButton;
}
#pragma mark - Button events
// Called by the cancel button from the navigation controller. Shows the cancel
// alert dialog.
- (void)onNavigationCancelButton {
[self.navigationDelegate navigationCancelButtonWasTapped];
}
// Called by the confirm button from tne navigation controller. Validates the
// sync preferences chosen by the user, starts the sync, close the completion
// callback and closes the advanced sign-in settings.
- (void)onNavigationConfirmButton {
[self.navigationDelegate navigationConfirmButtonWasTapped];
}
@end
...@@ -32,6 +32,12 @@ typedef void (^SigninCoordinatorCompletionCallback)( ...@@ -32,6 +32,12 @@ typedef void (^SigninCoordinatorCompletionCallback)(
// This completion needs to be set before calling -[SigninCoordinator start]. // This completion needs to be set before calling -[SigninCoordinator start].
@property(nonatomic, copy) SigninCoordinatorCompletionCallback signinCompletion; @property(nonatomic, copy) SigninCoordinatorCompletionCallback signinCompletion;
// Returns YES if the Google services settings view is presented.
// TODO(crbug.com/971989): This property exists for the implementation
// transition.
@property(nonatomic, assign, readonly, getter=isSettingsViewPresented)
BOOL settingsViewPresented;
// Returns a coordinator for user sign-in workflow. // Returns a coordinator for user sign-in workflow.
// |viewController| presents the sign-in. // |viewController| presents the sign-in.
// |identity| is the identity preselected with the sign-in opens. // |identity| is the identity preselected with the sign-in opens.
......
...@@ -118,6 +118,13 @@ using signin_metrics::PromoAction; ...@@ -118,6 +118,13 @@ using signin_metrics::PromoAction;
DCHECK(!self.signinCompletion); DCHECK(!self.signinCompletion);
} }
#pragma mark - Properties
- (BOOL)isSettingsViewPresented {
// TODO(crbug.com/971989): Remove this method.
return NO;
}
#pragma mark - Private #pragma mark - Private
- (void)runCompletionCallbackWithSigninResult: - (void)runCompletionCallbackWithSigninResult:
......
...@@ -29,6 +29,7 @@ source_set("settings_root") { ...@@ -29,6 +29,7 @@ source_set("settings_root") {
"//ios/public/provider/chrome/browser/user_feedback", "//ios/public/provider/chrome/browser/user_feedback",
"//ui/base", "//ui/base",
] ]
public_deps = [ ":settings_controller_protocol" ]
} }
source_set("settings_root_constants") { source_set("settings_root_constants") {
...@@ -193,6 +194,12 @@ source_set("settings") { ...@@ -193,6 +194,12 @@ source_set("settings") {
] ]
} }
source_set("settings_controller_protocol") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [ "settings_controller_protocol.h" ]
frameworks = [ "UIKit.framework" ]
}
source_set("constants") { source_set("constants") {
configs += [ "//build/config/compiler:enable_arc" ] configs += [ "//build/config/compiler:enable_arc" ]
sources = [ sources = [
......
...@@ -7,10 +7,6 @@ source_set("google_services") { ...@@ -7,10 +7,6 @@ source_set("google_services") {
sources = [ sources = [
"accounts_table_view_controller.h", "accounts_table_view_controller.h",
"accounts_table_view_controller.mm", "accounts_table_view_controller.mm",
"advanced_signin_settings_coordinator.h",
"advanced_signin_settings_coordinator.mm",
"advanced_signin_settings_navigation_controller.h",
"advanced_signin_settings_navigation_controller.mm",
"google_services_settings_command_handler.h", "google_services_settings_command_handler.h",
"google_services_settings_consumer.h", "google_services_settings_consumer.h",
"google_services_settings_coordinator.h", "google_services_settings_coordinator.h",
...@@ -60,6 +56,7 @@ source_set("google_services") { ...@@ -60,6 +56,7 @@ source_set("google_services") {
"//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/ui/alert_coordinator",
"//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication",
"//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/cells",
"//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin",
"//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators", "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/icons", "//ios/chrome/browser/ui/icons",
...@@ -79,8 +76,10 @@ source_set("google_services") { ...@@ -79,8 +76,10 @@ source_set("google_services") {
"//ios/public/provider/chrome/browser/signin", "//ios/public/provider/chrome/browser/signin",
"//ui/base", "//ui/base",
] ]
allow_circular_includes_from = allow_circular_includes_from = [
[ "//ios/chrome/browser/ui/signin_interaction" ] "//ios/chrome/browser/ui/signin_interaction",
"//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin",
]
} }
source_set("constants") { source_set("constants") {
...@@ -88,8 +87,6 @@ source_set("constants") { ...@@ -88,8 +87,6 @@ source_set("constants") {
sources = [ sources = [
"accounts_table_view_controller_constants.h", "accounts_table_view_controller_constants.h",
"accounts_table_view_controller_constants.mm", "accounts_table_view_controller_constants.mm",
"advanced_signin_settings_constants.h",
"advanced_signin_settings_constants.mm",
"google_services_settings_constants.h", "google_services_settings_constants.h",
"google_services_settings_constants.mm", "google_services_settings_constants.mm",
"manage_sync_settings_constants.h", "manage_sync_settings_constants.h",
......
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
#import "base/ios/block_types.h"
#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
@class AdvancedSigninSettingsCoordinator;
// AdvancedSigninSettingsCoordinator delegate.
@protocol AdvancedSigninSettingsCoordinatorDelegate <NSObject>
// Called when the user closes AdvancedSigninSettingsCoordinator.
// |signedin|, YES if the view is confirmed or aborted, and NO if the view is
// canceled.
- (void)advancedSigninSettingsCoordinatorDidClose:
(AdvancedSigninSettingsCoordinator*)coordinator
signedin:(BOOL)signedin;
@end
// Shows the Google services settings in a navigation controller, so the user
// can update their sync settings before sync starts (or sign-out).
@interface AdvancedSigninSettingsCoordinator : ChromeCoordinator
// Delegate.
@property(nonatomic, weak) id<AdvancedSigninSettingsCoordinatorDelegate>
delegate;
// Aborts the sign-in flow, and calls the delegate. Aborting the Advanced
// sync settings doesn't sign out the user. The sync is left unsetup and doesn't
// start. This method does nothing if called twice.
// |dismiss|, dismisses the view controller if YES.
// |animated|, the view is animated if YES.
// |completion|, this completion block is called after the view is dismissed.
// It will be called even the view is already dismissed. The value
// can be nil.
- (void)abortWithDismiss:(BOOL)dismiss
animated:(BOOL)animated
completion:(ProceduralBlock)completion;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
// Copyright 2019 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/google_services/advanced_signin_settings_coordinator.h"
#import <UIKit/UIKit.h>
#include "base/logging.h"
#include "base/metrics/user_metrics.h"
#include "components/signin/public/base/signin_metrics.h"
#include "components/strings/grit/components_strings.h"
#include "components/sync/driver/sync_service.h"
#include "components/unified_consent/unified_consent_metrics.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/signin/authentication_service.h"
#import "ios/chrome/browser/signin/authentication_service_factory.h"
#include "ios/chrome/browser/sync/profile_sync_service_factory.h"
#include "ios/chrome/browser/sync/sync_setup_service.h"
#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
#import "ios/chrome/browser/ui/icons/chrome_icon.h"
#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h"
#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_mode.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
using l10n_util::GetNSString;
// Advanced sign-in settings result.
typedef NS_ENUM(NSInteger, AdvancedSigninSettingsCoordinatorResult) {
// The user confirmed the advanced sync settings.
AdvancedSyncSettingsCoordinatorResultConfirm,
// The user canceled the advanced sync settings.
AdvancedSigninSettingsCoordinatorResultCancel,
// Chrome aborted the advanced sync settings.
AdvancedSigninSettingsCoordinatorResultInterrupted,
};
@interface AdvancedSigninSettingsCoordinator () <
UIAdaptivePresentationControllerDelegate>
// Google services settings coordinator.
@property(nonatomic, strong)
GoogleServicesSettingsCoordinator* googleServicesSettingsCoordinator;
// Advanced signin settings navigation controller.
@property(nonatomic, strong) AdvancedSigninSettingsNavigationController*
advancedSigninSettingsNavigationController;
// Confirm cancel sign-in/sync dialog.
@property(nonatomic, strong)
AlertCoordinator* cancelConfirmationAlertCoordinator;
@end
@implementation AdvancedSigninSettingsCoordinator
- (void)start {
// Create the navigation controller.
self.advancedSigninSettingsNavigationController =
[[AdvancedSigninSettingsNavigationController alloc] init];
// Shorter name to make line wrapping better.
AdvancedSigninSettingsNavigationController* controller =
self.advancedSigninSettingsNavigationController;
controller.modalPresentationStyle = UIModalPresentationFormSheet;
controller.presentationController.delegate = self;
// Init and start Google settings coordinator.
GoogleServicesSettingsMode mode =
GoogleServicesSettingsModeAdvancedSigninSettings;
self.googleServicesSettingsCoordinator =
[[GoogleServicesSettingsCoordinator alloc]
initWithBaseViewController:controller
browser:self.browser
mode:mode];
self.googleServicesSettingsCoordinator.navigationController = controller;
// Starting the coordinator will add its view controller to the navigation
// controller.
[self.googleServicesSettingsCoordinator start];
// Set navigation items for settings coordinator.
self.googleServicesSettingsCoordinator.viewController.navigationItem
.leftBarButtonItem = [self navigationCancelButton];
self.googleServicesSettingsCoordinator.viewController.navigationItem
.rightBarButtonItem = [self navigationConfirmButton];
// Present the navigation controller that now contains the Google settings
// view controller.
[self.baseViewController presentViewController:controller
animated:YES
completion:nil];
}
- (void)abortWithDismiss:(BOOL)dismiss
animated:(BOOL)animated
completion:(ProceduralBlock)completion {
if (!self.advancedSigninSettingsNavigationController) {
if (completion) {
completion();
}
return;
}
DCHECK_EQ(self.advancedSigninSettingsNavigationController,
self.baseViewController.presentedViewController);
if (dismiss) {
[self dismissViewControllerAndFinishWithResult:
AdvancedSigninSettingsCoordinatorResultInterrupted
animated:animated
completion:completion];
} else {
[self
finishedWithResult:AdvancedSigninSettingsCoordinatorResultInterrupted];
if (completion) {
completion();
}
}
}
#pragma mark - UIAdaptivePresentationControllerDelegate
- (BOOL)presentationControllerShouldDismiss:
(UIPresentationController*)presentationController {
return NO;
}
- (void)presentationControllerDidAttemptToDismiss:
(UIPresentationController*)presentationController {
[self showDismissAlertDialog];
}
#pragma mark - Private
// Called once the view controller has been removed (if needed).
// |result|, YES if the user accepts to sync.
- (void)finishedWithResult:(AdvancedSigninSettingsCoordinatorResult)result {
DCHECK(self.advancedSigninSettingsNavigationController);
SyncSetupService* syncSetupService =
SyncSetupServiceFactory::GetForBrowserState(
self.browser->GetBrowserState());
switch (result) {
case AdvancedSyncSettingsCoordinatorResultConfirm: {
base::RecordAction(
base::UserMetricsAction("Signin_Signin_ConfirmAdvancedSyncSettings"));
syncer::SyncService* syncService =
ProfileSyncServiceFactory::GetForBrowserState(
self.browser->GetBrowserState());
unified_consent::metrics::RecordSyncSetupDataTypesHistrogam(
syncService->GetUserSettings(),
self.browser->GetBrowserState()->GetPrefs());
if (syncSetupService->IsSyncEnabled()) {
// FirstSetupComplete flag should be only turned on when the user agrees
// to start Sync.
syncSetupService->PrepareForFirstSyncSetup();
syncSetupService->SetFirstSetupComplete(
syncer::SyncFirstSetupCompleteSource::ADVANCED_FLOW_CONFIRM);
}
break;
}
case AdvancedSigninSettingsCoordinatorResultCancel:
base::RecordAction(base::UserMetricsAction(
"Signin_Signin_ConfirmCancelAdvancedSyncSettings"));
syncSetupService->CommitSyncChanges();
AuthenticationServiceFactory::GetForBrowserState(
self.browser->GetBrowserState())
->SignOut(signin_metrics::ABORT_SIGNIN,
/*force_clear_browsing_data=*/false, nil);
break;
case AdvancedSigninSettingsCoordinatorResultInterrupted:
base::RecordAction(
base::UserMetricsAction("Signin_Signin_AbortAdvancedSyncSettings"));
break;
}
[self.googleServicesSettingsCoordinator stop];
self.googleServicesSettingsCoordinator.delegate = nil;
self.googleServicesSettingsCoordinator = nil;
DCHECK(!syncSetupService->HasUncommittedChanges())
<< "-[GoogleServicesSettingsCoordinator stop] should commit sync "
"changes.";
BOOL signedin = result != AdvancedSigninSettingsCoordinatorResultCancel;
[self.delegate advancedSigninSettingsCoordinatorDidClose:self
signedin:signedin];
self.advancedSigninSettingsNavigationController = nil;
}
// This method should be moved to the view controller.
- (UIBarButtonItem*)navigationCancelButton {
UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self
action:@selector(showDismissAlertDialog)];
cancelButton.accessibilityIdentifier = kSyncSettingsCancelButtonId;
return cancelButton;
}
// This method should be moved to the view controller.
- (UIBarButtonItem*)navigationConfirmButton {
UIBarButtonItem* confirmButton = [[UIBarButtonItem alloc]
initWithTitle:GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON)
style:UIBarButtonItemStyleDone
target:self
action:@selector(navigationConfirmButtonAction)];
confirmButton.accessibilityIdentifier = kSyncSettingsConfirmButtonId;
return confirmButton;
}
// Presents an UIAlert to ask the user if wants to cancel the sign-in.
- (void)showDismissAlertDialog {
base::RecordAction(
base::UserMetricsAction("Signin_Signin_CancelAdvancedSyncSettings"));
self.cancelConfirmationAlertCoordinator = [[AlertCoordinator alloc]
initWithBaseViewController:self.advancedSigninSettingsNavigationController
title:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE)
message:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE)];
__weak __typeof(self) weakSelf = self;
[self.cancelConfirmationAlertCoordinator
addItemWithTitle:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON)
action:^{
[weakSelf alertButtonActionWithCancelSync:NO];
}
style:UIAlertActionStyleCancel];
[self.cancelConfirmationAlertCoordinator
addItemWithTitle:
GetNSString(
IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON)
action:^{
[weakSelf alertButtonActionWithCancelSync:YES];
}
style:UIAlertActionStyleDefault];
[self.cancelConfirmationAlertCoordinator start];
}
// Called by the confirm button from tne navigation controller. Validates the
// sync preferences chosen by the user, starts the sync, close the completion
// callback and closes the advanced sign-in settings.
- (void)navigationConfirmButtonAction {
DCHECK_EQ(self.advancedSigninSettingsNavigationController,
self.baseViewController.presentedViewController);
[self dismissViewControllerAndFinishWithResult:
AdvancedSyncSettingsCoordinatorResultConfirm
animated:YES
completion:nil];
}
// Called when a button of |self.cancelConfirmationAlertCoordinator| is pressed.
- (void)alertButtonActionWithCancelSync:(BOOL)cancelSync {
DCHECK(self.cancelConfirmationAlertCoordinator);
[self.cancelConfirmationAlertCoordinator stop];
self.cancelConfirmationAlertCoordinator = nil;
if (cancelSync) {
[self dismissViewControllerAndFinishWithResult:
AdvancedSigninSettingsCoordinatorResultCancel
animated:YES
completion:nil];
} else {
base::RecordAction(base::UserMetricsAction(
"Signin_Signin_CancelCancelAdvancedSyncSettings"));
}
}
// Dismisses the current view controller with animation, and calls
// -[self finishedWithResult:] with |result|.
- (void)dismissViewControllerAndFinishWithResult:
(AdvancedSigninSettingsCoordinatorResult)result
animated:(BOOL)animated
completion:(ProceduralBlock)completion {
DCHECK_EQ(self.advancedSigninSettingsNavigationController,
self.baseViewController.presentedViewController);
__weak __typeof(self) weakSelf = self;
ProceduralBlock dismissCompletion = ^() {
[weakSelf finishedWithResult:result];
if (completion) {
completion();
}
};
[self.baseViewController dismissViewControllerAnimated:animated
completion:dismissCompletion];
}
@end
// Copyright 2018 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
// View controller to related to AdvancedSigninSettingsCoordinator.
@interface AdvancedSigninSettingsNavigationController
: SettingsNavigationController
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
// Copyright 2018 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/google_services/advanced_signin_settings_navigation_controller.h"
#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@implementation AdvancedSigninSettingsNavigationController
- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
UIViewController* poppedViewController =
[super popViewControllerAnimated:animated];
if ([poppedViewController
respondsToSelector:@selector(viewControllerWasPopped)]) {
[poppedViewController performSelector:@selector(viewControllerWasPopped)];
}
return poppedViewController;
}
@end
...@@ -272,6 +272,7 @@ ...@@ -272,6 +272,7 @@
- (void)manageSyncSettingsCoordinatorWasPopped: - (void)manageSyncSettingsCoordinatorWasPopped:
(ManageSyncSettingsCoordinator*)coordinator { (ManageSyncSettingsCoordinator*)coordinator {
DCHECK_EQ(self.manageSyncSettingsCoordinator, coordinator); DCHECK_EQ(self.manageSyncSettingsCoordinator, coordinator);
[self.manageSyncSettingsCoordinator stop];
self.manageSyncSettingsCoordinator = nil; self.manageSyncSettingsCoordinator = nil;
} }
......
// Copyright 2020 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_CONTROLLER_PROTOCOL_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_CONTROLLER_PROTOCOL_H_
#import <UIKit/UIKit.h>
// Protocol for settings view controllers.
@protocol SettingsControllerProtocol <NSObject>
@optional
// Notifies the controller that the settings screen is being dismissed.
- (void)settingsWillBeDismissed;
// Notifies the controller that is popped out from the settings navigation
// controller.
- (void)viewControllerWasPopped;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_CONTROLLER_PROTOCOL_H_
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/settings/settings_controller_protocol.h"
class Browser; class Browser;
@protocol BrowserCommands; @protocol BrowserCommands;
...@@ -18,19 +19,6 @@ class Browser; ...@@ -18,19 +19,6 @@ class Browser;
// The accessibility identifier for the settings' "Done" button. // The accessibility identifier for the settings' "Done" button.
extern NSString* const kSettingsDoneButtonId; extern NSString* const kSettingsDoneButtonId;
@protocol SettingsControllerProtocol<NSObject>
@optional
// Notifies the controller that the settings screen is being dismissed.
- (void)settingsWillBeDismissed;
// Notifies the controller that is popped out from the settings navigation
// controller.
- (void)viewControllerWasPopped;
@end
@protocol SettingsNavigationControllerDelegate<NSObject> @protocol SettingsNavigationControllerDelegate<NSObject>
// Informs the delegate that the settings navigation controller should be // Informs the delegate that the settings navigation controller should be
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h"
#import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h" #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h"
#import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h"
#import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.h"
#import "ios/chrome/browser/ui/signin_interaction/signin_interaction_presenting.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_presenting.h"
...@@ -19,9 +18,7 @@ ...@@ -19,9 +18,7 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface SigninInteractionCoordinator () < @interface SigninInteractionCoordinator () <SigninInteractionPresenting>
AdvancedSigninSettingsCoordinatorDelegate,
SigninInteractionPresenting>
// Coordinator to present alerts. // Coordinator to present alerts.
@property(nonatomic, strong) AlertCoordinator* alertCoordinator; @property(nonatomic, strong) AlertCoordinator* alertCoordinator;
...@@ -43,10 +40,6 @@ ...@@ -43,10 +40,6 @@
// Sign-in completion. // Sign-in completion.
@property(nonatomic, copy) signin_ui::CompletionCallback signinCompletion; @property(nonatomic, copy) signin_ui::CompletionCallback signinCompletion;
// Advanced sign-in settings coordinator.
@property(nonatomic, strong)
AdvancedSigninSettingsCoordinator* advancedSigninSettingsCoordinator;
@end @end
@implementation SigninInteractionCoordinator @implementation SigninInteractionCoordinator
...@@ -130,28 +123,24 @@ ...@@ -130,28 +123,24 @@
- (void)cancel { - (void)cancel {
[self.controller cancel]; [self.controller cancel];
[self interrupSigninCoordinatorWithAction: [self interrupSigninCoordinatorWithAction:
SigninCoordinatorInterruptActionNoDismiss]; SigninCoordinatorInterruptActionNoDismiss
[self.advancedSigninSettingsCoordinator abortWithDismiss:NO completion:nil];
animated:YES
completion:nil];
} }
- (void)cancelAndDismiss { - (void)cancelAndDismiss {
[self.controller cancelAndDismiss]; [self.controller cancelAndDismiss];
[self interrupSigninCoordinatorWithAction: [self interrupSigninCoordinatorWithAction:
SigninCoordinatorInterruptActionDismissWithAnimation]; SigninCoordinatorInterruptActionDismissWithAnimation
[self.advancedSigninSettingsCoordinator abortWithDismiss:YES completion:nil];
animated:YES
completion:nil];
} }
- (void)abortAndDismissSettingsViewAnimated:(BOOL)animated - (void)abortAndDismissSettingsViewAnimated:(BOOL)animated
completion:(ProceduralBlock)completion { completion:(ProceduralBlock)completion {
DCHECK(!self.controller); DCHECK(!self.controller);
DCHECK(self.advancedSigninSettingsCoordinator); SigninCoordinatorInterruptAction action =
[self.advancedSigninSettingsCoordinator abortWithDismiss:YES animated ? SigninCoordinatorInterruptActionDismissWithAnimation
animated:animated : SigninCoordinatorInterruptActionDismissWithoutAnimation;
completion:completion]; [self interrupSigninCoordinatorWithAction:action completion:completion];
} }
#pragma mark - Properties #pragma mark - Properties
...@@ -161,17 +150,7 @@ ...@@ -161,17 +150,7 @@
} }
- (BOOL)isSettingsViewPresented { - (BOOL)isSettingsViewPresented {
return self.advancedSigninSettingsCoordinator != nil; return self.coordinator.isSettingsViewPresented;
}
#pragma mark - AdvancedSigninSettingsCoordinatorDelegate
- (void)advancedSigninSettingsCoordinatorDidClose:
(AdvancedSigninSettingsCoordinator*)coordinator
signedin:(BOOL)signedin {
DCHECK_EQ(self.advancedSigninSettingsCoordinator, coordinator);
self.advancedSigninSettingsCoordinator = nil;
[self signinDoneWithSuccess:signedin];
} }
#pragma mark - SigninInteractionPresenting #pragma mark - SigninInteractionPresenting
...@@ -280,14 +259,25 @@ ...@@ -280,14 +259,25 @@
// Shows the advanced sign-in settings UI. // Shows the advanced sign-in settings UI.
- (void)showAdvancedSigninSettings { - (void)showAdvancedSigninSettings {
DCHECK(!self.advancedSigninSettingsCoordinator); DCHECK(!self.coordinator);
DCHECK(self.presentingViewController); DCHECK(self.presentingViewController);
self.advancedSigninSettingsCoordinator = self.coordinator = [SigninCoordinator
[[AdvancedSigninSettingsCoordinator alloc] advancedSettingsSigninCoordinatorWithBaseViewController:
initWithBaseViewController:self.presentingViewController self.presentingViewController
browser:self.browser]; browser:self.browser];
self.advancedSigninSettingsCoordinator.delegate = self; __weak SigninInteractionCoordinator* weakSelf = self;
[self.advancedSigninSettingsCoordinator start]; self.coordinator.signinCompletion =
^(SigninCoordinatorResult signinResult, ChromeIdentity* identity) {
[weakSelf advancedSigninDoneWithSigninResult:signinResult];
};
[self.coordinator start];
}
- (void)advancedSigninDoneWithSigninResult:
(SigninCoordinatorResult)signinResult {
[self.coordinator stop];
self.coordinator = nil;
[self signinDoneWithSuccess:signinResult == SigninCoordinatorResultSuccess];
} }
// Called when the sign-in is done. // Called when the sign-in is done.
...@@ -299,18 +289,19 @@ ...@@ -299,18 +289,19 @@
self.signinCompletion(success); self.signinCompletion(success);
self.signinCompletion = nil; self.signinCompletion = nil;
} }
[self.advancedSigninSettingsCoordinator stop];
self.advancedSigninSettingsCoordinator = nil;
self.presentingViewController = nil;
} }
- (void)interrupSigninCoordinatorWithAction: - (void)interrupSigninCoordinatorWithAction:
(SigninCoordinatorInterruptAction)action { (SigninCoordinatorInterruptAction)action
completion:(ProceduralBlock)completion {
__weak __typeof(self) weakSelf = self; __weak __typeof(self) weakSelf = self;
ProceduralBlock interruptCompletion = ^() { ProceduralBlock interruptCompletion = ^() {
// |weakSelf.coordinator.signinCompletion| is called before this interrupt // |weakSelf.coordinator.signinCompletion| is called before this interrupt
// block. The signin completion has to set |coordinator| to nil. // block. The signin completion has to set |coordinator| to nil.
DCHECK(!weakSelf.coordinator); DCHECK(!weakSelf.coordinator);
if (completion) {
completion();
}
}; };
[self.coordinator interruptWithAction:action completion:interruptCompletion]; [self.coordinator interruptWithAction:action completion:interruptCompletion];
} }
......
...@@ -253,6 +253,7 @@ source_set("test_support") { ...@@ -253,6 +253,7 @@ source_set("test_support") {
"//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/authentication:authentication", "//ios/chrome/browser/ui/authentication:authentication",
"//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/cells",
"//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin:constants",
"//ios/chrome/browser/ui/autofill:autofill_ui", "//ios/chrome/browser/ui/autofill:autofill_ui",
"//ios/chrome/browser/ui/autofill/manual_fill", "//ios/chrome/browser/ui/autofill/manual_fill",
"//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui", "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui",
...@@ -392,6 +393,7 @@ source_set("eg_app_support+eg2") { ...@@ -392,6 +393,7 @@ source_set("eg_app_support+eg2") {
"//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/authentication:eg_app_support+eg2", "//ios/chrome/browser/ui/authentication:eg_app_support+eg2",
"//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/cells",
"//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin:constants",
"//ios/chrome/browser/ui/autofill:autofill_ui", "//ios/chrome/browser/ui/autofill:autofill_ui",
"//ios/chrome/browser/ui/autofill:eg_app_support+eg2", "//ios/chrome/browser/ui/autofill:eg_app_support+eg2",
"//ios/chrome/browser/ui/autofill/manual_fill", "//ios/chrome/browser/ui/autofill/manual_fill",
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/autofill/form_suggestion_constants.h" #import "ios/chrome/browser/autofill/form_suggestion_constants.h"
#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h" #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/address_view_controller.h" #import "ios/chrome/browser/ui/autofill/manual_fill/address_view_controller.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.h" #import "ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_view_controller.h" #import "ios/chrome/browser/ui/autofill/manual_fill/card_view_controller.h"
...@@ -38,7 +39,6 @@ ...@@ -38,7 +39,6 @@
#import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_ui_constants.h" #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_ui_constants.h"
#import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_view_controller.h" #import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_view_controller.h"
#import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h" #import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h"
#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h"
#import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h" #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/password/passwords_table_view_constants.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_constants.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment