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/autofill/autofill_dialog_common.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/browser_process.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_country.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_field.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "components/autofill/core/browser/autofill_type.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace autofill {
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace common {
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool ServerTypeEncompassesFieldType(ServerFieldType type,
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    const AutofillType& field_type) {
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // If any credit card expiration info is asked for, show both month and year
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // inputs.
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ServerFieldType server_type = field_type.GetStorableType();
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (server_type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      server_type == CREDIT_CARD_EXP_2_DIGIT_YEAR ||
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      server_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ||
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      server_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      server_type == CREDIT_CARD_EXP_MONTH) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           type == CREDIT_CARD_EXP_MONTH;
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (server_type == CREDIT_CARD_TYPE)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return type == CREDIT_CARD_NUMBER;
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Check the groups to distinguish billing types from shipping ones.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AutofillType autofill_type = AutofillType(type);
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (autofill_type.group() != field_type.group())
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The page may ask for individual address lines; this roughly matches the
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // street address blob.
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (server_type == ADDRESS_HOME_LINE1 ||
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          server_type == ADDRESS_HOME_LINE2 ||
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          server_type == ADDRESS_HOME_LINE3) {
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return autofill_type.GetStorableType() == ADDRESS_HOME_STREET_ADDRESS;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // First, middle and last name are parsed from full name.
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (field_type.group() == NAME || field_type.group() == NAME_BILLING)
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return autofill_type.GetStorableType() == NAME_FULL;
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return autofill_type.GetStorableType() == server_type;
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ServerTypeMatchesField(DialogSection section,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            ServerFieldType type,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            const AutofillField& field) {
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  AutofillType field_type = field.Type();
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // The credit card name is filled from the billing section's data.
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (field_type.GetStorableType() == CREDIT_CARD_NAME &&
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      (section == SECTION_BILLING || section == SECTION_CC_BILLING)) {
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return type == NAME_BILLING_FULL;
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return ServerTypeEncompassesFieldType(type, field_type);
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool IsCreditCardType(ServerFieldType type) {
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillType(type).group() == CREDIT_CARD;
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid BuildInputs(const DetailInput* input_template,
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 size_t template_size,
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 DetailInputs* inputs) {
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (size_t i = 0; i < template_size; ++i) {
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const DetailInput* input = &input_template[i];
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    inputs->push_back(*input);
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillMetrics::DialogUiEvent DialogSectionToUiItemAddedEvent(
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section) {
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  switch (section) {
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_BILLING:
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_BILLING_ITEM_ADDED;
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_CC_BILLING:
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_CC_BILLING_ITEM_ADDED;
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_SHIPPING:
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_SHIPPING_ITEM_ADDED;
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_CC:
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_CC_ITEM_ADDED;
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NOTREACHED();
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillMetrics::NUM_DIALOG_UI_EVENTS;
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochAutofillMetrics::DialogUiEvent DialogSectionToUiSelectionChangedEvent(
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DialogSection section) {
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  switch (section) {
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_BILLING:
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_BILLING_SELECTED_SUGGESTION_CHANGED;
105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_CC_BILLING:
107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_CC_BILLING_SELECTED_SUGGESTION_CHANGED;
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_SHIPPING:
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_SHIPPING_SELECTED_SUGGESTION_CHANGED;
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case SECTION_CC:
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return AutofillMetrics::DIALOG_UI_CC_SELECTED_SUGGESTION_CHANGED;
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  NOTREACHED();
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillMetrics::NUM_DIALOG_UI_EVENTS;
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<ServerFieldType> TypesFromInputs(const DetailInputs& inputs) {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<ServerFieldType> types;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < inputs.size(); ++i) {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    types.push_back(inputs[i].type);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return types;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace common
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace autofill
130