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

Side by Side Diff: chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc

Issue 2816083002: [WebPayments] Desktop implementation of Contact Editor (Closed)
Patch Set: rebase Created 3 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/views/payments/contact_info_editor_view_controller.h "
6
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/ui/views/payments/validating_textfield.h"
9 #include "components/autofill/core/browser/autofill_country.h"
10 #include "components/autofill/core/browser/autofill_profile.h"
11 #include "components/autofill/core/browser/autofill_type.h"
12 #include "components/autofill/core/browser/personal_data_manager.h"
13 #include "components/autofill/core/browser/validation.h"
14 #include "components/autofill/core/common/autofill_constants.h"
15 #include "components/payments/content/payment_request_spec.h"
16 #include "components/payments/content/payment_request_state.h"
17 #include "components/strings/grit/components_strings.h"
18 #include "ui/base/l10n/l10n_util.h"
19 #include "ui/base/models/simple_combobox_model.h"
20 #include "ui/views/controls/label.h"
21 #include "ui/views/controls/textfield/textfield.h"
22
23 namespace payments {
24
25 ContactInfoEditorViewController::ContactInfoEditorViewController(
26 PaymentRequestSpec* spec,
27 PaymentRequestState* state,
28 PaymentRequestDialogView* dialog,
29 autofill::AutofillProfile* profile)
30 : EditorViewController(spec, state, dialog), profile_to_edit_(profile) {}
31
32 ContactInfoEditorViewController::~ContactInfoEditorViewController() {}
33
34 std::unique_ptr<views::View>
35 ContactInfoEditorViewController::CreateHeaderView() {
36 return base::MakeUnique<views::View>();
37 }
38
39 std::vector<EditorField>
40 ContactInfoEditorViewController::GetFieldDefinitions() {
41 std::vector<EditorField> fields;
42 if (spec()->request_payer_name()) {
43 fields.push_back(EditorField(
44 autofill::NAME_FULL,
45 l10n_util::GetStringUTF16(IDS_PAYMENTS_NAME_FIELD_IN_CONTACT_DETAILS),
46 EditorField::LengthHint::HINT_LONG, /*required=*/true));
47 }
48 if (spec()->request_payer_phone()) {
49 fields.push_back(EditorField(
50 autofill::PHONE_HOME_WHOLE_NUMBER,
51 l10n_util::GetStringUTF16(IDS_PAYMENTS_PHONE_FIELD_IN_CONTACT_DETAILS),
52 EditorField::LengthHint::HINT_LONG, /*required=*/true));
53 }
54 if (spec()->request_payer_email()) {
55 fields.push_back(EditorField(
56 autofill::EMAIL_ADDRESS,
57 l10n_util::GetStringUTF16(IDS_PAYMENTS_EMAIL_FIELD_IN_CONTACT_DETAILS),
58 EditorField::LengthHint::HINT_LONG, /*required=*/true));
59 }
60 return fields;
61 }
62
63 base::string16 ContactInfoEditorViewController::GetInitialValueForType(
64 autofill::ServerFieldType type) {
65 if (!profile_to_edit_)
66 return base::string16();
67
68 return profile_to_edit_->GetInfo(autofill::AutofillType(type),
69 state()->GetApplicationLocale());
70 }
71
72 bool ContactInfoEditorViewController::ValidateModelAndSave() {
73 // TODO(crbug.com/712224): Move this method and its helpers to a base class
74 // shared with the Shipping Address editor.
75 if (!ValidateModel())
76 return false;
77
78 if (profile_to_edit_) {
79 PopulateProfile(profile_to_edit_);
80 state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
81 } else {
82 std::unique_ptr<autofill::AutofillProfile> profile =
83 base::MakeUnique<autofill::AutofillProfile>();
84 PopulateProfile(profile.get());
85 state()->GetPersonalDataManager()->AddProfile(*profile);
86 // TODO(crbug.com/712224): Add to profile cache in state_.
87 }
88 return true;
89 }
90
91 std::unique_ptr<ValidationDelegate>
92 ContactInfoEditorViewController::CreateValidationDelegate(
93 const EditorField& field) {
94 return base::MakeUnique<ContactInfoValidationDelegate>(
95 field, state()->GetApplicationLocale(), this);
96 }
97
98 std::unique_ptr<ui::ComboboxModel>
99 ContactInfoEditorViewController::GetComboboxModelForType(
100 const autofill::ServerFieldType& type) {
101 NOTREACHED();
102 return nullptr;
103 }
104
105 base::string16 ContactInfoEditorViewController::GetSheetTitle() {
106 return profile_to_edit_ ? l10n_util::GetStringUTF16(
107 IDS_PAYMENTS_EDIT_CONTACT_DETAILS_LABEL)
108 : l10n_util::GetStringUTF16(
109 IDS_PAYMENTS_ADD_CONTACT_DETAILS_LABEL);
110 }
111
112 bool ContactInfoEditorViewController::ValidateModel() {
113 for (const auto& field : text_fields()) {
114 // Force a blur, as validation only occurs after the first blur.
115 field.first->OnBlur();
116 if (field.first->invalid())
117 return false;
118 }
119 return true;
120 }
121
122 void ContactInfoEditorViewController::PopulateProfile(
123 autofill::AutofillProfile* profile) {
124 for (const auto& field : text_fields()) {
125 profile->SetInfo(autofill::AutofillType(field.second.type),
126 field.first->text(), state()->GetApplicationLocale());
127 }
128 profile->set_origin(autofill::kSettingsOrigin);
129 }
130
131 ContactInfoEditorViewController::ContactInfoValidationDelegate::
132 ContactInfoValidationDelegate(const EditorField& field,
133 const std::string& locale,
134 EditorViewController* controller)
135 : field_(field), controller_(controller), locale_(locale) {}
136
137 ContactInfoEditorViewController::ContactInfoValidationDelegate::
138 ~ContactInfoValidationDelegate() {}
139
140 bool ContactInfoEditorViewController::ContactInfoValidationDelegate::
141 ValidateTextfield(views::Textfield* textfield) {
142 bool is_valid = true;
143 base::string16 error_message;
144
145 if (textfield->text().empty()) {
146 is_valid = false;
147 error_message = l10n_util::GetStringUTF16(
148 IDS_PAYMENTS_FIELD_REQUIRED_VALIDATION_MESSAGE);
149 } else {
150 switch (field_.type) {
151 case autofill::PHONE_HOME_WHOLE_NUMBER: {
152 const std::string default_region_code =
153 autofill::AutofillCountry::CountryCodeForLocale(locale_);
154 if (!autofill::IsValidPhoneNumber(textfield->text(),
155 default_region_code)) {
156 is_valid = false;
157 error_message = l10n_util::GetStringUTF16(
158 IDS_PAYMENTS_PHONE_INVALID_VALIDATION_MESSAGE);
159 }
160 break;
161 }
162
163 case autofill::EMAIL_ADDRESS: {
164 if (!autofill::IsValidEmailAddress(textfield->text())) {
165 is_valid = false;
166 error_message = l10n_util::GetStringUTF16(
167 IDS_PAYMENTS_EMAIL_INVALID_VALIDATION_MESSAGE);
168 }
169 break;
170 }
171
172 case autofill::NAME_FULL: {
173 // We have already determined that name is nonempty, which is the only
174 // requirement.
175 break;
176 }
177
178 default: {
179 NOTREACHED();
180 break;
181 }
182 }
183 }
184
185 controller_->DisplayErrorMessageForField(field_, error_message);
186 return is_valid;
187 }
188
189 bool ContactInfoEditorViewController::ContactInfoValidationDelegate::
190 ValidateCombobox(views::Combobox* combobox) {
191 // This UI doesn't contain any comboboxes.
192 NOTREACHED();
193 return true;
194 }
195
196 } // namespace payments
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698