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 ? &not_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