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_method_selection_coordinator.h" | 5 #import "ios/chrome/browser/payments/payment_method_selection_coordinator.h" |
6 | 6 |
7 #import "base/ios/weak_nsobject.h" | |
8 #include "base/mac/scoped_nsobject.h" | |
9 #include "components/autofill/core/browser/credit_card.h" | 7 #include "components/autofill/core/browser/credit_card.h" |
10 #include "ios/chrome/browser/payments/payment_request.h" | 8 #include "ios/chrome/browser/payments/payment_request.h" |
11 | 9 |
12 @interface PaymentMethodSelectionCoordinator () { | 10 #if !defined(__has_feature) || !__has_feature(objc_arc) |
13 base::WeakNSProtocol<id<PaymentMethodSelectionCoordinatorDelegate>> _delegate; | 11 #error "This file requires ARC support." |
14 base::scoped_nsobject<PaymentMethodSelectionViewController> _viewController; | 12 #endif |
15 } | 13 |
| 14 @interface PaymentMethodSelectionCoordinator () |
| 15 @property(nonatomic, strong) |
| 16 PaymentMethodSelectionViewController* viewController; |
16 | 17 |
17 // Called when the user selects a payment method. The cell is checked, the | 18 // Called when the user selects a payment method. The cell is checked, the |
18 // UI is locked so that the user can't interact with it, then the delegate is | 19 // UI is locked so that the user can't interact with it, then the delegate is |
19 // notified. The delay is here to let the user get a visual feedback of the | 20 // notified. The delay is here to let the user get a visual feedback of the |
20 // selection before this view disappears. | 21 // selection before this view disappears. |
21 - (void)delayedNotifyDelegateOfSelection:(autofill::CreditCard*)paymentMethod; | 22 - (void)delayedNotifyDelegateOfSelection:(autofill::CreditCard*)paymentMethod; |
22 | 23 |
23 @end | 24 @end |
24 | 25 |
25 @implementation PaymentMethodSelectionCoordinator | 26 @implementation PaymentMethodSelectionCoordinator |
26 | |
27 @synthesize paymentRequest = _paymentRequest; | 27 @synthesize paymentRequest = _paymentRequest; |
28 | 28 @synthesize delegate = _delegate; |
29 - (id<PaymentMethodSelectionCoordinatorDelegate>)delegate { | 29 @synthesize viewController = _viewController; |
30 return _delegate.get(); | |
31 } | |
32 | |
33 - (void)setDelegate:(id<PaymentMethodSelectionCoordinatorDelegate>)delegate { | |
34 _delegate.reset(delegate); | |
35 } | |
36 | 30 |
37 - (void)start { | 31 - (void)start { |
38 _viewController.reset([[PaymentMethodSelectionViewController alloc] | 32 _viewController = [[PaymentMethodSelectionViewController alloc] |
39 initWithPaymentRequest:_paymentRequest]); | 33 initWithPaymentRequest:_paymentRequest]; |
40 [_viewController setDelegate:self]; | 34 [_viewController setDelegate:self]; |
41 [_viewController loadModel]; | 35 [_viewController loadModel]; |
42 | 36 |
43 DCHECK([self baseViewController].navigationController); | 37 DCHECK([self baseViewController].navigationController); |
44 [[self baseViewController].navigationController | 38 [[self baseViewController].navigationController |
45 pushViewController:_viewController | 39 pushViewController:_viewController |
46 animated:YES]; | 40 animated:YES]; |
47 } | 41 } |
48 | 42 |
49 - (void)stop { | 43 - (void)stop { |
50 [[self baseViewController].navigationController | 44 [[self baseViewController].navigationController |
51 popViewControllerAnimated:YES]; | 45 popViewControllerAnimated:YES]; |
52 _viewController.reset(); | 46 _viewController = nil; |
53 } | 47 } |
54 | 48 |
55 #pragma mark - PaymentMethodSelectionViewControllerDelegate | 49 #pragma mark - PaymentMethodSelectionViewControllerDelegate |
56 | 50 |
57 - (void)paymentMethodSelectionViewController: | 51 - (void)paymentMethodSelectionViewController: |
58 (PaymentMethodSelectionViewController*)controller | 52 (PaymentMethodSelectionViewController*)controller |
59 didSelectPaymentMethod: | 53 didSelectPaymentMethod: |
60 (autofill::CreditCard*)paymentMethod { | 54 (autofill::CreditCard*)paymentMethod { |
61 [self delayedNotifyDelegateOfSelection:paymentMethod]; | 55 [self delayedNotifyDelegateOfSelection:paymentMethod]; |
62 } | 56 } |
63 | 57 |
64 - (void)paymentMethodSelectionViewControllerDidReturn: | 58 - (void)paymentMethodSelectionViewControllerDidReturn: |
65 (PaymentMethodSelectionViewController*)controller { | 59 (PaymentMethodSelectionViewController*)controller { |
66 [_delegate paymentMethodSelectionCoordinatorDidReturn:self]; | 60 [_delegate paymentMethodSelectionCoordinatorDidReturn:self]; |
67 } | 61 } |
68 | 62 |
69 - (void)delayedNotifyDelegateOfSelection:(autofill::CreditCard*)paymentMethod { | 63 - (void)delayedNotifyDelegateOfSelection:(autofill::CreditCard*)paymentMethod { |
70 _viewController.get().view.userInteractionEnabled = NO; | 64 _viewController.view.userInteractionEnabled = NO; |
71 base::WeakNSObject<PaymentMethodSelectionCoordinator> weakSelf(self); | 65 __weak PaymentMethodSelectionCoordinator* weakSelf = self; |
72 dispatch_after( | 66 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, |
73 dispatch_time(DISPATCH_TIME_NOW, | 67 static_cast<int64_t>(0.2 * NSEC_PER_SEC)), |
74 static_cast<int64_t>(0.2 * NSEC_PER_SEC)), | 68 dispatch_get_main_queue(), ^{ |
75 dispatch_get_main_queue(), ^{ | 69 PaymentMethodSelectionCoordinator* strongSelf = weakSelf; |
76 base::scoped_nsobject<PaymentMethodSelectionCoordinator> strongSelf( | 70 strongSelf.viewController.view.userInteractionEnabled = YES; |
77 [weakSelf retain]); | 71 [strongSelf.delegate |
78 // Early return if the coordinator has been deallocated. | 72 paymentMethodSelectionCoordinator:strongSelf |
79 if (!strongSelf) | 73 didSelectPaymentMethod:paymentMethod]; |
80 return; | 74 }); |
81 | |
82 _viewController.get().view.userInteractionEnabled = YES; | |
83 [_delegate paymentMethodSelectionCoordinator:self | |
84 didSelectPaymentMethod:paymentMethod]; | |
85 }); | |
86 } | 75 } |
87 | 76 |
88 @end | 77 @end |
OLD | NEW |