autofill_dialog_controller_android.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/user_prefs/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
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) {
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::string16();
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSectionWithComparator(
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DetailInputs& inputs,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FormStructure::InputFieldComparator& compare,
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FormStructure& form_structure,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if ((section == SECTION_CC_BILLING && !full_wallet->billing_address()) ||
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (section == SECTION_SHIPPING && !full_wallet->shipping_address())) {
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Callback<base::string16(const AutofillType&)> get_info =
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FullWallet::GetInfo,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(full_wallet),
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 g_browser_process->GetApplicationLocale());
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<ServerFieldType> types = common::TypesFromInputs(inputs);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  form_structure.FillFields(types,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            compare,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            get_info,
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            g_browser_process->GetApplicationLocale());
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FillOutputForSection(
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section,
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    FormStructure& form_structure,
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FullWallet* full_wallet,
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::string16& email_address) {
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DetailInputs inputs;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  common::BuildInputsForSection(section, "US", &inputs);
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSectionWithComparator(
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      section, inputs,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(common::ServerTypeMatchesField, section),
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      form_structure, full_wallet, email_address);
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_CC_BILLING) {
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Email is hidden while using Wallet, special case it.
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (size_t i = 0; i < form_structure.field_count(); ++i) {
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillField* field = form_structure.field(i);
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (field->Type().GetStorableType() == EMAIL_ADDRESS)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        field->value = email_address;
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if |input_type| in |section| is needed for |form_structure|.
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputUsedInFormStructure(DialogSection section,
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       ServerFieldType input_type,
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                       const FormStructure& form_structure) {
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < form_structure.field_count(); ++i) {
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const AutofillField* field = form_structure.field(i);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (field && common::ServerTypeMatchesField(section, input_type, *field))
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Returns true if one of |inputs| in |section| is needed for |form_structure|.
124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool IsSectionInputsUsedInFormStructure(DialogSection section,
125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const ServerFieldType* input_types,
126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const size_t input_types_size,
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                        const FormStructure& form_structure) {
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < input_types_size; ++i) {
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (IsSectionInputUsedInFormStructure(
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        section, input_types[i], form_structure)) {
131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return true;
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return false;
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogControllerAndroid::Create(
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // AutofillDialogControllerAndroid owns itself.
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillDialogControllerAndroid* autofill_dialog_controller =
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new AutofillDialogControllerAndroid(contents,
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          form_structure,
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          source_url,
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                          callback);
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_AUTOFILL_DIALOG)
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController>
158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogController::Create(
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerAndroid::Create(contents,
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 form_structure,
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 source_url,
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                 callback);
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {}
1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs(
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterDictionaryPref(
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ::prefs::kAutofillDialogDefaults,
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_AUTOFILL_DIALOG)
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::~AutofillDialogControllerAndroid() {
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (java_object_.is_null())
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Java_AutofillDialogControllerAndroid_onDestroy(env, java_object_.obj());
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Show() {
19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  dialog_shown_timestamp_ = base::Time::Now();
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL& current_url = contents_->GetLastCommittedURL();
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invoked_from_same_origin_ =
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_url.GetOrigin() == source_url_.GetOrigin();
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types, or
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // if the dialog shouldn't be shown in a given circumstances.
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!has_types ||
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      !Java_AutofillDialogControllerAndroid_isDialogAllowed(
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          env,
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          invoked_from_same_origin_)) {
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    callback_.Run(NULL);
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    delete this;
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Log any relevant UI metrics and security exceptions.
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogSecurityMetric(
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!invoked_from_same_origin_) {
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GetMetricLogger().LogDialogSecurityMetric(
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
225424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const ServerFieldType full_billing_is_necessary_if[] = {
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE1,
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_LINE2,
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_CITY,
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ADDRESS_BILLING_STATE,
230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER
231424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_full_billing_address =
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputsUsedInFormStructure(
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
235424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          full_billing_is_necessary_if,
236424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          arraysize(full_billing_is_necessary_if),
237424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
238424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const bool request_phone_numbers =
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_BILLING,
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_BILLING_WHOLE_NUMBER,
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_) ||
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      IsSectionInputUsedInFormStructure(
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          SECTION_SHIPPING,
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          PHONE_HOME_WHOLE_NUMBER,
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          form_structure_);
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  bool request_shipping_address = false;
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DetailInputs inputs;
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    common::BuildInputsForSection(SECTION_SHIPPING, "US", &inputs);
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request_shipping_address = form_structure_.FillFields(
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        common::TypesFromInputs(inputs),
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING),
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(NullGetInfo),
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        g_browser_process->GetApplicationLocale());
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const bool incognito_mode = profile_->IsOffTheRecord();
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool last_used_choice_is_autofill = false;
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::string16 last_used_account_name;
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_billing;
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_shipping;
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string last_used_credit_card;
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::DictionaryValue* defaults =
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        profile_->GetPrefs()->GetDictionary(::prefs::kAutofillDialogDefaults);
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedAccountName, &last_used_account_name);
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetBoolean(kLastUsedChoiceIsAutofill,
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           &last_used_choice_is_autofill);
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedBillingAddressGuid, &last_used_billing);
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedShippingAddressGuid, &last_used_shipping);
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->GetString(kLastUsedCreditCardGuid, &last_used_credit_card);
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DLOG(ERROR) << "Failed to read AutofillDialog preferences";
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (contents_->GetBrowserContext()->IsOffTheRecord())
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    last_used_choice_is_autofill = true;
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_account_name =
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF16ToJavaString(
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_account_name);
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_billing =
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_billing);
290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_shipping =
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_shipping);
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jlast_used_card =
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, last_used_credit_card);
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedJavaLocalRef<jstring> jmerchant_domain =
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertUTF8ToJavaString(
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          env, source_url_.GetOrigin().spec());
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  java_object_.Reset(Java_AutofillDialogControllerAndroid_create(
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      env,
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(this),
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      WindowAndroidHelper::FromWebContents(contents_)->
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetWindowAndroid()->GetJavaObject().obj(),
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_full_billing_address, request_shipping_address,
305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      request_phone_numbers, incognito_mode,
306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      last_used_choice_is_autofill, jlast_used_account_name.obj(),
307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_billing.obj(), jlast_used_shipping.obj(),
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jlast_used_card.obj(),
309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      jmerchant_domain.obj()));
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::Hide() {
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete this;
314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::TabActivated() {}
317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerAndroid::
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RegisterAutofillDialogControllerAndroid(JNIEnv* env) {
321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return RegisterNativesImpl(env);
322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogCancel(JNIEnv* env,
325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                                   jobject obj) {
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LogOnCancelMetrics();
327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(NULL);
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::DialogContinue(
331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    JNIEnv* env,
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject obj,
333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jobject wallet,
334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jboolean jlast_used_choice_is_autofill,
335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_account_name,
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_billing,
337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_shipping,
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    jstring jlast_used_card) {
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 email =
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      AutofillDialogResult::GetWalletEmail(env, wallet);
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string google_transaction_id =
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::GetWalletGoogleTransactionId(env, wallet);
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 last_used_account_name =
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF16(env, jlast_used_account_name);
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_billing =
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_billing);
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_shipping =
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_shipping);
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string last_used_card =
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::android::ConvertJavaStringToUTF8(env, jlast_used_card);
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FullWallet> full_wallet =
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillDialogResult::ConvertFromJava(env, wallet);
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_CC_BILLING, form_structure_, full_wallet.get(), email);
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FillOutputForSection(
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SECTION_SHIPPING, form_structure_, full_wallet.get(), email);
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DictionaryPrefUpdate updater(profile_->GetPrefs(),
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                 ::prefs::kAutofillDialogDefaults);
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::DictionaryValue* defaults = updater.Get();
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (defaults) {
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const bool last_used_choice_is_autofill = !!jlast_used_choice_is_autofill;
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetString(kLastUsedAccountName, last_used_account_name);
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      defaults->SetBoolean(kLastUsedChoiceIsAutofill,
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           last_used_choice_is_autofill);
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_billing.empty())
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedBillingAddressGuid, last_used_billing);
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_shipping.empty())
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedShippingAddressGuid, last_used_shipping);
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!last_used_card.empty())
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        defaults->SetString(kLastUsedCreditCardGuid, last_used_card);
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      LOG(ERROR) << "Failed to save AutofillDialog preferences";
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LogOnFinishSubmitMetrics();
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Callback should be called as late as possible.
383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(&form_structure_);
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // This might delete us.
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillDialogControllerAndroid::AutofillDialogControllerAndroid(
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback)
394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      contents_(contents),
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      invoked_from_same_origin_(true),
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      source_url_(source_url),
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      callback_(callback),
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      cares_about_shipping_(true),
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_ptr_factory_(this),
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      was_ui_latency_logged_(false) {
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!callback_.is_null());
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnFinishSubmitMetrics() {
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_ACCEPTED);
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerAndroid::LogOnCancelMetrics() {
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GetMetricLogger().LogDialogUiDuration(
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time::Now() - dialog_shown_timestamp_,
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillMetrics::DIALOG_CANCELED);
419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
424