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") { ...@@ -115,6 +115,7 @@ source_set("browser_view") {
"//ios/chrome/browser/ui/omnibox:omnibox_internal", "//ios/chrome/browser/ui/omnibox:omnibox_internal",
"//ios/chrome/browser/ui/omnibox/popup", "//ios/chrome/browser/ui/omnibox/popup",
"//ios/chrome/browser/ui/open_in", "//ios/chrome/browser/ui/open_in",
"//ios/chrome/browser/ui/overlays",
"//ios/chrome/browser/ui/overscroll_actions", "//ios/chrome/browser/ui/overscroll_actions",
"//ios/chrome/browser/ui/page_info:coordinator", "//ios/chrome/browser/ui/page_info:coordinator",
"//ios/chrome/browser/ui/page_info:features", "//ios/chrome/browser/ui/page_info:features",
......
...@@ -37,7 +37,9 @@ ...@@ -37,7 +37,9 @@
#import "ios/chrome/browser/ui/commands/password_breach_commands.h" #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/ar_quick_look_coordinator.h"
#import "ios/chrome/browser/ui/download/pass_kit_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/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/features.h"
#import "ios/chrome/browser/ui/page_info/page_info_coordinator.h" #import "ios/chrome/browser/ui/page_info/page_info_coordinator.h"
#import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h" #import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
...@@ -153,6 +155,12 @@ ...@@ -153,6 +155,12 @@
@property(nonatomic, strong) @property(nonatomic, strong)
LegacyTranslateInfobarCoordinator* translateInfobarCoordinator; LegacyTranslateInfobarCoordinator* translateInfobarCoordinator;
// The container coordinators for the infobar modalities.
@property(nonatomic, strong)
OverlayContainerCoordinator* infobarBannerOverlayContainerCoordinator;
@property(nonatomic, strong)
OverlayContainerCoordinator* infobarModalOverlayContainerCoordinator;
@end @end
@implementation BrowserCoordinator { @implementation BrowserCoordinator {
...@@ -353,6 +361,26 @@ ...@@ -353,6 +361,26 @@
self.addCreditCardCoordinator = [[AutofillAddCreditCardCoordinator alloc] self.addCreditCardCoordinator = [[AutofillAddCreditCardCoordinator alloc]
initWithBaseViewController:self.viewController initWithBaseViewController:self.viewController
browser:self.browser]; 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. // Stops child coordinators.
...@@ -406,6 +434,12 @@ ...@@ -406,6 +434,12 @@
[self.addCreditCardCoordinator stop]; [self.addCreditCardCoordinator stop];
self.addCreditCardCoordinator = nil; self.addCreditCardCoordinator = nil;
[self.infobarBannerOverlayContainerCoordinator stop];
self.infobarBannerOverlayContainerCoordinator = nil;
[self.infobarModalOverlayContainerCoordinator stop];
self.infobarModalOverlayContainerCoordinator = nil;
} }
#pragma mark - AutofillSecurityAlertPresenter #pragma mark - AutofillSecurityAlertPresenter
......
...@@ -88,6 +88,14 @@ class ChromeBrowserState; ...@@ -88,6 +88,14 @@ class ChromeBrowserState;
// The Browser's ChromeBrowserState. // The Browser's ChromeBrowserState.
@property(nonatomic, assign, readonly) ChromeBrowserState* browserState; @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. // Whether the receiver is currently the primary BVC.
- (void)setPrimary:(BOOL)primary; - (void)setPrimary:(BOOL)primary;
......
...@@ -845,6 +845,44 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -845,6 +845,44 @@ NSString* const kBrowserViewControllerSnackbarCategory =
return self.browser ? self.browser->GetBrowserState() : nullptr; 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 #pragma mark - Private Properties
- (SideSwipeController*)sideSwipeController { - (SideSwipeController*)sideSwipeController {
...@@ -2336,6 +2374,8 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -2336,6 +2374,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
[self.view insertSubview:self.typingShield aboveSubview:self.contentArea]; [self.view insertSubview:self.typingShield aboveSubview:self.contentArea];
[self.typingShield setHidden:YES]; [self.typingShield setHidden:YES];
} }
[self updateOverlayContainerOrder];
} }
- (void)displayWebState:(web::WebState*)webState { - (void)displayWebState:(web::WebState*)webState {
...@@ -2417,6 +2457,30 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -2417,6 +2457,30 @@ NSString* const kBrowserViewControllerSnackbarCategory =
webStateList:self.tabModel.webStateList]; 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 #pragma mark - Private Methods: UI Configuration, update and Layout
// Update the state of back and forward buttons, hiding the forward button if // 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