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