Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(967)

Unified Diff: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc

Issue 12208070: allow wallet items to appear in requestAutocomplete UI (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clang fix Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
index de646bdb57565d5dbc45e7c6293391c37f5406be..92873b859dab2c4958909ddf0f9c319fdd87aad6 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
@@ -7,6 +7,7 @@
#include <string>
#include "base/logging.h"
+#include "base/string_number_conversions.h"
#include "base/string_split.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
@@ -21,6 +22,7 @@
#include "chrome/browser/autofill/wallet/wallet_service_url.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
+#include "chrome/browser/ui/autofill/data_model_wrapper.h"
#include "chrome/common/form_data.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_details.h"
@@ -378,24 +380,51 @@ string16 AutofillDialogControllerImpl::SuggestionTextForSection(
if (section == SECTION_EMAIL)
return model->GetLabelAt(model->checked_item());
- if (section == SECTION_CC) {
+ scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
+ return wrapper->GetDisplayText();
+}
+
+scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper(
+ DialogSection section) {
+ SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
+ std::string item_key = model->GetItemKeyAt(model->checked_item());
+ scoped_ptr<DataModelWrapper> wrapper;
+ if (item_key.empty())
+ return wrapper.Pass();
+
+ if (CanPayWithWallet()) {
+ int index;
+ bool success = !base::StringToInt(item_key, &index);
Dan Beam 2013/02/15 02:11:45 shouldn't this be without the "!" ?
Evan Stade 2013/02/20 00:03:39 yes
+ DCHECK(success);
+
+ if (section == SECTION_CC) {
+ wrapper.reset(
+ new WalletInstrumentWrapper(wallet_items_->instruments()[index]));
+ } else {
+ wrapper.reset(
+ new WalletAddressWrapper(wallet_items_->addresses()[index]));
+ }
+ } else if (section == SECTION_CC) {
CreditCard* card = GetManager()->GetCreditCardByGUID(item_key);
- return card->TypeAndLastFourDigits();
+ DCHECK(card);
+ wrapper.reset(new AutofillCreditCardWrapper(card));
+ } else {
+ // Calculate the variant by looking at how many items come from the same
+ // FormGroup. TODO(estade): add a test for this.
+ size_t variant = 0;
+ for (int i = model->checked_item() - 1; i >= 0; --i) {
+ if (model->GetItemKeyAt(i) == item_key)
+ variant++;
+ else
+ break;
+ }
+
+ AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
+ DCHECK(profile);
+ wrapper.reset(new AutofillDataModelWrapper(profile, variant));
}
- const std::string app_locale = AutofillCountry::ApplicationLocale();
- AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
- string16 comma = ASCIIToUTF16(", ");
- string16 label = profile->GetInfo(NAME_FULL, app_locale) +
- comma + profile->GetInfo(ADDRESS_HOME_LINE1, app_locale);
- string16 address2 = profile->GetInfo(ADDRESS_HOME_LINE2, app_locale);
- if (!address2.empty())
- label += comma + address2;
- label += ASCIIToUTF16("\n") +
- profile->GetInfo(ADDRESS_HOME_CITY, app_locale) + comma +
- profile->GetInfo(ADDRESS_HOME_STATE, app_locale) + ASCIIToUTF16(" ") +
- profile->GetInfo(ADDRESS_HOME_ZIP, app_locale);
- return label;
+ return wrapper.Pass();
}
gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection(
@@ -403,13 +432,11 @@ gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection(
if (section != SECTION_CC)
return gfx::Image();
- std::string item_key =
- suggested_cc_.GetItemKeyAt(suggested_cc_.checked_item());
- if (item_key.empty())
+ scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
+ if (!model.get())
return gfx::Image();
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- CreditCard* card = GetManager()->GetCreditCardByGUID(item_key);
- return rb.GetImageNamed(card->IconResourceId());
+
+ return model->GetIcon();
}
void AutofillDialogControllerImpl::EditClickedForSection(
@@ -424,14 +451,8 @@ void AutofillDialogControllerImpl::EditClickedForSection(
(*inputs)[0].autofilled_value = model->GetLabelAt(model->checked_item());
} else {
- std::string guid = model->GetItemKeyAt(model->checked_item());
- DCHECK(!guid.empty());
-
- FormGroup* form_group = section == SECTION_CC ?
- static_cast<FormGroup*>(GetManager()->GetCreditCardByGUID(guid)) :
- static_cast<FormGroup*>(GetManager()->GetProfileByGUID(guid));
- DCHECK(form_group);
- FillInputFromFormGroup(form_group, inputs);
+ scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
+ model->FillInputs(inputs);
}
section_editing_state_[section] = true;
@@ -720,6 +741,8 @@ void AutofillDialogControllerImpl::OnDidGetWalletItems(
WalletRequestCompleted(true);
if (items_changed) {
+ GenerateSuggestionsModels();
+ view_->ModelChanged();
view_->UpdateAccountChooser();
view_->UpdateNotificationArea();
}
@@ -830,6 +853,8 @@ void AutofillDialogControllerImpl::WalletRequestCompleted(bool success) {
if (!success) {
had_wallet_error_ = true;
wallet_items_.reset();
+ GenerateSuggestionsModels();
+ view_->ModelChanged();
view_->UpdateAccountChooser();
view_->UpdateNotificationArea();
return;
@@ -845,30 +870,49 @@ void AutofillDialogControllerImpl::GenerateSuggestionsModels() {
suggested_email_.Reset();
suggested_shipping_.Reset();
- PersonalDataManager* manager = GetManager();
- const std::vector<CreditCard*>& cards = manager->credit_cards();
- for (size_t i = 0; i < cards.size(); ++i) {
- suggested_cc_.AddKeyedItem(cards[i]->guid(), cards[i]->Label());
- }
-
- const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
- const std::string app_locale = AutofillCountry::ApplicationLocale();
- for (size_t i = 0; i < profiles.size(); ++i) {
- if (!IsCompleteProfile(*profiles[i]))
- continue;
-
- // Add all email addresses.
- std::vector<string16> values;
- profiles[i]->GetMultiInfo(EMAIL_ADDRESS, app_locale, &values);
- for (size_t j = 0; j < values.size(); ++j) {
- if (!values[j].empty())
- suggested_email_.AddKeyedItem(profiles[i]->guid(), values[j]);
+ if (CanPayWithWallet()) {
+ if (wallet_items_.get()) {
+ // TODO(estade): seems we need to hardcode the email address.
+ // TODO(estade): CC and billing need to be combined into one section,
+ // and suggestions added here.
+ const std::vector<wallet::Address*>& addresses =
+ wallet_items_->addresses();
+ for (size_t i = 0; i < addresses.size(); ++i) {
+ suggested_billing_.AddKeyedItem(base::IntToString(i),
+ addresses[i]->DisplayName());
+ suggested_shipping_.AddKeyedItem(base::IntToString(i),
+ addresses[i]->DisplayName());
+ }
+ }
+ } else {
+ PersonalDataManager* manager = GetManager();
+ const std::vector<CreditCard*>& cards = manager->credit_cards();
+ for (size_t i = 0; i < cards.size(); ++i) {
+ suggested_cc_.AddKeyedItem(cards[i]->guid(), cards[i]->Label());
}
- // Don't add variants for addresses: the email variants are handled above,
- // name is part of credit card and we'll just ignore phone number variants.
- suggested_billing_.AddKeyedItem(profiles[i]->guid(), profiles[i]->Label());
- suggested_shipping_.AddKeyedItem(profiles[i]->guid(), profiles[i]->Label());
+ const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
+ const std::string app_locale = AutofillCountry::ApplicationLocale();
+ for (size_t i = 0; i < profiles.size(); ++i) {
+ if (!IsCompleteProfile(*profiles[i]))
+ continue;
+
+ // Add all email addresses.
+ std::vector<string16> values;
+ profiles[i]->GetMultiInfo(EMAIL_ADDRESS, app_locale, &values);
+ for (size_t j = 0; j < values.size(); ++j) {
+ if (!values[j].empty())
+ suggested_email_.AddKeyedItem(profiles[i]->guid(), values[j]);
+ }
+
+ // Don't add variants for addresses: the email variants are handled above,
+ // name is part of credit card and we'll just ignore phone number
+ // variants.
+ suggested_billing_.AddKeyedItem(profiles[i]->guid(),
+ profiles[i]->Label());
+ suggested_shipping_.AddKeyedItem(profiles[i]->guid(),
+ profiles[i]->Label());
+ }
}
suggested_email_.AddKeyedItem(
@@ -902,25 +946,12 @@ void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
DialogSection section,
const InputFieldComparator& compare) {
SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
- std::string guid = model->GetItemKeyAt(model->checked_item());
- PersonalDataManager* manager = GetManager();
- if (!guid.empty() && !section_editing_state_[section]) {
- FormGroup* form_group = section == SECTION_CC ?
- static_cast<FormGroup*>(manager->GetCreditCardByGUID(guid)) :
- static_cast<FormGroup*>(manager->GetProfileByGUID(guid));
- DCHECK(form_group);
-
- // Calculate the variant by looking at how many items come from the same
- // FormGroup. TODO(estade): add a test for this.
- size_t variant = 0;
- for (int i = model->checked_item() - 1; i >= 0; --i) {
- if (model->GetItemKeyAt(i) == guid)
- variant++;
- else
- break;
- }
-
- FillFormStructureForSection(*form_group, variant, section, compare);
+ std::string item_key = model->GetItemKeyAt(model->checked_item());
+ if (!item_key.empty() && !section_editing_state_[section]) {
+ scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
+ // Only fill in data that is associated with this section.
+ const DetailInputs& inputs = RequestedFieldsForSection(section);
+ model->FillFormStructure(inputs, compare, &form_structure_);
// CVC needs special-casing because the CreditCard class doesn't store
// or handle them.
@@ -928,6 +959,7 @@ void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
SetCvcResult(view_->GetCvc());
} else {
// The user manually input data.
+ PersonalDataManager* manager = GetManager();
DetailOutputMap output;
view_->GetUserInput(section, &output);
« no previous file with comments | « chrome/browser/ui/autofill/autofill_dialog_controller_impl.h ('k') | chrome/browser/ui/autofill/autofill_dialog_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698