blob: 66d8074ec91eb42b8e41cb86ea65c9afe56d7a30 [file] [log] [blame]
// Copyright 2016 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.
#include "components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.h"
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/browser/legal_message_line.h"
#include "components/autofill/core/common/autofill_constants.h"
#include "components/autofill/core/common/autofill_features.h"
#include "components/autofill/core/common/autofill_pref_names.h"
#include "components/grit/components_scaled_resources.h"
#include "components/infobars/core/infobar.h"
#include "components/infobars/core/infobar_manager.h"
#include "components/prefs/pref_service.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/window_open_disposition.h"
#include "url/gurl.h"
namespace autofill {
AutofillSaveCardInfoBarDelegateMobile::AutofillSaveCardInfoBarDelegateMobile(
bool upload,
const CreditCard& card,
std::unique_ptr<base::DictionaryValue> legal_message,
const base::Closure& save_card_callback,
PrefService* pref_service)
: ConfirmInfoBarDelegate(),
upload_(upload),
save_card_callback_(save_card_callback),
pref_service_(pref_service),
had_user_interaction_(false),
#if defined(OS_IOS)
// TODO(jdonnelly): Use credit card issuer images on iOS.
// http://crbug.com/535784
issuer_icon_id_(kNoIconID),
#else
issuer_icon_id_(CreditCard::IconResourceId(card.network())),
#endif
card_label_(base::string16(kMidlineEllipsis) + card.LastFourDigits()),
card_sub_label_(card.AbbreviatedExpirationDateForDisplay()) {
if (legal_message) {
if (!LegalMessageLine::Parse(*legal_message, &legal_messages_,
/*escape_apostrophes=*/true)) {
AutofillMetrics::LogCreditCardInfoBarMetric(
AutofillMetrics::INFOBAR_NOT_SHOWN_INVALID_LEGAL_MESSAGE, upload_,
pref_service_->GetInteger(
prefs::kAutofillAcceptSaveCreditCardPromptState));
return;
}
}
if (IsGooglePayBrandingEnabled()) {
card_label_ = card.NetworkForDisplay() + base::string16(kMidlineEllipsis) +
card.LastFourDigits();
}
AutofillMetrics::LogCreditCardInfoBarMetric(
AutofillMetrics::INFOBAR_SHOWN, upload_,
pref_service_->GetInteger(
prefs::kAutofillAcceptSaveCreditCardPromptState));
}
AutofillSaveCardInfoBarDelegateMobile::
~AutofillSaveCardInfoBarDelegateMobile() {
if (!had_user_interaction_)
LogUserAction(AutofillMetrics::INFOBAR_IGNORED);
}
void AutofillSaveCardInfoBarDelegateMobile::OnLegalMessageLinkClicked(
GURL url) {
infobar()->owner()->OpenURL(url, WindowOpenDisposition::NEW_FOREGROUND_TAB);
}
bool AutofillSaveCardInfoBarDelegateMobile::LegalMessagesParsedSuccessfully() {
// If we are uploading to the server, verify that legal lines have been parsed
// into |legal_messages_|.
return !upload_ || !legal_messages_.empty();
}
bool AutofillSaveCardInfoBarDelegateMobile::IsGooglePayBrandingEnabled() const {
return upload_ &&
base::FeatureList::IsEnabled(
features::kAutofillUpstreamUseGooglePayBrandingOnMobile);
}
base::string16 AutofillSaveCardInfoBarDelegateMobile::GetTitleText() const {
return l10n_util::GetStringUTF16(
IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V3);
}
base::string16 AutofillSaveCardInfoBarDelegateMobile::GetDescriptionText()
const {
return l10n_util::GetStringUTF16(
IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V2);
}
int AutofillSaveCardInfoBarDelegateMobile::GetIconId() const {
return IsGooglePayBrandingEnabled() ? 0 : IDR_INFOBAR_AUTOFILL_CC;
}
base::string16 AutofillSaveCardInfoBarDelegateMobile::GetMessageText() const {
if (IsGooglePayBrandingEnabled()) {
return base::string16();
}
return l10n_util::GetStringUTF16(
upload_ ? IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD
: IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL);
}
base::string16 AutofillSaveCardInfoBarDelegateMobile::GetLinkText() const {
return IsGooglePayBrandingEnabled()
? base::string16()
: l10n_util::GetStringUTF16(IDS_LEARN_MORE);
}
infobars::InfoBarDelegate::InfoBarIdentifier
AutofillSaveCardInfoBarDelegateMobile::GetIdentifier() const {
return AUTOFILL_CC_INFOBAR_DELEGATE_MOBILE;
}
bool AutofillSaveCardInfoBarDelegateMobile::ShouldExpire(
const NavigationDetails& details) const {
// The user has submitted a form, causing the page to navigate elsewhere. We
// don't want the infobar to be expired at this point, because the user won't
// get a chance to answer the question.
return false;
}
void AutofillSaveCardInfoBarDelegateMobile::InfoBarDismissed() {
LogUserAction(AutofillMetrics::INFOBAR_DENIED);
}
base::string16 AutofillSaveCardInfoBarDelegateMobile::GetButtonLabel(
InfoBarButton button) const {
return l10n_util::GetStringUTF16(button == BUTTON_OK
? IDS_AUTOFILL_SAVE_CARD_PROMPT_ACCEPT
: IDS_NO_THANKS);
}
bool AutofillSaveCardInfoBarDelegateMobile::Accept() {
save_card_callback_.Run();
save_card_callback_.Reset();
LogUserAction(AutofillMetrics::INFOBAR_ACCEPTED);
return true;
}
bool AutofillSaveCardInfoBarDelegateMobile::Cancel() {
LogUserAction(AutofillMetrics::INFOBAR_DENIED);
return true;
}
GURL AutofillSaveCardInfoBarDelegateMobile::GetLinkURL() const {
return IsGooglePayBrandingEnabled() ? GURL() : GURL(kHelpURL);
}
void AutofillSaveCardInfoBarDelegateMobile::LogUserAction(
AutofillMetrics::InfoBarMetric user_action) {
DCHECK(!had_user_interaction_);
AutofillMetrics::LogCreditCardInfoBarMetric(
user_action, upload_,
pref_service_->GetInteger(
prefs::kAutofillAcceptSaveCreditCardPromptState));
pref_service_->SetInteger(
prefs::kAutofillAcceptSaveCreditCardPromptState,
user_action == AutofillMetrics::INFOBAR_ACCEPTED
? prefs::PREVIOUS_SAVE_CREDIT_CARD_PROMPT_USER_DECISION_ACCEPTED
: prefs::PREVIOUS_SAVE_CREDIT_CARD_PROMPT_USER_DECISION_DENIED);
had_user_interaction_ = true;
}
} // namespace autofill