autofill_dialog_controller_android.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Email is hidden while using Wallet, special case it. 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (section == SECTION_EMAIL) { 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillProfile profile; 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile.SetRawInfo(EMAIL_ADDRESS, email_address); 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillProfileWrapper profile_wrapper(&profile, 0); 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_wrapper.FillFormStructure(inputs, compare, &form_structure); 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section, full_wallet); 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (wrapper) 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch wrapper->FillFormStructure(inputs, compare, &form_structure); 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection( 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DialogSection section, 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FormStructure& form_structure, 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch wallet::FullWallet* full_wallet, 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::string16& email_address) { 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DetailInputs inputs; 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(section, &inputs); 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSectionWithComparator( 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, inputs, 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(common::DetailInputMatchesField, section), 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, full_wallet, email_address); 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|. 114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section, 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ServerFieldType input_type, 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const DetailInput input = { 0, input_type }; 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < form_structure.field_count(); ++i) { 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const AutofillField* field = form_structure.field(i); 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (field && common::DetailInputMatchesField(section, input, *field)) 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|. 127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section, 128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType* input_types, 129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const size_t input_types_size, 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FormStructure& form_structure) { 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) for (size_t i = 0; i < input_types_size; ++i) { 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (IsSectionInputUsedInFormStructure( 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) section, input_types[i], form_structure)) { 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return false; 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create( 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DialogType dialog_type, 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) { 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // AutofillDialogControllerAndroid owns itself. 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid* autofill_dialog_controller = 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new AutofillDialogControllerAndroid(contents, 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type, 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::RegisterProfilePrefs( 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch registry->RegisterDictionaryPref( 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults, 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create( 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DialogType dialog_type, 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) { 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerAndroid::Create(contents, 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type, 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid::RegisterProfilePrefs(registry); 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() { 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj()); 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() { 197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_shown_timestamp_ = base::Time::Now(); 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::NavigationEntry* entry = contents_->GetController().GetActiveEntry(); 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& active_url = entry ? entry->GetURL() : contents_->GetURL(); 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin(); 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Log any relevant UI metrics and security exceptions. 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_SHOWN); 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP); 214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!invoked_from_same_origin_) { 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Determine what field types should be included in the dialog. 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_types = false; 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_sections = false; 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_.ParseFieldTypesFromAutocompleteAttributes( 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &has_types, &has_sections); 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Fail if the author didn't specify autocomplete types. 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!has_types) { 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch delete this; 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ServerFieldType full_billing_is_necessary_if[] = { 236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE1, 237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_LINE2, 238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_CITY, 239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ADDRESS_BILLING_STATE, 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER 241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_full_billing_address = 243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputsUsedInFormStructure( 244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_billing_is_necessary_if, 246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) arraysize(full_billing_is_necessary_if), 247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const bool request_phone_numbers = 249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_BILLING, 251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_BILLING_WHOLE_NUMBER, 252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_) || 253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) IsSectionInputUsedInFormStructure( 254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECTION_SHIPPING, 255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) PHONE_HOME_WHOLE_NUMBER, 256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_structure_); 257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool request_shipping_address = false; 259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { 260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DetailInputs inputs; 261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) common::BuildInputsForSection(SECTION_SHIPPING, &inputs); 262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EmptyDataModelWrapper empty_wrapper; 263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_shipping_address = empty_wrapper.FillFormStructure( 264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) inputs, 265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING), 266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &form_structure_); 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool incognito_mode = profile_->IsOffTheRecord(); 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool last_used_choice_is_autofill = false; 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 last_used_account_name; 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_billing; 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_shipping; 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_credit_card; 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue* defaults = 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults); 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedAccountName, &last_used_account_name); 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetBoolean(kLastUsedChoiceIsAutofill, 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &last_used_choice_is_autofill); 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing); 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping); 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card); 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(ERROR) << "Failed to read AutofillDialog preferences"; 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (contents_->GetBrowserContext()->IsOffTheRecord()) 292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill = true; 293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_account_name = 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF16ToJavaString( 297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_account_name); 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_billing = 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_billing); 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_shipping = 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_shipping); 304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_card = 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_credit_card); 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jmerchant_domain = 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, source_url_.GetOrigin().spec()); 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch java_object_.Reset(Java_AutofillDialogControllerAndroid_create( 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, 312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch reinterpret_cast<jint>(this), 313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WindowAndroidHelper::FromWebContents(contents_)-> 314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetWindowAndroid()->GetJavaObject().obj(), 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address, request_shipping_address, 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_phone_numbers, incognito_mode, 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill, jlast_used_account_name.obj(), 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_billing.obj(), jlast_used_shipping.obj(), 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_card.obj(), 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jmerchant_domain.obj())); 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() { 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {} 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::AddAutocheckoutStep( 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepType step_type) { 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED() << " step_type = " << step_type; 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::UpdateAutocheckoutStep( 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepType step_type, 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepStatus step_status) { 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED() << " step_type=" << step_type 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch << " step_status=" << step_status; 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::OnAutocheckoutError() { 345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(AUTOCHECKOUT_IN_PROGRESS, autocheckout_state_); 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_FAILED); 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_ERROR); 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time(); 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::OnAutocheckoutSuccess() { 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(AUTOCHECKOUT_IN_PROGRESS, autocheckout_state_); 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_SUCCEEDED); 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_SUCCESS); 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time(); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochDialogType AutofillDialogControllerAndroid::GetDialogType() const { 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return dialog_type_; 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid:: 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterAutofillDialogControllerAndroid(JNIEnv* env) { 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return RegisterNativesImpl(env); 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env, 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj) { 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == AUTOCHECKOUT_NOT_STARTED) 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnCancelMetrics(); 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == AUTOCHECKOUT_IN_PROGRESS) { 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_CANCELLED); 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue( 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env, 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj, 393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject wallet, 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jboolean jlast_used_choice_is_autofill, 395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_account_name, 396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_billing, 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_shipping, 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_card) { 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 email = AutofillDialogResult::GetWalletEmail(env, wallet); 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string google_transaction_id = 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet); 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 last_used_account_name = 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name); 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_billing = 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_billing); 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_shipping = 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping); 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_card = 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_card); 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<wallet::FullWallet> full_wallet = 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::ConvertFromJava(env, wallet); 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_EMAIL, form_structure_, full_wallet.get(), email); 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_CC_BILLING, form_structure_, full_wallet.get(), email); 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_SHIPPING, form_structure_, full_wallet.get(), email); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DictionaryPrefUpdate updater(profile_->GetPrefs(), 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults); 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::DictionaryValue* defaults = updater.Get(); 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill; 427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedAccountName, last_used_account_name); 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetBoolean(kLastUsedChoiceIsAutofill, 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill); 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_billing.empty()) 431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing); 432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_shipping.empty()) 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping); 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_card.empty()) 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedCreditCardGuid, last_used_card); 436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(ERROR) << "Failed to save AutofillDialog preferences"; 438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (GetDialogType() == DIALOG_TYPE_AUTOCHECKOUT) { 442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time::Now(); 443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_IN_PROGRESS); 444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnFinishSubmitMetrics(); 447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback should be called as late as possible. 449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(&form_structure_, google_transaction_id); 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This might delete us. 452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (GetDialogType() == DIALOG_TYPE_REQUEST_AUTOCOMPLETE) 453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Hide(); 454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid( 457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DialogType dialog_type, 461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) 463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch contents_(contents), 465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type_(dialog_type), 467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_(form_structure, std::string()), 468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_(true), 469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url_(source_url), 470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_(callback), 471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cares_about_shipping_(true), 472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch weak_ptr_factory_(this), 473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_state_(AUTOCHECKOUT_NOT_STARTED), 474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch was_ui_latency_logged_(false) { 475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!callback_.is_null()); 476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::RequestingCreditCardInfo() const { 479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_GT(form_structure_.field_count(), 0U); 480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < form_structure_.field_count(); ++i) { 482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillType type = form_structure_.field(i)->Type(); 483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(type.GetStorableType())) 484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return true; 485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return false; 488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::TransmissionWillBeSecure() const { 491424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return source_url_.SchemeIs(content::kHttpsScheme); 492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::SetAutocheckoutState( 495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutState autocheckout_state) { 496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == autocheckout_state) 497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_state_ = autocheckout_state; 500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() { 503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_ACCEPTED); 507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_ACCEPTED); 510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() { 513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_CANCELED); 517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_CANCELED); 520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 523