autofill_dialog_controller_android.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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/browser/ui/autofill/data_model_wrapper.h"
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/pref_names.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/url_constants.h"
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/content/browser/wallet/full_wallet.h"
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_metrics.h"
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_profile.h"
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_type.h"
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/credit_card.h"
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/common/form_data.h"
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/user_prefs/pref_registry_syncable.h"
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h"
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_details.h"
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_entry.h"
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents.h"
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "grit/generated_resources.h"
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "jni/AutofillDialogControllerAndroid_jni.h"
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/android/window_android.h"
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/l10n/l10n_util.h"
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h"
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h"
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h"
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h"
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h"
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill {
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values).
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name";
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill";
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing";
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping";
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card";
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<DataModelWrapper> CreateWrapper(
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section, wallet::FullWallet* full_wallet) {
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (section == SECTION_CC_BILLING) {
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!full_wallet->billing_address())
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return scoped_ptr<DataModelWrapper>();
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return scoped_ptr<DataModelWrapper>(
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        new FullWalletBillingWrapper(full_wallet));
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (section == SECTION_SHIPPING) {
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (!full_wallet->shipping_address())
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return scoped_ptr<DataModelWrapper>();
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return scoped_ptr<DataModelWrapper>(
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        new FullWalletShippingWrapper(full_wallet));
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NOTREACHED();
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return scoped_ptr<DataModelWrapper>();
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator(
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section, const DetailInputs& inputs,
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const InputFieldComparator& compare,
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FormStructure& form_structure, wallet::FullWallet* full_wallet,
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section, full_wallet);
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (wrapper)
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    wrapper->FillFormStructure(inputs, compare, &form_structure);
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection(
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section,
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FormStructure& form_structure,
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    wallet::FullWallet* full_wallet,
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DetailInputs inputs;
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  common::BuildInputsForSection(section, &inputs);
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSectionWithComparator(
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      section, inputs,
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(common::DetailInputMatchesField, section),
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      form_structure, full_wallet, email_address);
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_CC_BILLING) {
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Email is hidden while using Wallet, special case it.
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < form_structure.field_count(); ++i) {
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillField* field = form_structure.field(i);
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (field->Type().GetStorableType() == EMAIL_ADDRESS)
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        field->value = email_address;
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|.
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section,
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       ServerFieldType input_type,
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       const FormStructure& form_structure) {
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const DetailInput input = { 0, input_type };
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < form_structure.field_count(); ++i) {
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AutofillField* field = form_structure.field(i);
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (field && common::DetailInputMatchesField(section, input, *field))
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|.
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section,
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const ServerFieldType* input_types,
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const size_t input_types_size,
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const FormStructure& form_structure) {
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < input_types_size; ++i) {
131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (IsSectionInputUsedInFormStructure(
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        section, input_types[i], form_structure)) {
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create(
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // AutofillDialogControllerAndroid owns itself.
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillDialogControllerAndroid* autofill_dialog_controller =
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new AutofillDialogControllerAndroid(contents,
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          form_structure,
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          source_url,
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          callback);
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::RegisterProfilePrefs(
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  registry->RegisterDictionaryPref(
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ::prefs::kAutofillDialogDefaults,
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG)
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController>
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create(
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerAndroid::Create(contents,
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 form_structure,
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 source_url,
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 callback);
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs(
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillDialogControllerAndroid::RegisterProfilePrefs(registry);
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_AUTOFILL_DIALOG)
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() {
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (java_object_.is_null())
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj());
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() {
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  dialog_shown_timestamp_ = base::Time::Now();
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::NavigationEntry* entry = contents_->GetController().GetActiveEntry();
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const GURL& active_url = entry ? entry->GetURL() : contents_->GetURL();
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin();
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types, or
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // if the dialog shouldn't be shown in a given circumstances.
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_types ||
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !Java_AutofillDialogControllerAndroid_isDialogAllowed(
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          env,
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          RequestingCreditCardInfo(),
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          TransmissionWillBeSecure(),
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          invoked_from_same_origin_)) {
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    callback_.Run(NULL);
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    delete this;
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
21968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Log any relevant UI metrics and security exceptions.
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogSecurityMetric(
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) {
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP);
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!invoked_from_same_origin_) {
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ServerFieldType full_billing_is_necessary_if[] = {
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE1,
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE2,
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_CITY,
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_STATE,
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_full_billing_address =
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputsUsedInFormStructure(
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          full_billing_is_necessary_if,
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          arraysize(full_billing_is_necessary_if),
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_phone_numbers =
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_BILLING_WHOLE_NUMBER,
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_) ||
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_SHIPPING,
257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_HOME_WHOLE_NUMBER,
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool request_shipping_address = false;
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailInputs inputs;
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    common::BuildInputsForSection(SECTION_SHIPPING, &inputs);
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EmptyDataModelWrapper empty_wrapper;
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    request_shipping_address = empty_wrapper.FillFormStructure(
266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        inputs,
267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING),
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        &form_structure_);
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const bool incognito_mode = profile_->IsOffTheRecord();
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool last_used_choice_is_autofill = false;
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 last_used_account_name;
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_billing;
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_shipping;
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_credit_card;
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::DictionaryValue* defaults =
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults);
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedAccountName, &last_used_account_name);
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetBoolean(kLastUsedChoiceIsAutofill,
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           &last_used_choice_is_autofill);
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing);
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping);
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card);
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DLOG(ERROR) << "Failed to read AutofillDialog preferences";
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (contents_->GetBrowserContext()->IsOffTheRecord())
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    last_used_choice_is_autofill = true;
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_account_name =
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF16ToJavaString(
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_account_name);
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_billing =
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_billing);
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_shipping =
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_shipping);
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_card =
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_credit_card);
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jmerchant_domain =
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, source_url_.GetOrigin().spec());
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  java_object_.Reset(Java_AutofillDialogControllerAndroid_create(
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      env,
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      reinterpret_cast<jint>(this),
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      WindowAndroidHelper::FromWebContents(contents_)->
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetWindowAndroid()->GetJavaObject().obj(),
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_full_billing_address, request_shipping_address,
317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_phone_numbers, incognito_mode,
318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      last_used_choice_is_autofill, jlast_used_account_name.obj(),
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_billing.obj(), jlast_used_shipping.obj(),
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_card.obj(),
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jmerchant_domain.obj()));
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() {
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(aruslan): http://crbug.com/177373 Autocheckout.
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NOTIMPLEMENTED();
327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {}
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RegisterAutofillDialogControllerAndroid(JNIEnv* env) {
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return RegisterNativesImpl(env);
335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env,
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                   jobject obj) {
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LogOnCancelMetrics();
340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(NULL);
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue(
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JNIEnv* env,
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject obj,
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject wallet,
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jboolean jlast_used_choice_is_autofill,
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_account_name,
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_billing,
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_shipping,
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_card) {
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string16 email = AutofillDialogResult::GetWalletEmail(env, wallet);
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string google_transaction_id =
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet);
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string16 last_used_account_name =
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name);
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_billing =
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_billing);
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_shipping =
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping);
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_card =
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_card);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<wallet::FullWallet> full_wallet =
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::ConvertFromJava(env, wallet);
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_CC_BILLING, form_structure_, full_wallet.get(), email);
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_SHIPPING, form_structure_, full_wallet.get(), email);
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DictionaryPrefUpdate updater(profile_->GetPrefs(),
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                 ::prefs::kAutofillDialogDefaults);
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::DictionaryValue* defaults = updater.Get();
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill;
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetString(kLastUsedAccountName, last_used_account_name);
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetBoolean(kLastUsedChoiceIsAutofill,
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           last_used_choice_is_autofill);
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_billing.empty())
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing);
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_shipping.empty())
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping);
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_card.empty())
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedCreditCardGuid, last_used_card);
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      LOG(ERROR) << "Failed to save AutofillDialog preferences";
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LogOnFinishSubmitMetrics();
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Callback should be called as late as possible.
395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(&form_structure_);
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This might delete us.
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid(
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback)
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_(contents),
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      invoked_from_same_origin_(true),
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      source_url_(source_url),
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      callback_(callback),
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cares_about_shipping_(true),
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this),
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      was_ui_latency_logged_(false) {
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback_.is_null());
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::RequestingCreditCardInfo() const {
420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK_GT(form_structure_.field_count(), 0U);
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AutofillType type = form_structure_.field(i)->Type();
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (common::IsCreditCardType(type.GetStorableType()))
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return true;
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return false;
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::TransmissionWillBeSecure() const {
432424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return source_url_.SchemeIs(content::kHttpsScheme);
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() {
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
437ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_ACCEPTED);
439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() {
444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_CANCELED);
447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
452