Commit fb08685a authored by Robbie Gibson's avatar Robbie Gibson Committed by Commit Bot

[iOS] Add cover over BVC when thumb strip is revealed

The added view covers the entire BVC and uses a LocationBarSteadyView to
display the current web address.

Bug: 1094335
Change-Id: I8790c595f079ed31760416a0ef52b8b0232ddf05
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2537354
Commit-Queue: Robbie Gibson <rkgibson@google.com>
Reviewed-by: default avatarGauthier Ambard <gambard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#828212}
parent 70b1780b
...@@ -84,6 +84,7 @@ source_set("browser_view") { ...@@ -84,6 +84,7 @@ source_set("browser_view") {
"//ios/chrome/browser/ui/bookmarks", "//ios/chrome/browser/ui/bookmarks",
"//ios/chrome/browser/ui/browser_container", "//ios/chrome/browser/ui/browser_container",
"//ios/chrome/browser/ui/browser_container:ui", "//ios/chrome/browser/ui/browser_container:ui",
"//ios/chrome/browser/ui/browser_view/hider",
"//ios/chrome/browser/ui/bubble", "//ios/chrome/browser/ui/bubble",
"//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/colors",
"//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/commands",
......
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
#import "ios/chrome/browser/ui/browser_container/browser_container_view_controller.h" #import "ios/chrome/browser/ui/browser_container/browser_container_view_controller.h"
#import "ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h" #import "ios/chrome/browser/ui/browser_view/browser_view_controller_dependency_factory.h"
#import "ios/chrome/browser/ui/browser_view/browser_view_controller_helper.h" #import "ios/chrome/browser/ui/browser_view/browser_view_controller_helper.h"
#import "ios/chrome/browser/ui/browser_view/hider/browser_view_hider_coordinator.h"
#import "ios/chrome/browser/ui/browser_view/key_commands_provider.h" #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
#import "ios/chrome/browser/ui/bubble/bubble_presenter.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter.h"
#import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h" #import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h"
...@@ -610,6 +611,11 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -610,6 +611,11 @@ NSString* const kBrowserViewControllerSnackbarCategory =
// The coordinator that shows the Send Tab To Self UI. // The coordinator that shows the Send Tab To Self UI.
@property(nonatomic, strong) SendTabToSelfCoordinator* sendTabToSelfCoordinator; @property(nonatomic, strong) SendTabToSelfCoordinator* sendTabToSelfCoordinator;
// Coordinator for the view that hides the web content when using the
// ViewRevealingVerticalPanHandler.
@property(nonatomic, strong)
BrowserViewHiderCoordinator* browserViewHiderCoordinator;
// BVC initialization // BVC initialization
// ------------------ // ------------------
// If the BVC is initialized with a valid browser state & tab model immediately, // If the BVC is initialized with a valid browser state & tab model immediately,
...@@ -1337,6 +1343,8 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -1337,6 +1343,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
self.legacyTabStripCoordinator = nil; self.legacyTabStripCoordinator = nil;
self.tabStripView = nil; self.tabStripView = nil;
} }
[self.browserViewHiderCoordinator stop];
self.browserViewHiderCoordinator = nil;
[self.commandDispatcher stopDispatchingToTarget:self.bubblePresenter]; [self.commandDispatcher stopDispatchingToTarget:self.bubblePresenter];
self.bubblePresenter = nil; self.bubblePresenter = nil;
...@@ -1464,6 +1472,16 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -1464,6 +1472,16 @@ NSString* const kBrowserViewControllerSnackbarCategory =
[tapRecognizer setDelegate:self]; [tapRecognizer setDelegate:self];
[tapRecognizer setCancelsTouchesInView:NO]; [tapRecognizer setCancelsTouchesInView:NO];
[self.contentArea addGestureRecognizer:tapRecognizer]; [self.contentArea addGestureRecognizer:tapRecognizer];
// When using the thumb strip, the web content needs to be hidden when the
// thumb strip is opened.
if (IsThumbStripEnabled()) {
self.browserViewHiderCoordinator = [[BrowserViewHiderCoordinator alloc]
initWithBaseViewController:self
browser:self.browser];
self.browserViewHiderCoordinator.locationBarModel = self.locationBarModel;
[self.browserViewHiderCoordinator start];
}
} }
- (void)viewSafeAreaInsetsDidChange { - (void)viewSafeAreaInsetsDidChange {
...@@ -1576,6 +1594,8 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -1576,6 +1594,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
self.secondaryToolbarContainerCoordinator = nil; self.secondaryToolbarContainerCoordinator = nil;
[self.secondaryToolbarCoordinator stop]; [self.secondaryToolbarCoordinator stop];
self.secondaryToolbarCoordinator = nil; self.secondaryToolbarCoordinator = nil;
[self.browserViewHiderCoordinator stop];
self.browserViewHiderCoordinator = nil;
self.toolbarInterface = nil; self.toolbarInterface = nil;
[_toolbarUIUpdater stopUpdating]; [_toolbarUIUpdater stopUpdating];
_toolbarUIUpdater = nil; _toolbarUIUpdater = nil;
...@@ -2326,6 +2346,7 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -2326,6 +2346,7 @@ NSString* const kBrowserViewControllerSnackbarCategory =
kSecondaryToolbarGuide, kSecondaryToolbarGuide,
kVoiceSearchButtonGuide, kVoiceSearchButtonGuide,
kDiscoverFeedHeaderMenuGuide, kDiscoverFeedHeaderMenuGuide,
kPrimaryToolbarLocationViewGuide,
]; ];
AddNamedGuidesToView(guideNames, self.view); AddNamedGuidesToView(guideNames, self.view);
...@@ -2831,6 +2852,8 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -2831,6 +2852,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
- (void)setUpThumbStrip { - (void)setUpThumbStrip {
[self.thumbStripPanHandler [self.thumbStripPanHandler
addAnimatee:self.primaryToolbarCoordinator.animatee]; addAnimatee:self.primaryToolbarCoordinator.animatee];
[self.thumbStripPanHandler
addAnimatee:self.browserViewHiderCoordinator.animatee];
[self.thumbStripPanHandler addAnimatee:self]; [self.thumbStripPanHandler addAnimatee:self];
self.primaryToolbarCoordinator.panGestureHandler = self.thumbStripPanHandler; self.primaryToolbarCoordinator.panGestureHandler = self.thumbStripPanHandler;
...@@ -2838,6 +2861,8 @@ NSString* const kBrowserViewControllerSnackbarCategory = ...@@ -2838,6 +2861,8 @@ NSString* const kBrowserViewControllerSnackbarCategory =
self.legacyTabStripCoordinator.panGestureHandler = self.legacyTabStripCoordinator.panGestureHandler =
self.thumbStripPanHandler; self.thumbStripPanHandler;
} }
self.browserViewHiderCoordinator.panGestureHandler =
self.thumbStripPanHandler;
} }
#pragma mark - ** Protocol Implementations and Helpers ** #pragma mark - ** Protocol Implementations and Helpers **
......
# Copyright 2020 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.
source_set("hider") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"browser_view_hider_coordinator.h",
"browser_view_hider_coordinator.mm",
"browser_view_hider_view_controller.h",
"browser_view_hider_view_controller.mm",
]
deps = [
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/overlays",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/gestures",
"//ios/chrome/browser/ui/location_bar",
"//ios/chrome/browser/ui/toolbar",
"//ios/chrome/browser/ui/toolbar/public:constants",
"//ios/chrome/browser/ui/util",
"//ios/chrome/common/ui/colors",
"//ios/chrome/common/ui/util",
]
}
// Copyright 2020 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.
#ifndef IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_COORDINATOR_H_
#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
class LocationBarModel;
@protocol ViewRevealingAnimatee;
@class ViewRevealingVerticalPanHandler;
// Coordinator for a view that hides the browser view controller's view.
@interface BrowserViewHiderCoordinator : ChromeCoordinator
// A reference to the view controller that implements the view revealing
// vertical pan handler delegate methods.
@property(nonatomic, weak, readonly) id<ViewRevealingAnimatee> animatee;
// The pan gesture handler for the hider view controller.
@property(nonatomic, weak) ViewRevealingVerticalPanHandler* panGestureHandler;
// The locationBarModel that informs this view about the current navigation
// entry.
@property(nonatomic, assign) LocationBarModel* locationBarModel;
@end
#endif // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_COORDINATOR_H_
// Copyright 2020 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/browser_view/hider/browser_view_hider_coordinator.h"
#import "ios/chrome/browser/main/browser.h"
#import "ios/chrome/browser/overlays/public/overlay_presenter.h"
#import "ios/chrome/browser/ui/browser_view/hider/browser_view_hider_view_controller.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_steady_view_mediator.h"
#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
#import "ios/chrome/browser/ui/util/layout_guide_names.h"
#import "ios/chrome/browser/ui/util/named_guide.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface BrowserViewHiderCoordinator ()
@property(nonatomic, strong) BrowserViewHiderViewController* viewController;
@property(nonatomic, strong) LocationBarSteadyViewMediator* mediator;
@end
@implementation BrowserViewHiderCoordinator
- (void)start {
self.viewController = [[BrowserViewHiderViewController alloc] init];
[self.baseViewController addChildViewController:self.viewController];
[self.baseViewController.view addSubview:self.viewController.view];
self.viewController.view.translatesAutoresizingMaskIntoConstraints = NO;
AddSameConstraintsToSides(
self.baseViewController.view, self.viewController.view,
LayoutSides::kBottom | LayoutSides::kLeading | LayoutSides::kTrailing);
NamedGuide* primaryToolbarGuide =
[NamedGuide guideWithName:kPrimaryToolbarGuide
view:self.baseViewController.view];
[self.viewController.view.topAnchor
constraintEqualToAnchor:primaryToolbarGuide.topAnchor]
.active = YES;
[self.viewController didMoveToParentViewController:self.baseViewController];
self.mediator = [[LocationBarSteadyViewMediator alloc]
initWithLocationBarModel:self.locationBarModel];
self.mediator.webStateList = self.browser->GetWebStateList();
self.mediator.webContentAreaOverlayPresenter = OverlayPresenter::FromBrowser(
self.browser, OverlayModality::kWebContentArea);
self.mediator.consumer = self.viewController;
}
- (id<ViewRevealingAnimatee>)animatee {
return self.viewController;
}
- (ViewRevealingVerticalPanHandler*)panGestureHandler {
return self.viewController.panGestureHandler;
}
- (void)setPanGestureHandler:
(ViewRevealingVerticalPanHandler*)panGestureHandler {
self.viewController.panGestureHandler = panGestureHandler;
}
@end
// Copyright 2020 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.
#ifndef IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_VIEW_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_VIEW_CONTROLLER_H_
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/gestures/view_revealing_animatee.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_steady_view_consumer.h"
@class ViewRevealingVerticalPanHandler;
// View controller for a view that hides the browser view controller's view.
@interface BrowserViewHiderViewController
: UIViewController <LocationBarSteadyViewConsumer, ViewRevealingAnimatee>
// Pan gesture handler for the hider view.
@property(nonatomic, weak) ViewRevealingVerticalPanHandler* panGestureHandler;
@end
#endif // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_HIDER_BROWSER_VIEW_HIDER_VIEW_CONTROLLER_H_
// Copyright 2020 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/browser_view/hider/browser_view_hider_view_controller.h"
#import "ios/chrome/browser/ui/gestures/view_revealing_vertical_pan_handler.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_steady_view.h"
#import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
#import "ios/chrome/browser/ui/util/layout_guide_names.h"
#import "ios/chrome/browser/ui/util/named_guide.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ios/chrome/common/ui/util/constraints_ui_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface BrowserViewHiderViewController ()
// Gesture recognizer for swipes on this view.
@property(nonatomic, strong) UIPanGestureRecognizer* panGestureRecognizer;
@property(nonatomic, strong) LocationBarSteadyView* steadyView;
@end
@implementation BrowserViewHiderViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorNamed:kBackgroundDarkColor];
self.view.layer.cornerRadius = kTopCornerRadius;
self.view.hidden = YES;
self.steadyView = [[LocationBarSteadyView alloc] init];
self.steadyView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:self.steadyView];
self.steadyView.colorScheme =
[LocationBarSteadyViewColorScheme incognitoScheme];
self.steadyView.locationButton.enabled = NO;
}
- (void)didMoveToParentViewController:(UIViewController*)parent {
[super didMoveToParentViewController:parent];
NamedGuide* guide = [NamedGuide guideWithName:kPrimaryToolbarLocationViewGuide
view:self.view];
AddSameConstraints(guide, self.steadyView);
}
- (void)setPanGestureHandler:
(ViewRevealingVerticalPanHandler*)panGestureHandler {
_panGestureHandler = panGestureHandler;
[self.view removeGestureRecognizer:self.panGestureRecognizer];
UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:panGestureHandler
action:@selector(handlePanGesture:)];
panGestureRecognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:panGestureRecognizer];
self.panGestureRecognizer = panGestureRecognizer;
}
#pragma mark - LocationBarSteadyViewConsumer
- (void)updateLocationText:(NSString*)string clipTail:(BOOL)clipTail {
[self.steadyView setLocationLabelText:string];
self.steadyView.locationLabel.lineBreakMode =
clipTail ? NSLineBreakByTruncatingTail : NSLineBreakByTruncatingHead;
}
- (void)updateLocationIcon:(UIImage*)icon
securityStatusText:(NSString*)statusText {
[self.steadyView setLocationImage:icon];
self.steadyView.securityLevelAccessibilityString = statusText;
}
- (void)updateLocationShareable:(BOOL)shareable {
// No-op. The share button should never be visible on the hider view.
}
- (void)updateAfterNavigatingToNTP {
[self.steadyView setLocationLabelText:@""];
}
#pragma mark - viewRevealingAnimatee
- (void)willAnimateViewReveal:(ViewRevealState)currentViewRevealState {
self.view.alpha = currentViewRevealState == ViewRevealState::Revealed ? 1 : 0;
self.view.hidden = NO;
}
- (void)animateViewReveal:(ViewRevealState)nextViewRevealState {
switch (nextViewRevealState) {
case ViewRevealState::Hidden:
self.view.alpha = 0;
break;
case ViewRevealState::Peeked:
self.view.alpha = 0;
break;
case ViewRevealState::Revealed:
self.view.alpha = 1;
break;
}
}
- (void)didAnimateViewReveal:(ViewRevealState)viewRevealState {
self.view.hidden = viewRevealState != ViewRevealState::Revealed;
}
@end
...@@ -180,12 +180,16 @@ ...@@ -180,12 +180,16 @@
[super willMoveToWindow:newWindow]; [super willMoveToWindow:newWindow];
[NamedGuide guideWithName:kPrimaryToolbarGuide view:self].constrainedView = [NamedGuide guideWithName:kPrimaryToolbarGuide view:self].constrainedView =
nil; nil;
[NamedGuide guideWithName:kPrimaryToolbarLocationViewGuide view:self]
.constrainedView = nil;
} }
- (void)didMoveToWindow { - (void)didMoveToWindow {
[super didMoveToWindow]; [super didMoveToWindow];
[NamedGuide guideWithName:kPrimaryToolbarGuide view:self].constrainedView = [NamedGuide guideWithName:kPrimaryToolbarGuide view:self].constrainedView =
self; self;
[NamedGuide guideWithName:kPrimaryToolbarLocationViewGuide view:self]
.constrainedView = self.locationBarContainer;
} }
#pragma mark - Setup #pragma mark - Setup
......
...@@ -55,5 +55,8 @@ extern GuideName* const kVoiceSearchButtonGuide; ...@@ -55,5 +55,8 @@ extern GuideName* const kVoiceSearchButtonGuide;
// A guide that is constrained to match the frame of the Discover feed header's // A guide that is constrained to match the frame of the Discover feed header's
// top-level menu button. // top-level menu button.
extern GuideName* const kDiscoverFeedHeaderMenuGuide; extern GuideName* const kDiscoverFeedHeaderMenuGuide;
// A guide that is constrained to match the frame of the location view in the
// primary toolbar (i.e. the Address Bar).
extern GuideName* const kPrimaryToolbarLocationViewGuide;
#endif // IOS_CHROME_BROWSER_UI_UTIL_LAYOUT_GUIDE_NAMES_H_ #endif // IOS_CHROME_BROWSER_UI_UTIL_LAYOUT_GUIDE_NAMES_H_
...@@ -26,3 +26,5 @@ GuideName* const kTranslateInfobarOptionsGuide = ...@@ -26,3 +26,5 @@ GuideName* const kTranslateInfobarOptionsGuide =
@"kTranslateInfobarOptionsGuide"; @"kTranslateInfobarOptionsGuide";
GuideName* const kVoiceSearchButtonGuide = @"kVoiceSearchButtonGuide"; GuideName* const kVoiceSearchButtonGuide = @"kVoiceSearchButtonGuide";
GuideName* const kDiscoverFeedHeaderMenuGuide = @"kDiscoverFeedHeaderMenuGuide"; GuideName* const kDiscoverFeedHeaderMenuGuide = @"kDiscoverFeedHeaderMenuGuide";
GuideName* const kPrimaryToolbarLocationViewGuide =
@"kPrimaryToolbarLocationViewGuide";
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