Chromium Code Reviews| 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/shipping_address_selection_coordinator.h" | 5 #import "ios/chrome/browser/payments/shipping_address_selection_coordinator.h" |
| 6 | 6 |
| 7 #include "base/strings/sys_string_conversions.h" | 7 #include "base/strings/sys_string_conversions.h" |
| 8 #include "components/autofill/core/browser/autofill_profile.h" | 8 #include "components/autofill/core/browser/autofill_profile.h" |
| 9 #include "components/payments/core/strings_util.h" | |
| 9 #include "ios/chrome/browser/payments/payment_request.h" | 10 #include "ios/chrome/browser/payments/payment_request.h" |
| 11 #include "ios/chrome/browser/payments/payment_request_selector_view_controller.h " | |
| 10 #import "ios/chrome/browser/payments/payment_request_util.h" | 12 #import "ios/chrome/browser/payments/payment_request_util.h" |
| 13 #include "ios/chrome/browser/payments/shipping_address_selection_mediator.h" | |
| 11 | 14 |
| 12 #if !defined(__has_feature) || !__has_feature(objc_arc) | 15 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 13 #error "This file requires ARC support." | 16 #error "This file requires ARC support." |
| 14 #endif | 17 #endif |
| 15 | 18 |
| 16 namespace { | 19 namespace { |
| 17 using ::payment_request_util::GetShippingAddressSelectorErrorMessage; | 20 using ::payment_request_util::GetShippingAddressSelectorErrorMessage; |
| 21 using ::payments::GetShippingAddressSectionString; | |
| 22 using ::payments::GetShippingAddressSelectorInfoMessage; | |
| 18 } // namespace | 23 } // namespace |
| 19 | 24 |
| 20 @interface ShippingAddressSelectionCoordinator () | 25 @interface ShippingAddressSelectionCoordinator () |
| 21 | 26 |
| 22 @property(nonatomic, strong) | 27 @property(nonatomic, strong) |
| 23 ShippingAddressSelectionViewController* viewController; | 28 PaymentRequestSelectorViewController* viewController; |
| 29 | |
| 30 @property(nonatomic, strong) ShippingAddressSelectionMediator* mediator; | |
| 24 | 31 |
| 25 // Called when the user selects a shipping address. The cell is checked, the | 32 // Called when the user selects a shipping address. The cell is checked, the |
| 26 // UI is locked so that the user can't interact with it, then the delegate is | 33 // UI is locked so that the user can't interact with it, then the delegate is |
| 27 // notified. The delay is here to let the user get a visual feedback of the | 34 // notified. The delay is here to let the user get a visual feedback of the |
| 28 // selection before this view disappears. | 35 // selection before this view disappears. |
| 29 - (void)delayedNotifyDelegateOfSelection: | 36 - (void)delayedNotifyDelegateOfSelection: |
| 30 (autofill::AutofillProfile*)shippingAddress; | 37 (autofill::AutofillProfile*)shippingAddress; |
| 31 | 38 |
| 32 @end | 39 @end |
| 33 | 40 |
| 34 @implementation ShippingAddressSelectionCoordinator | 41 @implementation ShippingAddressSelectionCoordinator |
| 35 | 42 |
| 36 @synthesize paymentRequest = _paymentRequest; | 43 @synthesize paymentRequest = _paymentRequest; |
| 37 @synthesize delegate = _delegate; | 44 @synthesize delegate = _delegate; |
| 38 @synthesize viewController = _viewController; | 45 @synthesize viewController = _viewController; |
| 46 @synthesize mediator = _mediator; | |
| 39 | 47 |
| 40 - (void)start { | 48 - (void)start { |
| 41 _viewController = [[ShippingAddressSelectionViewController alloc] | 49 self.mediator = [[ShippingAddressSelectionMediator alloc] |
| 42 initWithPaymentRequest:_paymentRequest]; | 50 initWithPaymentRequest:self.paymentRequest]; |
| 43 [_viewController setDelegate:self]; | 51 [self.mediator setMessage:self.paymentRequest->shipping_options().empty() |
|
gambard
2017/04/18 14:34:46
Are you sure you want to set message to something
gambard
2017/04/18 14:34:46
s/self.mediator setMessage:/self.mediator.message
Moe
2017/04/18 17:19:16
Done. Fixed similar cases as well.
Moe
2017/04/18 17:19:16
Yes. that's according to the specs and mocks. It's
| |
| 44 [_viewController loadModel]; | 52 ? base::SysUTF16ToNSString( |
| 53 GetShippingAddressSelectorInfoMessage( | |
| 54 self.paymentRequest->shipping_type())) | |
| 55 : nil]; | |
| 56 | |
| 57 self.viewController = [[PaymentRequestSelectorViewController alloc] init]; | |
| 58 [self.viewController | |
| 59 setTitle:base::SysUTF16ToNSString(GetShippingAddressSectionString( | |
| 60 self.paymentRequest->shipping_type()))]; | |
| 61 [self.viewController setDelegate:self]; | |
| 62 [self.viewController setDataSource:self.mediator]; | |
| 63 [self.viewController loadModel]; | |
| 45 | 64 |
| 46 DCHECK(self.baseViewController.navigationController); | 65 DCHECK(self.baseViewController.navigationController); |
| 47 [self.baseViewController.navigationController | 66 [self.baseViewController.navigationController |
| 48 pushViewController:_viewController | 67 pushViewController:self.viewController |
| 49 animated:YES]; | 68 animated:YES]; |
| 50 } | 69 } |
| 51 | 70 |
| 52 - (void)stop { | 71 - (void)stop { |
| 53 [self.baseViewController.navigationController popViewControllerAnimated:YES]; | 72 [self.baseViewController.navigationController popViewControllerAnimated:YES]; |
| 54 _viewController = nil; | 73 self.viewController = nil; |
| 74 self.mediator = nil; | |
| 55 } | 75 } |
| 56 | 76 |
| 57 - (void)stopSpinnerAndDisplayError { | 77 - (void)stopSpinnerAndDisplayError { |
| 58 // Re-enable user interactions that were disabled earlier in | 78 // Re-enable user interactions that were disabled earlier in |
| 59 // delayedNotifyDelegateOfSelection. | 79 // delayedNotifyDelegateOfSelection. |
| 60 _viewController.view.userInteractionEnabled = YES; | 80 self.viewController.view.userInteractionEnabled = YES; |
| 61 | 81 |
| 62 [_viewController setPending:NO]; | 82 DCHECK(self.paymentRequest); |
| 63 DCHECK(_paymentRequest); | 83 [self.mediator |
| 64 [_viewController | 84 setMessage:GetShippingAddressSelectorErrorMessage(*self.paymentRequest)]; |
| 65 setErrorMessage:GetShippingAddressSelectorErrorMessage(*_paymentRequest)]; | 85 [self.mediator setState:PaymentRequestSelectorStateError]; |
| 66 [_viewController loadModel]; | 86 [self.viewController loadModel]; |
| 67 [[_viewController collectionView] reloadData]; | 87 [[self.viewController collectionView] reloadData]; |
| 68 } | 88 } |
| 69 | 89 |
| 70 #pragma mark - ShippingAddressSelectionViewControllerDelegate | 90 #pragma mark - PaymentRequestSelectorViewControllerDelegate |
| 71 | 91 |
| 72 - (void)shippingAddressSelectionViewController: | 92 - (void)paymentRequestSelectorViewController: |
| 73 (ShippingAddressSelectionViewController*)controller | 93 (PaymentRequestSelectorViewController*)controller |
| 74 didSelectShippingAddress: | 94 didSelectItemAtIndex:(NSUInteger)index { |
| 75 (autofill::AutofillProfile*)shippingAddress { | 95 // Update the data source with the selection. |
| 76 [self delayedNotifyDelegateOfSelection:shippingAddress]; | 96 [self.mediator setSelectedItemIndex:index]; |
| 97 | |
| 98 DCHECK(index < self.paymentRequest->shipping_profiles().size()); | |
| 99 [self delayedNotifyDelegateOfSelection:self.paymentRequest | |
| 100 ->shipping_profiles()[index]]; | |
| 77 } | 101 } |
| 78 | 102 |
| 79 - (void)shippingAddressSelectionViewControllerDidReturn: | 103 - (void)paymentRequestSelectorViewControllerDidFinish: |
| 80 (ShippingAddressSelectionViewController*)controller { | 104 (PaymentRequestSelectorViewController*)controller { |
| 81 [_delegate shippingAddressSelectionCoordinatorDidReturn:self]; | 105 [self.delegate shippingAddressSelectionCoordinatorDidReturn:self]; |
| 82 } | 106 } |
| 83 | 107 |
| 108 - (void)paymentRequestSelectorViewControllerDidSelectAddItem: | |
| 109 (PaymentRequestSelectorViewController*)controller { | |
| 110 // TODO(crbug.com/602666): Present a shipping address addition UI. | |
| 111 } | |
| 112 | |
| 113 #pragma mark - Helper methods | |
| 114 | |
| 84 - (void)delayedNotifyDelegateOfSelection: | 115 - (void)delayedNotifyDelegateOfSelection: |
| 85 (autofill::AutofillProfile*)shippingAddress { | 116 (autofill::AutofillProfile*)shippingAddress { |
| 86 _viewController.view.userInteractionEnabled = NO; | 117 self.viewController.view.userInteractionEnabled = NO; |
| 87 __weak ShippingAddressSelectionCoordinator* weakSelf = self; | 118 __weak ShippingAddressSelectionCoordinator* weakSelf = self; |
| 88 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, | 119 dispatch_after( |
| 89 static_cast<int64_t>(0.2 * NSEC_PER_SEC)), | 120 dispatch_time(DISPATCH_TIME_NOW, |
| 90 dispatch_get_main_queue(), ^{ | 121 static_cast<int64_t>(0.2 * NSEC_PER_SEC)), |
| 91 ShippingAddressSelectionCoordinator* strongSelf = weakSelf; | 122 dispatch_get_main_queue(), ^{ |
| 92 // Early return if the coordinator has been deallocated. | 123 [weakSelf.mediator setState:PaymentRequestSelectorStatePending]; |
| 93 if (!strongSelf) | 124 [weakSelf.viewController loadModel]; |
| 94 return; | 125 [[weakSelf.viewController collectionView] reloadData]; |
| 95 | 126 |
| 96 [strongSelf.viewController setPending:YES]; | 127 [weakSelf.delegate shippingAddressSelectionCoordinator:weakSelf |
| 97 [strongSelf.viewController loadModel]; | 128 didSelectShippingAddress:shippingAddress]; |
| 98 [[strongSelf.viewController collectionView] reloadData]; | 129 }); |
| 99 | |
| 100 [strongSelf.delegate | |
| 101 shippingAddressSelectionCoordinator:strongSelf | |
| 102 didSelectShippingAddress:shippingAddress]; | |
| 103 }); | |
| 104 } | 130 } |
| 105 | 131 |
| 106 @end | 132 @end |
| OLD | NEW |