| 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
|
|
|