diff options
Diffstat (limited to 'chromium/components/autofill/core/browser/local_card_migration_manager.cc')
-rw-r--r-- | chromium/components/autofill/core/browser/local_card_migration_manager.cc | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/chromium/components/autofill/core/browser/local_card_migration_manager.cc b/chromium/components/autofill/core/browser/local_card_migration_manager.cc new file mode 100644 index 00000000000..0040b5748c9 --- /dev/null +++ b/chromium/components/autofill/core/browser/local_card_migration_manager.cc @@ -0,0 +1,170 @@ +// Copyright 2018 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/local_card_migration_manager.h" + +#include <stddef.h> + +#include <algorithm> +#include <vector> + +#include "base/bind.h" +#include "components/autofill/core/browser/autofill_client.h" +#include "components/autofill/core/browser/autofill_experiments.h" +#include "components/autofill/core/browser/autofill_metrics.h" +#include "components/autofill/core/browser/credit_card.h" +#include "components/autofill/core/browser/form_data_importer.h" +#include "components/autofill/core/browser/payments/payments_client.h" +#include "components/autofill/core/browser/personal_data_manager.h" +#include "services/identity/public/cpp/identity_manager.h" + +namespace autofill { + +LocalCardMigrationManager::LocalCardMigrationManager( + AutofillClient* client, + payments::PaymentsClient* payments_client, + const std::string& app_locale, + PersonalDataManager* personal_data_manager) + : client_(client), + payments_client_(payments_client), + app_locale_(app_locale), + personal_data_manager_(personal_data_manager) { + if (payments_client_) + payments_client_->SetSaveDelegate(this); +} + +LocalCardMigrationManager::~LocalCardMigrationManager() {} + +bool LocalCardMigrationManager::ShouldOfferLocalCardMigration( + int imported_credit_card_record_type) { + // Must be an existing card. New cards always get Upstream or local save. + if (imported_credit_card_record_type != + FormDataImporter::ImportedCreditCardRecordType::LOCAL_CARD && + imported_credit_card_record_type != + FormDataImporter::ImportedCreditCardRecordType::SERVER_CARD) { + return false; + } + + if (!IsCreditCardMigrationEnabled()) + return false; + + std::vector<CreditCard*> local_credit_cards = + personal_data_manager_->GetLocalCreditCards(); + + // Empty previous state. + migratable_credit_cards_.clear(); + + // Initialize the local credit card list and queue for showing and uploading. + for (CreditCard* card : local_credit_cards) { + // If the card is valid (has a valid card number, expiration date, and is + // not expired) and is not a server card, add it to the list of migratable + // cards. + if (card->IsValid() && !IsServerCard(card)) + migratable_credit_cards_.push_back(*card); + } + + // If the form was submitted with a local card, only offer migration instead + // of Upstream if there are other local cards to migrate as well. If the form + // was submitted with a server card, offer migration if ANY local cards can be + // migrated. + return (imported_credit_card_record_type == + FormDataImporter::ImportedCreditCardRecordType::LOCAL_CARD && + migratable_credit_cards_.size() > 1) || + (imported_credit_card_record_type == + FormDataImporter::ImportedCreditCardRecordType::SERVER_CARD && + !migratable_credit_cards_.empty()); +} + +void LocalCardMigrationManager::AttemptToOfferLocalCardMigration() { + // Abort the migration if |payments_client_| is nullptr. + if (!payments_client_) + return; + payments_client_->SetSaveDelegate(this); + upload_request_ = payments::PaymentsClient::UploadRequestDetails(); + + // Payments server determines which version of the legal message to show based + // on the existence of this experiment flag. + if (IsAutofillUpstreamUpdatePromptExplanationExperimentEnabled()) { + upload_request_.active_experiments.push_back( + kAutofillUpstreamUpdatePromptExplanation.name); + } + + // Don't send pan_first_six, as potentially migrating multiple local cards at + // once will negate its usefulness. + payments_client_->GetUploadDetails( + upload_request_.profiles, GetDetectedValues(), + /*pan_first_six=*/std::string(), upload_request_.active_experiments, + app_locale_); +} + +bool LocalCardMigrationManager::IsCreditCardMigrationEnabled() { + // Confirm that the user is signed in, syncing, and the proper experiment + // flags are enabled. + bool migration_experiment_enabled = + IsAutofillCreditCardLocalCardMigrationExperimentEnabled(); + bool credit_card_upload_enabled = ::autofill::IsCreditCardUploadEnabled( + client_->GetPrefs(), client_->GetSyncService(), + client_->GetIdentityManager()->GetPrimaryAccountInfo().email); + bool has_google_payments_account = + (static_cast<int64_t>(payments_client_->GetPrefService()->GetDouble( + prefs::kAutofillBillingCustomerNumber)) != 0); + return migration_experiment_enabled && credit_card_upload_enabled && + has_google_payments_account; +} + +void LocalCardMigrationManager::OnDidGetUploadDetails( + AutofillClient::PaymentsRpcResult result, + const base::string16& context_token, + std::unique_ptr<base::DictionaryValue> legal_message) { + if (result == AutofillClient::SUCCESS) { + upload_request_.context_token = context_token; + legal_message_ = std::move(legal_message); + // If we successfully received the legal docs, trigger the offer-to-migrate + // dialog. + // TODO(crbug.com/852904): Show intermediate migration prompt here! Relies + // on CL/1117929 first. + } +} + +// TODO(crbug.com/852904): Starts the upload of the next local card if one +// exists. +void LocalCardMigrationManager::OnDidUploadCard( + AutofillClient::PaymentsRpcResult result, + const std::string& server_id) {} + +int LocalCardMigrationManager::GetDetectedValues() const { + int detected_values = 0; + + // If all cards to be migrated have a cardholder name, include it in the + // detected values. + bool all_cards_have_cardholder_name = true; + for (CreditCard card : migratable_credit_cards_) { + all_cards_have_cardholder_name &= + !card.GetInfo(AutofillType(CREDIT_CARD_NAME_FULL), app_locale_).empty(); + } + if (all_cards_have_cardholder_name) + detected_values |= CreditCardSaveManager::DetectedValue::CARDHOLDER_NAME; + + // Local card migration should ONLY be offered when the user already has a + // Google Payments account. + DCHECK(static_cast<int64_t>(payments_client_->GetPrefService()->GetDouble( + prefs::kAutofillBillingCustomerNumber)) != 0); + detected_values |= + CreditCardSaveManager::DetectedValue::HAS_GOOGLE_PAYMENTS_ACCOUNT; + + return detected_values; +} + +bool LocalCardMigrationManager::IsServerCard(CreditCard* local_card) const { + std::vector<CreditCard*> server_credit_cards = + personal_data_manager_->GetServerCreditCards(); + // Check whether the current card is already uploaded. + for (const CreditCard* server_card : server_credit_cards) { + if (local_card->HasSameNumberAs(*server_card)) + return true; + } + return false; +} + +} // namespace autofill |