| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 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 | 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/ui/payments/credit_card_edit_view_controller.h" | 5 #import "ios/chrome/browser/ui/payments/credit_card_edit_view_controller.h" |
| 6 | 6 |
| 7 #import "base/mac/foundation_util.h" | 7 #import "base/mac/foundation_util.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "components/strings/grit/components_strings.h" | 9 #include "components/strings/grit/components_strings.h" |
| 10 #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" | 10 #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" |
| 11 #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.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" | 12 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrom
e.h" |
| 13 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item
.h" | |
| 14 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item+collec
tion_view_controller.h" | 13 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item+collec
tion_view_controller.h" |
| 15 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item
.h" | 14 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item
.h" |
| 16 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" | 15 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
| 17 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" | 16 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" |
| 18 #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller+int
ernal.h" | 17 #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller+int
ernal.h" |
| 19 #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller_act
ions.h" | 18 #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller_act
ions.h" |
| 20 #import "ios/chrome/browser/ui/payments/payment_request_editor_field.h" | 19 #import "ios/chrome/browser/ui/payments/payment_request_editor_field.h" |
| 21 #import "ios/chrome/browser/ui/uikit_ui_util.h" | 20 #import "ios/chrome/browser/ui/uikit_ui_util.h" |
| 22 #import "ios/third_party/material_components_ios/src/components/Typography/src/M
aterialTypography.h" | 21 #import "ios/third_party/material_components_ios/src/components/Typography/src/M
aterialTypography.h" |
| 23 #include "ui/base/l10n/l10n_util.h" | 22 #include "ui/base/l10n/l10n_util.h" |
| 24 | 23 |
| 25 #if !defined(__has_feature) || !__has_feature(objc_arc) | 24 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 26 #error "This file requires ARC support." | 25 #error "This file requires ARC support." |
| 27 #endif | 26 #endif |
| 28 | 27 |
| 29 namespace { | 28 namespace { |
| 30 | 29 |
| 31 NSString* const kCreditCardEditCollectionViewId = | 30 NSString* const kCreditCardEditCollectionViewId = |
| 32 @"kCreditCardEditCollectionViewId"; | 31 @"kCreditCardEditCollectionViewId"; |
| 33 | 32 |
| 34 typedef NS_ENUM(NSInteger, SectionIdentifier) { | 33 typedef NS_ENUM(NSInteger, SectionIdentifier) { |
| 35 SectionIdentifierAcceptedMethods = kSectionIdentifierEnumStart, | 34 SectionIdentifierSaveCard = kSectionIdentifierEnumStart, |
| 36 SectionIdentifierCardSummary, | |
| 37 SectionIdentifierBillingAddress, | |
| 38 SectionIdentifierSaveCard, | |
| 39 }; | 35 }; |
| 40 | 36 |
| 41 typedef NS_ENUM(NSInteger, ItemType) { | 37 typedef NS_ENUM(NSInteger, ItemType) { |
| 42 ItemTypeAcceptedMethods = kItemTypeEnumStart, | 38 ItemTypeSaveCard = kItemTypeEnumStart, |
| 43 ItemTypeCardSummary, | |
| 44 ItemTypeBillingAddress, | |
| 45 ItemTypeSaveCard, | |
| 46 }; | 39 }; |
| 47 | 40 |
| 48 } // namespace | 41 } // namespace |
| 49 | 42 |
| 50 @interface CreditCardEditViewController () { | 43 @interface CreditCardEditViewController () { |
| 51 NSArray<EditorField*>* _fields; | 44 NSArray<EditorField*>* _fields; |
| 52 | 45 |
| 53 // Indicates whether the credit card being created should be saved locally. | 46 // Indicates whether the credit card being created should be saved locally. |
| 54 BOOL _saveCreditCard; | 47 BOOL _saveCreditCard; |
| 55 } | 48 } |
| 56 | 49 |
| 57 @end | 50 @end |
| 58 | 51 |
| 59 @implementation CreditCardEditViewController | 52 @implementation CreditCardEditViewController |
| 60 | 53 |
| 61 @synthesize delegate = _delegate; | 54 @synthesize delegate = _delegate; |
| 62 @synthesize dataSource = _dataSource; | 55 @synthesize dataSource = _dataSource; |
| 63 @synthesize billingAddressGUID = _billingAddressGUID; | |
| 64 | 56 |
| 65 #pragma mark - Initialization | 57 #pragma mark - Initialization |
| 66 | 58 |
| 67 - (instancetype)init { | 59 - (instancetype)init { |
| 68 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; | 60 self = [super initWithStyle:CollectionViewControllerStyleAppBar]; |
| 69 if (self) { | 61 if (self) { |
| 70 _saveCreditCard = YES; | 62 _saveCreditCard = YES; |
| 71 | 63 |
| 72 // Set up leading (cancel) button. | 64 // Set up leading (cancel) button. |
| 73 UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] | 65 UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] |
| (...skipping 19 matching lines...) Expand all Loading... |
| 93 NSForegroundColorAttributeName : [UIColor lightGrayColor] | 85 NSForegroundColorAttributeName : [UIColor lightGrayColor] |
| 94 } | 86 } |
| 95 forState:UIControlStateDisabled]; | 87 forState:UIControlStateDisabled]; |
| 96 [doneButton setAccessibilityLabel:l10n_util::GetNSString(IDS_ACCNAME_DONE)]; | 88 [doneButton setAccessibilityLabel:l10n_util::GetNSString(IDS_ACCNAME_DONE)]; |
| 97 [self navigationItem].rightBarButtonItem = doneButton; | 89 [self navigationItem].rightBarButtonItem = doneButton; |
| 98 } | 90 } |
| 99 | 91 |
| 100 return self; | 92 return self; |
| 101 } | 93 } |
| 102 | 94 |
| 95 - (void)setDelegate:(id<CreditCardEditViewControllerDelegate>)delegate { |
| 96 [super setDelegate:delegate]; |
| 97 _delegate = delegate; |
| 98 } |
| 99 |
| 103 - (void)setDataSource:(id<CreditCardEditViewControllerDataSource>)dataSource { | 100 - (void)setDataSource:(id<CreditCardEditViewControllerDataSource>)dataSource { |
| 104 [super setDataSource:dataSource]; | 101 [super setDataSource:dataSource]; |
| 105 _dataSource = dataSource; | 102 _dataSource = dataSource; |
| 106 _fields = [dataSource editorFields]; | 103 _fields = [dataSource editorFields]; |
| 107 } | 104 } |
| 108 | 105 |
| 109 - (BOOL)validateForm { | |
| 110 if (![super validateForm]) | |
| 111 return NO; | |
| 112 | |
| 113 // TODO(crbug.com/602666): Uncomment the following when billing address | |
| 114 // selection UI is ready. | |
| 115 // Validate the billing address GUID. | |
| 116 // NSString* errorMessage = | |
| 117 // !_billingAddressGUID ? l10n_util::GetNSString( | |
| 118 // IDS_PAYMENTS_FIELD_REQUIRED_VALIDATION_MESSAGE) | |
| 119 // : nil; | |
| 120 // [self addOrRemoveErrorMessage:errorMessage | |
| 121 // inSectionWithIdentifier:SectionIdentifierBillingAddress]; | |
| 122 // if (errorMessage) { | |
| 123 // return NO; | |
| 124 // } | |
| 125 | |
| 126 return YES; | |
| 127 } | |
| 128 | |
| 129 #pragma mark - PaymentRequestEditViewControllerActions methods | 106 #pragma mark - PaymentRequestEditViewControllerActions methods |
| 130 | 107 |
| 131 - (void)onCancel { | 108 - (void)onCancel { |
| 132 [_delegate creditCardEditViewControllerDidCancel:self]; | 109 [_delegate creditCardEditViewControllerDidCancel:self]; |
| 133 } | 110 } |
| 134 | 111 |
| 135 - (void)onDone { | 112 - (void)onDone { |
| 136 if (![self validateForm]) | 113 if (![self validateForm]) |
| 137 return; | 114 return; |
| 138 | 115 |
| 139 [_delegate creditCardEditViewController:self | 116 [_delegate creditCardEditViewController:self |
| 140 didFinishEditingFields:_fields | 117 didFinishEditingFields:_fields |
| 141 billingAddressID:_billingAddressGUID | |
| 142 saveCreditCard:_saveCreditCard]; | 118 saveCreditCard:_saveCreditCard]; |
| 143 } | 119 } |
| 144 | 120 |
| 145 #pragma mark - CollectionViewController methods | 121 #pragma mark - CollectionViewController methods |
| 146 | 122 |
| 147 - (void)loadModel { | 123 - (void)loadModel { |
| 148 [super loadModel]; | 124 [super loadModel]; |
| 149 | 125 |
| 150 // If editing a credit card, set the card type icon (e.g. "Visa"). | 126 // If editing a credit card, set the card type icon (e.g. "Visa"). |
| 151 if (_dataSource.state == CreditCardEditViewControllerStateEdit) { | 127 if (_dataSource.state == EditViewControllerStateEdit) { |
| 152 for (EditorField* field in _fields) { | 128 for (EditorField* field in _fields) { |
| 153 AutofillEditItem* item = field.item; | |
| 154 if (field.autofillUIType == AutofillUITypeCreditCardNumber) { | 129 if (field.autofillUIType == AutofillUITypeCreditCardNumber) { |
| 130 AutofillEditItem* item = |
| 131 base::mac::ObjCCastStrict<AutofillEditItem>(field.item); |
| 155 item.cardTypeIcon = | 132 item.cardTypeIcon = |
| 156 [_dataSource cardTypeIconFromCardNumber:field.value]; | 133 [_dataSource cardTypeIconFromCardNumber:item.textFieldValue]; |
| 157 } | 134 } |
| 158 } | 135 } |
| 159 } | 136 } |
| 160 } | 137 } |
| 161 | 138 |
| 162 - (void)loadHeaderItems { | |
| 163 [super loadHeaderItems]; | |
| 164 CollectionViewModel* model = self.collectionViewModel; | |
| 165 | |
| 166 // Server card summary section. | |
| 167 CollectionViewItem* serverCardSummaryItem = | |
| 168 [_dataSource serverCardSummaryItem]; | |
| 169 if (serverCardSummaryItem) { | |
| 170 [model addSectionWithIdentifier:SectionIdentifierCardSummary]; | |
| 171 serverCardSummaryItem.type = ItemTypeCardSummary; | |
| 172 [model addItem:serverCardSummaryItem | |
| 173 toSectionWithIdentifier:SectionIdentifierCardSummary]; | |
| 174 } | |
| 175 | |
| 176 // Accepted payment methods section. | |
| 177 CollectionViewItem* acceptedMethodsItem = | |
| 178 [_dataSource acceptedPaymentMethodsItem]; | |
| 179 if (acceptedMethodsItem) { | |
| 180 [model addSectionWithIdentifier:SectionIdentifierAcceptedMethods]; | |
| 181 acceptedMethodsItem.type = ItemTypeAcceptedMethods; | |
| 182 [model addItem:acceptedMethodsItem | |
| 183 toSectionWithIdentifier:SectionIdentifierAcceptedMethods]; | |
| 184 } | |
| 185 } | |
| 186 | |
| 187 - (void)loadFooterItems { | 139 - (void)loadFooterItems { |
| 188 CollectionViewModel* model = self.collectionViewModel; | 140 CollectionViewModel* model = self.collectionViewModel; |
| 189 | 141 |
| 190 // Billing Address section. | |
| 191 [model addSectionWithIdentifier:SectionIdentifierBillingAddress]; | |
| 192 CollectionViewDetailItem* billingAddressItem = | |
| 193 [[CollectionViewDetailItem alloc] initWithType:ItemTypeBillingAddress]; | |
| 194 billingAddressItem.text = [NSString | |
| 195 stringWithFormat:@"%@*", | |
| 196 l10n_util::GetNSString(IDS_PAYMENTS_BILLING_ADDRESS)]; | |
| 197 billingAddressItem.accessoryType = | |
| 198 MDCCollectionViewCellAccessoryDisclosureIndicator; | |
| 199 [model addItem:billingAddressItem | |
| 200 toSectionWithIdentifier:SectionIdentifierBillingAddress]; | |
| 201 | |
| 202 if (_billingAddressGUID) { | |
| 203 billingAddressItem.detailText = | |
| 204 [_dataSource billingAddressLabelForProfileWithGUID:_billingAddressGUID]; | |
| 205 } | |
| 206 | |
| 207 // "Save card" section. Visible only when creating a card. | 142 // "Save card" section. Visible only when creating a card. |
| 208 if (_dataSource.state == CreditCardEditViewControllerStateCreate) { | 143 if (_dataSource.state == EditViewControllerStateCreate) { |
| 209 [model addSectionWithIdentifier:SectionIdentifierSaveCard]; | 144 [model addSectionWithIdentifier:SectionIdentifierSaveCard]; |
| 210 CollectionViewSwitchItem* saveCardItem = | 145 CollectionViewSwitchItem* saveCardItem = |
| 211 [[CollectionViewSwitchItem alloc] initWithType:ItemTypeSaveCard]; | 146 [[CollectionViewSwitchItem alloc] initWithType:ItemTypeSaveCard]; |
| 212 saveCardItem.text = | 147 saveCardItem.text = |
| 213 l10n_util::GetNSString(IDS_PAYMENTS_SAVE_CARD_TO_DEVICE_CHECKBOX); | 148 l10n_util::GetNSString(IDS_PAYMENTS_SAVE_CARD_TO_DEVICE_CHECKBOX); |
| 214 saveCardItem.on = _saveCreditCard; | 149 saveCardItem.on = _saveCreditCard; |
| 215 [model addItem:saveCardItem | 150 [model addItem:saveCardItem |
| 216 toSectionWithIdentifier:SectionIdentifierSaveCard]; | 151 toSectionWithIdentifier:SectionIdentifierSaveCard]; |
| 217 } | 152 } |
| 218 | 153 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 #pragma mark - UICollectionViewDataSource | 187 #pragma mark - UICollectionViewDataSource |
| 253 | 188 |
| 254 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView | 189 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView |
| 255 cellForItemAtIndexPath:(NSIndexPath*)indexPath { | 190 cellForItemAtIndexPath:(NSIndexPath*)indexPath { |
| 256 UICollectionViewCell* cell = | 191 UICollectionViewCell* cell = |
| 257 [super collectionView:collectionView cellForItemAtIndexPath:indexPath]; | 192 [super collectionView:collectionView cellForItemAtIndexPath:indexPath]; |
| 258 CollectionViewItem* item = | 193 CollectionViewItem* item = |
| 259 [self.collectionViewModel itemAtIndexPath:indexPath]; | 194 [self.collectionViewModel itemAtIndexPath:indexPath]; |
| 260 | 195 |
| 261 switch (item.type) { | 196 switch (item.type) { |
| 262 case ItemTypeBillingAddress: { | |
| 263 CollectionViewDetailCell* billingCell = | |
| 264 base::mac::ObjCCastStrict<CollectionViewDetailCell>(cell); | |
| 265 billingCell.textLabel.font = [MDCTypography body2Font]; | |
| 266 billingCell.textLabel.textColor = [[MDCPalette greyPalette] tint900]; | |
| 267 billingCell.detailTextLabel.font = [MDCTypography body1Font]; | |
| 268 billingCell.detailTextLabel.textColor = | |
| 269 [[MDCPalette cr_bluePalette] tint600]; | |
| 270 break; | |
| 271 } | |
| 272 case ItemTypeSaveCard: { | 197 case ItemTypeSaveCard: { |
| 273 CollectionViewSwitchCell* switchCell = | 198 CollectionViewSwitchCell* switchCell = |
| 274 base::mac::ObjCCastStrict<CollectionViewSwitchCell>(cell); | 199 base::mac::ObjCCastStrict<CollectionViewSwitchCell>(cell); |
| 275 [switchCell.switchView addTarget:self | 200 [switchCell.switchView addTarget:self |
| 276 action:@selector(saveCardSwitchToggled:) | 201 action:@selector(saveCardSwitchToggled:) |
| 277 forControlEvents:UIControlEventValueChanged]; | 202 forControlEvents:UIControlEventValueChanged]; |
| 278 break; | 203 break; |
| 279 } | 204 } |
| 280 default: | 205 default: |
| 281 break; | 206 break; |
| 282 } | 207 } |
| 283 | 208 |
| 284 return cell; | 209 return cell; |
| 285 } | 210 } |
| 286 | 211 |
| 287 #pragma mark UICollectionViewDelegate | |
| 288 | |
| 289 - (void)collectionView:(UICollectionView*)collectionView | |
| 290 didSelectItemAtIndexPath:(NSIndexPath*)indexPath { | |
| 291 [super collectionView:collectionView didSelectItemAtIndexPath:indexPath]; | |
| 292 | |
| 293 CollectionViewItem* item = | |
| 294 [self.collectionViewModel itemAtIndexPath:indexPath]; | |
| 295 switch (item.type) { | |
| 296 case ItemTypeAcceptedMethods: | |
| 297 case ItemTypeCardSummary: | |
| 298 case ItemTypeSaveCard: | |
| 299 break; | |
| 300 case ItemTypeBillingAddress: { | |
| 301 // TODO(crbug.com/602666): Display a list of billing addresses. | |
| 302 break; | |
| 303 } | |
| 304 default: | |
| 305 break; | |
| 306 } | |
| 307 } | |
| 308 | |
| 309 #pragma mark MDCCollectionViewStylingDelegate | 212 #pragma mark MDCCollectionViewStylingDelegate |
| 310 | 213 |
| 311 - (CGFloat)collectionView:(UICollectionView*)collectionView | 214 - (CGFloat)collectionView:(UICollectionView*)collectionView |
| 312 cellHeightAtIndexPath:(NSIndexPath*)indexPath { | 215 cellHeightAtIndexPath:(NSIndexPath*)indexPath { |
| 313 CollectionViewItem* item = | 216 CollectionViewItem* item = |
| 314 [self.collectionViewModel itemAtIndexPath:indexPath]; | 217 [self.collectionViewModel itemAtIndexPath:indexPath]; |
| 315 switch (item.type) { | 218 switch (item.type) { |
| 316 case ItemTypeBillingAddress: | |
| 317 return MDCCellDefaultOneLineHeight; | |
| 318 case ItemTypeAcceptedMethods: | |
| 319 case ItemTypeCardSummary: | |
| 320 case ItemTypeSaveCard: | 219 case ItemTypeSaveCard: |
| 321 return [MDCCollectionViewCell | 220 return [MDCCollectionViewCell |
| 322 cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds) | 221 cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds) |
| 323 forItem:item]; | 222 forItem:item]; |
| 324 default: | 223 default: |
| 325 return | 224 return |
| 326 [super collectionView:collectionView cellHeightAtIndexPath:indexPath]; | 225 [super collectionView:collectionView cellHeightAtIndexPath:indexPath]; |
| 327 } | 226 } |
| 328 } | 227 } |
| 329 | 228 |
| 330 - (BOOL)collectionView:(UICollectionView*)collectionView | 229 - (BOOL)collectionView:(UICollectionView*)collectionView |
| 331 hidesInkViewAtIndexPath:(NSIndexPath*)indexPath { | 230 hidesInkViewAtIndexPath:(NSIndexPath*)indexPath { |
| 332 NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; | 231 NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; |
| 333 switch (type) { | 232 switch (type) { |
| 334 case ItemTypeAcceptedMethods: | |
| 335 case ItemTypeCardSummary: | |
| 336 case ItemTypeSaveCard: | 233 case ItemTypeSaveCard: |
| 337 return YES; | 234 return YES; |
| 338 default: | 235 default: |
| 339 return [super collectionView:collectionView | 236 return [super collectionView:collectionView |
| 340 hidesInkViewAtIndexPath:indexPath]; | 237 hidesInkViewAtIndexPath:indexPath]; |
| 341 } | 238 } |
| 342 } | 239 } |
| 343 | 240 |
| 344 - (BOOL)collectionView:(UICollectionView*)collectionView | |
| 345 shouldHideItemBackgroundAtIndexPath:(NSIndexPath*)indexPath { | |
| 346 NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; | |
| 347 switch (type) { | |
| 348 case ItemTypeAcceptedMethods: | |
| 349 return YES; | |
| 350 default: | |
| 351 return [super collectionView:collectionView | |
| 352 shouldHideItemBackgroundAtIndexPath:indexPath]; | |
| 353 } | |
| 354 } | |
| 355 | |
| 356 #pragma mark Switch Actions | 241 #pragma mark Switch Actions |
| 357 | 242 |
| 358 - (void)saveCardSwitchToggled:(UISwitch*)sender { | 243 - (void)saveCardSwitchToggled:(UISwitch*)sender { |
| 359 _saveCreditCard = sender.isOn; | 244 _saveCreditCard = sender.isOn; |
| 360 } | 245 } |
| 361 | 246 |
| 362 @end | 247 @end |
| OLD | NEW |