OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/chrome/browser/ui/alert_coordinator/loading_alert_coordinator.h" | 5 #import "ios/chrome/browser/ui/alert_coordinator/loading_alert_coordinator.h" |
6 | 6 |
7 #import <UIKit/UIKit.h> | 7 #import <UIKit/UIKit.h> |
8 | 8 |
9 #include "base/ios/block_types.h" | 9 #include "base/ios/block_types.h" |
10 #import "base/ios/weak_nsobject.h" | |
11 #import "base/mac/scoped_block.h" | 10 #import "base/mac/scoped_block.h" |
12 #import "base/mac/scoped_nsobject.h" | |
13 #include "components/strings/grit/components_strings.h" | 11 #include "components/strings/grit/components_strings.h" |
14 #import "ios/chrome/browser/ui/material_components/activity_indicator.h" | 12 #import "ios/chrome/browser/ui/material_components/activity_indicator.h" |
15 #import "ios/chrome/browser/ui/uikit_ui_util.h" | 13 #import "ios/chrome/browser/ui/uikit_ui_util.h" |
16 #import "ios/third_party/material_components_ios/src/components/ActivityIndicato
r/src/MaterialActivityIndicator.h" | 14 #import "ios/third_party/material_components_ios/src/components/ActivityIndicato
r/src/MaterialActivityIndicator.h" |
17 #import "ios/third_party/material_components_ios/src/components/Buttons/src/Mate
rialButtons.h" | 15 #import "ios/third_party/material_components_ios/src/components/Buttons/src/Mate
rialButtons.h" |
18 #import "ios/third_party/material_components_ios/src/components/Dialogs/src/Mate
rialDialogs.h" | 16 #import "ios/third_party/material_components_ios/src/components/Dialogs/src/Mate
rialDialogs.h" |
19 #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoF
ontLoader.h" | 17 #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoF
ontLoader.h" |
20 #include "ui/base/l10n/l10n_util_mac.h" | 18 #include "ui/base/l10n/l10n_util_mac.h" |
21 | 19 |
| 20 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 21 #error "This file requires ARC support." |
| 22 #endif |
| 23 |
22 namespace { | 24 namespace { |
23 | 25 |
24 // MDC constraints. | 26 // MDC constraints. |
25 const CGFloat kMDCPadding = 24.0; | 27 const CGFloat kMDCPadding = 24.0; |
26 const CGFloat kMDCMargin = 40.0; | 28 const CGFloat kMDCMargin = 40.0; |
27 const CGFloat kButtonPadding = 8.0; | 29 const CGFloat kButtonPadding = 8.0; |
28 | 30 |
29 // Size of the activity indicator. | 31 // Size of the activity indicator. |
30 const CGFloat kActivityIndicatorPadding = 50.0; | 32 const CGFloat kActivityIndicatorPadding = 50.0; |
31 | 33 |
32 // Constant for the title | 34 // Constant for the title |
33 const int kTitleLabelFontColor = 0x333333; | 35 const int kTitleLabelFontColor = 0x333333; |
34 const int kTitleLabelFontSize = 16; | 36 const int kTitleLabelFontSize = 16; |
35 | 37 |
36 // Maximum size of the dialog | 38 // Maximum size of the dialog |
37 const CGFloat kPrefWidth = 330; | 39 const CGFloat kPrefWidth = 330; |
38 const CGFloat kPrefHeight = 300; | 40 const CGFloat kPrefHeight = 300; |
39 | 41 |
40 } // namespace | 42 } // namespace |
41 | 43 |
42 @interface LoadingAlertCoordinator () { | 44 @interface LoadingAlertCoordinator () { |
43 // Title of the alert. | 45 // Title of the alert. |
44 base::scoped_nsobject<NSString> _title; | 46 NSString* _title; |
45 // Callback for the cancel button. | 47 // Callback for the cancel button. |
46 base::mac::ScopedBlock<ProceduralBlock> _cancelHandler; | 48 ProceduralBlock _cancelHandler; |
47 // View Controller which will be displayed on |baseViewController|. | 49 // View Controller which will be displayed on |baseViewController|. |
48 base::scoped_nsobject<UIViewController> _presentedViewController; | 50 UIViewController* _presentedViewController; |
49 } | 51 } |
50 | 52 |
51 // Callback called when the cancel button is pressed. | 53 // Callback called when the cancel button is pressed. |
52 - (void)cancelCallback; | 54 - (void)cancelCallback; |
53 | 55 |
54 @end | 56 @end |
55 | 57 |
56 // View Controller handling the layout of the dialog. | 58 // View Controller handling the layout of the dialog. |
57 @interface LoadingViewController : UIViewController { | 59 @interface LoadingViewController : UIViewController { |
58 // Title of the dialog. | 60 // Title of the dialog. |
59 base::scoped_nsobject<NSString> _title; | 61 NSString* _title; |
60 // View containing the elements of the dialog. | 62 // View containing the elements of the dialog. |
61 base::scoped_nsobject<UIView> _contentView; | 63 UIView* _contentView; |
62 // Coordinator used for the cancel callback. | 64 // Coordinator used for the cancel callback. |
63 base::WeakNSObject<LoadingAlertCoordinator> _coordinator; | 65 __weak LoadingAlertCoordinator* _coordinator; |
64 // Transitioning delegate for this ViewController. | 66 // Transitioning delegate for this ViewController. |
65 base::scoped_nsobject<MDCDialogTransitionController> _transitionDelegate; | 67 MDCDialogTransitionController* _transitionDelegate; |
66 } | 68 } |
67 | 69 |
68 // Initializes with the |title| of the dialog and the |coordinator| which will | 70 // Initializes with the |title| of the dialog and the |coordinator| which will |
69 // be notified if the cancel callback occurs. | 71 // be notified if the cancel callback occurs. |
70 - (instancetype)initWithTitle:(NSString*)title | 72 - (instancetype)initWithTitle:(NSString*)title |
71 coordinator:(LoadingAlertCoordinator*)coordinator; | 73 coordinator:(LoadingAlertCoordinator*)coordinator; |
72 | 74 |
73 // Returns the maximum possible width for the dialog, taking into account the | 75 // Returns the maximum possible width for the dialog, taking into account the |
74 // MDC constraints. | 76 // MDC constraints. |
75 - (CGFloat)maxDialogWidth; | 77 - (CGFloat)maxDialogWidth; |
76 // Callback for the cancel button, calling the coordinator's callback. | 78 // Callback for the cancel button, calling the coordinator's callback. |
77 - (void)cancelCallback; | 79 - (void)cancelCallback; |
78 | 80 |
79 @end | 81 @end |
80 | 82 |
81 @implementation LoadingViewController | 83 @implementation LoadingViewController |
82 | 84 |
83 - (instancetype)initWithTitle:(NSString*)title | 85 - (instancetype)initWithTitle:(NSString*)title |
84 coordinator:(LoadingAlertCoordinator*)coordinator { | 86 coordinator:(LoadingAlertCoordinator*)coordinator { |
85 self = [super initWithNibName:nil bundle:nil]; | 87 self = [super initWithNibName:nil bundle:nil]; |
86 if (self) { | 88 if (self) { |
87 _title.reset([title copy]); | 89 _title = [title copy]; |
88 _coordinator.reset(coordinator); | 90 _coordinator = coordinator; |
89 self.modalPresentationStyle = UIModalPresentationCustom; | 91 self.modalPresentationStyle = UIModalPresentationCustom; |
90 _transitionDelegate.reset([[MDCDialogTransitionController alloc] init]); | 92 _transitionDelegate = [[MDCDialogTransitionController alloc] init]; |
91 self.transitioningDelegate = _transitionDelegate; | 93 self.transitioningDelegate = _transitionDelegate; |
92 } | 94 } |
93 return self; | 95 return self; |
94 } | 96 } |
95 | 97 |
96 - (void)viewDidLoad { | 98 - (void)viewDidLoad { |
97 [super viewDidLoad]; | 99 [super viewDidLoad]; |
98 | 100 |
99 self.preferredContentSize = CGSizeMake([self maxDialogWidth], kPrefHeight); | 101 self.preferredContentSize = CGSizeMake([self maxDialogWidth], kPrefHeight); |
100 self.view.backgroundColor = [UIColor whiteColor]; | 102 self.view.backgroundColor = [UIColor whiteColor]; |
101 | 103 |
102 // Cancel button. | 104 // Cancel button. |
103 NSString* cancelTitle = l10n_util::GetNSString(IDS_CANCEL); | 105 NSString* cancelTitle = l10n_util::GetNSString(IDS_CANCEL); |
104 MDCFlatButton* cancelButton = [[[MDCFlatButton alloc] init] autorelease]; | 106 MDCFlatButton* cancelButton = [[MDCFlatButton alloc] init]; |
105 [cancelButton sizeToFit]; | 107 [cancelButton sizeToFit]; |
106 [cancelButton setCustomTitleColor:[UIColor blackColor]]; | 108 [cancelButton setCustomTitleColor:[UIColor blackColor]]; |
107 [cancelButton setTitle:cancelTitle forState:UIControlStateNormal]; | 109 [cancelButton setTitle:cancelTitle forState:UIControlStateNormal]; |
108 [cancelButton addTarget:self | 110 [cancelButton addTarget:self |
109 action:@selector(cancelCallback) | 111 action:@selector(cancelCallback) |
110 forControlEvents:UIControlEventTouchUpInside]; | 112 forControlEvents:UIControlEventTouchUpInside]; |
111 | 113 |
112 // Activity indicator. | 114 // Activity indicator. |
113 base::scoped_nsobject<MDCActivityIndicator> activityIndicator( | 115 MDCActivityIndicator* activityIndicator = |
114 [[MDCActivityIndicator alloc] initWithFrame:CGRectZero]); | 116 [[MDCActivityIndicator alloc] initWithFrame:CGRectZero]; |
115 [activityIndicator setCycleColors:ActivityIndicatorBrandedCycleColors()]; | 117 [activityIndicator setCycleColors:ActivityIndicatorBrandedCycleColors()]; |
116 [activityIndicator startAnimating]; | 118 [activityIndicator startAnimating]; |
117 | 119 |
118 // Title. | 120 // Title. |
119 NSMutableDictionary* attrsDictionary = [NSMutableDictionary | 121 NSMutableDictionary* attrsDictionary = [NSMutableDictionary |
120 dictionaryWithObject:[[MDFRobotoFontLoader sharedInstance] | 122 dictionaryWithObject:[[MDFRobotoFontLoader sharedInstance] |
121 mediumFontOfSize:kTitleLabelFontSize] | 123 mediumFontOfSize:kTitleLabelFontSize] |
122 forKey:NSFontAttributeName]; | 124 forKey:NSFontAttributeName]; |
123 [attrsDictionary setObject:UIColorFromRGB(kTitleLabelFontColor) | 125 [attrsDictionary setObject:UIColorFromRGB(kTitleLabelFontColor) |
124 forKey:NSForegroundColorAttributeName]; | 126 forKey:NSForegroundColorAttributeName]; |
125 | 127 |
126 NSMutableAttributedString* string = [[[NSMutableAttributedString alloc] | 128 NSMutableAttributedString* string = |
127 initWithString:_title | 129 [[NSMutableAttributedString alloc] initWithString:_title |
128 attributes:attrsDictionary] autorelease]; | 130 attributes:attrsDictionary]; |
129 | 131 |
130 UILabel* title = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease]; | 132 UILabel* title = [[UILabel alloc] initWithFrame:CGRectZero]; |
131 title.attributedText = string; | 133 title.attributedText = string; |
132 | 134 |
133 // Content view. | 135 // Content view. |
134 _contentView.reset([[UIView alloc] initWithFrame:CGRectZero]); | 136 _contentView = [[UIView alloc] initWithFrame:CGRectZero]; |
135 | 137 |
136 // Constraints. | 138 // Constraints. |
137 [activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO]; | 139 [activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO]; |
138 [cancelButton setTranslatesAutoresizingMaskIntoConstraints:NO]; | 140 [cancelButton setTranslatesAutoresizingMaskIntoConstraints:NO]; |
139 [title setTranslatesAutoresizingMaskIntoConstraints:NO]; | 141 [title setTranslatesAutoresizingMaskIntoConstraints:NO]; |
140 [_contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; | 142 [_contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; |
141 | 143 |
142 [_contentView addSubview:title]; | 144 [_contentView addSubview:title]; |
143 [_contentView addSubview:activityIndicator]; | 145 [_contentView addSubview:activityIndicator]; |
144 [_contentView addSubview:cancelButton]; | 146 [_contentView addSubview:cancelButton]; |
145 | 147 |
146 [[self view] addSubview:_contentView]; | 148 [[self view] addSubview:_contentView]; |
147 | 149 |
148 NSDictionary* viewsDictionary = @{ | 150 NSDictionary* viewsDictionary = @{ |
149 @"spinner" : activityIndicator, | 151 @"spinner" : activityIndicator, |
150 @"cancel" : cancelButton, | 152 @"cancel" : cancelButton, |
151 @"title" : title, | 153 @"title" : title, |
152 @"contentView" : _contentView.get() | 154 @"contentView" : _contentView |
153 }; | 155 }; |
154 NSDictionary* metrics = @{ | 156 NSDictionary* metrics = @{ |
155 @"padding" : @(kMDCPadding), | 157 @"padding" : @(kMDCPadding), |
156 @"buttonPadding" : @(kButtonPadding), | 158 @"buttonPadding" : @(kButtonPadding), |
157 @"spinnerButtonPadding" : @(kButtonPadding + kMDCPadding), | 159 @"spinnerButtonPadding" : @(kButtonPadding + kMDCPadding), |
158 @"spinnerPadding" : @(kActivityIndicatorPadding) | 160 @"spinnerPadding" : @(kActivityIndicatorPadding) |
159 }; | 161 }; |
160 | 162 |
161 NSString* verticalConstaint = @"V:|-(padding)-[title]-(spinnerPadding)-[" | 163 NSString* verticalConstaint = @"V:|-(padding)-[title]-(spinnerPadding)-[" |
162 @"spinner]-(spinnerButtonPadding)-[cancel]-(" | 164 @"spinner]-(spinnerButtonPadding)-[cancel]-(" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 - (instancetype)initWithBaseViewController:(UIViewController*)viewController { | 203 - (instancetype)initWithBaseViewController:(UIViewController*)viewController { |
202 NOTREACHED(); | 204 NOTREACHED(); |
203 return nil; | 205 return nil; |
204 } | 206 } |
205 | 207 |
206 - (instancetype)initWithBaseViewController:(UIViewController*)viewController | 208 - (instancetype)initWithBaseViewController:(UIViewController*)viewController |
207 title:(NSString*)title | 209 title:(NSString*)title |
208 cancelHandler:(ProceduralBlock)cancelHandler { | 210 cancelHandler:(ProceduralBlock)cancelHandler { |
209 self = [super initWithBaseViewController:viewController]; | 211 self = [super initWithBaseViewController:viewController]; |
210 if (self) { | 212 if (self) { |
211 _title.reset([title copy]); | 213 _title = [title copy]; |
212 _cancelHandler.reset(cancelHandler, base::scoped_policy::RETAIN); | 214 _cancelHandler = cancelHandler; |
213 } | 215 } |
214 return self; | 216 return self; |
215 } | 217 } |
216 | 218 |
217 - (void)start { | 219 - (void)start { |
218 _presentedViewController.reset( | 220 _presentedViewController = |
219 [[LoadingViewController alloc] initWithTitle:_title coordinator:self]); | 221 [[LoadingViewController alloc] initWithTitle:_title coordinator:self]; |
220 [self.baseViewController presentViewController:_presentedViewController | 222 [self.baseViewController presentViewController:_presentedViewController |
221 animated:YES | 223 animated:YES |
222 completion:nil]; | 224 completion:nil]; |
223 } | 225 } |
224 | 226 |
225 - (void)stop { | 227 - (void)stop { |
226 [[_presentedViewController presentingViewController] | 228 [[_presentedViewController presentingViewController] |
227 dismissViewControllerAnimated:NO | 229 dismissViewControllerAnimated:NO |
228 completion:nil]; | 230 completion:nil]; |
229 _presentedViewController.reset(); | 231 _presentedViewController = nil; |
230 _cancelHandler.reset(); | 232 _cancelHandler = nil; |
231 } | 233 } |
232 | 234 |
233 - (void)cancelCallback { | 235 - (void)cancelCallback { |
234 if (_cancelHandler) | 236 if (_cancelHandler) |
235 _cancelHandler.get()(); | 237 _cancelHandler(); |
236 [self stop]; | 238 [self stop]; |
237 } | 239 } |
238 | 240 |
239 @end | 241 @end |
OLD | NEW |