blob: 5804e0a698ba2ae8623868f68d7a2a21a6d3f3e6 [file] [log] [blame]
// 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.
#include "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h"
#include "base/check_op.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator.h"
#import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator_delegate.h"
#import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.h"
#import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.h"
#import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller_delegate.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface UnifiedConsentCoordinator () <IdentityChooserCoordinatorDelegate,
UnifiedConsentMediatorDelegate,
UnifiedConsentViewControllerDelegate>
// Unified consent mediator.
@property(nonatomic, strong) UnifiedConsentMediator* unifiedConsentMediator;
// Unified consent view controller.
@property(nonatomic, strong)
UnifiedConsentViewController* unifiedConsentViewController;
// YES if the user tapped on the setting link.
@property(nonatomic, assign) BOOL settingsLinkWasTapped;
// Identity chooser coordinator.
@property(nonatomic, strong)
IdentityChooserCoordinator* identityChooserCoordinator;
@end
@implementation UnifiedConsentCoordinator
- (instancetype)initWithBaseViewController:(UIViewController*)viewController
browser:(Browser*)browser {
self = [super initWithBaseViewController:nil browser:browser];
if (self) {
_unifiedConsentViewController = [[UnifiedConsentViewController alloc] init];
_unifiedConsentViewController.delegate = self;
_unifiedConsentMediator = [[UnifiedConsentMediator alloc]
initWithUnifiedConsentViewController:_unifiedConsentViewController];
_unifiedConsentMediator.delegate = self;
}
return self;
}
- (void)start {
[self.unifiedConsentMediator start];
}
- (void)scrollToBottom {
[self.unifiedConsentViewController scrollToBottom];
}
- (void)resetSettingLinkTapped {
self.settingsLinkWasTapped = NO;
}
#pragma mark - Properties
- (ChromeIdentity*)selectedIdentity {
return self.unifiedConsentMediator.selectedIdentity;
}
- (void)setSelectedIdentity:(ChromeIdentity*)selectedIdentity {
self.unifiedConsentMediator.selectedIdentity = selectedIdentity;
}
- (UIViewController*)viewController {
return self.unifiedConsentViewController;
}
- (int)openSettingsStringId {
return self.unifiedConsentViewController.openSettingsStringId;
}
- (const std::vector<int>&)consentStringIds {
return [self.unifiedConsentViewController consentStringIds];
}
- (BOOL)isScrolledToBottom {
return self.unifiedConsentViewController.isScrolledToBottom;
}
#pragma mark - Private
// Opens the identity chooser dialog with an animation from |point|.
- (void)showIdentityChooserDialogWithPoint:(CGPoint)point {
self.identityChooserCoordinator = [[IdentityChooserCoordinator alloc]
initWithBaseViewController:self.unifiedConsentViewController
browser:self.browser];
self.identityChooserCoordinator.delegate = self;
self.identityChooserCoordinator.origin = point;
[self.identityChooserCoordinator start];
self.identityChooserCoordinator.selectedIdentity = self.selectedIdentity;
}
#pragma mark - UnifiedConsentViewMediatorDelegate
- (void)unifiedConsentViewMediatorDelegateNeedPrimaryButtonUpdate:
(UnifiedConsentMediator*)mediator {
DCHECK_EQ(self.unifiedConsentMediator, mediator);
[self.delegate unifiedConsentCoordinatorNeedPrimaryButtonUpdate:self];
}
#pragma mark - UnifiedConsentViewControllerDelegate
- (void)unifiedConsentViewControllerViewDidAppear:
(UnifiedConsentViewController*)controller {
if (!self.autoOpenIdentityPicker)
return;
// The identity picker should not open a second time, to avoid opening it
// again after the merge/clear data dialog disappears.
self.autoOpenIdentityPicker = NO;
CGFloat midX = CGRectGetMidX(self.unifiedConsentViewController.view.bounds);
CGFloat midY = CGRectGetMidY(self.unifiedConsentViewController.view.bounds);
CGPoint point = CGPointMake(midX, midY);
[self showIdentityChooserDialogWithPoint:point];
}
- (void)unifiedConsentViewControllerDidTapSettingsLink:
(UnifiedConsentViewController*)controller {
if (self.isUIDisabled) {
return;
}
DCHECK_EQ(self.unifiedConsentViewController, controller);
DCHECK(!self.settingsLinkWasTapped);
self.settingsLinkWasTapped = YES;
[self.delegate unifiedConsentCoordinatorDidTapSettingsLink:self];
}
- (void)unifiedConsentViewControllerDidTapIdentityPickerView:
(UnifiedConsentViewController*)controller
atPoint:(CGPoint)point {
if (self.isUIDisabled) {
return;
}
DCHECK_EQ(self.unifiedConsentViewController, controller);
[self showIdentityChooserDialogWithPoint:point];
}
- (void)unifiedConsentViewControllerDidReachBottom:
(UnifiedConsentViewController*)controller {
DCHECK_EQ(self.unifiedConsentViewController, controller);
[self.delegate unifiedConsentCoordinatorDidReachBottom:self];
}
#pragma mark - IdentityChooserCoordinatorDelegate
- (void)identityChooserCoordinatorDidClose:
(IdentityChooserCoordinator*)coordinator {
CHECK_EQ(self.identityChooserCoordinator, coordinator);
self.identityChooserCoordinator.delegate = nil;
self.identityChooserCoordinator = nil;
}
- (void)identityChooserCoordinatorDidTapOnAddAccount:
(IdentityChooserCoordinator*)coordinator {
CHECK_EQ(self.identityChooserCoordinator, coordinator);
[self.delegate unifiedConsentCoordinatorDidTapOnAddAccount:self];
}
- (void)identityChooserCoordinator:(IdentityChooserCoordinator*)coordinator
didSelectIdentity:(ChromeIdentity*)identity {
CHECK_EQ(self.identityChooserCoordinator, coordinator);
self.selectedIdentity = identity;
}
@end