autofill_dialog_controller_android.cc revision f2477e01787aa58f445919b809d89e252beef54f
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"
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/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
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG)
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController>
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create(
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerAndroid::Create(contents,
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 form_structure,
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 source_url,
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 callback);
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {}
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs(
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterDictionaryPref(
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ::prefs::kAutofillDialogDefaults,
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_AUTOFILL_DIALOG)
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() {
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (java_object_.is_null())
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj());
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() {
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  dialog_shown_timestamp_ = base::Time::Now();
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL& current_url = contents_->GetLastCommittedURL();
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invoked_from_same_origin_ =
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_url.GetOrigin() == source_url_.GetOrigin();
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types, or
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // if the dialog shouldn't be shown in a given circumstances.
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_types ||
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !Java_AutofillDialogControllerAndroid_isDialogAllowed(
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          env,
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          RequestingCreditCardInfo(),
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          TransmissionWillBeSecure(),
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          invoked_from_same_origin_)) {
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    callback_.Run(NULL);
21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    delete this;
21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Log any relevant UI metrics and security exceptions.
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogSecurityMetric(
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) {
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP);
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!invoked_from_same_origin_) {
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ServerFieldType full_billing_is_necessary_if[] = {
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE1,
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE2,
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_CITY,
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_STATE,
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_full_billing_address =
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputsUsedInFormStructure(
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          full_billing_is_necessary_if,
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          arraysize(full_billing_is_necessary_if),
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_phone_numbers =
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_BILLING_WHOLE_NUMBER,
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_) ||
252424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
253424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_SHIPPING,
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_HOME_WHOLE_NUMBER,
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool request_shipping_address = false;
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailInputs inputs;
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    common::BuildInputsForSection(SECTION_SHIPPING, &inputs);
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EmptyDataModelWrapper empty_wrapper;
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    request_shipping_address = empty_wrapper.FillFormStructure(
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        inputs,
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING),
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        &form_structure_);
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const bool incognito_mode = profile_->IsOffTheRecord();
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool last_used_choice_is_autofill = false;
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 last_used_account_name;
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_billing;
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_shipping;
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_credit_card;
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::DictionaryValue* defaults =
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults);
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedAccountName, &last_used_account_name);
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetBoolean(kLastUsedChoiceIsAutofill,
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           &last_used_choice_is_autofill);
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing);
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping);
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card);
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DLOG(ERROR) << "Failed to read AutofillDialog preferences";
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (contents_->GetBrowserContext()->IsOffTheRecord())
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    last_used_choice_is_autofill = true;
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_account_name =
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF16ToJavaString(
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_account_name);
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_billing =
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_billing);
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_shipping =
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_shipping);
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_card =
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_credit_card);
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jmerchant_domain =
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, source_url_.GetOrigin().spec());
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  java_object_.Reset(Java_AutofillDialogControllerAndroid_create(
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      env,
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(this),
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      WindowAndroidHelper::FromWebContents(contents_)->
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetWindowAndroid()->GetJavaObject().obj(),
313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_full_billing_address, request_shipping_address,
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_phone_numbers, incognito_mode,
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      last_used_choice_is_autofill, jlast_used_account_name.obj(),
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_billing.obj(), jlast_used_shipping.obj(),
317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_card.obj(),
318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jmerchant_domain.obj()));
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() {
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // TODO(aruslan): http://crbug.com/177373 Autocheckout.
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NOTIMPLEMENTED();
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {}
327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RegisterAutofillDialogControllerAndroid(JNIEnv* env) {
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return RegisterNativesImpl(env);
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env,
335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                   jobject obj) {
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LogOnCancelMetrics();
337d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(NULL);
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue(
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JNIEnv* env,
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject obj,
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject wallet,
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jboolean jlast_used_choice_is_autofill,
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_account_name,
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_billing,
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_shipping,
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_card) {
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string16 email = AutofillDialogResult::GetWalletEmail(env, wallet);
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string google_transaction_id =
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet);
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string16 last_used_account_name =
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name);
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_billing =
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_billing);
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_shipping =
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping);
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_card =
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_card);
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<wallet::FullWallet> full_wallet =
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::ConvertFromJava(env, wallet);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_CC_BILLING, form_structure_, full_wallet.get(), email);
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_SHIPPING, form_structure_, full_wallet.get(), email);
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DictionaryPrefUpdate updater(profile_->GetPrefs(),
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                 ::prefs::kAutofillDialogDefaults);
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::DictionaryValue* defaults = updater.Get();
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill;
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetString(kLastUsedAccountName, last_used_account_name);
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetBoolean(kLastUsedChoiceIsAutofill,
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           last_used_choice_is_autofill);
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_billing.empty())
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing);
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_shipping.empty())
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping);
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_card.empty())
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedCreditCardGuid, last_used_card);
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      LOG(ERROR) << "Failed to save AutofillDialog preferences";
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LogOnFinishSubmitMetrics();
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Callback should be called as late as possible.
392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(&form_structure_);
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This might delete us.
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid(
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback)
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_(contents),
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      invoked_from_same_origin_(true),
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      source_url_(source_url),
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      callback_(callback),
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cares_about_shipping_(true),
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this),
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      was_ui_latency_logged_(false) {
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback_.is_null());
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::RequestingCreditCardInfo() const {
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK_GT(form_structure_.field_count(), 0U);
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    AutofillType type = form_structure_.field(i)->Type();
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (common::IsCreditCardType(type.GetStorableType()))
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return true;
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return false;
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::TransmissionWillBeSecure() const {
429424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return source_url_.SchemeIs(content::kHttpsScheme);
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() {
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_ACCEPTED);
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() {
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_CANCELED);
444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
449