autofill_dialog_controller_android.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
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 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create( 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DialogType dialog_type, 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) { 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // AutofillDialogControllerAndroid owns itself. 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid* autofill_dialog_controller = 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new AutofillDialogControllerAndroid(contents, 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type, 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::RegisterProfilePrefs( 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch registry->RegisterDictionaryPref( 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults, 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::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 return AutofillDialogControllerAndroid::Create(contents, 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type, 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerAndroid::RegisterProfilePrefs(registry); 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() { 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj()); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() { 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_shown_timestamp_ = base::Time::Now(); 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::NavigationEntry* entry = contents_->GetController().GetActiveEntry(); 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& active_url = entry ? entry->GetURL() : contents_->GetURL(); 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin(); 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Log any relevant UI metrics and security exceptions. 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_SHOWN); 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP); 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!invoked_from_same_origin_) { 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogSecurityMetric( 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Determine what field types should be included in the dialog. 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_types = false; 197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool has_sections = false; 198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_.ParseFieldTypesFromAutocompleteAttributes( 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &has_types, &has_sections); 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Fail if the author didn't specify autocomplete types. 202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!has_types) { 203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch delete this; 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool request_full_billing_address = true; 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool request_shipping_address = false; 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool request_phone_numbers = false; 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < form_structure_.field_count(); ++i) { 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ServerFieldType type = 214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_.field(i)->Type().GetStorableType(); 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER) { 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_phone_numbers = true; 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (type == NAME_FULL || 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == ADDRESS_HOME_LINE1 || type == ADDRESS_HOME_LINE2 || 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == ADDRESS_HOME_CITY || type == ADDRESS_HOME_STATE || 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == ADDRESS_HOME_ZIP || type == ADDRESS_HOME_COUNTRY || 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == PHONE_HOME_WHOLE_NUMBER) { 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_shipping_address = true; 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (type == ADDRESS_BILLING_LINE1 || type == ADDRESS_BILLING_LINE2 || 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == ADDRESS_BILLING_CITY || type == ADDRESS_BILLING_STATE || 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type == PHONE_BILLING_WHOLE_NUMBER) { 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address = true; 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (request_shipping_address) 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address = true; 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool incognito_mode = profile_->IsOffTheRecord(); 236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool last_used_choice_is_autofill = false; 238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::string16 last_used_account_name; 239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_billing; 240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_shipping; 241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string last_used_credit_card; 242ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue* defaults = 244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults); 245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedAccountName, &last_used_account_name); 247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetBoolean(kLastUsedChoiceIsAutofill, 248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &last_used_choice_is_autofill); 249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing); 250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping); 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card); 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(ERROR) << "Failed to read AutofillDialog preferences"; 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (contents_->GetBrowserContext()->IsOffTheRecord()) 258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill = true; 259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env = base::android::AttachCurrentThread(); 261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_account_name = 262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF16ToJavaString( 263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_account_name); 264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_billing = 265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_billing); 267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_shipping = 268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_shipping); 270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jlast_used_card = 271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, last_used_credit_card); 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ScopedJavaLocalRef<jstring> jmerchant_domain = 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertUTF8ToJavaString( 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, source_url_.GetOrigin().spec()); 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch java_object_.Reset(Java_AutofillDialogControllerAndroid_create( 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch env, 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch reinterpret_cast<jint>(this), 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WindowAndroidHelper::FromWebContents(contents_)-> 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetWindowAndroid()->GetJavaObject().obj(), 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_full_billing_address, request_shipping_address, 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch request_phone_numbers, incognito_mode, 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill, jlast_used_account_name.obj(), 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_billing.obj(), jlast_used_shipping.obj(), 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jlast_used_card.obj(), 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jmerchant_domain.obj())); 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() { 290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {} 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::AddAutocheckoutStep( 297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepType step_type) { 298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED() << " step_type = " << step_type; 300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::UpdateAutocheckoutStep( 303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepType step_type, 304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutStepStatus step_status) { 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED() << " step_type=" << step_type 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch << " step_status=" << step_status; 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::OnAutocheckoutError() { 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(AUTOCHECKOUT_IN_PROGRESS, autocheckout_state_); 314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_FAILED); 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_ERROR); 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time(); 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::OnAutocheckoutSuccess() { 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(aruslan): http://crbug.com/177373 Autocheckout. 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTIMPLEMENTED(); 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(AUTOCHECKOUT_IN_PROGRESS, autocheckout_state_); 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_SUCCEEDED); 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_SUCCESS); 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time(); 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochDialogType AutofillDialogControllerAndroid::GetDialogType() const { 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return dialog_type_; 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid:: 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RegisterAutofillDialogControllerAndroid(JNIEnv* env) { 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return RegisterNativesImpl(env); 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env, 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj) { 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == AUTOCHECKOUT_NOT_STARTED) 345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnCancelMetrics(); 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == AUTOCHECKOUT_IN_PROGRESS) { 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogAutocheckoutDuration( 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - autocheckout_started_timestamp_, 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::AUTOCHECKOUT_CANCELLED); 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(NULL, std::string()); 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue( 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JNIEnv* env, 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject obj, 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jobject wallet, 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jboolean jlast_used_choice_is_autofill, 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_account_name, 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_billing, 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_shipping, 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch jstring jlast_used_card) { 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 email = AutofillDialogResult::GetWalletEmail(env, wallet); 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string google_transaction_id = 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet); 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const string16 last_used_account_name = 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name); 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_billing = 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_billing); 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_shipping = 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping); 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string last_used_card = 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::android::ConvertJavaStringToUTF8(env, jlast_used_card); 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<wallet::FullWallet> full_wallet = 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogResult::ConvertFromJava(env, wallet); 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_EMAIL, form_structure_, full_wallet.get(), email); 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_CC_BILLING, form_structure_, full_wallet.get(), email); 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillOutputForSection( 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SECTION_SHIPPING, form_structure_, full_wallet.get(), email); 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DictionaryPrefUpdate updater(profile_->GetPrefs(), 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ::prefs::kAutofillDialogDefaults); 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::DictionaryValue* defaults = updater.Get(); 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (defaults) { 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill; 393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedAccountName, last_used_account_name); 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetBoolean(kLastUsedChoiceIsAutofill, 395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_used_choice_is_autofill); 396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_billing.empty()) 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing); 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_shipping.empty()) 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping); 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!last_used_card.empty()) 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch defaults->SetString(kLastUsedCreditCardGuid, last_used_card); 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LOG(ERROR) << "Failed to save AutofillDialog preferences"; 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (GetDialogType() == DIALOG_TYPE_AUTOCHECKOUT) { 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_started_timestamp_ = base::Time::Now(); 409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SetAutocheckoutState(AUTOCHECKOUT_IN_PROGRESS); 410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogOnFinishSubmitMetrics(); 413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback should be called as late as possible. 415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_.Run(&form_structure_, google_transaction_id); 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This might delete us. 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (GetDialogType() == DIALOG_TYPE_REQUEST_AUTOCOMPLETE) 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Hide(); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid( 423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const DialogType dialog_type, 427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Callback<void(const FormStructure*, 428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string&)>& callback) 429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch contents_(contents), 431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_type_(dialog_type), 433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure_(form_structure, std::string()), 434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch invoked_from_same_origin_(true), 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url_(source_url), 436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback_(callback), 437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch cares_about_shipping_(true), 438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch weak_ptr_factory_(this), 439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_state_(AUTOCHECKOUT_NOT_STARTED), 440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch was_ui_latency_logged_(false) { 441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!callback_.is_null()); 442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::RequestingCreditCardInfo() const { 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_GT(form_structure_.field_count(), 0U); 446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (size_t i = 0; i < form_structure_.field_count(); ++i) { 448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillType type = form_structure_.field(i)->Type(); 449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(type.GetStorableType())) 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return true; 451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return false; 454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::TransmissionWillBeSecure() const { 457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return source_url_.SchemeIs(chrome::kHttpsScheme); 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::SetAutocheckoutState( 461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutocheckoutState autocheckout_state) { 462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (autocheckout_state_ == autocheckout_state) 463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch autocheckout_state_ = autocheckout_state; 466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() { 469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_ACCEPTED); 473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_ACCEPTED); 476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() { 479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiDuration( 480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Time::Now() - dialog_shown_timestamp_, 481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), 482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillMetrics::DIALOG_CANCELED); 483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetMetricLogger().LogDialogUiEvent( 485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetDialogType(), AutofillMetrics::DIALOG_UI_CANCELED); 486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace autofill 489