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/payments/payment_request_coordinator.h" | 5 #import "ios/chrome/browser/payments/payment_request_coordinator.h" |
6 | 6 |
7 #include <unordered_set> | 7 #include <unordered_set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #import "base/ios/weak_nsobject.h" | 10 #import "base/ios/weak_nsobject.h" |
11 #include "base/mac/objc_property_releaser.h" | 11 #include "base/mac/objc_property_releaser.h" |
12 #include "base/mac/scoped_nsobject.h" | 12 #include "base/mac/scoped_nsobject.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "components/autofill/core/browser/autofill_data_util.h" | 14 #include "components/autofill/core/browser/autofill_data_util.h" |
15 #include "components/autofill/core/browser/autofill_profile.h" | 15 #include "components/autofill/core/browser/autofill_profile.h" |
16 #include "components/autofill/core/browser/credit_card.h" | 16 #include "components/autofill/core/browser/credit_card.h" |
17 #include "components/autofill/core/browser/field_types.h" | 17 #include "components/autofill/core/browser/field_types.h" |
18 #include "components/autofill/core/browser/personal_data_manager.h" | 18 #include "components/autofill/core/browser/personal_data_manager.h" |
19 #include "ios/chrome/browser/application_context.h" | 19 #include "ios/chrome/browser/application_context.h" |
20 | 20 |
21 @interface PaymentRequestCoordinator () { | 21 @interface PaymentRequestCoordinator () { |
22 autofill::PersonalDataManager* _personalDataManager; // weak | 22 autofill::PersonalDataManager* _personalDataManager; // weak |
23 base::WeakNSProtocol<id<PaymentRequestCoordinatorDelegate>> _delegate; | 23 base::WeakNSProtocol<id<PaymentRequestCoordinatorDelegate>> _delegate; |
24 base::scoped_nsobject<UINavigationController> _navigationController; | 24 base::scoped_nsobject<UINavigationController> _navigationController; |
25 base::scoped_nsobject<PaymentRequestViewController> _viewController; | 25 base::scoped_nsobject<PaymentRequestViewController> _viewController; |
26 base::scoped_nsobject<PaymentItemsDisplayCoordinator> | 26 base::scoped_nsobject<PaymentItemsDisplayCoordinator> |
27 _itemsDisplayCoordinator; | 27 _itemsDisplayCoordinator; |
28 base::scoped_nsobject<ShippingAddressSelectionCoordinator> | 28 base::scoped_nsobject<ShippingAddressSelectionCoordinator> |
29 _shippingAddressSelectionCoordinator; | 29 _shippingAddressSelectionCoordinator; |
30 base::scoped_nsobject<ShippingOptionSelectionCoordinator> | |
31 _shippingOptionSelectionCoordinator; | |
30 base::scoped_nsobject<PaymentMethodSelectionCoordinator> | 32 base::scoped_nsobject<PaymentMethodSelectionCoordinator> |
31 _methodSelectionCoordinator; | 33 _methodSelectionCoordinator; |
32 | 34 |
33 base::mac::ObjCPropertyReleaser _propertyReleaser_PaymentRequestCoordinator; | 35 base::mac::ObjCPropertyReleaser _propertyReleaser_PaymentRequestCoordinator; |
34 } | 36 } |
35 | 37 |
36 // Returns the credit cards available from |_personalDataManager| that match | 38 // Returns the credit cards available from |_personalDataManager| that match |
37 // a supported type specified in |_paymentRequest|. | 39 // a supported type specified in |_paymentRequest|. |
38 - (std::vector<autofill::CreditCard*>)supportedMethods; | 40 - (std::vector<autofill::CreditCard*>)supportedMethods; |
39 | 41 |
40 @end | 42 @end |
41 | 43 |
42 @implementation PaymentRequestCoordinator | 44 @implementation PaymentRequestCoordinator |
43 | 45 |
44 @synthesize paymentRequest = _paymentRequest; | 46 @synthesize paymentRequest = _paymentRequest; |
45 @synthesize pageFavicon = _pageFavicon; | 47 @synthesize pageFavicon = _pageFavicon; |
46 @synthesize pageTitle = _pageTitle; | 48 @synthesize pageTitle = _pageTitle; |
47 @synthesize pageHost = _pageHost; | 49 @synthesize pageHost = _pageHost; |
48 @synthesize selectedShippingAddress = _selectedShippingAddress; | 50 @synthesize selectedShippingAddress = _selectedShippingAddress; |
51 @synthesize selectedShippingOption = _selectedShippingOption; | |
52 | |
49 @synthesize selectedPaymentMethod = _selectedPaymentMethod; | 53 @synthesize selectedPaymentMethod = _selectedPaymentMethod; |
50 | 54 |
51 - (instancetype)initWithBaseViewController:(UIViewController*)baseViewController | 55 - (instancetype)initWithBaseViewController:(UIViewController*)baseViewController |
52 personalDataManager: | 56 personalDataManager: |
53 (autofill::PersonalDataManager*)personalDataManager { | 57 (autofill::PersonalDataManager*)personalDataManager { |
54 if ((self = [super initWithBaseViewController:baseViewController])) { | 58 if ((self = [super initWithBaseViewController:baseViewController])) { |
55 _propertyReleaser_PaymentRequestCoordinator.Init( | 59 _propertyReleaser_PaymentRequestCoordinator.Init( |
56 self, [PaymentRequestCoordinator class]); | 60 self, [PaymentRequestCoordinator class]); |
57 _personalDataManager = personalDataManager; | 61 _personalDataManager = personalDataManager; |
58 } | 62 } |
59 return self; | 63 return self; |
60 } | 64 } |
61 | 65 |
62 - (id<PaymentRequestCoordinatorDelegate>)delegate { | 66 - (id<PaymentRequestCoordinatorDelegate>)delegate { |
63 return _delegate.get(); | 67 return _delegate.get(); |
64 } | 68 } |
65 | 69 |
66 - (void)setDelegate:(id<PaymentRequestCoordinatorDelegate>)delegate { | 70 - (void)setDelegate:(id<PaymentRequestCoordinatorDelegate>)delegate { |
67 _delegate.reset(delegate); | 71 _delegate.reset(delegate); |
68 } | 72 } |
69 | 73 |
70 - (void)start { | 74 - (void)start { |
71 const std::vector<autofill::AutofillProfile*> addresses = | 75 const std::vector<autofill::AutofillProfile*> addresses = |
72 _personalDataManager->GetProfilesToSuggest(); | 76 _personalDataManager->GetProfilesToSuggest(); |
73 if (addresses.size() > 0) | 77 if (addresses.size() > 0) |
74 _selectedShippingAddress = addresses[0]; | 78 _selectedShippingAddress = addresses[0]; |
75 | 79 |
80 for (size_t i = 0; i < _paymentRequest.details.shipping_options.size(); ++i) { | |
81 web::PaymentShippingOption* shippingOption = | |
82 &_paymentRequest.details.shipping_options[i]; | |
83 if (shippingOption->selected) { | |
84 // The selected shipping option must be the last shipping option with | |
Justin Donnelly
2017/01/10 17:11:53
At first, I thought you were saying here that the
Moe
2017/01/12 00:06:18
Done.
| |
85 // selected set to true. | |
86 _selectedShippingOption = shippingOption; | |
87 } | |
88 } | |
89 | |
76 const std::vector<autofill::CreditCard*> cards = [self supportedMethods]; | 90 const std::vector<autofill::CreditCard*> cards = [self supportedMethods]; |
77 if (cards.size() > 0) | 91 if (cards.size() > 0) |
78 _selectedPaymentMethod = cards[0]; | 92 _selectedPaymentMethod = cards[0]; |
79 | 93 |
80 _viewController.reset([[PaymentRequestViewController alloc] init]); | 94 _viewController.reset([[PaymentRequestViewController alloc] init]); |
81 [_viewController setPaymentRequest:_paymentRequest]; | 95 [_viewController setPaymentRequest:_paymentRequest]; |
82 [_viewController setPageFavicon:_pageFavicon]; | 96 [_viewController setPageFavicon:_pageFavicon]; |
83 [_viewController setPageTitle:_pageTitle]; | 97 [_viewController setPageTitle:_pageTitle]; |
84 [_viewController setPageHost:_pageHost]; | 98 [_viewController setPageHost:_pageHost]; |
85 [_viewController setSelectedShippingAddress:_selectedShippingAddress]; | 99 [_viewController setSelectedShippingAddress:_selectedShippingAddress]; |
100 [_viewController setSelectedShippingOption:_selectedShippingOption]; | |
86 [_viewController setSelectedPaymentMethod:_selectedPaymentMethod]; | 101 [_viewController setSelectedPaymentMethod:_selectedPaymentMethod]; |
87 [_viewController setDelegate:self]; | 102 [_viewController setDelegate:self]; |
88 [_viewController loadModel]; | 103 [_viewController loadModel]; |
89 | 104 |
90 _navigationController.reset([[UINavigationController alloc] | 105 _navigationController.reset([[UINavigationController alloc] |
91 initWithRootViewController:_viewController]); | 106 initWithRootViewController:_viewController]); |
92 [_navigationController setNavigationBarHidden:YES]; | 107 [_navigationController setNavigationBarHidden:YES]; |
93 | 108 |
94 [[self baseViewController] presentViewController:_navigationController | 109 [[self baseViewController] presentViewController:_navigationController |
95 animated:YES | 110 animated:YES |
96 completion:nil]; | 111 completion:nil]; |
97 } | 112 } |
98 | 113 |
99 - (void)stop { | 114 - (void)stop { |
100 [_navigationController dismissViewControllerAnimated:YES completion:nil]; | 115 [_navigationController dismissViewControllerAnimated:YES completion:nil]; |
101 _itemsDisplayCoordinator.reset(); | 116 _itemsDisplayCoordinator.reset(); |
102 _shippingAddressSelectionCoordinator.reset(); | 117 _shippingAddressSelectionCoordinator.reset(); |
118 _shippingOptionSelectionCoordinator.reset(); | |
103 _methodSelectionCoordinator.reset(); | 119 _methodSelectionCoordinator.reset(); |
104 _navigationController.reset(); | 120 _navigationController.reset(); |
105 _viewController.reset(); | 121 _viewController.reset(); |
106 } | 122 } |
107 | 123 |
108 - (std::vector<autofill::CreditCard*>)supportedMethods { | 124 - (std::vector<autofill::CreditCard*>)supportedMethods { |
109 std::vector<autofill::CreditCard*> supported_methods; | 125 std::vector<autofill::CreditCard*> supported_methods; |
110 | 126 |
111 std::unordered_set<base::string16> supported_method_types; | 127 std::unordered_set<base::string16> supported_method_types; |
112 for (web::PaymentMethodData method_data : _paymentRequest.method_data) { | 128 for (web::PaymentMethodData method_data : _paymentRequest.method_data) { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
211 const std::vector<autofill::AutofillProfile*> addresses = | 227 const std::vector<autofill::AutofillProfile*> addresses = |
212 _personalDataManager->GetProfilesToSuggest(); | 228 _personalDataManager->GetProfilesToSuggest(); |
213 [_shippingAddressSelectionCoordinator setShippingAddresses:addresses]; | 229 [_shippingAddressSelectionCoordinator setShippingAddresses:addresses]; |
214 [_shippingAddressSelectionCoordinator | 230 [_shippingAddressSelectionCoordinator |
215 setSelectedShippingAddress:_selectedShippingAddress]; | 231 setSelectedShippingAddress:_selectedShippingAddress]; |
216 [_shippingAddressSelectionCoordinator setDelegate:self]; | 232 [_shippingAddressSelectionCoordinator setDelegate:self]; |
217 | 233 |
218 [_shippingAddressSelectionCoordinator start]; | 234 [_shippingAddressSelectionCoordinator start]; |
219 } | 235 } |
220 | 236 |
237 - (void)paymentRequestViewControllerSelectShippingOption { | |
238 _shippingOptionSelectionCoordinator.reset( | |
239 [[ShippingOptionSelectionCoordinator alloc] | |
240 initWithBaseViewController:_viewController]); | |
241 | |
242 std::vector<web::PaymentShippingOption*> shippingOptions; | |
243 shippingOptions.reserve(_paymentRequest.details.shipping_options.size()); | |
244 std::transform(std::begin(_paymentRequest.details.shipping_options), | |
245 std::end(_paymentRequest.details.shipping_options), | |
246 std::back_inserter(shippingOptions), | |
247 [](web::PaymentShippingOption& option) { return &option; }); | |
248 | |
249 [_shippingOptionSelectionCoordinator setShippingOptions:shippingOptions]; | |
Justin Donnelly
2017/01/10 17:11:53
Why not just pass _paymentRequest.details.shipping
Moe
2017/01/12 00:06:18
The purpose for that wasn't efficiency gain. I wan
| |
250 [_shippingOptionSelectionCoordinator | |
251 setSelectedShippingOption:_selectedShippingOption]; | |
252 [_shippingOptionSelectionCoordinator setDelegate:self]; | |
253 | |
254 [_shippingOptionSelectionCoordinator start]; | |
255 } | |
256 | |
221 - (void)paymentRequestViewControllerSelectPaymentMethod { | 257 - (void)paymentRequestViewControllerSelectPaymentMethod { |
222 _methodSelectionCoordinator.reset([[PaymentMethodSelectionCoordinator alloc] | 258 _methodSelectionCoordinator.reset([[PaymentMethodSelectionCoordinator alloc] |
223 initWithBaseViewController:_viewController]); | 259 initWithBaseViewController:_viewController]); |
224 [_methodSelectionCoordinator setPaymentMethods:[self supportedMethods]]; | 260 [_methodSelectionCoordinator setPaymentMethods:[self supportedMethods]]; |
225 [_methodSelectionCoordinator setSelectedPaymentMethod:_selectedPaymentMethod]; | 261 [_methodSelectionCoordinator setSelectedPaymentMethod:_selectedPaymentMethod]; |
226 [_methodSelectionCoordinator setDelegate:self]; | 262 [_methodSelectionCoordinator setDelegate:self]; |
227 | 263 |
228 [_methodSelectionCoordinator start]; | 264 [_methodSelectionCoordinator start]; |
229 } | 265 } |
230 | 266 |
(...skipping 22 matching lines...) Expand all Loading... | |
253 [_shippingAddressSelectionCoordinator stop]; | 289 [_shippingAddressSelectionCoordinator stop]; |
254 _shippingAddressSelectionCoordinator.reset(); | 290 _shippingAddressSelectionCoordinator.reset(); |
255 } | 291 } |
256 | 292 |
257 - (void)shippingAddressSelectionCoordinatorDidReturn: | 293 - (void)shippingAddressSelectionCoordinatorDidReturn: |
258 (ShippingAddressSelectionCoordinator*)coordinator { | 294 (ShippingAddressSelectionCoordinator*)coordinator { |
259 [_shippingAddressSelectionCoordinator stop]; | 295 [_shippingAddressSelectionCoordinator stop]; |
260 _shippingAddressSelectionCoordinator.reset(); | 296 _shippingAddressSelectionCoordinator.reset(); |
261 } | 297 } |
262 | 298 |
299 #pragma mark - ShippingOptionSelectionCoordinatorDelegate | |
300 | |
301 - (void)shippingOptionSelectionCoordinator: | |
302 (ShippingOptionSelectionCoordinator*)coordinator | |
303 selectedShippingOption: | |
304 (web::PaymentShippingOption*)shippingOption { | |
305 _selectedShippingOption = shippingOption; | |
306 [_viewController updateSelectedShippingOption:shippingOption]; | |
307 | |
308 [_shippingOptionSelectionCoordinator stop]; | |
309 _shippingOptionSelectionCoordinator.reset(); | |
310 } | |
311 | |
312 - (void)shippingOptionSelectionCoordinatorDidReturn: | |
313 (ShippingAddressSelectionCoordinator*)coordinator { | |
314 [_shippingOptionSelectionCoordinator stop]; | |
315 _shippingOptionSelectionCoordinator.reset(); | |
316 } | |
317 | |
263 #pragma mark - PaymentMethodSelectionCoordinatorDelegate | 318 #pragma mark - PaymentMethodSelectionCoordinatorDelegate |
264 | 319 |
265 - (void)paymentMethodSelectionCoordinator: | 320 - (void)paymentMethodSelectionCoordinator: |
266 (PaymentMethodSelectionCoordinator*)coordinator | 321 (PaymentMethodSelectionCoordinator*)coordinator |
267 selectedPaymentMethod:(autofill::CreditCard*)creditCard { | 322 selectedPaymentMethod:(autofill::CreditCard*)creditCard { |
268 _selectedPaymentMethod = creditCard; | 323 _selectedPaymentMethod = creditCard; |
269 | 324 |
270 [_viewController setSelectedPaymentMethod:creditCard]; | 325 [_viewController setSelectedPaymentMethod:creditCard]; |
271 [_viewController loadModel]; | 326 [_viewController loadModel]; |
272 [[_viewController collectionView] reloadData]; | 327 [[_viewController collectionView] reloadData]; |
273 | 328 |
274 [_methodSelectionCoordinator stop]; | 329 [_methodSelectionCoordinator stop]; |
275 _methodSelectionCoordinator.reset(); | 330 _methodSelectionCoordinator.reset(); |
276 } | 331 } |
277 | 332 |
278 - (void)paymentMethodSelectionCoordinatorDidReturn: | 333 - (void)paymentMethodSelectionCoordinatorDidReturn: |
279 (PaymentMethodSelectionCoordinator*)coordinator { | 334 (PaymentMethodSelectionCoordinator*)coordinator { |
280 [_methodSelectionCoordinator stop]; | 335 [_methodSelectionCoordinator stop]; |
281 _methodSelectionCoordinator.reset(); | 336 _methodSelectionCoordinator.reset(); |
282 } | 337 } |
283 | 338 |
284 @end | 339 @end |
OLD | NEW |