autofill_dialog_controller_android.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
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" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/utf_string_conversions.h" 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/autofill/personal_data_manager_factory.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/browser_process.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/common/pref_names.h" 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/url_constants.h" 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/content/browser/wallet/full_wallet.h" 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_metrics.h" 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_profile.h" 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_type.h" 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/credit_card.h" 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/common/form_data.h" 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/user_prefs/pref_registry_syncable.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h" 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_details.h" 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_entry.h" 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents.h" 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "grit/generated_resources.h" 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "jni/AutofillDialogControllerAndroid_jni.h" 390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h" 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/l10n/l10n_util.h" 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h" 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h" 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h" 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h" 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h" 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using wallet::FullWallet; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values). 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name"; 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill"; 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing"; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping"; 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card"; 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator( 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DetailInputs& inputs, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FormStructure::InputFieldComparator& compare, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FormStructure& form_structure, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FullWallet* full_wallet, 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((section == SECTION_CC_BILLING && !full_wallet->billing_address()) || 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (section == SECTION_SHIPPING && !full_wallet->shipping_address())) { 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Callback<base::string16(const AutofillType&)> get_info = 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&FullWallet::GetInfo, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(full_wallet), 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<ServerFieldType> types = common::TypesFromInputs(inputs); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) form_structure.FillFields(types, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compare, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_info, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection( 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FormStructure& form_structure, 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FullWallet* full_wallet, 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DetailInputs inputs; 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch common::BuildInputsForSection(section, "US", &inputs, NULL); 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSectionWithComparator( 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, inputs, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(common::ServerTypeMatchesField, section), 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, full_wallet, email_address); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Email is hidden while using Wallet, special case it. 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillField* field = form_structure.field(i); 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == EMAIL_ADDRESS) 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = email_address; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|. 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section, 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ServerFieldType input_type, 114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const AutofillField* field = form_structure.field(i); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (field && common::ServerTypeMatchesField(section, input_type, *field)) 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|. 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section, 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType* input_types, 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const size_t input_types_size, 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < input_types_size; ++i) { 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (IsSectionInputUsedInFormStructure( 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) section, input_types[i], form_structure)) { 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create( 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const AutofillManagerDelegate::ResultCallback& callback) { 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // AutofillDialogControllerAndroid owns itself. 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid* autofill_dialog_controller = 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new AutofillDialogControllerAndroid(contents, 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG) 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create( 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const AutofillManagerDelegate::ResultCallback& callback) { 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerAndroid::Create(contents, 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {} 1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) registry->RegisterDictionaryPref( 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ::prefs::kAutofillDialogDefaults, 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(ENABLE_AUTOFILL_DIALOG) 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() { 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (java_object_.is_null()) 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj()); 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() { 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_shown_timestamp_ = base::Time::Now(); 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& current_url = contents_->GetLastCommittedURL(); 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invoked_from_same_origin_ = 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_url.GetOrigin() == source_url_.GetOrigin(); 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Determine what field types should be included in the dialog. 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_types = false; 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_sections = false; 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) form_structure_.ParseFieldTypesFromAutocompleteAttributes( 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &has_types, &has_sections); 20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Fail if the author didn't specify autocomplete types, or 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // if the dialog shouldn't be shown in a given circumstances. 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!has_types || 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) !Java_AutofillDialogControllerAndroid_isDialogAllowed( 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) env, 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) invoked_from_same_origin_)) { 209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback_.Run( 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AutofillManagerDelegate::AutocompleteResultErrorUnsupported, 211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::ASCIIToUTF16("Form is missing autocomplete attributes."), 212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NULL); 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) delete this; 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Log any relevant UI metrics and security exceptions. 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!invoked_from_same_origin_) { 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType full_billing_is_necessary_if[] = { 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE1, 230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE2, 231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_CITY, 232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_STATE, 233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_full_billing_address = 236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputsUsedInFormStructure( 237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_billing_is_necessary_if, 239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) arraysize(full_billing_is_necessary_if), 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_phone_numbers = 242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER, 245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_) || 246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_SHIPPING, 248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_HOME_WHOLE_NUMBER, 249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool request_shipping_address = false; 252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { 253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DetailInputs inputs; 254a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch common::BuildInputsForSection(SECTION_SHIPPING, "US", &inputs, NULL); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_shipping_address = form_structure_.FillFields( 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::TypesFromInputs(inputs), 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING), 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(NullGetInfo), 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool incognito_mode = profile_->IsOffTheRecord(); 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool last_used_choice_is_autofill = false; 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 last_used_account_name; 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_billing; 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_shipping; 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_credit_card; 269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue* defaults = 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults); 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedAccountName, &last_used_account_name); 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetBoolean(kLastUsedChoiceIsAutofill, 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &last_used_choice_is_autofill); 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing); 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping); 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card); 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(ERROR) << "Failed to read AutofillDialog preferences"; 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (contents_->GetBrowserContext()->IsOffTheRecord()) 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill = true; 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 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, 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<intptr_t>(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() { 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {} 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid:: 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterAutofillDialogControllerAndroid(JNIEnv* env) { 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return RegisterNativesImpl(env); 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env, 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj) { 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LogOnCancelMetrics(); 330a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback_.Run(AutofillManagerDelegate::AutocompleteResultErrorCancel, 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::string16(), 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NULL); 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue( 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env, 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj, 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject wallet, 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jboolean jlast_used_choice_is_autofill, 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_account_name, 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_billing, 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_shipping, 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_card) { 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 email = 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutofillDialogResult::GetWalletEmail(env, wallet); 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string google_transaction_id = 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet); 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 last_used_account_name = 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name); 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_billing = 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_billing); 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_shipping = 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping); 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_card = 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_card); 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FullWallet> full_wallet = 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::ConvertFromJava(env, wallet); 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_CC_BILLING, form_structure_, full_wallet.get(), email); 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_SHIPPING, form_structure_, full_wallet.get(), email); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DictionaryPrefUpdate updater(profile_->GetPrefs(), 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults); 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::DictionaryValue* defaults = updater.Get(); 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill; 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedAccountName, last_used_account_name); 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetBoolean(kLastUsedChoiceIsAutofill, 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill); 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_billing.empty()) 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing); 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_shipping.empty()) 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping); 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_card.empty()) 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedCreditCardGuid, last_used_card); 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(ERROR) << "Failed to save AutofillDialog preferences"; 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnFinishSubmitMetrics(); 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback should be called as late as possible. 388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback_.Run(AutofillManagerDelegate::AutocompleteResultSuccess, 389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::string16(), 390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &form_structure_); 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This might delete us. 39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid( 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const AutofillManagerDelegate::ResultCallback& callback) 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch contents_(contents), 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_(true), 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url_(source_url), 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_(callback), 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cares_about_shipping_(true), 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch weak_ptr_factory_(this), 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch was_ui_latency_logged_(false) { 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!callback_.is_null()); 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() { 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_ACCEPTED); 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() { 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_CANCELED); 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 431