Commit 73c81f24 authored by David Jean's avatar David Jean Committed by Commit Bot

[ios] Plug in obj-c credit card object in manual fill.

Also added use of cell utils in manual_fill_card_cell.

Bug: 845472
Change-Id: Ie015a2335c3cfe37f34620e2efb1447b8429d3c1
Reviewed-on: https://chromium-review.googlesource.com/c/1335550
Commit-Queue: David Jean <djean@chromium.org>
Reviewed-by: default avatarJavier Ernesto Flores Robles <javierrobles@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608355}
parent eaf11202
......@@ -5,11 +5,9 @@
#import "ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.h"
#include "base/memory/ref_counted.h"
#include "base/strings/sys_string_conversions.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/personal_data_manager.h"
#include "components/autofill/ios/browser/autofill_driver_ios.h"
#include "components/keyed_service/core/service_access_type.h"
#include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_list_delegate.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_mediator.h"
......@@ -66,6 +64,10 @@ initWithBaseViewController:(UIViewController*)viewController
std::vector<autofill::CreditCard*> cards =
personalDataManager->GetCreditCardsToSuggest(true);
// TODO(crbug.com/845472): add observer using
// PersonalDataManagerObserverBridge and refresh data when personal data
// changes. Applies to addresses too.
_cardMediator = [[ManualFillCardMediator alloc] initWithCards:cards];
_cardMediator.navigationDelegate = self;
_cardMediator.contentDelegate = self.manualFillInjectionHandler;
......@@ -94,13 +96,17 @@ initWithBaseViewController:(UIViewController*)viewController
}];
}
- (void)requestFullCreditCard:(const autofill::CreditCard&)card {
- (void)requestFullCreditCard:(ManualFillCreditCard*)card {
__weak __typeof(self) weakSelf = self;
// TODO(crbug.com/845472): resolve potential weak card here either using
// std::unique or an Obj-C Creditcard object as proposed in another TODO.
autofill::CreditCard cardCopy = card;
__weak ManualFillCreditCard* weakCard = card;
[self dismissIfNecessaryThenDoCompletion:^{
[weakSelf.cardRequester requestFullCreditCard:cardCopy
if (!weakSelf)
return;
const autofill::CreditCard* autofillCreditCard =
[weakSelf.cardMediator findCreditCardfromGUID:weakCard.GUID];
if (!autofillCreditCard)
return;
[weakSelf.cardRequester requestFullCreditCard:*autofillCreditCard
withBaseViewController:weakSelf.baseViewController];
}];
}
......
......@@ -5,9 +5,7 @@
#ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_CARD_LIST_DELEGATE_H_
#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_CARD_LIST_DELEGATE_H_
namespace autofill {
class CreditCard;
} // namespace autofill
#import "ios/chrome/browser/ui/autofill/manual_fill/credit_card.h"
// Delegate for actions in manual fallback's cards list.
@protocol CardListDelegate
......@@ -16,7 +14,7 @@ class CreditCard;
- (void)openCardSettings;
// Open credit card unlock, through CVC, prompt.
- (void)requestFullCreditCard:(const autofill::CreditCard&)card;
- (void)requestFullCreditCard:(ManualFillCreditCard*)card;
@end
......
......@@ -45,6 +45,9 @@ extern NSString* const OtherCardsAccessibilityIdentifier;
// Unavailable. Use |initWithCards:|.
- (instancetype)init NS_UNAVAILABLE;
// Finds the original autofill::CreditCard from given |GUID|.
- (const autofill::CreditCard*)findCreditCardfromGUID:(NSString*)GUID;
@end
#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_CARD_MEDIATOR_H_
......@@ -8,11 +8,14 @@
#include "base/metrics/user_metrics.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_manager.h"
#include "components/autofill/core/browser/credit_card.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/action_cell.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_consumer.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_list_delegate.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/credit_card.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/credit_card_form.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/full_card_request_result_delegate_bridge.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_cell.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_content_delegate.h"
......@@ -65,6 +68,16 @@ NSString* const ManageCardsAccessibilityIdentifier =
[self postActionsToConsumer];
}
- (const autofill::CreditCard*)findCreditCardfromGUID:(NSString*)GUID {
for (autofill::CreditCard* card : self.cards) {
NSString* cppGUID =
base::SysUTF16ToNSString(base::ASCIIToUTF16(card->guid()));
if ([cppGUID isEqualToString:GUID])
return card;
}
return nil;
}
#pragma mark - Private
// Posts the cards to the consumer.
......@@ -76,9 +89,10 @@ NSString* const ManageCardsAccessibilityIdentifier =
NSMutableArray* items =
[[NSMutableArray alloc] initWithCapacity:self.cards.size()];
for (autofill::CreditCard* card : self.cards) {
// TODO(crbug.com/845472): create a pure objc object instead.
ManualFillCreditCard* manualFillCreditCard =
[[ManualFillCreditCard alloc] initWithCreditCard:*card];
auto item =
[[ManualFillCardItem alloc] initWithCreditCard:*card
[[ManualFillCardItem alloc] initWithCreditCard:manualFillCreditCard
contentDelegate:self.contentDelegate
navigationDelegate:self.navigationDelegate];
[items addObject:item];
......@@ -110,16 +124,18 @@ NSString* const ManageCardsAccessibilityIdentifier =
- (void)onFullCardRequestSucceeded:(const autofill::CreditCard&)card {
// Credit card are not shown as 'Secure'.
NSString* cardNumber =
base::SysUTF16ToNSString(autofill::CreditCard::StripSeparators(
card.GetRawInfo(autofill::CREDIT_CARD_NUMBER)));
ManualFillCreditCard* manualFillCreditCard =
[[ManualFillCreditCard alloc] initWithCreditCard:card];
// Don't replace the locked card with the unlocked one, so the user will
// have to unlock it again, if needed.
// TODO(crbug.com/845472): update userDidPickContent to have an isHttps
// parameter.
[self.contentDelegate userDidPickContent:cardNumber isSecure:NO];
[self.contentDelegate userDidPickContent:manualFillCreditCard.number
isSecure:NO];
}
- (void)onFullCardRequestFailed {
// TODO(crbug.com/845472): handle failure to unlock card.
// This is called on user cancelling, so there's nothing to do here.
}
@end
......@@ -25,9 +25,11 @@
base::SysUTF16ToNSString(base::ASCIIToUTF16(creditCard.bank_name()));
NSString* cardHolder = autofill::GetCreditCardName(
creditCard, GetApplicationContext()->GetApplicationLocale());
NSString* number =
base::SysUTF16ToNSString(autofill::CreditCard::StripSeparators(
NSString* number = nil;
if (creditCard.record_type() != autofill::CreditCard::MASKED_SERVER_CARD) {
number = base::SysUTF16ToNSString(autofill::CreditCard::StripSeparators(
creditCard.GetRawInfo(autofill::CREDIT_CARD_NUMBER)));
}
// Unicode characters used in card number:
// - 0x0020 - Space.
......
......@@ -87,7 +87,7 @@ TEST_F(ManualFillCreditCardFormAutofilliOSTest, CreationObfuscated) {
EXPECT_TRUE([GUID isEqualToString:manualFillCard.GUID]);
EXPECT_TRUE([@"Visa" isEqualToString:manualFillCard.network]);
EXPECT_TRUE([bankName isEqualToString:manualFillCard.bankName]);
EXPECT_TRUE([number isEqualToString:manualFillCard.number]);
EXPECT_FALSE(manualFillCard.number);
EXPECT_TRUE([manualFillCard.obfuscatedNumber containsString:@"1234"]);
EXPECT_FALSE([manualFillCard.obfuscatedNumber containsString:@"4321"]);
EXPECT_TRUE([cardHolder isEqualToString:manualFillCard.cardHolder]);
......
......@@ -7,19 +7,16 @@
#import <UIKit/UIKit.h>
#import "ios/chrome/browser/ui/autofill/manual_fill/credit_card.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_item.h"
namespace autofill {
class CreditCard;
} // namespace autofill
@protocol CardListDelegate;
@protocol ManualFillContentDelegate;
// Wrapper to show card cells in a ChromeTableViewController.
@interface ManualFillCardItem : TableViewItem
- (instancetype)initWithCreditCard:(const autofill::CreditCard&)card
- (instancetype)initWithCreditCard:(ManualFillCreditCard*)card
contentDelegate:
(id<ManualFillContentDelegate>)contentDelegate
navigationDelegate:(id<CardListDelegate>)navigationDelegate
......@@ -34,7 +31,7 @@ class CreditCard;
@interface ManualFillCardCell : UITableViewCell
// Updates the cell with credit card and the |delegate| to be notified.
- (void)setUpWithCreditCard:(const autofill::CreditCard&)card
- (void)setUpWithCreditCard:(ManualFillCreditCard*)card
contentDelegate:(id<ManualFillContentDelegate>)contentDelegate
navigationDelegate:(id<CardListDelegate>)navigationDelegate;
......
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