Commit 1c99900f authored by Kurt Horimoto's avatar Kurt Horimoto Committed by Commit Bot

[iOS] Add overlay containers for infobar banners and modals.

These containers will be used to present the banner and modal view
controllers.

Bug: 1030357
Change-Id: I824563eb5b028b576dc29eb270685711e148f87b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2033339
Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org>
Reviewed-by: default avatarMark Cogan <marq@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742229}
parent d97232ca
......@@ -115,6 +115,7 @@ source_set("browser_view") {
"//ios/chrome/browser/ui/omnibox:omnibox_internal",
"//ios/chrome/browser/ui/omnibox/popup",
"//ios/chrome/browser/ui/open_in",
"//ios/chrome/browser/ui/overlays",
"//ios/chrome/browser/ui/overscroll_actions",
"//ios/chrome/browser/ui/page_info:coordinator",
"//ios/chrome/browser/ui/page_info:features",
......
......@@ -37,7 +37,9 @@
#import "ios/chrome/browser/ui/commands/password_breach_commands.h"
#import "ios/chrome/browser/ui/download/ar_quick_look_coordinator.h"
#import "ios/chrome/browser/ui/download/pass_kit_coordinator.h"
#import "ios/chrome/browser/ui/infobars/infobar_feature.h"
#import "ios/chrome/browser/ui/open_in/open_in_mediator.h"
#import "ios/chrome/browser/ui/overlays/overlay_container_coordinator.h"
#import "ios/chrome/browser/ui/page_info/features.h"
#import "ios/chrome/browser/ui/page_info/page_info_coordinator.h"
#import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
......@@ -153,6 +155,12 @@
@property(nonatomic, strong)
LegacyTranslateInfobarCoordinator* translateInfobarCoordinator;
// The container coordinators for the infobar modalities.
@property(nonatomic, strong)
OverlayContainerCoordinator* infobarBannerOverlayContainerCoordinator;
@property(nonatomic, strong)
OverlayContainerCoordinator* infobarModalOverlayContainerCoordinator;
@end
@implementation BrowserCoordinator {
......@@ -353,6 +361,26 @@
self.addCreditCardCoordinator = [[AutofillAddCreditCardCoordinator alloc]
initWithBaseViewController:self.viewController
browser:self.browser];
if (base::FeatureList::IsEnabled(kInfobarOverlayUI)) {
self.infobarBannerOverlayContainerCoordinator =
[[OverlayContainerCoordinator alloc]
initWithBaseViewController:self.viewController
browser:self.browser
modality:OverlayModality::kInfobarBanner];
[self.infobarBannerOverlayContainerCoordinator start];
self.viewController.infobarBannerOverlayContainerViewController =
self.infobarBannerOverlayContainerCoordinator.viewController;
self.infobarModalOverlayContainerCoordinator =
[[OverlayContainerCoordinator alloc]
initWithBaseViewController:self.viewController
browser:self.browser
modality:OverlayModality::kInfobarModal];
[self.infobarModalOverlayContainerCoordinator start];
self.viewController.infobarModalOverlayContainerViewController =
self.infobarModalOverlayContainerCoordinator.viewController;
}
}
// Stops child coordinators.
......@@ -406,6 +434,12 @@
[self.addCreditCardCoordinator stop];
self.addCreditCardCoordinator = nil;
[self.infobarBannerOverlayContainerCoordinator stop];
self.infobarBannerOverlayContainerCoordinator = nil;
[self.infobarModalOverlayContainerCoordinator stop];
self.infobarModalOverlayContainerCoordinator = nil;
}
#pragma mark - AutofillSecurityAlertPresenter
......
......@@ -88,6 +88,14 @@ class ChromeBrowserState;
// The Browser's ChromeBrowserState.
@property(nonatomic, assign, readonly) ChromeBrowserState* browserState;
// The container used for infobar banner overlays.
@property(nonatomic, strong)
UIViewController* infobarBannerOverlayContainerViewController;
// The container used for infobar modal overlays.
@property(nonatomic, strong)
UIViewController* infobarModalOverlayContainerViewController;
// Whether the receiver is currently the primary BVC.
- (void)setPrimary:(BOOL)primary;
......
......@@ -845,6 +845,44 @@ NSString* const kBrowserViewControllerSnackbarCategory =
return self.browser ? self.browser->GetBrowserState() : nullptr;
}
- (void)setInfobarBannerOverlayContainerViewController:
(UIViewController*)infobarBannerOverlayContainerViewController {
if (_infobarBannerOverlayContainerViewController ==
infobarBannerOverlayContainerViewController) {
return;
}
_infobarBannerOverlayContainerViewController =
infobarBannerOverlayContainerViewController;
if (!_infobarBannerOverlayContainerViewController)
return;
DCHECK_EQ(_infobarBannerOverlayContainerViewController.parentViewController,
self);
DCHECK_EQ(_infobarBannerOverlayContainerViewController.view.superview,
self.view);
[self updateOverlayContainerOrder];
}
- (void)setInfobarModalOverlayContainerViewController:
(UIViewController*)infobarModalOverlayContainerViewController {
if (_infobarModalOverlayContainerViewController ==
infobarModalOverlayContainerViewController) {
return;
}
_infobarModalOverlayContainerViewController =
infobarModalOverlayContainerViewController;
if (!_infobarModalOverlayContainerViewController)
return;
DCHECK_EQ(_infobarModalOverlayContainerViewController.parentViewController,
self);
DCHECK_EQ(_infobarModalOverlayContainerViewController.view.superview,
self.view);
[self updateOverlayContainerOrder];
}
#pragma mark - Private Properties
- (SideSwipeController*)sideSwipeController {
......@@ -2336,6 +2374,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
[self.view insertSubview:self.typingShield aboveSubview:self.contentArea];
[self.typingShield setHidden:YES];
}
[self updateOverlayContainerOrder];
}
- (void)displayWebState:(web::WebState*)webState {
......@@ -2417,6 +2457,30 @@ NSString* const kBrowserViewControllerSnackbarCategory =
webStateList:self.tabModel.webStateList];
}
- (void)updateOverlayContainerOrder {
// Both infobar overlay container views should exist in front of the entire
// browser UI, and the banner container should appear behind the modal
// container.
[self bringOverlayContainerToFront:
self.infobarBannerOverlayContainerViewController];
[self bringOverlayContainerToFront:
self.infobarModalOverlayContainerViewController];
}
- (void)bringOverlayContainerToFront:
(UIViewController*)containerViewController {
[self.view bringSubviewToFront:containerViewController.view];
// If |containerViewController| is presenting a view over its current context,
// its presentation container view is added as a sibling to
// |containerViewController|'s view. This presented view should be brought in
// front of the container view.
UIView* presentedContainerView =
containerViewController.presentedViewController.presentationController
.containerView;
if (presentedContainerView.superview == self.view)
[self.view bringSubviewToFront:presentedContainerView];
}
#pragma mark - Private Methods: UI Configuration, update and Layout
// Update the state of back and forward buttons, hiding the forward button if
......
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