Index: ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.mm |
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.mm b/ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..633129b9846711af248ba61ce13dfd22a39e19e2 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.mm |
@@ -0,0 +1,132 @@ |
+// Copyright 2014 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/ntp/recent_tabs/views/panel_bar_view.h" |
+ |
+#import "ios/chrome/browser/ui/ntp/recent_tabs/views/views_utils.h" |
+#include "ios/chrome/browser/ui/rtl_geometry.h" |
+#include "ios/chrome/browser/ui/ui_util.h" |
+#import "ios/chrome/browser/ui/uikit_ui_util.h" |
+#include "ios/chrome/grit/ios_strings.h" |
+#import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" |
+#import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h" |
+#include "ui/base/l10n/l10n_util_mac.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace { |
+ |
+const int kBackgroundColor = 0xf2f2f2; |
+const CGFloat kFontSize = 20; |
+ |
+} // namespace |
+ |
+@interface PanelBarView () { |
+ UIButton* _closeButton; |
+ NSLayoutConstraint* _statusBarSpacerConstraint; |
+} |
+// Whether the panel view extends throughout the whole screen. For example, |
+// when presented fullscreen, the panel bar extends to the borders of the app |
+// and the function returns YES. |
+// When presented modally as on iPad and iPhone 6 Plus landscape, it returns NO. |
+- (BOOL)coversFullAppWidth; |
+@end |
+ |
+@implementation PanelBarView |
+ |
+- (instancetype)init { |
+ self = [super initWithFrame:CGRectZero]; |
+ if (self) { |
+ [self setBackgroundColor:UIColorFromRGB(kBackgroundColor)]; |
+ // Create and add the bar's title. |
+ UILabel* title = [[UILabel alloc] initWithFrame:CGRectZero]; |
+ [title setTranslatesAutoresizingMaskIntoConstraints:NO]; |
+ [title setFont:[[MDFRobotoFontLoader sharedInstance] |
+ mediumFontOfSize:kFontSize]]; |
+ [title setTextColor:recent_tabs::GetTextColorGray()]; |
+ [title setTextAlignment:NSTextAlignmentNatural]; |
+ [title setText:l10n_util::GetNSString(IDS_IOS_NEW_TAB_RECENT_TABS)]; |
+ [title setBackgroundColor:UIColorFromRGB(kBackgroundColor)]; |
+ [self addSubview:title]; |
+ |
+ // Create and add the bar's close button. |
+ _closeButton = [[UIButton alloc] initWithFrame:CGRectZero]; |
+ [_closeButton setTranslatesAutoresizingMaskIntoConstraints:NO]; |
+ [_closeButton |
+ setTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON) |
+ .uppercaseString |
+ forState:UIControlStateNormal]; |
+ [_closeButton setTitleColor:recent_tabs::GetTextColorGray() |
+ forState:UIControlStateNormal]; |
+ [[_closeButton titleLabel] setFont:[MDCTypography buttonFont]]; |
+ [_closeButton setAccessibilityIdentifier:@"Exit"]; |
+ [self addSubview:_closeButton]; |
+ |
+ // Create and add the view that adds vertical padding that matches the |
+ // status bar's height. |
+ UIView* statusBarSpacer = [[UIView alloc] initWithFrame:CGRectZero]; |
+ [statusBarSpacer setTranslatesAutoresizingMaskIntoConstraints:NO]; |
+ [self addSubview:statusBarSpacer]; |
+ |
+ // Add the constraints on all the subviews. |
+ NSDictionary* viewsDictionary = @{ |
+ @"title" : title, |
+ @"closeButton" : _closeButton, |
+ @"statusBar" : statusBarSpacer, |
+ }; |
+ NSArray* constraints = @[ |
+ @"V:|-0-[statusBar]-14-[closeButton]-13-|", |
+ @"H:|-16-[title]-(>=0)-[closeButton]-16-|", |
+ ]; |
+ ApplyVisualConstraintsWithOptions(constraints, viewsDictionary, |
+ LayoutOptionForRTLSupport(), self); |
+ AddSameCenterYConstraint(self, title, _closeButton); |
+ _statusBarSpacerConstraint = |
+ [NSLayoutConstraint constraintWithItem:statusBarSpacer |
+ attribute:NSLayoutAttributeHeight |
+ relatedBy:NSLayoutRelationEqual |
+ toItem:nil |
+ attribute:NSLayoutAttributeNotAnAttribute |
+ multiplier:1 |
+ constant:0]; |
+ [self addConstraint:_statusBarSpacerConstraint]; |
+ } |
+ return self; |
+} |
+ |
+- (void)updateConstraints { |
+ UIInterfaceOrientation orientation = |
+ [[UIApplication sharedApplication] statusBarOrientation]; |
+ // On Plus phones in landscape, the modal is not fullscreen. The panel bar |
+ // doesn't need to take the status bar into account. |
+ BOOL takeStatusBarIntoAccount = [self coversFullAppWidth] || |
+ UIInterfaceOrientationIsPortrait(orientation); |
+ if (takeStatusBarIntoAccount) { |
+ CGFloat statusBarHeight = StatusBarHeight(); |
+ [_statusBarSpacerConstraint setConstant:statusBarHeight]; |
+ } else { |
+ [_statusBarSpacerConstraint setConstant:0]; |
+ } |
+ [super updateConstraints]; |
+} |
+ |
+- (void)setCloseTarget:(id)target action:(SEL)action { |
+ [_closeButton addTarget:target |
+ action:action |
+ forControlEvents:UIControlEventTouchUpInside]; |
+} |
+ |
+- (void)layoutSubviews { |
+ [self setNeedsUpdateConstraints]; |
+ [super layoutSubviews]; |
+} |
+ |
+- (BOOL)coversFullAppWidth { |
+ return self.traitCollection.horizontalSizeClass == |
+ self.window.traitCollection.horizontalSizeClass; |
+} |
+ |
+@end |