Commit 92a9fc4a authored by redatawfik's avatar redatawfik Committed by Commit Bot

Implements the mediator and the coordinator for adding new credit card

1)Creates new class AutofillAddCreditCardCoordinator as a coordinator
for add new credit card.
2)Initiates AutofillAddCreditCardCoordinator with BrowserState.
3)Creates new Interface CreditCardValidationDelegate.
4)Implements CreditCardValidationDelegate in AutofillAddCreditCardCoordinator.
5)Creates new class AutofillAddCreditCardMediator.
6)Creates new Interface AddCreditCardViewControllerDelegate.
7)Initiates AutofillAddCreditCardMediator with PersonalDataManager and
AutofillAddCreditCardCoordinator as a delegate.
8)Initiates AutofillAddCreditCardViewController with AutofillAddCreditCardMediator as a delegate.
9)AutofillAddCreditCardMediator creates and saves new credit card object.

Bug: 984545
Change-Id: I36e390f1e84c3cf54c4491780f73cdfdb142a21a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1724073
Commit-Queue: Reda Tawfik <redatawfik@google.com>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarJavier Ernesto Flores Robles <javierrobles@chromium.org>
Cr-Commit-Position: refs/heads/master@{#684262}
parent a179cedc
......@@ -204,6 +204,12 @@ locale. The strings in this file are specific to iOS.
<message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_OK_BUTTON" desc="Title of the button to validate the user consent [Length: 15m] [iOS only]">
YES, I'M IN
</message>
<message name="IDS_IOS_ADD_CREDIT_CARD_INVALID_CARD_NUMBER_ALERT" desc="The title of the alert view displaying invalid card number when a user enters invalid card number for the new credit card to save. [iOS only]">
Invalid Card Number
</message>
<message name="IDS_IOS_ADD_CREDIT_CARD_INVALID_EXPIRATION_DATE_ALERT" desc="The title of the alert view displaying invalid expiration date when a user enters invalid expiration date for the new credit card to save. [iOS only]">
Invalid Expiration Date
</message>
<message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON" desc="Alert button title to ask if the user really wants to cancel sign-in and sync. This button would let the user return to the sync settings, and let them choose again.">
Back
</message>
......
......@@ -5,8 +5,14 @@
source_set("autofill") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"autofill_add_credit_card_coordinator.h",
"autofill_add_credit_card_coordinator.mm",
"autofill_add_credit_card_mediator.h",
"autofill_add_credit_card_mediator.mm",
"autofill_add_credit_card_mediator_delegate.h",
"autofill_add_credit_card_view_controller.h",
"autofill_add_credit_card_view_controller.mm",
"autofill_add_credit_card_view_controller_delegate.h",
"autofill_credit_card_edit_table_view_controller.h",
"autofill_credit_card_edit_table_view_controller.mm",
"autofill_credit_card_table_view_controller.h",
......@@ -31,10 +37,12 @@ source_set("autofill") {
"//ios/chrome/browser/autofill",
"//ios/chrome/browser/browser_state",
"//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/alert_coordinator",
"//ios/chrome/browser/ui/autofill",
"//ios/chrome/browser/ui/autofill:autofill_ui",
"//ios/chrome/browser/ui/autofill/cells",
"//ios/chrome/browser/ui/commands",
"//ios/chrome/browser/ui/coordinators:chrome_coordinators",
"//ios/chrome/browser/ui/settings:settings_root",
"//ios/chrome/browser/ui/settings/autofill/cells",
"//ios/chrome/browser/ui/settings/cells",
......
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_COORDINATOR_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_COORDINATOR_H_
#include <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
// The coordinator for add credit card screen.
@interface AutofillAddCreditCardCoordinator : ChromeCoordinator
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_COORDINATOR_H_
// Copyright 2019 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/ui/settings/autofill/autofill_add_credit_card_coordinator.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#import "components/autofill/ios/browser/personal_data_manager_observer_bridge.h"
#include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_delegate.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface AutofillAddCreditCardCoordinator () <AddCreditCardMediatorDelegate>
// Displays message for invalid credit card data.
@property(nonatomic, strong) AlertCoordinator* alertCoordinator;
// The view controller attached to this coordinator.
@property(nonatomic, strong)
AutofillAddCreditCardViewController* addCreditCardViewController;
// The mediator for the view controller attatched to this coordinator.
@property(nonatomic, strong) AutofillAddCreditCardMediator* mediator;
@end
@implementation AutofillAddCreditCardCoordinator
- (void)start {
autofill::PersonalDataManager* personalDataManager =
autofill::PersonalDataManagerFactory::GetForBrowserState(
self.browserState);
self.mediator = [[AutofillAddCreditCardMediator alloc]
initWithDelegate:self
personalDataManager:personalDataManager];
self.addCreditCardViewController =
[[AutofillAddCreditCardViewController alloc]
initWithDelegate:self.mediator];
UINavigationController* navigationController = [[UINavigationController alloc]
initWithRootViewController:self.addCreditCardViewController];
[self.baseViewController presentViewController:navigationController
animated:YES
completion:nil];
}
- (void)stop {
[self.addCreditCardViewController.navigationController
dismissViewControllerAnimated:YES
completion:nil];
self.addCreditCardViewController = nil;
self.mediator = nil;
}
#pragma mark - AddCreditCardMediatorDelegate
- (void)creditCardMediatorDidFinish:(AutofillAddCreditCardMediator*)mediator {
[self stop];
}
- (void)creditCardMediatorHasInvalidCardNumber:
(AutofillAddCreditCardMediator*)mediator {
[self showAlertWithMessage:
l10n_util::GetNSString(
IDS_IOS_ADD_CREDIT_CARD_INVALID_CARD_NUMBER_ALERT)];
}
- (void)creditCardMediatorHasInvalidExpirationDate:
(AutofillAddCreditCardMediator*)mediator {
[self showAlertWithMessage:
l10n_util::GetNSString(
IDS_IOS_ADD_CREDIT_CARD_INVALID_EXPIRATION_DATE_ALERT)];
}
#pragma mark - Helper Methods
// Shows alert with received message by |AlertCoordinator|.
- (void)showAlertWithMessage:(NSString*)message {
self.alertCoordinator = [[AlertCoordinator alloc]
initWithBaseViewController:self.addCreditCardViewController
title:message
message:nil];
[self.alertCoordinator start];
}
@end
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_H_
#import <Foundation/Foundation.h>
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_delegate.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller_delegate.h"
namespace autofill {
class PersonalDataManager;
}
// The Mediator for validating and saving the credit card.
@interface AutofillAddCreditCardMediator
: NSObject <AddCreditCardViewControllerDelegate>
// Designated initializer. |addCreditCardMediatorDelegate| and |dataManager|
// should not be nil.
- (instancetype)initWithDelegate:(id<AddCreditCardMediatorDelegate>)
addCreditCardMediatorDelegate
personalDataManager:(autofill::PersonalDataManager*)dataManager
NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_H_
// Copyright 2019 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/ui/settings/autofill/autofill_add_credit_card_mediator.h"
#include "base/strings/sys_string_conversions.h"
#include "components/autofill/core/browser/data_model/credit_card.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "ios/chrome/browser/application_context.h"
#import "ios/chrome/browser/ui/autofill/autofill_ui_type.h"
#import "ios/chrome/browser/ui/autofill/autofill_ui_type_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
@interface AutofillAddCreditCardMediator ()
// Used for adding new CreditCard object.
@property(nonatomic, assign) autofill::PersonalDataManager* personalDataManager;
// This property is for an interface which sends a response about saving the
// credit card either the credit card is valid or it is invalid.
@property(nonatomic, weak) id<AddCreditCardMediatorDelegate>
addCreditCardMediatorDelegate;
@end
@implementation AutofillAddCreditCardMediator
- (instancetype)initWithDelegate:(id<AddCreditCardMediatorDelegate>)
addCreditCardMediatorDelegate
personalDataManager:(autofill::PersonalDataManager*)dataManager {
self = [super init];
if (self) {
DCHECK(dataManager);
_personalDataManager = dataManager;
_addCreditCardMediatorDelegate = addCreditCardMediatorDelegate;
}
return self;
}
#pragma mark - AddCreditCardViewControllerDelegate
- (void)addCreditCardViewController:(UIViewController*)viewController
addCreditCardWithHolderName:(NSString*)cardHolderName
cardNumber:(NSString*)cardNumber
expirationMonth:(NSString*)expirationMonth
expirationYear:(NSString*)expirationYear {
autofill::CreditCard creditCard = autofill::CreditCard();
const std::string& appLocal = GetApplicationContext()->GetApplicationLocale();
creditCard.SetInfo(autofill::AutofillType(AutofillTypeFromAutofillUIType(
AutofillUITypeCreditCardHolderFullName)),
base::SysNSStringToUTF16(cardHolderName), appLocal);
creditCard.SetInfo(autofill::AutofillType(AutofillTypeFromAutofillUIType(
AutofillUITypeCreditCardNumber)),
base::SysNSStringToUTF16(cardNumber), appLocal);
creditCard.SetInfo(autofill::AutofillType(AutofillTypeFromAutofillUIType(
AutofillUITypeCreditCardExpMonth)),
base::SysNSStringToUTF16(expirationMonth), appLocal);
creditCard.SetInfo(autofill::AutofillType(AutofillTypeFromAutofillUIType(
AutofillUITypeCreditCardExpYear)),
base::SysNSStringToUTF16(expirationYear), appLocal);
if (!creditCard.HasValidCardNumber()) {
[self.addCreditCardMediatorDelegate
creditCardMediatorHasInvalidCardNumber:self];
return;
}
if (!creditCard.HasValidExpirationDate()) {
[self.addCreditCardMediatorDelegate
creditCardMediatorHasInvalidExpirationDate:self];
return;
}
self.personalDataManager->AddCreditCard(creditCard);
[self.addCreditCardMediatorDelegate creditCardMediatorDidFinish:self];
}
- (void)addCreditCardViewControllerDidCancel:(UIViewController*)viewController {
[self.addCreditCardMediatorDelegate creditCardMediatorDidFinish:self];
}
@end
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_DELEGATE_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_DELEGATE_H_
@class AutofillAddCreditCardMediator;
// This delegate is notified of the result of saving a credit card.
@protocol AddCreditCardMediatorDelegate
// Notifies that the credit card number is invalid.
- (void)creditCardMediatorHasInvalidCardNumber:
(AutofillAddCreditCardMediator*)mediator;
// Notifies that the credit card expiration date is invalid.
- (void)creditCardMediatorHasInvalidExpirationDate:
(AutofillAddCreditCardMediator*)mediator;
// Notifies that the credit card is valid or the user cancel the view
// controller.
- (void)creditCardMediatorDidFinish:(AutofillAddCreditCardMediator*)mediator;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_MEDIATOR_DELEGATE_H_
......@@ -7,14 +7,20 @@
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller_delegate.h"
#import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
// The view controller for adding new credit card.
@interface AutofillAddCreditCardViewController : SettingsRootTableViewController
// Initializes a AutofillAddCreditCardViewController with
// A default style and |ChromeTableViewControllerStyleNoAppBar|.
- (instancetype)init;
// Initializes a AutofillAddCreditCardViewController with passed delegate.
- (instancetype)initWithDelegate:
(id<AddCreditCardViewControllerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
appBarStyle:
(ChromeTableViewControllerStyle)appBarStyle
NS_UNAVAILABLE;
@end
......
......@@ -5,6 +5,7 @@
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.h"
#include "base/feature_list.h"
#include "base/mac/foundation_util.h"
#import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.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"
......@@ -37,14 +38,28 @@ typedef NS_ENUM(NSInteger, ItemType) {
} // namespace
@interface AutofillAddCreditCardViewController ()
// The AddCreditCardViewControllerDelegate for this ViewController.
@property(nonatomic, weak) id<AddCreditCardViewControllerDelegate> delegate;
@end
@implementation AutofillAddCreditCardViewController
- (instancetype)init {
- (instancetype)initWithDelegate:
(id<AddCreditCardViewControllerDelegate>)delegate {
UITableViewStyle style = base::FeatureList::IsEnabled(kSettingsRefresh)
? UITableViewStylePlain
: UITableViewStyleGrouped;
return [super initWithTableViewStyle:style
self = [super initWithTableViewStyle:style
appBarStyle:ChromeTableViewControllerStyleNoAppBar];
if (self) {
_delegate = delegate;
}
return self;
}
- (void)viewDidLoad {
......@@ -66,7 +81,7 @@ typedef NS_ENUM(NSInteger, ItemType) {
initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_ADD_BUTTON)
style:UIBarButtonItemStyleDone
target:self
action:nil];
action:@selector(didTapAddButton:)];
[self loadModel];
}
......@@ -139,9 +154,46 @@ typedef NS_ENUM(NSInteger, ItemType) {
#pragma mark - Private
// Reads the data from text fields and sends it to the mediator.
- (void)didTapAddButton:(id)sender {
NSString* cardHolderName = [self readTextFromItemtype:ItemTypeName
sectionIdentifier:SectionIdentifierName];
NSString* cardNumber =
[self readTextFromItemtype:ItemTypeCardNumber
sectionIdentifier:SectionIdentifierCreditCardDetails];
NSString* expirationMonth =
[self readTextFromItemtype:ItemTypeExpirationMonth
sectionIdentifier:SectionIdentifierCreditCardDetails];
NSString* expirationYear =
[self readTextFromItemtype:ItemTypeExpirationYear
sectionIdentifier:SectionIdentifierCreditCardDetails];
[self.delegate addCreditCardViewController:self
addCreditCardWithHolderName:cardHolderName
cardNumber:cardNumber
expirationMonth:expirationMonth
expirationYear:expirationYear];
}
// Reads and returns the data from the item with passed |itemType| and
// |sectionIdentifier|.
- (NSString*)readTextFromItemtype:(NSInteger)itemType
sectionIdentifier:(NSInteger)sectionIdentifier {
NSIndexPath* path =
[self.tableViewModel indexPathForItemType:itemType
sectionIdentifier:sectionIdentifier];
AutofillEditItem* item = base::mac::ObjCCastStrict<AutofillEditItem>(
[self.tableViewModel itemAtIndexPath:path]);
NSString* text = item.textFieldValue;
return text;
}
// Dimisses this view controller.
- (void)handleCancelButton:(id)sender {
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
[self.delegate addCreditCardViewControllerDidCancel:self];
}
// Returns initialized tableViewItem with passed arguments.
......
// Copyright 2019 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.
#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_VIEW_CONTROLLER_DELEGATE_H_
#define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_VIEW_CONTROLLER_DELEGATE_H_
@class UIViewController;
// Delegate manages adding a new credit card.
@protocol AddCreditCardViewControllerDelegate
// Receives a credit card data. Implement this method to save a new credit card.
- (void)addCreditCardViewController:(UIViewController*)viewController
addCreditCardWithHolderName:(NSString*)cardHolderName
cardNumber:(NSString*)cardNumber
expirationMonth:(NSString*)expirationMonth
expirationYear:(NSString*)expirationYear;
// Notifies the class which conform this delegate for cancel button tap in
// received view controller.
- (void)addCreditCardViewControllerDidCancel:(UIViewController*)viewController;
@end
#endif // IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_AUTOFILL_ADD_CREDIT_CARD_VIEW_CONTROLLER_DELEGATE_H_
......@@ -17,7 +17,7 @@
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/autofill/cells/autofill_data_item.h"
#import "ios/chrome/browser/ui/settings/autofill/features.h"
......@@ -78,6 +78,10 @@ typedef NS_ENUM(NSInteger, ItemType) {
// Button to add a new credit card.
@property(nonatomic, strong) UIBarButtonItem* addPaymentMethodButton;
// Coordinator to add new credit card.
@property(nonatomic, strong)
AutofillAddCreditCardCoordinator* addCreditCardCoordinator;
@end
@implementation AutofillCreditCardTableViewController
......@@ -424,13 +428,12 @@ typedef NS_ENUM(NSInteger, ItemType) {
// credit card details.
- (void)handleAddPayment:(id)sender {
DCHECK(base::FeatureList::IsEnabled(kSettingsAddPaymentMethod));
AutofillAddCreditCardViewController* addCreditCardViewController =
[[AutofillAddCreditCardViewController alloc] init];
UINavigationController* navigationController = [[UINavigationController alloc]
initWithRootViewController:addCreditCardViewController];
self.addCreditCardCoordinator = [[AutofillAddCreditCardCoordinator alloc]
initWithBaseViewController:self
browserState:_browserState];
[self presentViewController:navigationController animated:YES completion:nil];
[self.addCreditCardCoordinator start];
}
#pragma mark PersonalDataManagerObserver
......
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