Commit 19f6b5e6 authored by sczs's avatar sczs Committed by Commit Bot

[ios] Implements SaveCardModal model.

Creates and configuresthe necessary items to populate the SaveCard Modal
and adds placeholder methods for their actions.

Screenshot:
https://drive.google.com/open?id=1VOFTyTGYyOAXp_dI0ZEkiAg6SP-rv8bd

Bug: 1014652
Change-Id: I231b19781a5f7142a2c4096f995450aace2f833b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1907210Reviewed-by: default avatarChris Lu <thegreenfrog@chromium.org>
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714380}
parent e6e2cff8
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h" #import "ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator_implementation.h"
#import "ios/chrome/browser/ui/infobars/infobar_container.h" #import "ios/chrome/browser/ui/infobars/infobar_container.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
...@@ -154,8 +155,9 @@ ...@@ -154,8 +155,9 @@
self.modalViewController = self.modalViewController =
[[InfobarSaveCardTableViewController alloc] initWithModalDelegate:self]; [[InfobarSaveCardTableViewController alloc] initWithModalDelegate:self];
// TODO(crbug.com/1014652): Replace with Modal specific text. // TODO(crbug.com/1014652): Replace with Modal specific text.
self.modalViewController.title = self.modalViewController.title = @"Save Credit Card";
base::SysUTF16ToNSString(self.saveCardInfoBarDelegate->GetMessageText()); self.modalViewController.cardIssuerIcon =
NativeImage(self.saveCardInfoBarDelegate->issuer_icon_id());
return YES; return YES;
} }
......
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
(ChromeTableViewControllerStyle)appBarStyle (ChromeTableViewControllerStyle)appBarStyle
NS_UNAVAILABLE; NS_UNAVAILABLE;
// Card Issuer icon image to be displayed.
@property(nonatomic, strong) UIImage* cardIssuerIcon;
@end @end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_SAVE_CARD_TABLE_VIEW_CONTROLLER_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_SAVE_CARD_TABLE_VIEW_CONTROLLER_H_
...@@ -4,12 +4,15 @@ ...@@ -4,12 +4,15 @@
#import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.h"
#include "base/mac/foundation_util.h"
#include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h" #include "base/metrics/user_metrics_action.h"
#include "ios/chrome/browser/infobars/infobar_metrics_recorder.h" #include "ios/chrome/browser/infobars/infobar_metrics_recorder.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h"
#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h"
#import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
#import "ios/chrome/common/colors/semantic_color_names.h" #import "ios/chrome/common/colors/semantic_color_names.h"
...@@ -17,9 +20,21 @@ ...@@ -17,9 +20,21 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
@interface InfobarSaveCardTableViewController () typedef NS_ENUM(NSInteger, SectionIdentifier) {
SectionIdentifierContent = kSectionIdentifierEnumZero,
};
// InfobarPasswordModalDelegate for this ViewController. typedef NS_ENUM(NSInteger, ItemType) {
ItemTypeCardLastDigits = kItemTypeEnumZero,
ItemTypeCardHolderName,
ItemTypeCardExpireMonth,
ItemTypeCardExpireYear,
ItemTypeCardSave,
};
@interface InfobarSaveCardTableViewController () <UITextFieldDelegate>
// InfobarModalDelegate for this ViewController.
@property(nonatomic, strong) id<InfobarModalDelegate> infobarModalDelegate; @property(nonatomic, strong) id<InfobarModalDelegate> infobarModalDelegate;
// Used to build and record metrics. // Used to build and record metrics.
@property(nonatomic, strong) InfobarMetricsRecorder* metricsRecorder; @property(nonatomic, strong) InfobarMetricsRecorder* metricsRecorder;
...@@ -57,10 +72,201 @@ ...@@ -57,10 +72,201 @@
cancelButton.accessibilityIdentifier = kInfobarModalCancelButton; cancelButton.accessibilityIdentifier = kInfobarModalCancelButton;
self.navigationItem.leftBarButtonItem = cancelButton; self.navigationItem.leftBarButtonItem = cancelButton;
self.navigationController.navigationBar.prefersLargeTitles = NO; self.navigationController.navigationBar.prefersLargeTitles = NO;
[self loadModel];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.metricsRecorder recordModalEvent:MobileMessagesModalEvent::Presented];
}
- (void)viewDidDisappear:(BOOL)animated {
[self.infobarModalDelegate modalInfobarWasDismissed:self];
[self.metricsRecorder recordModalEvent:MobileMessagesModalEvent::Dismissed];
[super viewDidDisappear:animated];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.tableView.scrollEnabled =
self.tableView.contentSize.height > self.view.frame.size.height;
}
#pragma mark - TableViewModel
- (void)loadModel {
[super loadModel];
TableViewModel* model = self.tableViewModel;
[model addSectionWithIdentifier:SectionIdentifierContent];
// TODO(crbug.com/1014652): Use the real strings once they are exposed in the
// delegate.
TableViewTextEditItem* cardLastDigitsItem =
[self textEditItemWithType:ItemTypeCardExpireYear
textFieldName:@"Card Number"
textFieldValue:@"•••• 1234"
textFieldEnabled:NO];
cardLastDigitsItem.identifyingIcon = self.cardIssuerIcon;
[model addItem:cardLastDigitsItem
toSectionWithIdentifier:SectionIdentifierContent];
// TODO(crbug.com/1014652): Use the real strings once they are exposed in the
// delegate.
TableViewTextEditItem* cardholderNameItem =
[self textEditItemWithType:ItemTypeCardExpireYear
textFieldName:@"Cardholder Name"
textFieldValue:@"Sergio Collazos"
textFieldEnabled:YES];
[model addItem:cardholderNameItem
toSectionWithIdentifier:SectionIdentifierContent];
// TODO(crbug.com/1014652): Use the real strings once they are exposed in the
// delegate.
TableViewTextEditItem* expireMonthItem =
[self textEditItemWithType:ItemTypeCardExpireYear
textFieldName:@"Expiration Month"
textFieldValue:@"07"
textFieldEnabled:YES];
[model addItem:expireMonthItem
toSectionWithIdentifier:SectionIdentifierContent];
// TODO(crbug.com/1014652): Use the real strings once they are exposed in the
// delegate.
TableViewTextEditItem* expireYearItem =
[self textEditItemWithType:ItemTypeCardExpireYear
textFieldName:@"Expiration Year"
textFieldValue:@"2020"
textFieldEnabled:YES];
[model addItem:expireYearItem
toSectionWithIdentifier:SectionIdentifierContent];
// TODO(crbug.com/1014652): Use the real strings once they are exposed in the
// delegate.
TableViewTextButtonItem* saveCardButtonItem =
[[TableViewTextButtonItem alloc] initWithType:ItemTypeCardSave];
saveCardButtonItem.textAlignment = NSTextAlignmentNatural;
// TODO(crbug.com/1014652): Implement TOS with Links. This might require a
// separate item.
saveCardButtonItem.text = @"TOS Agreement";
saveCardButtonItem.buttonText = @"Save Credit Card";
saveCardButtonItem.enabled = YES;
saveCardButtonItem.disableButtonIntrinsicWidth = YES;
[model addItem:saveCardButtonItem
toSectionWithIdentifier:SectionIdentifierContent];
}
#pragma mark - UITableViewDataSource
- (UITableViewCell*)tableView:(UITableView*)tableView
cellForRowAtIndexPath:(NSIndexPath*)indexPath {
UITableViewCell* cell = [super tableView:tableView
cellForRowAtIndexPath:indexPath];
ItemType itemType = static_cast<ItemType>(
[self.tableViewModel itemTypeForIndexPath:indexPath]);
switch (itemType) {
case ItemTypeCardLastDigits: {
cell.selectionStyle = UITableViewCellSelectionStyleNone;
break;
}
case ItemTypeCardHolderName: {
TableViewTextEditCell* editCell =
base::mac::ObjCCast<TableViewTextEditCell>(cell);
[editCell.textField addTarget:self
action:@selector(nameEditDidBegin)
forControlEvents:UIControlEventEditingDidBegin];
[editCell.textField addTarget:self
action:@selector(updateSaveCardButtonState)
forControlEvents:UIControlEventEditingChanged];
editCell.selectionStyle = UITableViewCellSelectionStyleNone;
editCell.textField.delegate = self;
break;
}
case ItemTypeCardExpireMonth: {
TableViewTextEditCell* editCell =
base::mac::ObjCCast<TableViewTextEditCell>(cell);
[editCell.textField addTarget:self
action:@selector(monthEditDidBegin)
forControlEvents:UIControlEventEditingDidBegin];
[editCell.textField addTarget:self
action:@selector(updateSaveCardButtonState)
forControlEvents:UIControlEventEditingChanged];
editCell.selectionStyle = UITableViewCellSelectionStyleNone;
editCell.textField.delegate = self;
break;
}
case ItemTypeCardExpireYear: {
TableViewTextEditCell* editCell =
base::mac::ObjCCast<TableViewTextEditCell>(cell);
[editCell.textField addTarget:self
action:@selector(yearEditDidBegin)
forControlEvents:UIControlEventEditingDidBegin];
[editCell.textField addTarget:self
action:@selector(updateSaveCardButtonState)
forControlEvents:UIControlEventEditingChanged];
editCell.selectionStyle = UITableViewCellSelectionStyleNone;
editCell.textField.delegate = self;
break;
}
case ItemTypeCardSave: {
TableViewTextButtonCell* tableViewTextButtonCell =
base::mac::ObjCCastStrict<TableViewTextButtonCell>(cell);
[tableViewTextButtonCell.button
addTarget:self
action:@selector(saveCardButtonWasPressed:)
forControlEvents:UIControlEventTouchUpInside];
break;
}
}
return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView*)tableView
heightForFooterInSection:(NSInteger)section {
return 0;
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
[textField resignFirstResponder];
return YES;
} }
#pragma mark - Private Methods #pragma mark - Private Methods
- (void)updateSaveCardButtonState {
// TODO(crbug.com/1014652): Implement
// TODO(crbug.com/1014652):Ideally the InfobarDelegate should update the
// button text. Once we have a consumer protocol we should be able to create a
// delegate that asks the InfobarDelegate for the correct text.
}
- (void)saveCardButtonWasPressed:(UIButton*)sender {
// TODO(crbug.com/1014652): Implement and record metrics.
}
- (void)nameEditDidBegin {
// TODO(crbug.com/1014652): Implement, should only be needed to record
// SaveCard specific editing metrics.
}
- (void)monthEditDidBegin {
// TODO(crbug.com/1014652): Implement, should only be needed to record
// SaveCard specific editing metrics.
}
- (void)yearEditDidBegin {
// TODO(crbug.com/1014652): Implement, should only be needed to record
// SaveCard specific editing metrics.
}
- (void)dismissInfobarModal:(UIButton*)sender { - (void)dismissInfobarModal:(UIButton*)sender {
base::RecordAction( base::RecordAction(
base::UserMetricsAction("MobileMessagesModalCancelledTapped")); base::UserMetricsAction("MobileMessagesModalCancelledTapped"));
...@@ -70,4 +276,21 @@ ...@@ -70,4 +276,21 @@
completion:nil]; completion:nil];
} }
#pragma mark - Helpers
- (TableViewTextEditItem*)textEditItemWithType:(ItemType)type
textFieldName:(NSString*)name
textFieldValue:(NSString*)value
textFieldEnabled:(BOOL)enabled {
TableViewTextEditItem* textEditItem =
[[TableViewTextEditItem alloc] initWithType:type];
textEditItem.textFieldName = name;
textEditItem.textFieldValue = value;
textEditItem.textFieldEnabled = enabled;
textEditItem.hideIcon = !enabled;
textEditItem.returnKeyType = UIReturnKeyDone;
return textEditItem;
}
@end @end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment