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

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

Issue 2589803002: Upstream Chrome on iOS source code [6/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/whats_new_header_view.mm
diff --git a/ios/chrome/browser/ui/ntp/whats_new_header_view.mm b/ios/chrome/browser/ui/ntp/whats_new_header_view.mm
new file mode 100644
index 0000000000000000000000000000000000000000..96301ef41bb02aca30bb565aef07ebdd9f0921a5
--- /dev/null
+++ b/ios/chrome/browser/ui/ntp/whats_new_header_view.mm
@@ -0,0 +1,205 @@
+// Copyright 2015 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/whats_new_header_view.h"
+
+#include "base/logging.h"
+#include "base/mac/scoped_nsobject.h"
+#import "ios/chrome/browser/ui/uikit_ui_util.h"
+#include "ios/chrome/common/string_util.h"
+#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
+#include "ios/public/provider/chrome/browser/images/branded_image_provider.h"
+#import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h"
+
+namespace {
+
+const CGFloat kLabelTopMargin = 16;
+const CGFloat kLabelBottomMargin = 24;
+const CGFloat kLabelLineSpacing = 4;
+const CGFloat kLabelLeftMargin = 8;
+const CGFloat kLabelFontSize = 14;
+const CGFloat kInfoIconSize = 24;
+const CGFloat kInfoIconTopMargin = 12;
+
+const int kTextColorRgb = 0x333333;
+const int kLinkColorRgb = 0x5595FE;
+
+} // namespace
+
+@interface WhatsNewHeaderView () {
+ base::scoped_nsobject<UIImageView> _infoIconImageView;
+ base::scoped_nsobject<UILabel> _promoLabel;
+ base::scoped_nsobject<NSLayoutConstraint> _edgeConstraint;
+ base::scoped_nsobject<UIView> _leftSpacer;
+ base::scoped_nsobject<UIView> _rightSpacer;
+ CGFloat _sideMargin;
+}
+
+@end
+
+@implementation WhatsNewHeaderView
+
+@synthesize delegate = _delegate;
+
+- (instancetype)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ self.hidden = YES;
+ UIImage* infoIconImage = ios::GetChromeBrowserProvider()
+ ->GetBrandedImageProvider()
+ ->GetWhatsNewIconImage(WHATS_NEW_INFO);
+ _infoIconImageView.reset([[UIImageView alloc] initWithImage:infoIconImage]);
+ _promoLabel.reset([[[self class] promoLabel] retain]);
+ [_promoLabel setUserInteractionEnabled:YES];
+ base::scoped_nsobject<UITapGestureRecognizer> promoTapRecognizer(
+ [[UITapGestureRecognizer alloc]
+ initWithTarget:self
+ action:@selector(promoButtonPressed)]);
+ [_promoLabel addGestureRecognizer:promoTapRecognizer];
+ _leftSpacer.reset([[UIView alloc] initWithFrame:CGRectZero]);
+ _rightSpacer.reset([[UIView alloc] initWithFrame:CGRectZero]);
+
+ [_leftSpacer setHidden:YES];
+ [_rightSpacer setHidden:YES];
+
+ [self addSubview:_infoIconImageView];
+ [self addSubview:_promoLabel];
+ [self addSubview:_leftSpacer];
+ [self addSubview:_rightSpacer];
+ [self setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_infoIconImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_promoLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_leftSpacer setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_rightSpacer setTranslatesAutoresizingMaskIntoConstraints:NO];
+ }
+ return self;
+}
+
+- (void)updateConstraints {
+ if ([[self constraints] count] == 0 && !self.hidden) {
+ NSString* verticalLogoVisualFormat =
+ @"V:|-logoTopMargin-[iconView(==iconSize)]";
+ NSString* verticalLabelVisualFormat = @"V:|-topMargin-[promoLabel]";
+ NSString* horizontalVisualFormat =
+ @"H:|-0-[leftSpacer]-0-[iconView(==iconSize)]-"
+ @"iconTextSpace-[promoLabel]-0-[rightSpacer(==leftSpacer)]-0-|";
+ NSNumber* topMargin = @(kLabelTopMargin);
+ NSNumber* iconSize = @(kInfoIconSize);
+ NSNumber* iconTextSpace = @(kLabelLeftMargin);
+ NSNumber* logoTopMargin = @(kInfoIconTopMargin);
+ NSDictionary* metrics = NSDictionaryOfVariableBindings(
+ topMargin, iconSize, iconTextSpace, logoTopMargin);
+
+ NSDictionary* views = @{
+ @"promoLabel" : _promoLabel,
+ @"iconView" : _infoIconImageView,
+ @"leftSpacer" : _leftSpacer,
+ @"rightSpacer" : _rightSpacer,
+ };
+
+ ApplyVisualConstraintsWithMetrics(
+ @[
+ verticalLogoVisualFormat, verticalLabelVisualFormat,
+ horizontalVisualFormat
+ ],
+ views, metrics, self);
+
+ _edgeConstraint.reset([[NSLayoutConstraint
+ constraintWithItem:_leftSpacer
+ attribute:NSLayoutAttributeWidth
+ relatedBy:NSLayoutRelationGreaterThanOrEqual
+ toItem:nil
+ attribute:NSLayoutAttributeNotAnAttribute
+ multiplier:1
+ constant:_sideMargin] retain]);
+ [self addConstraint:_edgeConstraint];
+ }
+ [_edgeConstraint setConstant:_sideMargin];
+ [super updateConstraints];
+}
+
+- (void)setText:(NSString*)text {
+ [[self class] setText:text inPromoLabel:_promoLabel];
+ self.hidden = NO;
+}
+
+- (void)setIcon:(WhatsNewIcon)icon {
+ UIImage* image = ios::GetChromeBrowserProvider()
+ ->GetBrandedImageProvider()
+ ->GetWhatsNewIconImage(icon);
+ [_infoIconImageView setImage:image];
+}
+
+- (void)setSideMargin:(CGFloat)sideMargin {
+ _sideMargin = sideMargin;
+ [self setNeedsUpdateConstraints];
+ CGFloat maxLabelWidth =
+ self.frame.size.width - 2 * sideMargin - kInfoIconSize - kLabelLeftMargin;
+ [_promoLabel.get() setPreferredMaxLayoutWidth:maxLabelWidth];
+}
+
+- (void)promoButtonPressed {
+ [_delegate onPromoLabelTapped];
+ [self removeConstraints:self.constraints];
+ _edgeConstraint.reset();
+}
+
++ (void)setText:(NSString*)promoLabelText inPromoLabel:(UILabel*)promoLabel {
+ DCHECK(promoLabelText);
+ NSRange linkRange;
+ NSString* strippedText = ParseStringWithLink(promoLabelText, &linkRange);
+ DCHECK_NE(NSNotFound, static_cast<NSInteger>(linkRange.location));
+ DCHECK_NE(0u, linkRange.length);
+
+ NSMutableAttributedString* attributedText =
+ [[[NSMutableAttributedString alloc] initWithString:strippedText]
+ autorelease];
+
+ // Sets the styling to mimic a link.
+ UIColor* linkColor = UIColorFromRGB(kLinkColorRgb, 1.0);
+ [attributedText addAttribute:NSForegroundColorAttributeName
+ value:linkColor
+ range:linkRange];
+ [attributedText addAttribute:NSUnderlineStyleAttributeName
+ value:@(NSUnderlineStyleSingle)
+ range:linkRange];
+ [attributedText addAttribute:NSUnderlineColorAttributeName
+ value:linkColor
+ range:linkRange];
+
+ // Sets the line spacing on the attributed string.
+ NSInteger strLength = [strippedText length];
+ base::scoped_nsobject<NSMutableParagraphStyle> style(
+ [[NSMutableParagraphStyle alloc] init]);
+ [style setLineSpacing:kLabelLineSpacing];
+ [attributedText addAttribute:NSParagraphStyleAttributeName
+ value:style
+ range:NSMakeRange(0, strLength)];
+
+ [promoLabel setAttributedText:attributedText];
+}
+
++ (UILabel*)promoLabel {
+ base::scoped_nsobject<UILabel> promoLabel(
+ [[UILabel alloc] initWithFrame:CGRectZero]);
+ [promoLabel setFont:[[MDFRobotoFontLoader sharedInstance]
+ regularFontOfSize:kLabelFontSize]];
+ [promoLabel setTextColor:UIColorFromRGB(kTextColorRgb, 1.0)];
+ [promoLabel setNumberOfLines:0];
+ [promoLabel setTextAlignment:NSTextAlignmentNatural];
+ [promoLabel setLineBreakMode:NSLineBreakByWordWrapping];
+ return promoLabel.autorelease();
+}
+
++ (int)heightToFitText:(NSString*)text inWidth:(CGFloat)width {
+ CGFloat maxWidthForLabel = width - kInfoIconSize - kLabelLeftMargin;
+ base::scoped_nsobject<UILabel> promoLabel([[self promoLabel] retain]);
+ [[self class] setText:text inPromoLabel:promoLabel.get()];
+ CGFloat promoLabelHeight =
+ [promoLabel sizeThatFits:CGSizeMake(maxWidthForLabel, CGFLOAT_MAX)]
+ .height;
+ return promoLabelHeight + kLabelTopMargin + kLabelBottomMargin;
+}
+
+@end
« no previous file with comments | « ios/chrome/browser/ui/ntp/whats_new_header_view.h ('k') | ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698