| OLD | NEW |
| (Empty) |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #import "ios/chrome/browser/ui/payments/credit_card_edit_view_controller.h" | |
| 6 | |
| 7 #import "base/mac/foundation_util.h" | |
| 8 #include "base/memory/ptr_util.h" | |
| 9 #include "components/strings/grit/components_strings.h" | |
| 10 #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" | |
| 11 #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h" | |
| 12 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrom
e.h" | |
| 13 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item+collec
tion_view_controller.h" | |
| 14 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item
.h" | |
| 15 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" | |
| 16 #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller+int
ernal.h" | |
| 17 #import "ios/chrome/browser/ui/payments/payment_request_editor_field.h" | |
| 18 #import "ios/chrome/browser/ui/uikit_ui_util.h" | |
| 19 #include "ui/base/l10n/l10n_util.h" | |
| 20 | |
| 21 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
| 22 #error "This file requires ARC support." | |
| 23 #endif | |
| 24 | |
| 25 namespace { | |
| 26 | |
| 27 NSString* const kCreditCardEditCollectionViewId = | |
| 28 @"kCreditCardEditCollectionViewId"; | |
| 29 | |
| 30 typedef NS_ENUM(NSInteger, SectionIdentifier) { | |
| 31 SectionIdentifierSaveCard = kSectionIdentifierEnumStart, | |
| 32 }; | |
| 33 | |
| 34 typedef NS_ENUM(NSInteger, ItemType) { | |
| 35 ItemTypeSaveCard = kItemTypeEnumStart, | |
| 36 }; | |
| 37 | |
| 38 } // namespace | |
| 39 | |
| 40 @interface CreditCardEditViewController () { | |
| 41 // Indicates whether the credit card being created should be saved locally. | |
| 42 BOOL _saveCreditCard; | |
| 43 } | |
| 44 | |
| 45 // The list of field definitions for the editor. | |
| 46 @property(nonatomic, strong) NSArray<EditorField*>* fields; | |
| 47 | |
| 48 @end | |
| 49 | |
| 50 @implementation CreditCardEditViewController | |
| 51 | |
| 52 @synthesize delegate = _delegate; | |
| 53 @synthesize dataSource = _dataSource; | |
| 54 @synthesize fields = _fields; | |
| 55 | |
| 56 #pragma mark - Setters | |
| 57 | |
| 58 - (void)setDelegate:(id<CreditCardEditViewControllerDelegate>)delegate { | |
| 59 [super setDelegate:delegate]; | |
| 60 _delegate = delegate; | |
| 61 } | |
| 62 | |
| 63 - (void)setDataSource:(id<CreditCardEditViewControllerDataSource>)dataSource { | |
| 64 [super setDataSource:dataSource]; | |
| 65 _dataSource = dataSource; | |
| 66 } | |
| 67 | |
| 68 #pragma mark - PaymentRequestEditViewControllerActions methods | |
| 69 | |
| 70 - (void)onCancel { | |
| 71 [super onCancel]; | |
| 72 | |
| 73 [_delegate creditCardEditViewControllerDidCancel:self]; | |
| 74 } | |
| 75 | |
| 76 - (void)onDone { | |
| 77 [super onDone]; | |
| 78 | |
| 79 if (![self validateForm]) | |
| 80 return; | |
| 81 | |
| 82 [_delegate creditCardEditViewController:self | |
| 83 didFinishEditingFields:_fields | |
| 84 saveCreditCard:_saveCreditCard]; | |
| 85 } | |
| 86 | |
| 87 #pragma mark - CollectionViewController methods | |
| 88 | |
| 89 - (void)loadModel { | |
| 90 [super loadModel]; | |
| 91 | |
| 92 // If editing a credit card, set the card type icon (e.g. "Visa"). | |
| 93 if (_dataSource.state == EditViewControllerStateEdit) { | |
| 94 for (EditorField* field in _fields) { | |
| 95 if (field.autofillUIType == AutofillUITypeCreditCardNumber) { | |
| 96 AutofillEditItem* item = | |
| 97 base::mac::ObjCCastStrict<AutofillEditItem>(field.item); | |
| 98 item.identifyingIcon = | |
| 99 [_dataSource cardTypeIconFromCardNumber:item.textFieldValue]; | |
| 100 } | |
| 101 } | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 - (void)loadFooterItems { | |
| 106 CollectionViewModel* model = self.collectionViewModel; | |
| 107 | |
| 108 // "Save card" section. Visible only when creating a card. | |
| 109 if (_dataSource.state == EditViewControllerStateCreate) { | |
| 110 [model addSectionWithIdentifier:SectionIdentifierSaveCard]; | |
| 111 CollectionViewSwitchItem* saveCardItem = | |
| 112 [[CollectionViewSwitchItem alloc] initWithType:ItemTypeSaveCard]; | |
| 113 saveCardItem.text = | |
| 114 l10n_util::GetNSString(IDS_PAYMENTS_SAVE_CARD_TO_DEVICE_CHECKBOX); | |
| 115 saveCardItem.on = YES; | |
| 116 [model addItem:saveCardItem | |
| 117 toSectionWithIdentifier:SectionIdentifierSaveCard]; | |
| 118 } | |
| 119 | |
| 120 [super loadFooterItems]; | |
| 121 } | |
| 122 | |
| 123 #pragma mark - UITextFieldDelegate | |
| 124 | |
| 125 // This method is called as the text is being typed in, pasted, or deleted. Asks | |
| 126 // the delegate if the text should be changed. Should always return YES. During | |
| 127 // typing/pasting text, |newText| contains one or more new characters. When user | |
| 128 // deletes text, |newText| is empty. |range| is the range of characters to be | |
| 129 // replaced. | |
| 130 - (BOOL)textField:(UITextField*)textField | |
| 131 shouldChangeCharactersInRange:(NSRange)range | |
| 132 replacementString:(NSString*)newText { | |
| 133 NSIndexPath* indexPath = [self indexPathForCurrentTextField]; | |
| 134 AutofillEditItem* item = base::mac::ObjCCastStrict<AutofillEditItem>( | |
| 135 [self.collectionViewModel itemAtIndexPath:indexPath]); | |
| 136 | |
| 137 // If the user is typing in the credit card number field, update the card type | |
| 138 // icon (e.g. "Visa") to reflect the number being typed. | |
| 139 if (item.autofillUIType == AutofillUITypeCreditCardNumber) { | |
| 140 // Obtain the text being typed. | |
| 141 NSString* updatedText = | |
| 142 [textField.text stringByReplacingCharactersInRange:range | |
| 143 withString:newText]; | |
| 144 item.identifyingIcon = [_dataSource cardTypeIconFromCardNumber:updatedText]; | |
| 145 | |
| 146 // Update the cell. | |
| 147 [self reconfigureCellsForItems:@[ item ]]; | |
| 148 } | |
| 149 | |
| 150 return YES; | |
| 151 } | |
| 152 | |
| 153 #pragma mark - UICollectionViewDataSource | |
| 154 | |
| 155 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView | |
| 156 cellForItemAtIndexPath:(NSIndexPath*)indexPath { | |
| 157 UICollectionViewCell* cell = | |
| 158 [super collectionView:collectionView cellForItemAtIndexPath:indexPath]; | |
| 159 CollectionViewItem* item = | |
| 160 [self.collectionViewModel itemAtIndexPath:indexPath]; | |
| 161 | |
| 162 switch (item.type) { | |
| 163 case ItemTypeSaveCard: { | |
| 164 CollectionViewSwitchCell* switchCell = | |
| 165 base::mac::ObjCCastStrict<CollectionViewSwitchCell>(cell); | |
| 166 [switchCell.switchView addTarget:self | |
| 167 action:@selector(saveCardSwitchToggled:) | |
| 168 forControlEvents:UIControlEventValueChanged]; | |
| 169 break; | |
| 170 } | |
| 171 default: | |
| 172 break; | |
| 173 } | |
| 174 | |
| 175 return cell; | |
| 176 } | |
| 177 | |
| 178 #pragma mark MDCCollectionViewStylingDelegate | |
| 179 | |
| 180 - (CGFloat)collectionView:(UICollectionView*)collectionView | |
| 181 cellHeightAtIndexPath:(NSIndexPath*)indexPath { | |
| 182 CollectionViewItem* item = | |
| 183 [self.collectionViewModel itemAtIndexPath:indexPath]; | |
| 184 switch (item.type) { | |
| 185 case ItemTypeSaveCard: | |
| 186 return [MDCCollectionViewCell | |
| 187 cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds) | |
| 188 forItem:item]; | |
| 189 default: | |
| 190 return | |
| 191 [super collectionView:collectionView cellHeightAtIndexPath:indexPath]; | |
| 192 } | |
| 193 } | |
| 194 | |
| 195 - (BOOL)collectionView:(UICollectionView*)collectionView | |
| 196 hidesInkViewAtIndexPath:(NSIndexPath*)indexPath { | |
| 197 NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; | |
| 198 switch (type) { | |
| 199 case ItemTypeSaveCard: | |
| 200 return YES; | |
| 201 default: | |
| 202 return [super collectionView:collectionView | |
| 203 hidesInkViewAtIndexPath:indexPath]; | |
| 204 } | |
| 205 } | |
| 206 | |
| 207 #pragma mark Switch Actions | |
| 208 | |
| 209 - (void)saveCardSwitchToggled:(UISwitch*)sender { | |
| 210 _saveCreditCard = sender.isOn; | |
| 211 } | |
| 212 | |
| 213 @end | |
| OLD | NEW |