autofill_dialog_controller_android.cc revision 58537e28ecd584eab876aee8be7156509866d23a
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/android/autofill/autofill_dialog_controller_android.h" 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/android/jni_android.h" 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/android/jni_array.h" 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/android/jni_string.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/android/scoped_java_ref.h" 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/prefs/pref_service.h" 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/autofill/personal_data_manager_factory.h" 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/browser_process.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/scoped_user_pref_update.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/profiles/profile.h" 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/profiles/profile_manager.h" 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/android/autofill/autofill_dialog_result.h" 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/android/window_android_helper.h" 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/autofill_dialog_common.h" 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/data_model_wrapper.h" 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/pref_names.h" 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/url_constants.h" 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/content/browser/wallet/full_wallet.h" 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_metrics.h" 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_profile.h" 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_type.h" 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/credit_card.h" 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/common/form_data.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/user_prefs/pref_registry_syncable.h" 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h" 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_details.h" 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_entry.h" 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents.h" 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "grit/generated_resources.h" 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "jni/AutofillDialogControllerAndroid_jni.h" 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/android/window_android.h" 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/l10n/l10n_util.h" 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h" 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h" 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h" 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h" 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h" 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill { 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values). 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name"; 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill"; 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing"; 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping"; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card"; 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<DataModelWrapper> CreateWrapper( 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, wallet::FullWallet* full_wallet) { 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (section == SECTION_CC_BILLING) { 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!full_wallet->billing_address()) 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return scoped_ptr<DataModelWrapper>(); 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return scoped_ptr<DataModelWrapper>( 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new FullWalletBillingWrapper(full_wallet)); 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (section == SECTION_SHIPPING) { 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!full_wallet->shipping_address()) 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return scoped_ptr<DataModelWrapper>(); 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return scoped_ptr<DataModelWrapper>( 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new FullWalletShippingWrapper(full_wallet)); 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTREACHED(); 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return scoped_ptr<DataModelWrapper>(); 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator( 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, const DetailInputs& inputs, 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const InputFieldComparator& compare, 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FormStructure& form_structure, wallet::FullWallet* full_wallet, 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section, full_wallet); 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (wrapper) 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch wrapper->FillFormStructure(inputs, compare, &form_structure); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection( 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FormStructure& form_structure, 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch wallet::FullWallet* full_wallet, 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DetailInputs inputs; 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(section, &inputs); 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSectionWithComparator( 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, inputs, 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(common::DetailInputMatchesField, section), 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, full_wallet, email_address); 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Email is hidden while using Wallet, special case it. 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillField* field = form_structure.field(i); 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == EMAIL_ADDRESS) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = email_address; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|. 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section, 114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ServerFieldType input_type, 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const DetailInput input = { 0, input_type }; 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const AutofillField* field = form_structure.field(i); 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (field && common::DetailInputMatchesField(section, input, *field)) 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|. 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section, 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType* input_types, 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const size_t input_types_size, 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < input_types_size; ++i) { 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (IsSectionInputUsedInFormStructure( 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) section, input_types[i], form_structure)) { 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create( 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) { 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // AutofillDialogControllerAndroid owns itself. 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid* autofill_dialog_controller = 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new AutofillDialogControllerAndroid(contents, 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::RegisterProfilePrefs( 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch registry->RegisterDictionaryPref( 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults, 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create( 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) { 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerAndroid::Create(contents, 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid::RegisterProfilePrefs(registry); 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() { 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj()); 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() { 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_shown_timestamp_ = base::Time::Now(); 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::NavigationEntry* entry = contents_->GetController().GetActiveEntry(); 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& active_url = entry ? entry->GetURL() : contents_->GetURL(); 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin(); 197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Log any relevant UI metrics and security exceptions. 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP); 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!invoked_from_same_origin_) { 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Determine what field types should be included in the dialog. 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_types = false; 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_sections = false; 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_.ParseFieldTypesFromAutocompleteAttributes( 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &has_types, &has_sections); 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Fail if the author didn't specify autocomplete types. 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!has_types) { 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch delete this; 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType full_billing_is_necessary_if[] = { 228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE1, 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE2, 230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_CITY, 231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_STATE, 232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER 233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_full_billing_address = 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputsUsedInFormStructure( 236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_billing_is_necessary_if, 238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) arraysize(full_billing_is_necessary_if), 239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_phone_numbers = 241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER, 244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_) || 245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_SHIPPING, 247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_HOME_WHOLE_NUMBER, 248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool request_shipping_address = false; 251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { 252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DetailInputs inputs; 253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) common::BuildInputsForSection(SECTION_SHIPPING, &inputs); 254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EmptyDataModelWrapper empty_wrapper; 255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_shipping_address = empty_wrapper.FillFormStructure( 256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) inputs, 257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING), 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &form_structure_); 259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool incognito_mode = profile_->IsOffTheRecord(); 262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool last_used_choice_is_autofill = false; 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 last_used_account_name; 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_billing; 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_shipping; 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_credit_card; 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue* defaults = 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults); 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedAccountName, &last_used_account_name); 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetBoolean(kLastUsedChoiceIsAutofill, 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &last_used_choice_is_autofill); 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing); 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping); 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card); 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(ERROR) << "Failed to read AutofillDialog preferences"; 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (contents_->GetBrowserContext()->IsOffTheRecord()) 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill = true; 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_account_name = 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF16ToJavaString( 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_account_name); 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_billing = 291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_billing); 293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_shipping = 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_shipping); 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_card = 297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_credit_card); 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jmerchant_domain = 300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, source_url_.GetOrigin().spec()); 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch java_object_.Reset(Java_AutofillDialogControllerAndroid_create( 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, 304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch reinterpret_cast<jint>(this), 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WindowAndroidHelper::FromWebContents(contents_)-> 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetWindowAndroid()->GetJavaObject().obj(), 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address, request_shipping_address, 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_phone_numbers, incognito_mode, 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill, jlast_used_account_name.obj(), 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_billing.obj(), jlast_used_shipping.obj(), 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_card.obj(), 312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jmerchant_domain.obj())); 313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() { 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {} 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid:: 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterAutofillDialogControllerAndroid(JNIEnv* env) { 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return RegisterNativesImpl(env); 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env, 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj) { 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LogOnCancelMetrics(); 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue( 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env, 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj, 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject wallet, 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jboolean jlast_used_choice_is_autofill, 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_account_name, 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_billing, 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_shipping, 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_card) { 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 email = AutofillDialogResult::GetWalletEmail(env, wallet); 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string google_transaction_id = 345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet); 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 last_used_account_name = 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name); 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_billing = 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_billing); 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_shipping = 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping); 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_card = 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_card); 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<wallet::FullWallet> full_wallet = 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::ConvertFromJava(env, wallet); 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_CC_BILLING, form_structure_, full_wallet.get(), email); 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_SHIPPING, form_structure_, full_wallet.get(), email); 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DictionaryPrefUpdate updater(profile_->GetPrefs(), 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults); 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::DictionaryValue* defaults = updater.Get(); 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill; 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedAccountName, last_used_account_name); 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetBoolean(kLastUsedChoiceIsAutofill, 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill); 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_billing.empty()) 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing); 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_shipping.empty()) 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping); 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_card.empty()) 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedCreditCardGuid, last_used_card); 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(ERROR) << "Failed to save AutofillDialog preferences"; 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnFinishSubmitMetrics(); 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback should be called as late as possible. 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(&form_structure_, google_transaction_id); 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This might delete us. 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid( 393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch contents_(contents), 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_(true), 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url_(source_url), 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_(callback), 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cares_about_shipping_(true), 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch weak_ptr_factory_(this), 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch was_ui_latency_logged_(false) { 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!callback_.is_null()); 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::RequestingCreditCardInfo() const { 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_GT(form_structure_.field_count(), 0U); 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < form_structure_.field_count(); ++i) { 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillType type = form_structure_.field(i)->Type(); 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(type.GetStorableType())) 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return true; 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return false; 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::TransmissionWillBeSecure() const { 424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return source_url_.SchemeIs(content::kHttpsScheme); 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() { 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_ACCEPTED); 431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() { 436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_CANCELED); 439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 444