Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: ios/chrome/browser/ui/ntp/incognito_panel_controller.mm

Issue 2590473002: Upstream Chrome on iOS source code [5/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/ntp/incognito_panel_controller.mm
diff --git a/ios/chrome/browser/ui/ntp/incognito_panel_controller.mm b/ios/chrome/browser/ui/ntp/incognito_panel_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..cd938591f8fe665bbd191c48867ee56850416361
--- /dev/null
+++ b/ios/chrome/browser/ui/ntp/incognito_panel_controller.mm
@@ -0,0 +1,361 @@
+// Copyright 2012 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/ntp/incognito_panel_controller.h"
+
+#include <string>
+
+#import "base/mac/scoped_nsobject.h"
+#include "components/google/core/browser/google_util.h"
+#include "components/strings/grit/components_strings.h"
+#include "ios/chrome/browser/application_context.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/ui/toolbar/web_toolbar_controller.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
+#import "ios/chrome/browser/ui/url_loader.h"
+#import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
+#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
+#import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h"
+#include "ios/web/public/referrer.h"
+#import "net/base/mac/url_conversions.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "url/gurl.h"
+
+namespace {
+// The URL for the the Learn More page shown on incognito new tab.
+// Taken from ntp_resource_cache.cc.
+const char kLearnMoreIncognitoUrl[] =
+ "https://www.google.com/support/chrome/bin/answer.py?answer=95464";
+
+GURL GetUrlWithLang(const GURL& url) {
+ std::string locale = GetApplicationContext()->GetApplicationLocale();
+ return google_util::AppendGoogleLocaleParam(url, locale);
+}
+
+const CGFloat kDistanceToFadeToolbar = 50.0;
+const int kLinkColor = 0x03A9F4;
+}
+
+// The scrollview containing the views. Its content's size is constrained on its
+// superview's size.
+@interface IncognitoNTPView : UIScrollView
+
+// Returns an autoreleased label with the right format.
+- (UILabel*)labelWithString:(NSString*)string
+ font:(UIFont*)font
+ alpha:(float)alpha;
+
+// Triggers a navigation to the help page.
+- (void)learnMoreButtonPressed;
+
+@end
+
+@implementation IncognitoNTPView {
+ base::WeakNSProtocol<id<UrlLoader>> _loader;
+ base::scoped_nsobject<UIView> _containerView;
+
+ // Constraint ensuring that |containerView| is at least as high as the
+ // superview of the IncognitoNTPView, i.e. the Incognito panel.
+ // This ensures that if the Incognito panel is higher than a compact
+ // |containerView|, the |containerView|'s |topGuide| and |bottomGuide| are
+ // forced to expand, centering the views in between them.
+ base::scoped_nsobject<NSLayoutConstraint> _containerVerticalConstraint;
+
+ // Constraint ensuring that |containerView| is as wide as the superview of the
+ // the IncognitoNTPView, i.e. the Incognito panel.
+ base::scoped_nsobject<NSLayoutConstraint> _containerHorizontalConstraint;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame urlLoader:(id<UrlLoader>)loader {
+ self = [super initWithFrame:frame];
+ if (self) {
+ _loader.reset(loader);
+
+ self.alwaysBounceVertical = YES;
+
+ // Container in which all the subviews (image, labels, button) are added.
+ _containerView.reset([[UIView alloc] initWithFrame:frame]);
+ [_containerView setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ // Incognito image.
+ base::scoped_nsobject<UIImageView> incognitoImage([[UIImageView alloc]
+ initWithImage:[UIImage imageNamed:@"incognito_icon"]]);
+ [incognitoImage setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_containerView addSubview:incognitoImage];
+
+ // Title.
+ UIFont* titleFont =
+ [[MDFRobotoFontLoader sharedInstance] lightFontOfSize:24];
+ base::scoped_nsobject<UILabel> incognitoTabHeading(
+ [[self labelWithString:l10n_util::GetNSString(IDS_NEW_TAB_OTR_HEADING)
+ font:titleFont
+ alpha:0.8] retain]);
+ [_containerView addSubview:incognitoTabHeading];
+
+ // Description paragraph.
+ UIFont* regularFont =
+ [[MDFRobotoFontLoader sharedInstance] regularFontOfSize:14];
+ base::scoped_nsobject<UILabel> incognitoTabDescription([[self
+ labelWithString:l10n_util::GetNSString(IDS_NEW_TAB_OTR_DESCRIPTION)
+ font:regularFont
+ alpha:0.7] retain]);
+ [_containerView addSubview:incognitoTabDescription];
+
+ // Warning paragraph.
+ base::scoped_nsobject<UILabel> incognitoTabWarning([[self
+ labelWithString:l10n_util::GetNSString(IDS_NEW_TAB_OTR_MESSAGE_WARNING)
+ font:regularFont
+ alpha:0.7] retain]);
+ [_containerView addSubview:incognitoTabWarning];
+
+ // Learn more button.
+ base::scoped_nsobject<MDCButton> learnMore([[MDCFlatButton alloc] init]);
+ UIColor* inkColor =
+ [[[MDCPalette greyPalette] tint300] colorWithAlphaComponent:0.25];
+ [learnMore setInkColor:inkColor];
+ [learnMore setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [learnMore setTitle:l10n_util::GetNSString(IDS_NEW_TAB_OTR_LEARN_MORE_LINK)
+ forState:UIControlStateNormal];
+ [learnMore setTitleColor:UIColorFromRGB(kLinkColor)
+ forState:UIControlStateNormal];
+ UIFont* buttonFont =
+ [[MDFRobotoFontLoader sharedInstance] boldFontOfSize:14];
+ [[learnMore titleLabel] setFont:buttonFont];
+ [learnMore addTarget:self
+ action:@selector(learnMoreButtonPressed)
+ forControlEvents:UIControlEventTouchUpInside];
+ [_containerView addSubview:learnMore];
+
+ // |topGuide| and |bottomGuide| exist to vertically center the sibling views
+ // located in between them.
+ base::scoped_nsobject<UILayoutGuide> topGuide([[UILayoutGuide alloc] init]);
+ base::scoped_nsobject<UILayoutGuide> bottomGuide(
+ [[UILayoutGuide alloc] init]);
+ [_containerView addLayoutGuide:topGuide];
+ [_containerView addLayoutGuide:bottomGuide];
+
+ NSDictionary* viewsDictionary = @{
+ @"topGuide" : topGuide.get(),
+ @"image" : incognitoImage.get(),
+ @"heading" : incognitoTabHeading.get(),
+ @"description" : incognitoTabDescription.get(),
+ @"warning" : incognitoTabWarning.get(),
+ @"learnMoreButton" : learnMore.get(),
+ @"bottomGuide" : bottomGuide.get(),
+ };
+ NSArray* constraints = @[
+ @"V:|-0-[topGuide(>=12)]-[image]-24-[heading]-32-[description]",
+ @"V:[description]-32-[warning]-32-[learnMoreButton]",
+ @"V:[learnMoreButton]-[bottomGuide]-0-|",
+ @"H:|-(>=24)-[heading]-(>=24)-|",
+ @"H:|-(>=24)-[description(==416@999)]-(>=24)-|",
+ @"H:|-(>=24)-[warning(==416@999)]-(>=24)-|"
+ ];
+ ApplyVisualConstraintsWithOptions(constraints, viewsDictionary,
+ LayoutOptionForRTLSupport(),
+ _containerView);
+
+ AddSameCenterXConstraint(_containerView, incognitoImage);
+ AddSameCenterXConstraint(_containerView, incognitoTabHeading);
+ AddSameCenterXConstraint(_containerView, incognitoTabDescription);
+ AddSameCenterXConstraint(_containerView, incognitoTabWarning);
+ AddSameCenterXConstraint(_containerView, learnMore);
+
+ // The bottom guide is twice as big as the top guide.
+ [_containerView addConstraint:[NSLayoutConstraint
+ constraintWithItem:bottomGuide
+ attribute:NSLayoutAttributeHeight
+ relatedBy:NSLayoutRelationEqual
+ toItem:topGuide
+ attribute:NSLayoutAttributeHeight
+ multiplier:2
+ constant:0]];
+
+ [self addSubview:_containerView];
+
+ // Constraints comunicating the size of the contentView to the scrollview.
+ // See UIScrollView autolayout information at
+ // https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-6_0/index.html
+ viewsDictionary = @{ @"containerView" : _containerView.get() };
+ constraints = @[
+ @"V:|-0-[containerView]-0-|",
+ @"H:|-0-[containerView]-0-|",
+ ];
+ ApplyVisualConstraintsWithOptions(constraints, viewsDictionary,
+ LayoutOptionForRTLSupport(), self);
+ }
+ return self;
+}
+
+- (UILabel*)labelWithString:(NSString*)string
+ font:(UIFont*)font
+ alpha:(float)alpha {
+ base::scoped_nsobject<NSMutableAttributedString> attributedString(
+ [[NSMutableAttributedString alloc] initWithString:string]);
+ base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle(
+ [[NSMutableParagraphStyle alloc] init]);
+ [paragraphStyle setLineSpacing:4];
+ [paragraphStyle setAlignment:NSTextAlignmentJustified];
+ [attributedString addAttribute:NSParagraphStyleAttributeName
+ value:paragraphStyle
+ range:NSMakeRange(0, string.length)];
+ base::scoped_nsobject<UILabel> label(
+ [[UILabel alloc] initWithFrame:CGRectZero]);
+ [label setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [label setNumberOfLines:0];
+ [label setFont:font];
+ [label setAttributedText:attributedString];
+ [label setTextColor:[UIColor colorWithWhite:1.0 alpha:alpha]];
+ return label.autorelease();
+}
+
+- (void)learnMoreButtonPressed {
+ GURL gurl = GetUrlWithLang(GURL(kLearnMoreIncognitoUrl));
+ [_loader loadURL:gurl
+ referrer:web::Referrer()
+ transition:ui::PAGE_TRANSITION_LINK
+ rendererInitiated:NO];
+}
+
+#pragma mark - UIView overrides
+
+- (void)didMoveToSuperview {
+ [super didMoveToSuperview];
+ _containerHorizontalConstraint.reset(
+ [[NSLayoutConstraint constraintWithItem:_containerView.get()
+ attribute:NSLayoutAttributeWidth
+ relatedBy:NSLayoutRelationEqual
+ toItem:[self superview]
+ attribute:NSLayoutAttributeWidth
+ multiplier:1
+ constant:0] retain]);
+ _containerVerticalConstraint.reset(
+ [[NSLayoutConstraint constraintWithItem:_containerView.get()
+ attribute:NSLayoutAttributeHeight
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:[self superview]
+ attribute:NSLayoutAttributeHeight
+ multiplier:1
+ constant:0] retain]);
+ [[self superview] addConstraint:_containerHorizontalConstraint.get()];
+ [[self superview] addConstraint:_containerVerticalConstraint.get()];
+}
+
+- (void)willMoveToSuperview:(UIView*)newSuperview {
+ [[self superview] removeConstraint:_containerHorizontalConstraint.get()];
+ [[self superview] removeConstraint:_containerVerticalConstraint.get()];
+ _containerHorizontalConstraint.reset();
+ _containerVerticalConstraint.reset();
+ [super willMoveToSuperview:newSuperview];
+}
+
+@end
+
+@interface IncognitoPanelController ()<UIScrollViewDelegate>
+// Calculate the background alpha for the toolbar based on how much |scrollView|
+// has scrolled up.
+- (CGFloat)toolbarAlphaForScrollView:(UIScrollView*)scrollView;
+@end
+
+@implementation IncognitoPanelController {
+ // Delegate for updating the toolbar's background alpha.
+ base::WeakNSProtocol<id<WebToolbarDelegate>> _webToolbarDelegate;
+
+ // The view containing the scrollview.
+ // The purpose of this view is to be used to set the size
+ // of the contentView of the scrollview with constraints.
+ base::scoped_nsobject<UIView> _view;
+
+ // The scrollview containing the actual views.
+ base::scoped_nsobject<IncognitoNTPView> _incognitoView;
+}
+
+// Property declared in NewTabPagePanelProtocol.
+@synthesize delegate = _delegate;
+
+- (id)initWithLoader:(id<UrlLoader>)loader
+ browserState:(ios::ChromeBrowserState*)browserState
+ webToolbarDelegate:(id<WebToolbarDelegate>)webToolbarDelegate {
+ self = [super init];
+ if (self) {
+ _view.reset([[UIView alloc]
+ initWithFrame:[UIApplication sharedApplication].keyWindow.bounds]);
+ [_view setAccessibilityIdentifier:@"NTP Incognito Panel"];
+ [_view setAutoresizingMask:UIViewAutoresizingFlexibleHeight |
+ UIViewAutoresizingFlexibleWidth];
+ _incognitoView.reset([[IncognitoNTPView alloc]
+ initWithFrame:[UIApplication sharedApplication].keyWindow.bounds
+ urlLoader:loader]);
+ [_incognitoView setAutoresizingMask:UIViewAutoresizingFlexibleHeight |
+ UIViewAutoresizingFlexibleWidth];
+
+ if (IsIPadIdiom()) {
+ [_incognitoView setBackgroundColor:[UIColor clearColor]];
+ } else {
+ [_incognitoView
+ setBackgroundColor:[UIColor colorWithWhite:34 / 255.0 alpha:1.0]];
+ }
+ if (!IsIPadIdiom()) {
+ [_incognitoView setDelegate:self];
+ _webToolbarDelegate.reset(webToolbarDelegate);
+ [_webToolbarDelegate updateToolbarBackgroundAlpha:0];
+ }
+ [_view addSubview:_incognitoView];
+ }
+ return self;
+}
+
+- (CGFloat)toolbarAlphaForScrollView:(UIScrollView*)scrollView {
+ CGFloat alpha = scrollView.contentOffset.y / kDistanceToFadeToolbar;
+ return MAX(MIN(alpha, 1), 0);
+}
+
+- (void)dealloc {
+ [_webToolbarDelegate updateToolbarBackgroundAlpha:1];
+ [_incognitoView setDelegate:nil];
+ [super dealloc];
+}
+
+#pragma mark -
+#pragma mark NewTabPagePanelProtocol
+
+- (void)reload {
+}
+
+- (void)wasShown {
+ CGFloat alpha = [self toolbarAlphaForScrollView:_incognitoView];
+ [_webToolbarDelegate updateToolbarBackgroundAlpha:alpha];
+}
+
+- (void)wasHidden {
+ [_webToolbarDelegate updateToolbarBackgroundAlpha:1];
+}
+
+- (void)dismissModals {
+}
+
+- (void)dismissKeyboard {
+}
+
+- (void)setScrollsToTop:(BOOL)enable {
+}
+
+- (CGFloat)alphaForBottomShadow {
+ return 0;
+}
+
+- (UIView*)view {
+ return _view.get();
+}
+
+#pragma mark -
+#pragma mark UIScrollViewDelegate methods
+
+- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
+ CGFloat alpha = [self toolbarAlphaForScrollView:_incognitoView];
+ [_webToolbarDelegate updateToolbarBackgroundAlpha:alpha];
+}
+
+@end
« no previous file with comments | « ios/chrome/browser/ui/ntp/incognito_panel_controller.h ('k') | ios/chrome/browser/ui/ntp/most_visited_cell.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698