15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_split.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/browser_process.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/autofill/core/browser/address_i18n.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/autofill_profile.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/credit_card.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/field_types.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/components_strings.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/chromium/addressinput_util.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui_component.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/localization.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace autofill { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace i18ninput { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF16ToUTF8; 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressField; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressUiComponent; 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::Localization; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<AddressUiComponent> BuildComponents(const std::string& country_code, 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string* language_code) { 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Localization localization; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch localization.SetGetter(l10n_util::GetStringUTF8); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string not_used; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ::i18n::addressinput::BuildComponents( 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch country_code, localization, g_browser_process->GetApplicationLocale(), 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch language_code == NULL ? ¬_used : language_code); 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DetailInput::Length LengthFromHint(AddressUiComponent::LengthHint hint) { 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (hint == AddressUiComponent::HINT_SHORT) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DetailInput::SHORT; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(hint, AddressUiComponent::HINT_LONG); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DetailInput::LONG; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BuildAddressInputs(common::AddressType address_type, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& country_code, 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DetailInputs* inputs, 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string* language_code) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<AddressUiComponent>& components( 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BuildComponents(country_code, language_code)); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const bool billing = address_type == common::ADDRESS_TYPE_BILLING; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < components.size(); ++i) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AddressUiComponent& component = components[i]; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Interactive autofill dialog does not display organization. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (component.field == ::i18n::addressinput::ORGANIZATION) 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServerFieldType server_type = i18n::TypeForField(component.field, billing); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInput::Length length = LengthFromHint(component.length_hint); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::string16 placeholder = base::UTF8ToUTF16(component.name); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInput input = { length, server_type, placeholder }; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inputs->push_back(input); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ServerFieldType server_type = 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) billing ? ADDRESS_BILLING_COUNTRY : ADDRESS_HOME_COUNTRY; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 placeholder_text = 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_FIELD_LABEL_COUNTRY); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInput input = { DetailInput::LONG, server_type, placeholder_text }; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inputs->push_back(input); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool CardHasCompleteAndVerifiedData(const CreditCard& card) { 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!card.IsVerified()) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ServerFieldType required_fields[] = { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CREDIT_CARD_NUMBER, 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CREDIT_CARD_EXP_MONTH, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CREDIT_CARD_EXP_4_DIGIT_YEAR, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(required_fields); ++i) { 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (card.GetRawInfo(required_fields[i]).empty()) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AddressHasCompleteAndVerifiedData(const AutofillProfile& profile, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& app_locale) { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!profile.IsVerified()) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!addressinput::HasAllRequiredFields( 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *i18n::CreateAddressDataFromAutofillProfile(profile, app_locale))) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ServerFieldType more_required_fields[] = { 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NAME_FULL, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PHONE_HOME_WHOLE_NUMBER 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(more_required_fields); ++i) { 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (profile.GetInfo(AutofillType(more_required_fields[i]), 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch app_locale).empty()) { 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace i18ninput 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace autofill 126