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 "jni/AutofillDialogControllerAndroid_jni.h"
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/base/android/window_android.h"
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/combobox_model.h"
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/base/models/menu_model.h"
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/android/java_bitmap.h"
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ui/gfx/rect.h"
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "url/gurl.h"
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill {
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using wallet::FullWallet;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Keys in kAutofillDialogDefaults pref dictionary (do not change these values).
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedAccountName[] = "last_used_account_name";
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedChoiceIsAutofill[] = "last_used_choice_is_autofill";
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedBillingAddressGuid[] = "last_used_billing";
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedShippingAddressGuid[] = "last_used_shipping";
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst char kLastUsedCreditCardGuid[] = "last_used_card";
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_CC_BILLING section.
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildCcBillingInputs(DetailInputs* inputs) {
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kCcBillingInputs[] = {
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, NAME_BILLING_FULL },
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_STREET_ADDRESS },
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_CITY },
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_DEPENDENT_LOCALITY },
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_STATE },
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_ZIP },
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_SORTING_CODE },
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_BILLING_COUNTRY },
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, PHONE_BILLING_WHOLE_NUMBER },
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_NUMBER },
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_EXP_MONTH },
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_EXP_4_DIGIT_YEAR },
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, CREDIT_CARD_VERIFICATION_CODE },
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  common::BuildInputs(kCcBillingInputs, arraysize(kCcBillingInputs), inputs);
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| for the SECTION_SHIPPING section.
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildShippingInputs(DetailInputs* inputs) {
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kShippingInputs[] = {
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, NAME_FULL },
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_STREET_ADDRESS },
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_CITY },
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_DEPENDENT_LOCALITY },
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_STATE },
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_ZIP },
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_SORTING_CODE },
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, ADDRESS_HOME_COUNTRY },
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG, PHONE_HOME_WHOLE_NUMBER },
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  common::BuildInputs(kShippingInputs, arraysize(kShippingInputs), inputs);
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) {
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::string16();
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section,
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DetailInputs& inputs,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FormStructure::InputFieldComparator& compare,
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FormStructure& form_structure,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if ((section == SECTION_CC_BILLING && !full_wallet->billing_address()) ||
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (section == SECTION_SHIPPING && !full_wallet->shipping_address())) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Callback<base::string16(const AutofillType&)> get_info =
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FullWallet::GetInfo,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(full_wallet),
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 g_browser_process->GetApplicationLocale());
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<ServerFieldType> types = common::TypesFromInputs(inputs);
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  form_structure.FillFields(
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      types,
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      compare,
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      get_info,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      section == SECTION_CC_BILLING
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ? full_wallet->billing_address()->language_code()
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          : full_wallet->shipping_address()->language_code(),
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      g_browser_process->GetApplicationLocale());
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection(
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section,
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FormStructure& form_structure,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(section == SECTION_CC_BILLING || section == SECTION_SHIPPING);
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DetailInputs inputs;
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (section == SECTION_CC_BILLING)
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildCcBillingInputs(&inputs);
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildShippingInputs(&inputs);
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSectionWithComparator(
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      section, inputs,
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(common::ServerTypeMatchesField, section),
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      form_structure, full_wallet, email_address);
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_CC_BILLING) {
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Email is hidden while using Wallet, special case it.
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < form_structure.field_count(); ++i) {
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillField* field = form_structure.field(i);
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (field->Type().GetStorableType() == EMAIL_ADDRESS)
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        field->value = email_address;
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|.
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section,
155424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       ServerFieldType input_type,
156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       const FormStructure& form_structure) {
157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < form_structure.field_count(); ++i) {
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AutofillField* field = form_structure.field(i);
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (field && common::ServerTypeMatchesField(section, input_type, *field))
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|.
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section,
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const ServerFieldType* input_types,
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const size_t input_types_size,
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const FormStructure& form_structure) {
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < input_types_size; ++i) {
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (IsSectionInputUsedInFormStructure(
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        section, input_types[i], form_structure)) {
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create(
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback) {
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // AutofillDialogControllerAndroid owns itself.
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillDialogControllerAndroid* autofill_dialog_controller =
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new AutofillDialogControllerAndroid(contents,
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          form_structure,
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          source_url,
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          callback);
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG)
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController>
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create(
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback) {
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerAndroid::Create(contents,
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 form_structure,
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 source_url,
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 callback);
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {}
2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs(
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterDictionaryPref(
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ::prefs::kAutofillDialogDefaults,
2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_AUTOFILL_DIALOG)
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() {
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (java_object_.is_null())
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj());
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() {
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  dialog_shown_timestamp_ = base::Time::Now();
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The Autofill dialog is shown in response to a message from the renderer and
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // as such, it can only be made in the context of the current document. A call
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // to GetActiveEntry would return a pending entry, if there was one, which
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // would be a security bug. Therefore, we use the last committed URL for the
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // access checks.
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL& current_url = contents_->GetLastCommittedURL();
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invoked_from_same_origin_ =
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_url.GetOrigin() == source_url_.GetOrigin();
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Fail if the dialog factory (e.g. SDK) doesn't support cross-origin calls.
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!Java_AutofillDialogControllerAndroid_isDialogAllowed(
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          env,
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          invoked_from_same_origin_)) {
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback_.Run(
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        AutofillClient::AutocompleteResultErrorDisabled,
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::ASCIIToUTF16("Cross-origin form invocations are not supported."),
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NULL);
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete this;
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types, or
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // if the dialog shouldn't be shown in a given circumstances.
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!has_types) {
265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    callback_.Run(
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        AutofillClient::AutocompleteResultErrorDisabled,
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::ASCIIToUTF16("Form is missing autocomplete attributes."),
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        NULL);
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    delete this;
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Fail if the author didn't ask for at least some kind of credit card
2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // information.
2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool has_credit_card_field = false;
2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    AutofillType type = form_structure_.field(i)->Type();
2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (type.html_type() != HTML_TYPE_UNKNOWN && type.group() == CREDIT_CARD) {
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      has_credit_card_field = true;
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      break;
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!has_credit_card_field) {
2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback_.Run(
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        AutofillClient::AutocompleteResultErrorDisabled,
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        base::ASCIIToUTF16("Form is not a payment form (must contain "
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                           "some autocomplete=\"cc-*\" fields). "),
2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NULL);
2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete this;
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Log any relevant UI metrics and security exceptions.
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogSecurityMetric(
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!invoked_from_same_origin_) {
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ServerFieldType full_billing_is_necessary_if[] = {
306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE1,
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE2,
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_APT_NUM,
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_CITY,
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_STATE,
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // ADDRESS_BILLING_ZIP,  // Postal code alone is a short form.
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_COUNTRY,
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_STREET_ADDRESS,
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_DEPENDENT_LOCALITY,
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ADDRESS_BILLING_SORTING_CODE,
316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ServerFieldType billing_phone_number_is_necessary_if[] = {
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ServerFieldType shipping_phone_number_is_necessary_if[] = {
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_HOME_WHOLE_NUMBER
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_full_billing_address =
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputsUsedInFormStructure(
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          full_billing_is_necessary_if,
328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          arraysize(full_billing_is_necessary_if),
329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_phone_numbers =
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      IsSectionInputsUsedInFormStructure(
332424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          billing_phone_number_is_necessary_if,
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          arraysize(billing_phone_number_is_necessary_if),
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_) ||
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      IsSectionInputsUsedInFormStructure(
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_SHIPPING,
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          shipping_phone_number_is_necessary_if,
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          arraysize(shipping_phone_number_is_necessary_if),
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool request_shipping_address = false;
343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailInputs inputs;
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildShippingInputs(&inputs);
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request_shipping_address = form_structure_.FillFields(
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        common::TypesFromInputs(inputs),
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING),
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(NullGetInfo),
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        std::string(),
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        g_browser_process->GetApplicationLocale());
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool last_used_choice_is_autofill = false;
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 last_used_account_name;
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_billing;
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_shipping;
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_credit_card;
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::DictionaryValue* defaults =
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults);
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedAccountName, &last_used_account_name);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetBoolean(kLastUsedChoiceIsAutofill,
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           &last_used_choice_is_autofill);
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing);
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping);
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card);
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DLOG(ERROR) << "Failed to read AutofillDialog preferences";
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const bool incognito_mode = profile_->IsOffTheRecord();
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (incognito_mode)
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    last_used_choice_is_autofill = true;
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_account_name =
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF16ToJavaString(
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_account_name);
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_billing =
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_billing);
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_shipping =
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_shipping);
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_card =
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_credit_card);
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jmerchant_domain =
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, source_url_.GetOrigin().spec());
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::set<base::string16> available_shipping_countries =
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      form_structure_.PossibleValues(ADDRESS_HOME_COUNTRY);
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> jshipping_countries =
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::android::ToJavaArrayOfStrings(
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          env,
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::vector<base::string16>(available_shipping_countries.begin(),
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      available_shipping_countries.end()));
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::set<base::string16> available_credit_card_types =
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      form_structure_.PossibleValues(CREDIT_CARD_TYPE);
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedJavaLocalRef<jobjectArray> jcredit_card_types =
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::android::ToJavaArrayOfStrings(
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          env,
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          std::vector<base::string16>(available_credit_card_types.begin(),
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      available_credit_card_types.end()));
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  java_object_.Reset(Java_AutofillDialogControllerAndroid_create(
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      env,
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(this),
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      WindowAndroidHelper::FromWebContents(contents_)->
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetWindowAndroid()->GetJavaObject().obj(),
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_full_billing_address, request_shipping_address,
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_phone_numbers, incognito_mode,
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      last_used_choice_is_autofill, jlast_used_account_name.obj(),
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_billing.obj(), jlast_used_shipping.obj(),
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_card.obj(),
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      jmerchant_domain.obj(),
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      jshipping_countries.obj(),
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      jcredit_card_types.obj()));
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() {
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {}
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::
431ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RegisterAutofillDialogControllerAndroid(JNIEnv* env) {
432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return RegisterNativesImpl(env);
433ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env,
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                   jobject obj) {
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LogOnCancelMetrics();
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback_.Run(AutofillClient::AutocompleteResultErrorCancel,
439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                base::string16(),
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                NULL);
441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
442ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue(
444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JNIEnv* env,
445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject obj,
446ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject wallet,
447ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jboolean jlast_used_choice_is_autofill,
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_account_name,
449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_billing,
450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_shipping,
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_card) {
452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 email =
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      AutofillDialogResult::GetWalletEmail(env, wallet);
454ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string google_transaction_id =
455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet);
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 last_used_account_name =
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name);
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_billing =
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_billing);
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_shipping =
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping);
463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_card =
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_card);
465ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FullWallet> full_wallet =
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::ConvertFromJava(env, wallet);
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_CC_BILLING, form_structure_, full_wallet.get(), email);
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_SHIPPING, form_structure_, full_wallet.get(), email);
472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DictionaryPrefUpdate updater(profile_->GetPrefs(),
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                 ::prefs::kAutofillDialogDefaults);
476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::DictionaryValue* defaults = updater.Get();
477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill;
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetString(kLastUsedAccountName, last_used_account_name);
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetBoolean(kLastUsedChoiceIsAutofill,
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           last_used_choice_is_autofill);
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_billing.empty())
483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing);
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_shipping.empty())
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping);
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_card.empty())
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedCreditCardGuid, last_used_card);
488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      DLOG(ERROR) << "Failed to save AutofillDialog preferences";
490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LogOnFinishSubmitMetrics();
494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Callback should be called as late as possible.
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback_.Run(AutofillClient::AutocompleteResultSuccess,
497a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                base::string16(),
498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                &form_structure_);
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This might delete us.
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid(
505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback)
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_(contents),
511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      invoked_from_same_origin_(true),
514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      source_url_(source_url),
515ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      callback_(callback),
516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cares_about_shipping_(true),
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      was_ui_latency_logged_(false),
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_ptr_factory_(this) {
519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback_.is_null());
520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() {
523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_ACCEPTED);
526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
529ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() {
531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_CANCELED);
534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
538ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
539