autofill_dialog_controller_android.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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/common/pref_names.h"
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/url_constants.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/content/browser/wallet/full_wallet.h"
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_metrics.h"
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_profile.h"
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_type.h"
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/credit_card.h"
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/common/form_data.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_controller.h"
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_details.h"
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/navigation_entry.h"
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/web_contents.h"
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "grit/generated_resources.h"
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "jni/AutofillDialogControllerAndroid_jni.h"
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h"
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/l10n/l10n_util.h"
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h"
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h"
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h"
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h"
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h"
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill {
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using wallet::FullWallet;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values).
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name";
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill";
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing";
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping";
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card";
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_CC_BILLING section.
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildCcBillingInputs(DetailInputs* inputs) {
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kCcBillingInputs[] = {
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, NAME_BILLING_FULL },
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_STREET_ADDRESS },
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_CITY },
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_DEPENDENT_LOCALITY },
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_STATE },
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_ZIP },
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_SORTING_CODE },
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_COUNTRY },
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, PHONE_BILLING_WHOLE_NUMBER },
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_NUMBER },
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_EXP_MONTH },
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_EXP_4_DIGIT_YEAR },
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_VERIFICATION_CODE },
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  common::BuildInputs(kCcBillingInputs, arraysize(kCcBillingInputs), inputs);
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_SHIPPING section.
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildShippingInputs(DetailInputs* inputs) {
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kShippingInputs[] = {
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, NAME_FULL },
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_STREET_ADDRESS },
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_CITY },
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_DEPENDENT_LOCALITY },
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_STATE },
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_ZIP },
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_SORTING_CODE },
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_COUNTRY },
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, PHONE_HOME_WHOLE_NUMBER },
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  common::BuildInputs(kShippingInputs, arraysize(kShippingInputs), inputs);
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) {
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::string16();
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator(
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section,
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DetailInputs& inputs,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FormStructure::InputFieldComparator& compare,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FormStructure& form_structure,
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if ((section == SECTION_CC_BILLING && !full_wallet->billing_address()) ||
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (section == SECTION_SHIPPING && !full_wallet->shipping_address())) {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Callback<base::string16(const AutofillType&)> get_info =
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FullWallet::GetInfo,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(full_wallet),
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 g_browser_process->GetApplicationLocale());
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<ServerFieldType> types = common::TypesFromInputs(inputs);
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  form_structure.FillFields(types,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            compare,
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            get_info,
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            g_browser_process->GetApplicationLocale());
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection(
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section,
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FormStructure& form_structure,
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(section == SECTION_CC_BILLING || section == SECTION_SHIPPING);
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DetailInputs inputs;
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (section == SECTION_CC_BILLING)
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildCcBillingInputs(&inputs);
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildShippingInputs(&inputs);
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSectionWithComparator(
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      section, inputs,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(common::ServerTypeMatchesField, section),
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      form_structure, full_wallet, email_address);
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_CC_BILLING) {
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Email is hidden while using Wallet, special case it.
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < form_structure.field_count(); ++i) {
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillField* field = form_structure.field(i);
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (field->Type().GetStorableType() == EMAIL_ADDRESS)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        field->value = email_address;
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|.
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section,
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       ServerFieldType input_type,
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       const FormStructure& form_structure) {
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < form_structure.field_count(); ++i) {
156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AutofillField* field = form_structure.field(i);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (field && common::ServerTypeMatchesField(section, input_type, *field))
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|.
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section,
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const ServerFieldType* input_types,
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const size_t input_types_size,
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const FormStructure& form_structure) {
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < input_types_size; ++i) {
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (IsSectionInputUsedInFormStructure(
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        section, input_types[i], form_structure)) {
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create(
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const AutofillManagerDelegate::ResultCallback& callback) {
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // AutofillDialogControllerAndroid owns itself.
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillDialogControllerAndroid* autofill_dialog_controller =
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new AutofillDialogControllerAndroid(contents,
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          form_structure,
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          source_url,
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          callback);
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG)
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController>
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create(
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const AutofillManagerDelegate::ResultCallback& callback) {
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerAndroid::Create(contents,
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 form_structure,
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 source_url,
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 callback);
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {}
2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs(
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterDictionaryPref(
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ::prefs::kAutofillDialogDefaults,
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_AUTOFILL_DIALOG)
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() {
22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (java_object_.is_null())
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj());
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() {
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  dialog_shown_timestamp_ = base::Time::Now();
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The Autofill dialog is shown in response to a message from the renderer and
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // as such, it can only be made in the context of the current document. A call
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // to GetActiveEntry would return a pending entry, if there was one, which
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // would be a security bug. Therefore, we use the last committed URL for the
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // access checks.
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL& current_url = contents_->GetLastCommittedURL();
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invoked_from_same_origin_ =
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_url.GetOrigin() == source_url_.GetOrigin();
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Fail if the dialog factory (e.g. SDK) doesn't support cross-origin calls.
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!Java_AutofillDialogControllerAndroid_isDialogAllowed(
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          env,
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          invoked_from_same_origin_)) {
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback_.Run(
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        AutofillManagerDelegate::AutocompleteResultErrorDisabled,
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::ASCIIToUTF16("Cross-origin form invocations are not supported."),
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NULL);
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete this;
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types, or
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // if the dialog shouldn't be shown in a given circumstances.
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!has_types) {
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    callback_.Run(
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        AutofillManagerDelegate::AutocompleteResultErrorDisabled,
265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::ASCIIToUTF16("Form is missing autocomplete attributes."),
266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        NULL);
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    delete this;
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Fail if the author didn't ask for at least some kind of credit card
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // information.
2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool has_credit_card_field = false;
2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    AutofillType type = form_structure_.field(i)->Type();
2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (type.html_type() != HTML_TYPE_UNKNOWN && type.group() == CREDIT_CARD) {
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      has_credit_card_field = true;
2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!has_credit_card_field) {
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback_.Run(
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        AutofillManagerDelegate::AutocompleteResultErrorDisabled,
2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::ASCIIToUTF16("Form is not a payment form (must contain "
2865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           "some autocomplete=\"cc-*\" fields). "),
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NULL);
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete this;
2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Log any relevant UI metrics and security exceptions.
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogSecurityMetric(
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!invoked_from_same_origin_) {
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ServerFieldType full_billing_is_necessary_if[] = {
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE1,
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE2,
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_APT_NUM,
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_CITY,
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_STATE,
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // ADDRESS_BILLING_ZIP,  // Postal code alone is a short form.
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_COUNTRY,
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_STREET_ADDRESS,
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_DEPENDENT_LOCALITY,
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_SORTING_CODE,
314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ServerFieldType billing_phone_number_is_necessary_if[] = {
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ServerFieldType shipping_phone_number_is_necessary_if[] = {
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_HOME_WHOLE_NUMBER
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
322424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_full_billing_address =
323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputsUsedInFormStructure(
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          full_billing_is_necessary_if,
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          arraysize(full_billing_is_necessary_if),
327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_phone_numbers =
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      IsSectionInputsUsedInFormStructure(
330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          billing_phone_number_is_necessary_if,
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          arraysize(billing_phone_number_is_necessary_if),
333424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_) ||
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      IsSectionInputsUsedInFormStructure(
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_SHIPPING,
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shipping_phone_number_is_necessary_if,
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          arraysize(shipping_phone_number_is_necessary_if),
338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool request_shipping_address = false;
341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailInputs inputs;
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildShippingInputs(&inputs);
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request_shipping_address = form_structure_.FillFields(
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        common::TypesFromInputs(inputs),
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING),
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(NullGetInfo),
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        g_browser_process->GetApplicationLocale());
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool last_used_choice_is_autofill = false;
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 last_used_account_name;
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_billing;
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_shipping;
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_credit_card;
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::DictionaryValue* defaults =
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults);
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedAccountName, &last_used_account_name);
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetBoolean(kLastUsedChoiceIsAutofill,
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           &last_used_choice_is_autofill);
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping);
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card);
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DLOG(ERROR) << "Failed to read AutofillDialog preferences";
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool incognito_mode = profile_->IsOffTheRecord();
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (incognito_mode)
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    last_used_choice_is_autofill = true;
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_account_name =
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF16ToJavaString(
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_account_name);
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_billing =
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_billing);
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_shipping =
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_shipping);
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_card =
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_credit_card);
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jmerchant_domain =
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, source_url_.GetOrigin().spec());
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::set<base::string16> available_shipping_countries =
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      form_structure_.PossibleValues(ADDRESS_HOME_COUNTRY);
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> jshipping_countries =
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::android::ToJavaArrayOfStrings(
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          env,
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::vector<base::string16>(available_shipping_countries.begin(),
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      available_shipping_countries.end()));
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::set<base::string16> available_credit_card_types =
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      form_structure_.PossibleValues(CREDIT_CARD_TYPE);
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> jcredit_card_types =
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::android::ToJavaArrayOfStrings(
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          env,
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::vector<base::string16>(available_credit_card_types.begin(),
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      available_credit_card_types.end()));
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  java_object_.Reset(Java_AutofillDialogControllerAndroid_create(
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      env,
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(this),
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      WindowAndroidHelper::FromWebContents(contents_)->
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetWindowAndroid()->GetJavaObject().obj(),
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_full_billing_address, request_shipping_address,
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_phone_numbers, incognito_mode,
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      last_used_choice_is_autofill, jlast_used_account_name.obj(),
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_billing.obj(), jlast_used_shipping.obj(),
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_card.obj(),
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      jmerchant_domain.obj(),
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      jshipping_countries.obj(),
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      jcredit_card_types.obj()));
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() {
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {}
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RegisterAutofillDialogControllerAndroid(JNIEnv* env) {
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return RegisterNativesImpl(env);
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env,
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                   jobject obj) {
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LogOnCancelMetrics();
435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  callback_.Run(AutofillManagerDelegate::AutocompleteResultErrorCancel,
436a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                base::string16(),
437a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                NULL);
438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue(
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JNIEnv* env,
442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject obj,
443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject wallet,
444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jboolean jlast_used_choice_is_autofill,
445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_account_name,
446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_billing,
447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_shipping,
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_card) {
449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 email =
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      AutofillDialogResult::GetWalletEmail(env, wallet);
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string google_transaction_id =
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet);
453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 last_used_account_name =
455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name);
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_billing =
457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_billing);
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_shipping =
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping);
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_card =
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_card);
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FullWallet> full_wallet =
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::ConvertFromJava(env, wallet);
465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
466ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_CC_BILLING, form_structure_, full_wallet.get(), email);
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_SHIPPING, form_structure_, full_wallet.get(), email);
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DictionaryPrefUpdate updater(profile_->GetPrefs(),
472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                 ::prefs::kAutofillDialogDefaults);
473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::DictionaryValue* defaults = updater.Get();
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill;
476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetString(kLastUsedAccountName, last_used_account_name);
477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetBoolean(kLastUsedChoiceIsAutofill,
478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           last_used_choice_is_autofill);
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_billing.empty())
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing);
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_shipping.empty())
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping);
483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_card.empty())
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedCreditCardGuid, last_used_card);
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DLOG(ERROR) << "Failed to save AutofillDialog preferences";
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LogOnFinishSubmitMetrics();
491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Callback should be called as late as possible.
493a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  callback_.Run(AutofillManagerDelegate::AutocompleteResultSuccess,
494a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                base::string16(),
495a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                &form_structure_);
496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This might delete us.
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid(
502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
505a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const AutofillManagerDelegate::ResultCallback& callback)
506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_(contents),
508ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      invoked_from_same_origin_(true),
511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      source_url_(source_url),
512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      callback_(callback),
513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cares_about_shipping_(true),
514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this),
515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      was_ui_latency_logged_(false) {
516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback_.is_null());
517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() {
520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_ACCEPTED);
523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() {
528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_CANCELED);
531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
536