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

Side by Side Diff: ios/chrome/browser/payments/payment_request_coordinator.mm

Issue 2621453002: Selected shipping option in payment summary view + shipping option selection view (Closed)
Patch Set: Addressed comments by lpromero@ and jdonnelley@ Created 3 years, 11 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
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 // If more than one option has |selected| set, the last one in the
85 // sequence should be treated as the selected item.
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
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];
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
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
OLDNEW
« no previous file with comments | « ios/chrome/browser/payments/payment_request_coordinator.h ('k') | ios/chrome/browser/payments/payment_request_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698