| // 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/infobars/infobar_coordinator.h" |
| |
| #include <memory> |
| |
| #include "ios/chrome/browser/infobars/infobar_manager_impl.h" |
| #import "ios/chrome/browser/ui/commands/application_commands.h" |
| #include "ios/chrome/browser/ui/infobars/infobar_container_mediator.h" |
| #include "ios/chrome/browser/ui/infobars/infobar_container_view_controller.h" |
| #import "ios/chrome/browser/ui/infobars/infobar_positioner.h" |
| #import "ios/chrome/browser/ui/signin_interaction/public/signin_presenter.h" |
| #import "ios/chrome/browser/ui/translate/language_selection_coordinator.h" |
| #include "ios/chrome/browser/upgrade/upgrade_center.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| @interface InfobarCoordinator ()<SigninPresenter> |
| |
| @property(nonatomic, assign) TabModel* tabModel; |
| |
| // UIViewController that contains Infobars. |
| @property(nonatomic, strong) |
| InfobarContainerViewController* containerViewController; |
| // The mediator for this Coordinator. |
| @property(nonatomic, strong) InfobarContainerMediator* mediator; |
| |
| // Coordinator for the language selection UI. |
| @property(nonatomic, strong) |
| LanguageSelectionCoordinator* languageSelectionCoordinator; |
| |
| @end |
| |
| @implementation InfobarCoordinator |
| |
| - (instancetype)initWithBaseViewController:(UIViewController*)viewController |
| browserState: |
| (ios::ChromeBrowserState*)browserState |
| tabModel:(TabModel*)tabModel { |
| self = [super initWithBaseViewController:viewController |
| browserState:browserState]; |
| if (self) { |
| _tabModel = tabModel; |
| } |
| return self; |
| } |
| |
| - (void)start { |
| DCHECK(self.positioner); |
| DCHECK(self.dispatcher); |
| |
| // Create and setup the ViewController. |
| self.containerViewController = [[InfobarContainerViewController alloc] init]; |
| [self.baseViewController addChildViewController:self.containerViewController]; |
| // TODO(crbug.com/892376): We shouldn't modify the BaseVC hierarchy, BVC needs |
| // to handle this. |
| [self.baseViewController.view insertSubview:self.containerViewController.view |
| aboveSubview:self.positioner.parentView]; |
| [self.containerViewController |
| didMoveToParentViewController:self.baseViewController]; |
| self.containerViewController.positioner = self.positioner; |
| |
| self.languageSelectionCoordinator = [[LanguageSelectionCoordinator alloc] |
| initWithBaseViewController:self.baseViewController]; |
| |
| // Create the mediator once the VC has been added to the View hierarchy. |
| self.mediator = [[InfobarContainerMediator alloc] |
| initWithConsumer:self.containerViewController |
| browserState:self.browserState |
| tabModel:self.tabModel]; |
| self.mediator.syncPresenter = self.syncPresenter; |
| self.mediator.signinPresenter = self; |
| self.mediator.languageSelectionHandler = self.languageSelectionCoordinator; |
| |
| [[UpgradeCenter sharedInstance] registerClient:self.mediator |
| withDispatcher:self.dispatcher]; |
| } |
| |
| - (void)stop { |
| [[UpgradeCenter sharedInstance] unregisterClient:self.mediator]; |
| self.mediator = nil; |
| } |
| |
| #pragma mark - Public Interface |
| |
| - (UIView*)view { |
| return self.containerViewController.view; |
| } |
| |
| - (void)updateInfobarContainer { |
| [self.containerViewController updateLayoutAnimated:NO]; |
| } |
| |
| - (BOOL)isInfobarPresentingForWebState:(web::WebState*)webState { |
| infobars::InfoBarManager* infoBarManager = |
| InfoBarManagerImpl::FromWebState(webState); |
| if (infoBarManager->infobar_count() > 0) { |
| return YES; |
| } |
| return NO; |
| } |
| |
| - (id<LanguageSelectionHandler>)languageSelectionHandler { |
| return self.languageSelectionCoordinator; |
| } |
| |
| #pragma mark - SigninPresenter |
| |
| - (void)showSignin:(ShowSigninCommand*)command { |
| [self.dispatcher showSignin:command |
| baseViewController:self.baseViewController]; |
| } |
| |
| @end |