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

Unified Diff: ios/chrome/today_extension/physical_web_optin_footer.mm

Issue 2586713002: Upstream code and resources for Chrome on iOS extensions. (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/today_extension/physical_web_optin_footer.mm
diff --git a/ios/chrome/today_extension/physical_web_optin_footer.mm b/ios/chrome/today_extension/physical_web_optin_footer.mm
new file mode 100644
index 0000000000000000000000000000000000000000..9287489c6ae7d5a4de2c9a07ad93a00c8556912d
--- /dev/null
+++ b/ios/chrome/today_extension/physical_web_optin_footer.mm
@@ -0,0 +1,262 @@
+// 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/today_extension/physical_web_optin_footer.h"
+
+#import "base/mac/scoped_block.h"
+#import "base/mac/scoped_nsobject.h"
+#include "ios/chrome/today_extension/interactive_label.h"
+#include "ios/chrome/today_extension/lock_screen_state.h"
+#import "ios/chrome/today_extension/transparent_button.h"
+#import "ios/chrome/today_extension/ui_util.h"
+#include "ios/today_extension/grit/ios_today_extension_strings.h"
+#import "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+// Vertical space between the title and the description.
+const CGFloat kTitleVerticalMargin = 3;
+// Font size of the button.
+const CGFloat kButtonFontSize = 13;
+// Left and right padding inside the button.
+const CGFloat kButtonPadding = 8;
+// Space between buttons.
+const CGFloat kButtonSpacing = 4;
+// Height of the buttons.
+const CGFloat kButtonHeight = 30;
+// Vertical space between the description and the buttons.
+const CGFloat kButtonVerticalMargin = 16;
+// Font size of the explanation.
+const CGFloat kDescriptionFontSize = 14;
+
+} // namespace
+
+@interface PhysicalWebOptInFooter ()
+
+- (void)optInButtonPressed:(id)sender;
+- (void)dismissButtonPressed:(id)sender;
+
+@end
+
+@implementation PhysicalWebOptInFooter {
+ // Container of the views of the opt-in dialog.
+ base::scoped_nsobject<UIView> _mainView;
+ // Title.
+ base::scoped_nsobject<UILabel> _titleView;
+ // Explanation.
+ base::scoped_nsobject<InteractiveLabel> _descriptionLabel;
+ // Confirm opt-in.
+ base::scoped_nsobject<TransparentButton> _optInButton;
+ // Refuse opt-in.
+ base::scoped_nsobject<TransparentButton> _dismissButton;
+ // Physical Web logo.
+ base::scoped_nsobject<UIImageView> _imageView;
+ // Outer horizontal padding.
+ CGFloat _horizontalPadding;
+ // Physical Web logo size.
+ CGSize _imageSize;
+ // Distance between the icon and the title.
+ CGFloat _imageTextSeparator;
+ // Opt-in action block.
+ base::mac::ScopedBlock<EnableDisableBlock> _optinAction;
+ // Dismiss action block.
+ base::mac::ScopedBlock<EnableDisableBlock> _dismissAction;
+ // Whether the screen is locked.
+ BOOL _locked;
+}
+
+- (id)initWithLeftInset:(CGFloat)leftInset
+ learnMoreBlock:(LearnMoreBlock)learnMoreBlock
+ optinAction:(EnableDisableBlock)optinAction
+ dismissAction:(EnableDisableBlock)dismissAction {
+ self = [super init];
+ if (self) {
+ _mainView.reset([[UIView alloc] initWithFrame:CGRectZero]);
+ _locked = [[LockScreenState sharedInstance] isScreenLocked];
+ [_mainView setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ [_mainView setUserInteractionEnabled:YES];
+
+ // Creates the layout of the opt-in UI.
+ UIImage* iconImage = [UIImage imageNamed:@"todayview_physical_web"];
+ _imageSize = [iconImage size];
+ _imageView.reset([[UIImageView alloc] init]);
+ [_imageView setImage:iconImage];
+ [_imageView setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ _titleView.reset([[UILabel alloc] initWithFrame:CGRectZero]);
+ [_titleView setTranslatesAutoresizingMaskIntoConstraints:NO];
+ [_titleView setText:l10n_util::GetNSString(
+ IDS_IOS_PYSICAL_WEB_TODAY_EXTENSION_OPTIN_TITLE)];
+ UIFont* titleFont =
+ [UIFont fontWithName:@"Helvetica" size:ui_util::kTitleFontSize];
+ [_titleView setTextColor:ui_util::TitleColor()];
+ [_titleView setFont:titleFont];
+ [_titleView setTextAlignment:ui_util::IsRTL() ? NSTextAlignmentRight
+ : NSTextAlignmentLeft];
+ [_titleView sizeToFit];
+
+ NSString* description;
+ if (_locked) {
+ description = l10n_util::GetNSString(
+ IDS_IOS_PYSICAL_WEB_TODAY_EXTENSION_OPTIN_UNLOCK);
+ } else {
+ description = l10n_util::GetNSString(
+ IDS_IOS_PYSICAL_WEB_TODAY_EXTENSION_OPTIN_DESCRIPTION);
+ }
+ _descriptionLabel.reset([[InteractiveLabel alloc]
+ initWithFrame:CGRectZero
+ labelString:description
+ fontSize:kDescriptionFontSize
+ labelAlignment:ui_util::IsRTL() ? NSTextAlignmentRight
+ : NSTextAlignmentLeft
+ insets:UIEdgeInsetsZero
+ buttonString:nil
+ linkBlock:learnMoreBlock
+ buttonBlock:NULL]);
+ [_descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
+ UIStackView* textStack = [[[UIStackView alloc]
+ initWithArrangedSubviews:@[ _titleView, _descriptionLabel ]]
+ autorelease];
+
+ [textStack setAxis:UILayoutConstraintAxisVertical];
+ [textStack setDistribution:UIStackViewDistributionEqualSpacing];
+ [textStack setSpacing:kTitleVerticalMargin];
+ [textStack setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ [_mainView addSubview:textStack];
+ [_mainView addSubview:_imageView];
+
+ _horizontalPadding = leftInset + ui_util::ChromeIconOffset();
+ _imageTextSeparator =
+ ui_util::ChromeTextOffset() - ui_util::ChromeIconOffset();
+
+ [NSLayoutConstraint activateConstraints:@[
+ [[textStack topAnchor] constraintEqualToAnchor:[_imageView topAnchor]],
+ [[textStack topAnchor]
+ constraintEqualToAnchor:[_mainView topAnchor]
+ constant:ui_util::kSecondLineVerticalPadding],
+ [[textStack leadingAnchor]
+ constraintEqualToAnchor:[_imageView leadingAnchor]
+ constant:_imageTextSeparator],
+ [[textStack trailingAnchor]
+ constraintEqualToAnchor:[_mainView trailingAnchor]
+ constant:-_horizontalPadding],
+ [[_imageView widthAnchor] constraintEqualToConstant:_imageSize.width],
+ [[_imageView heightAnchor] constraintEqualToConstant:_imageSize.height],
+ [[_imageView leadingAnchor]
+ constraintEqualToAnchor:[_mainView leadingAnchor]
+ constant:_horizontalPadding]
+ ]];
+
+ if (!_locked) {
+ UIView* buttons = [self createButtonsOptinAction:optinAction
+ dismissAction:dismissAction];
+ [_mainView addSubview:buttons];
+ [[buttons topAnchor] constraintEqualToAnchor:[textStack bottomAnchor]
+ constant:kButtonVerticalMargin]
+ .active = YES;
+ [[buttons centerXAnchor]
+ constraintEqualToAnchor:[_mainView centerXAnchor]]
+ .active = YES;
+ }
+ }
+ return self;
+}
+
+- (UIView*)createButtonsOptinAction:(EnableDisableBlock)optinAction
+ dismissAction:(EnableDisableBlock)dismissAction {
+ UIFont* buttonFont = [UIFont fontWithName:@"Helvetica" size:kButtonFontSize];
+
+ _dismissButton.reset([[TransparentButton alloc] initWithFrame:CGRectZero]);
+ [_dismissButton setCornerRadius:ui_util::kUIButtonCornerRadius];
+ [[_dismissButton titleLabel] setFont:buttonFont];
+ [_dismissButton setInkColor:ui_util::InkColor()];
+ [_dismissButton setTitleColor:ui_util::TitleColor()
+ forState:UIControlStateNormal];
+ [_dismissButton
+ setTitle:l10n_util::GetNSString(
+ IDS_IOS_PYSICAL_WEB_TODAY_EXTENSION_OPTIN_DISMISS)
+ forState:UIControlStateNormal];
+ [_dismissButton setBorderWidth:1.0];
+ [_dismissButton setBorderColor:ui_util::TitleColor()];
+ [_dismissButton addTarget:self
+ action:@selector(dismissButtonPressed:)
+ forControlEvents:UIControlEventTouchUpInside];
+ _dismissAction.reset(dismissAction, base::scoped_policy::RETAIN);
+ [_dismissButton setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ _optInButton.reset([[TransparentButton alloc] initWithFrame:CGRectZero]);
+ [_optInButton setCornerRadius:ui_util::kUIButtonCornerRadius];
+ [[_optInButton titleLabel] setFont:buttonFont];
+ [_optInButton setInkColor:ui_util::InkColor()];
+ [_optInButton setBackgroundColor:ui_util::BackgroundColor()];
+ [_optInButton setTitleColor:[UIColor blackColor]
+ forState:UIControlStateNormal];
+ [_optInButton setTitle:l10n_util::GetNSString(
+ IDS_IOS_PYSICAL_WEB_TODAY_EXTENSION_OPTIN_ACCEPT)
+ forState:UIControlStateNormal];
+ [_optInButton addTarget:self
+ action:@selector(optInButtonPressed:)
+ forControlEvents:UIControlEventTouchUpInside];
+ [_optInButton setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ [[_optInButton heightAnchor] constraintEqualToConstant:kButtonHeight];
+ [[_dismissButton heightAnchor] constraintEqualToConstant:kButtonHeight];
+ [[_optInButton widthAnchor]
+ constraintEqualToAnchor:[_dismissButton widthAnchor]];
+
+ _optinAction.reset(optinAction, base::scoped_policy::RETAIN);
+ UIStackView* buttonStack = [[UIStackView alloc]
+ initWithArrangedSubviews:@[ _dismissButton, _optInButton ]];
+ [buttonStack setUserInteractionEnabled:YES];
+ [buttonStack setAxis:UILayoutConstraintAxisHorizontal];
+ [buttonStack setSpacing:kButtonSpacing];
+ [buttonStack setTranslatesAutoresizingMaskIntoConstraints:NO];
+
+ [[_optInButton heightAnchor] constraintEqualToConstant:kButtonHeight].active =
+ YES;
+ [[_dismissButton heightAnchor] constraintEqualToConstant:kButtonHeight]
+ .active = YES;
+
+ [_optInButton setContentEdgeInsets:UIEdgeInsetsMake(0, kButtonPadding, 0,
+ kButtonPadding)];
+ [_dismissButton setContentEdgeInsets:UIEdgeInsetsMake(0, kButtonPadding, 0,
+ kButtonPadding)];
+
+ [[_optInButton widthAnchor]
+ constraintEqualToAnchor:[_dismissButton widthAnchor]]
+ .active = YES;
+ return [buttonStack autorelease];
+}
+
+- (CGFloat)heightForWidth:(CGFloat)width {
+ CGFloat height = ui_util::kSecondLineVerticalPadding +
+ [_titleView frame].size.height + kTitleVerticalMargin +
+ [_descriptionLabel
+ sizeThatFits:CGSizeMake(width - (_horizontalPadding * 2 +
+ _imageTextSeparator),
+ CGFLOAT_MAX)]
+ .height +
+ ui_util::kSecondLineVerticalPadding;
+
+ if (!_locked) {
+ height += kButtonVerticalMargin + kButtonHeight;
+ }
+ return height;
+}
+
+- (UIView*)view {
+ return _mainView;
+}
+
+- (void)optInButtonPressed:(id)sender {
+ _optinAction.get()();
+}
+
+- (void)dismissButtonPressed:(id)sender {
+ _dismissAction.get()();
+}
+
+@end
« no previous file with comments | « ios/chrome/today_extension/physical_web_optin_footer.h ('k') | ios/chrome/today_extension/resources/todayview_clipboard.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698