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

Side by Side Diff: ios/chrome/browser/ui/authentication/signin_promo_view.mm

Issue 2749703003: Adding mediator for Sign-in promo (Closed)
Patch Set: Visual constraints Created 3 years, 9 months 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
6
7 #include "base/logging.h"
8 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
9 #import "ios/chrome/browser/ui/uikit_ui_util.h"
10 #include "ios/chrome/grit/ios_strings.h"
11 #import "ios/third_party/material_components_ios/src/components/Buttons/src/Mate rialButtons.h"
12 #import "ios/third_party/material_components_ios/src/components/Typography/src/M aterialTypography.h"
13
14 #if !defined(__has_feature) || !__has_feature(objc_arc)
15 #error "This file requires ARC support."
16 #endif
17
18 namespace {
19 // Horizontal padding for label and buttons.
20 const CGFloat kHorizontalPadding = 40;
21 // Vertical padding for the image and the label.
22 const CGFloat kVerticalPadding = 12;
23 // Vertical padding for buttons.
24 const CGFloat kButtonVerticalPadding = 6;
25 // Image size for warm start.
26 const CGFloat kProfileImageFixedSize = 48;
27 // Image size for cold start.
28 const CGFloat kChromeImageFixedSize = 24;
msarda 2017/03/22 12:18:39 I expect the profile image and the chrome image sh
lpromero 2017/03/24 10:36:20 That would be simpler for us. Try to push back to
jlebel 2017/03/24 20:59:08 I don't understand my code already handles the 2 s
29 // Button height.
30 const CGFloat kButtonHeight = 36;
31 }
32
33 @implementation SigninPromoView {
34 SigninPromoViewMode _mode;
lpromero 2017/03/24 10:36:20 These 5 ivars are not needed, as they are generate
jlebel 2017/03/24 20:59:09 Done.
35 UIImageView* _imageView;
36 UILabel* _textLabel;
37 MDCFlatButton* _primaryButton;
38 MDCFlatButton* _secondaryButton;
39
40 NSArray<NSLayoutConstraint*>* _coldStartConstraints;
msarda 2017/03/22 12:18:39 s/_coldStartConstraints/_secondaryButtonVisibleCon
lpromero 2017/03/24 10:36:20 Actually, I like the abstraction the names give.
jlebel 2017/03/24 20:59:09 Acknowledged.
41 NSArray<NSLayoutConstraint*>* _warmStartConstraints;
msarda 2017/03/22 12:18:39 s/_coldStartConstraints/_secondaryButtonHiddenCons
jlebel 2017/03/24 20:59:09 Acknowledged.
42 }
43
44 @synthesize mode = _mode;
45 @synthesize imageView = _imageView;
46 @synthesize textLabel = _textLabel;
47 @synthesize primaryButton = _primaryButton;
48 @synthesize secondaryButton = _secondaryButton;
49
50 - (instancetype)initWithCoder:(NSCoder*)aDecoder {
lpromero 2017/03/24 10:36:20 No need for this (see similar comment above or bel
jlebel 2017/03/24 20:59:09 Done.
51 NOTREACHED();
52 return nil;
53 }
54
55 - (instancetype)initWithFrame:(CGRect)frame {
56 self = [super initWithFrame:frame];
57 if (self) {
58 self.translatesAutoresizingMaskIntoConstraints = NO;
59 self.isAccessibilityElement = YES;
60 [self addSubviews];
61 [self setDefaultViewStyling];
62 [self setViewConstraints];
msarda 2017/03/22 12:18:39 Consider calling [self setMode:SigninPromoViewCold
lpromero 2017/03/24 10:36:20 Ha! Mihai, you advised against calling methods in
jlebel 2017/03/24 20:59:09 I can't call -[SigninPromoView setMode:] in the in
63 _mode = SigninPromoViewColdStartMode;
64 [self activateColdMode];
65 }
66 return self;
67 }
68
69 - (void)addSubviews {
70 self.clipsToBounds = YES;
71
72 _imageView = [[UIImageView alloc] init];
73 _imageView.translatesAutoresizingMaskIntoConstraints = NO;
74 [self addSubview:_imageView];
75
76 _textLabel = [[UILabel alloc] init];
77 _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
78 [self addSubview:_textLabel];
79
80 _primaryButton = [[MDCFlatButton alloc] init];
81 _primaryButton.translatesAutoresizingMaskIntoConstraints = NO;
82 _primaryButton.accessibilityIdentifier = @"signin_promo_primary_button";
83 [self addSubview:_primaryButton];
84
85 _secondaryButton = [[MDCFlatButton alloc] init];
86 _secondaryButton.translatesAutoresizingMaskIntoConstraints = NO;
87 _secondaryButton.accessibilityIdentifier = @"signin_promo_secondary_button";
88 [self addSubview:_secondaryButton];
89 }
90
91 - (void)setDefaultViewStyling {
92 _imageView.contentMode = UIViewContentModeCenter;
93 _imageView.layer.masksToBounds = YES;
94 _imageView.contentMode = UIViewContentModeScaleAspectFit;
95
96 _textLabel.font = [MDCTypography buttonFont];
97 _textLabel.textColor = [[MDCPalette greyPalette] tint900];
98 _textLabel.numberOfLines = 0;
99 _textLabel.textAlignment = NSTextAlignmentCenter;
100
101 [_primaryButton setBackgroundColor:[[MDCPalette cr_bluePalette] tint500]
102 forState:UIControlStateNormal];
103 _primaryButton.customTitleColor = [UIColor whiteColor];
104 _primaryButton.inkColor = [UIColor colorWithWhite:1 alpha:0.2];
105
106 _secondaryButton.customTitleColor = [[MDCPalette cr_bluePalette] tint500];
107 _secondaryButton.uppercaseTitle = NO;
108 }
109
110 - (void)setViewConstraints {
111 NSDictionary* metrics = @{
112 @"kButtonHeight" : @(kButtonHeight),
113 @"kButtonVerticalPadding" : @(kButtonVerticalPadding),
114 @"kButtonVerticalPaddingx2" : @(kButtonVerticalPadding * 2),
115 @"kChromeImageFixedSize" : @(kChromeImageFixedSize),
116 @"kHorizontalPadding" : @(kHorizontalPadding),
117 @"kProfileImageFixedSize" : @(kProfileImageFixedSize),
118 @"kVerticalPadding" : @(kVerticalPadding),
119 @"kVerticalPaddingx2" : @(kVerticalPadding * 2),
120 @"kVerticalPaddingkButtonVerticalPadding" :
121 @(kVerticalPadding + kButtonVerticalPadding),
122 };
123 NSDictionary* views = @{
124 @"imageView" : _imageView,
125 @"primaryButton" : _primaryButton,
126 @"secondaryButton" : _secondaryButton,
127 @"textLabel" : _textLabel,
128 };
129
130 // Constraints in shared between modes.
msarda 2017/03/22 12:18:39 Constraints shared between modes.
jlebel 2017/03/24 20:59:09 Done.
131 NSString* formatString =
132 @"V:|-kVerticalPaddingx2-[imageView]-kVerticalPadding-[textLabel]-"
133 @"kVerticalPaddingkButtonVerticalPadding-[primaryButton(kButtonHeight)]";
msarda 2017/03/22 12:18:39 Personal pref: Consider removing the @ on this sec
lpromero 2017/03/24 10:36:20 Agreed, I thought it was a second string.
jlebel 2017/03/24 20:59:09 Done.
134 [NSLayoutConstraint
135 activateConstraints:
136 [NSLayoutConstraint
137 constraintsWithVisualFormat:formatString
138 options:NSLayoutFormatAlignAllCenterX
139 metrics:metrics
140 views:views]];
141
142 formatString = @"H:|-kHorizontalPadding-[primaryButton]-kHorizontalPadding-|";
msarda 2017/03/22 12:18:39 You can put all these visual constraints in a sing
jlebel 2017/03/24 20:59:08 Done.
143 [NSLayoutConstraint
msarda 2017/03/22 12:18:39 I think this code would be so much simpler to read
jlebel 2017/03/24 20:59:09 I will do that in another patch.
msarda 2017/03/27 09:34:16 I have a strong preference for this as I think it
144 activateConstraints:[NSLayoutConstraint
145 constraintsWithVisualFormat:formatString
146 options:0
147 metrics:metrics
148 views:views]];
149
150 // Constraints for cold start mode.
151 NSMutableArray* constraints = [NSMutableArray array];
152 formatString = @"V:[primaryButton]-kVerticalPaddingkButtonVerticalPadding-|";
153 [constraints addObjectsFromArray:[NSLayoutConstraint
154 constraintsWithVisualFormat:formatString
155 options:0
156 metrics:metrics
157 views:views]];
158 formatString = @"H:[imageView(kChromeImageFixedSize)]";
159 [constraints addObjectsFromArray:[NSLayoutConstraint
160 constraintsWithVisualFormat:formatString
161 options:0
162 metrics:metrics
163 views:views]];
164 formatString = @"V:[imageView(kChromeImageFixedSize)]";
165 [constraints addObjectsFromArray:[NSLayoutConstraint
166 constraintsWithVisualFormat:formatString
167 options:0
168 metrics:metrics
169 views:views]];
170 _coldStartConstraints = [constraints copy];
171
172 // Constraints for warm start mode.
173 constraints = [NSMutableArray array];
174 formatString = @"V:[primaryButton]-kButtonVerticalPaddingx2-[secondaryButton("
175 @"kButtonHeight)]-kVerticalPaddingkButtonVerticalPadding-|";
176 [constraints addObjectsFromArray:[NSLayoutConstraint
177 constraintsWithVisualFormat:formatString
178 options:0
179 metrics:metrics
180 views:views]];
181 formatString =
182 @"H:|-kHorizontalPadding-[secondaryButton]-kHorizontalPadding-|";
183 [constraints addObjectsFromArray:
184 [NSLayoutConstraint
185 constraintsWithVisualFormat:formatString
186 options:NSLayoutFormatAlignAllCenterX
lpromero 2017/03/24 10:36:20 Isn't tis option already done with line 138?
jlebel 2017/03/24 20:59:09 I didn't know it applied to the secondary button e
lpromero 2017/03/27 13:14:46 Oh good catch. Line 138 might not set this then.
187 metrics:metrics
188 views:views]];
189 formatString = @"H:[imageView(kProfileImageFixedSize)]";
190 [constraints addObjectsFromArray:[NSLayoutConstraint
191 constraintsWithVisualFormat:formatString
192 options:0
193 metrics:metrics
194 views:views]];
195 formatString = @"V:[imageView(kProfileImageFixedSize)]";
196 [constraints addObjectsFromArray:[NSLayoutConstraint
197 constraintsWithVisualFormat:formatString
198 options:0
199 metrics:metrics
200 views:views]];
201 _warmStartConstraints = [constraints copy];
202 _mode = SigninPromoViewWarmStartMode;
msarda 2017/03/22 12:18:39 I think this line needs to be removed.
jlebel 2017/03/24 20:59:09 Done.
203 }
204
205 - (void)setMode:(SigninPromoViewMode)mode {
206 if (mode == _mode) {
207 return;
208 }
209 _mode = mode;
210 switch (_mode) {
211 case SigninPromoViewColdStartMode:
212 [self activateColdMode];
213 return;
214 case SigninPromoViewWarmStartMode:
215 [self activateWarmMode];
216 return;
217 }
218 NOTREACHED();
219 }
220
221 - (void)activateColdMode {
msarda 2017/03/22 12:18:39 DCHECK(_mode, COLD);
jlebel 2017/03/24 20:59:09 Done.
222 // TODO(jlebel) Needs to set the chrome/chromium icon in |imageView|.
msarda 2017/03/22 12:18:39 Please remove this TODO as it is the job of the co
jlebel 2017/03/24 20:59:09 I'm going to follow Louis suggestion and keep it t
223 [NSLayoutConstraint deactivateConstraints:_warmStartConstraints];
224 [NSLayoutConstraint activateConstraints:_coldStartConstraints];
225 _secondaryButton.hidden = YES;
226 }
227
228 - (void)activateWarmMode {
msarda 2017/03/22 12:18:39 DCHECK(_mode, WARM);
jlebel 2017/03/24 20:59:09 Done.
229 [NSLayoutConstraint deactivateConstraints:_coldStartConstraints];
230 [NSLayoutConstraint activateConstraints:_warmStartConstraints];
231 _secondaryButton.hidden = NO;
232 }
233
234 - (void)setProfileImage:(UIImage*)image {
lpromero 2017/03/24 10:36:20 Can you add a comment in the header that this is a
jlebel 2017/03/24 20:59:09 Should I rephrase: "Should be called only with the
235 if (SigninPromoViewColdStartMode == _mode) {
236 return;
237 }
238 _imageView.image = CircularImageFromImage(image, kProfileImageFixedSize);
239 }
240
241 - (void)accessibilityPrimaryAction:(id)unused {
242 [_primaryButton sendActionsForControlEvents:UIControlEventTouchUpInside];
243 }
244
245 - (void)accessibilitySecondaryAction:(id)unused {
246 [_secondaryButton sendActionsForControlEvents:UIControlEventTouchUpInside];
247 }
248
249 - (CGFloat)horizontalPadding {
lpromero 2017/03/24 10:36:20 Doesn't seem used.
jlebel 2017/03/24 20:59:09 It is used. It is explained in the header why this
lpromero 2017/03/27 13:14:46 Sounds good.
250 return kHorizontalPadding;
251 }
252
253 #pragma mark - NSObject(Accessibility)
254
255 - (NSArray<UIAccessibilityCustomAction*>*)accessibilityCustomActions {
256 NSString* primaryActionName =
257 [_primaryButton titleForState:UIControlStateNormal];
258 UIAccessibilityCustomAction* primaryCustomAction =
259 [[UIAccessibilityCustomAction alloc]
260 initWithName:primaryActionName
261 target:self
262 selector:@selector(accessibilityPrimaryAction:)];
263 if (_mode == SigninPromoViewColdStartMode) {
264 return @[ primaryCustomAction ];
265 }
266 NSString* secondaryActionName =
267 [_secondaryButton titleForState:UIControlStateNormal];
268 UIAccessibilityCustomAction* secondaryCustomAction =
269 [[UIAccessibilityCustomAction alloc]
270 initWithName:secondaryActionName
271 target:self
272 selector:@selector(accessibilitySecondaryAction:)];
273 return @[ primaryCustomAction, secondaryCustomAction ];
274 }
275
276 - (NSString*)accessibilityLabel {
277 return _textLabel.text;
278 }
279
280 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698