Index: ios/chrome/browser/payments/shipping_address_selection_coordinator.mm |
diff --git a/ios/chrome/browser/payments/shipping_address_selection_coordinator.mm b/ios/chrome/browser/payments/shipping_address_selection_coordinator.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f31fa5ae19f7b29667490631421a040a25765a10 |
--- /dev/null |
+++ b/ios/chrome/browser/payments/shipping_address_selection_coordinator.mm |
@@ -0,0 +1,92 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/browser/payments/shipping_address_selection_coordinator.h" |
+ |
+#import "base/ios/weak_nsobject.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "components/autofill/core/browser/autofill_profile.h" |
+#import "ios/chrome/browser/payments/shipping_address_selection_view_controller.h" |
+ |
+@interface ShippingAddressSelectionCoordinator ()< |
+ ShippingAddressSelectionViewControllerDelegate> { |
+ base::WeakNSProtocol<id<ShippingAddressSelectionCoordinatorDelegate>> |
+ _delegate; |
+ base::scoped_nsobject<ShippingAddressSelectionViewController> _viewController; |
+} |
+ |
+// Called when the user selects a shipping address. The cell is checked, the |
+// UI is locked so that the user can't interact with it, then the delegate is |
+// notified. The delay is here to let the user get a visual feedback of the |
+// selection before this view disappears. |
+- (void)delayedNotifyDelegateOfSelection; |
+ |
+@end |
+ |
+@implementation ShippingAddressSelectionCoordinator |
+ |
+@synthesize shippingAddresses = _shippingAddresses; |
+@synthesize selectedShippingAddress = _selectedShippingAddress; |
+ |
+- (id<ShippingAddressSelectionCoordinatorDelegate>)delegate { |
+ return _delegate.get(); |
+} |
+ |
+- (void)setDelegate:(id<ShippingAddressSelectionCoordinatorDelegate>)delegate { |
+ _delegate.reset(delegate); |
+} |
+ |
+- (void)start { |
+ _viewController.reset([[ShippingAddressSelectionViewController alloc] init]); |
+ [_viewController setShippingAddresses:_shippingAddresses]; |
+ [_viewController setSelectedShippingAddress:_selectedShippingAddress]; |
+ [_viewController setDelegate:self]; |
+ [_viewController loadModel]; |
+ |
+ DCHECK(self.baseViewController.navigationController); |
+ [self.baseViewController.navigationController |
+ pushViewController:_viewController |
+ animated:YES]; |
+} |
+ |
+- (void)stop { |
+ [self.baseViewController.navigationController popViewControllerAnimated:YES]; |
+ _viewController.reset(); |
+} |
+ |
+#pragma mark - ShippingAddressSelectionViewControllerDelegate |
+ |
+- (void)shippingAddressSelectionViewController: |
+ (ShippingAddressSelectionViewController*)controller |
+ selectedShippingAddress: |
+ (autofill::AutofillProfile*)shippingAddress { |
+ _selectedShippingAddress = shippingAddress; |
+ [self delayedNotifyDelegateOfSelection]; |
+} |
+ |
+- (void)shippingAddressSelectionViewControllerDidReturn: |
+ (ShippingAddressSelectionViewController*)controller { |
+ [_delegate shippingAddressSelectionCoordinatorDidReturn:self]; |
+} |
+ |
+- (void)delayedNotifyDelegateOfSelection { |
+ _viewController.get().view.userInteractionEnabled = NO; |
+ base::WeakNSObject<ShippingAddressSelectionCoordinator> weakSelf(self); |
+ dispatch_after( |
+ dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.2 * NSEC_PER_SEC)), |
+ dispatch_get_main_queue(), ^{ |
+ base::scoped_nsobject<ShippingAddressSelectionCoordinator> strongSelf( |
+ [weakSelf retain]); |
+ // Early return if the coordinator has been deallocated. |
+ if (!strongSelf) |
+ return; |
+ |
+ _viewController.get().view.userInteractionEnabled = YES; |
+ [_delegate |
+ shippingAddressSelectionCoordinator:self |
+ selectedShippingAddress:_selectedShippingAddress]; |
+ }); |
+} |
+ |
+@end |