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" 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/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 "jni/AutofillDialogControllerAndroid_jni.h" 380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h" 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h" 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h" 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h" 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h" 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h" 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill { 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using wallet::FullWallet; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values). 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name"; 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill"; 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing"; 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping"; 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card"; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_CC_BILLING section. 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildCcBillingInputs(DetailInputs* inputs) { 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const DetailInput kCcBillingInputs[] = { 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, NAME_BILLING_FULL }, 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_STREET_ADDRESS }, 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_CITY }, 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_DEPENDENT_LOCALITY }, 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_STATE }, 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_ZIP }, 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_SORTING_CODE }, 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_BILLING_COUNTRY }, 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, PHONE_BILLING_WHOLE_NUMBER }, 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, CREDIT_CARD_NUMBER }, 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, CREDIT_CARD_EXP_MONTH }, 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, CREDIT_CARD_EXP_4_DIGIT_YEAR }, 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, CREDIT_CARD_VERIFICATION_CODE }, 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) common::BuildInputs(kCcBillingInputs, arraysize(kCcBillingInputs), inputs); 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_SHIPPING section. 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildShippingInputs(DetailInputs* inputs) { 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const DetailInput kShippingInputs[] = { 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, NAME_FULL }, 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_STREET_ADDRESS }, 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_CITY }, 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_DEPENDENT_LOCALITY }, 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_STATE }, 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_ZIP }, 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_SORTING_CODE }, 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, ADDRESS_HOME_COUNTRY }, 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { DetailInput::LONG, PHONE_HOME_WHOLE_NUMBER }, 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) common::BuildInputs(kShippingInputs, arraysize(kShippingInputs), inputs); 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator( 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section, 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DetailInputs& inputs, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FormStructure::InputFieldComparator& compare, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FormStructure& form_structure, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FullWallet* full_wallet, 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((section == SECTION_CC_BILLING && !full_wallet->billing_address()) || 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (section == SECTION_SHIPPING && !full_wallet->shipping_address())) { 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Callback<base::string16(const AutofillType&)> get_info = 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&FullWallet::GetInfo, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(full_wallet), 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<ServerFieldType> types = common::TypesFromInputs(inputs); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) form_structure.FillFields( 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) types, 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compare, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) get_info, 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) section == SECTION_CC_BILLING 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ? full_wallet->billing_address()->language_code() 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : full_wallet->shipping_address()->language_code(), 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection( 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FormStructure& form_structure, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FullWallet* full_wallet, 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(section == SECTION_CC_BILLING || section == SECTION_SHIPPING); 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DetailInputs inputs; 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (section == SECTION_CC_BILLING) 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildCcBillingInputs(&inputs); 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildShippingInputs(&inputs); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSectionWithComparator( 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, inputs, 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(common::ServerTypeMatchesField, section), 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, full_wallet, email_address); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Email is hidden while using Wallet, special case it. 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillField* field = form_structure.field(i); 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == EMAIL_ADDRESS) 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = email_address; 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|. 154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section, 155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ServerFieldType input_type, 156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const AutofillField* field = form_structure.field(i); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (field && common::ServerTypeMatchesField(section, input_type, *field)) 160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|. 166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section, 167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType* input_types, 168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const size_t input_types_size, 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < input_types_size; ++i) { 171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (IsSectionInputUsedInFormStructure( 172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) section, input_types[i], form_structure)) { 173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create( 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const AutofillClient::ResultCallback& callback) { 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // AutofillDialogControllerAndroid owns itself. 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid* autofill_dialog_controller = 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new AutofillDialogControllerAndroid(contents, 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG) 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create( 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const AutofillClient::ResultCallback& callback) { 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerAndroid::Create(contents, 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {} 2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) registry->RegisterDictionaryPref( 2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ::prefs::kAutofillDialogDefaults, 2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(ENABLE_AUTOFILL_DIALOG) 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() { 22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (java_object_.is_null()) 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj()); 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() { 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_shown_timestamp_ = base::Time::Now(); 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The Autofill dialog is shown in response to a message from the renderer and 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // as such, it can only be made in the context of the current document. A call 2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // to GetActiveEntry would return a pending entry, if there was one, which 2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // would be a security bug. Therefore, we use the last committed URL for the 2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // access checks. 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& current_url = contents_->GetLastCommittedURL(); 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invoked_from_same_origin_ = 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_url.GetOrigin() == source_url_.GetOrigin(); 243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Fail if the dialog factory (e.g. SDK) doesn't support cross-origin calls. 2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!Java_AutofillDialogControllerAndroid_isDialogAllowed( 2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu env, 2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu invoked_from_same_origin_)) { 2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback_.Run( 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient::AutocompleteResultErrorDisabled, 2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ASCIIToUTF16("Cross-origin form invocations are not supported."), 2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL); 2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete this; 2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Determine what field types should be included in the dialog. 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_types = false; 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_sections = false; 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) form_structure_.ParseFieldTypesFromAutocompleteAttributes( 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &has_types, &has_sections); 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Fail if the author didn't specify autocomplete types, or 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // if the dialog shouldn't be shown in a given circumstances. 2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!has_types) { 265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch callback_.Run( 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient::AutocompleteResultErrorDisabled, 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::ASCIIToUTF16("Form is missing autocomplete attributes."), 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NULL); 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) delete this; 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Fail if the author didn't ask for at least some kind of credit card 2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // information. 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool has_credit_card_field = false; 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < form_structure_.field_count(); ++i) { 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AutofillType type = form_structure_.field(i)->Type(); 2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (type.html_type() != HTML_TYPE_UNKNOWN && type.group() == CREDIT_CARD) { 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu has_credit_card_field = true; 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!has_credit_card_field) { 2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback_.Run( 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient::AutocompleteResultErrorDisabled, 2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ASCIIToUTF16("Form is not a payment form (must contain " 2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "some autocomplete=\"cc-*\" fields). "), 2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NULL); 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete this; 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Log any relevant UI metrics and security exceptions. 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!invoked_from_same_origin_) { 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType full_billing_is_necessary_if[] = { 306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE1, 307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE2, 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADDRESS_BILLING_APT_NUM, 309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_CITY, 310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_STATE, 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // ADDRESS_BILLING_ZIP, // Postal code alone is a short form. 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADDRESS_BILLING_COUNTRY, 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADDRESS_BILLING_STREET_ADDRESS, 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADDRESS_BILLING_DEPENDENT_LOCALITY, 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADDRESS_BILLING_SORTING_CODE, 316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER 317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ServerFieldType billing_phone_number_is_necessary_if[] = { 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ServerFieldType shipping_phone_number_is_necessary_if[] = { 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PHONE_HOME_WHOLE_NUMBER 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_full_billing_address = 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputsUsedInFormStructure( 326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_billing_is_necessary_if, 328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) arraysize(full_billing_is_necessary_if), 329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_phone_numbers = 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsSectionInputsUsedInFormStructure( 332424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) billing_phone_number_is_necessary_if, 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) arraysize(billing_phone_number_is_necessary_if), 335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_) || 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsSectionInputsUsedInFormStructure( 337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_SHIPPING, 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shipping_phone_number_is_necessary_if, 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) arraysize(shipping_phone_number_is_necessary_if), 340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool request_shipping_address = false; 343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { 344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DetailInputs inputs; 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BuildShippingInputs(&inputs); 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request_shipping_address = form_structure_.FillFields( 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::TypesFromInputs(inputs), 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING), 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(NullGetInfo), 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string(), 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool last_used_choice_is_autofill = false; 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 last_used_account_name; 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_billing; 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_shipping; 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_credit_card; 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue* defaults = 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults); 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedAccountName, &last_used_account_name); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetBoolean(kLastUsedChoiceIsAutofill, 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &last_used_choice_is_autofill); 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing); 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping); 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card); 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(ERROR) << "Failed to read AutofillDialog preferences"; 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool incognito_mode = profile_->IsOffTheRecord(); 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (incognito_mode) 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill = true; 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_account_name = 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF16ToJavaString( 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_account_name); 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_billing = 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_billing); 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_shipping = 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_shipping); 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_card = 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_credit_card); 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jmerchant_domain = 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, source_url_.GetOrigin().spec()); 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::set<base::string16> available_shipping_countries = 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) form_structure_.PossibleValues(ADDRESS_HOME_COUNTRY); 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ScopedJavaLocalRef<jobjectArray> jshipping_countries = 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::android::ToJavaArrayOfStrings( 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) env, 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<base::string16>(available_shipping_countries.begin(), 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_shipping_countries.end())); 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::set<base::string16> available_credit_card_types = 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_structure_.PossibleValues(CREDIT_CARD_TYPE); 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScopedJavaLocalRef<jobjectArray> jcredit_card_types = 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::android::ToJavaArrayOfStrings( 404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) env, 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<base::string16>(available_credit_card_types.begin(), 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_credit_card_types.end())); 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch java_object_.Reset(Java_AutofillDialogControllerAndroid_create( 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, 410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<intptr_t>(this), 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WindowAndroidHelper::FromWebContents(contents_)-> 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetWindowAndroid()->GetJavaObject().obj(), 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address, request_shipping_address, 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_phone_numbers, incognito_mode, 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill, jlast_used_account_name.obj(), 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_billing.obj(), jlast_used_shipping.obj(), 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_card.obj(), 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) jmerchant_domain.obj(), 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) jshipping_countries.obj(), 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) jcredit_card_types.obj())); 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() { 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {} 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid:: 431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterAutofillDialogControllerAndroid(JNIEnv* env) { 432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return RegisterNativesImpl(env); 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env, 436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj) { 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LogOnCancelMetrics(); 438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback_.Run(AutofillClient::AutocompleteResultErrorCancel, 439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::string16(), 440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NULL); 441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue( 444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env, 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj, 446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject wallet, 447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jboolean jlast_used_choice_is_autofill, 448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_account_name, 449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_billing, 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_shipping, 451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_card) { 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 email = 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AutofillDialogResult::GetWalletEmail(env, wallet); 454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string google_transaction_id = 455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet); 456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 last_used_account_name = 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name); 459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_billing = 460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_billing); 461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_shipping = 462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping); 463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_card = 464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_card); 465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FullWallet> full_wallet = 467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::ConvertFromJava(env, wallet); 468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_CC_BILLING, form_structure_, full_wallet.get(), email); 470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_SHIPPING, form_structure_, full_wallet.get(), email); 472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DictionaryPrefUpdate updater(profile_->GetPrefs(), 475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults); 476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::DictionaryValue* defaults = updater.Get(); 477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill; 479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedAccountName, last_used_account_name); 480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetBoolean(kLastUsedChoiceIsAutofill, 481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill); 482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_billing.empty()) 483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing); 484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_shipping.empty()) 485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping); 486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_card.empty()) 487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedCreditCardGuid, last_used_card); 488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DLOG(ERROR) << "Failed to save AutofillDialog preferences"; 490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnFinishSubmitMetrics(); 494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback should be called as late as possible. 496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback_.Run(AutofillClient::AutocompleteResultSuccess, 497a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::string16(), 498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &form_structure_); 499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This might delete us. 50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid( 505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const AutofillClient::ResultCallback& callback) 509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch contents_(contents), 511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_(true), 514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url_(source_url), 515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_(callback), 516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cares_about_shipping_(true), 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci was_ui_latency_logged_(false), 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_(this) { 519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!callback_.is_null()); 520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() { 523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_ACCEPTED); 526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() { 531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_CANCELED); 534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 539