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

[iOS] Interrupt AddAccountSigninCoordinator in the UserSigninCoordinator

|self.addAccountSigninCoordinator| needs to be interrupted when
UserSigninCoordinator interrupted.
Once |self.addAccountSigninCoordinator| is done, the sign-in flow
can be interrupted (with dismissing the view controller if needed).

Related to: crrev.com/c/2062410

Bug: 971989
Change-Id: I4825d822737e11ce5af83ef5f94d26c95bfda673
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2087752
Commit-Queue: Jérôme Lebel <jlebel@chromium.org>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746811}
parent 18341a4d
...@@ -109,33 +109,26 @@ using signin_metrics::PromoAction; ...@@ -109,33 +109,26 @@ using signin_metrics::PromoAction;
- (void)interruptWithAction:(SigninCoordinatorInterruptAction)action - (void)interruptWithAction:(SigninCoordinatorInterruptAction)action
completion:(ProceduralBlock)completion { completion:(ProceduralBlock)completion {
[self.mediator cancelAndDismissAuthenticationFlow]; if (self.addAccountSigninCoordinator) {
// |self.addAccountSigninCoordinator| needs to be interupted before
ProceduralBlock runCompletionCallback = ^{ // interrupting |self.viewController|.
[self // The add account view should not be dismissed since the
runCompletionCallbackWithSigninResult:SigninCoordinatorResultInterrupted // |self.viewController| will take care of that according to |action|.
identity:self.unifiedConsentCoordinator __weak UserSigninCoordinator* weakSelf = self;
.selectedIdentity]; [self.addAccountSigninCoordinator
if (completion) { interruptWithAction:SigninCoordinatorInterruptActionNoDismiss
completion(); completion:^{
} // |self.addAccountSigninCoordinator.signinCompletion|
}; // is expected to be called before this block.
switch (action) { // Therefore |weakSelf.addAccountSigninCoordinator| is
case SigninCoordinatorInterruptActionNoDismiss: { // expected to be nil.
runCompletionCallback(); DCHECK(!weakSelf.addAccountSigninCoordinator);
break; [weakSelf interruptUserSigninUIWithAction:action
} completion:completion];
case SigninCoordinatorInterruptActionDismissWithAnimation: { }];
[self.viewController dismissViewControllerAnimated:YES return;
completion:runCompletionCallback];
break;
}
case SigninCoordinatorInterruptActionDismissWithoutAnimation: {
[self.viewController dismissViewControllerAnimated:NO
completion:runCompletionCallback];
break;
}
} }
[self interruptUserSigninUIWithAction:action completion:completion];
} }
#pragma mark - UnifiedConsentCoordinatorDelegate #pragma mark - UnifiedConsentCoordinatorDelegate
...@@ -263,6 +256,7 @@ using signin_metrics::PromoAction; ...@@ -263,6 +256,7 @@ using signin_metrics::PromoAction;
#pragma mark - Private #pragma mark - Private
// Records the metrics when the sign-in is finished.
- (void)recordSigninMetricsWithResult:(SigninCoordinatorResult)signinResult { - (void)recordSigninMetricsWithResult:(SigninCoordinatorResult)signinResult {
switch (signinResult) { switch (signinResult) {
case SigninCoordinatorResultSuccess: { case SigninCoordinatorResultSuccess: {
...@@ -282,4 +276,40 @@ using signin_metrics::PromoAction; ...@@ -282,4 +276,40 @@ using signin_metrics::PromoAction;
} }
} }
// Interrupts the sign-in when |self.viewController| is presented, by dismissing
// it if needed (according to |action|). Then |completion| is called.
// This method should not be called if |self.addAccountSigninCoordinator| has
// not been stopped before.
- (void)interruptUserSigninUIWithAction:(SigninCoordinatorInterruptAction)action
completion:(ProceduralBlock)completion {
DCHECK(!self.addAccountSigninCoordinator);
[self.mediator cancelAndDismissAuthenticationFlow];
__weak UserSigninCoordinator* weakSelf = self;
ProceduralBlock runCompletionCallback = ^{
[weakSelf
runCompletionCallbackWithSigninResult:SigninCoordinatorResultInterrupted
identity:self.unifiedConsentCoordinator
.selectedIdentity];
if (completion) {
completion();
}
};
switch (action) {
case SigninCoordinatorInterruptActionNoDismiss: {
runCompletionCallback();
break;
}
case SigninCoordinatorInterruptActionDismissWithAnimation: {
[self.viewController dismissViewControllerAnimated:YES
completion:runCompletionCallback];
break;
}
case SigninCoordinatorInterruptActionDismissWithoutAnimation: {
[self.viewController dismissViewControllerAnimated:NO
completion:runCompletionCallback];
break;
}
}
}
@end @end
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