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

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: compile error + 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/views/controls/label.h"
20 #include "ui/views/controls/textfield/textfield.h"
21
22 namespace payments {
23
24 ContactInfoEditorViewController::ContactInfoEditorViewController(
25 PaymentRequestSpec* spec,
26 PaymentRequestState* state,
27 PaymentRequestDialogView* dialog,
28 autofill::AutofillProfile* profile)
29 : EditorViewController(spec, state, dialog), profile_to_edit_(profile) {}
30
31 ContactInfoEditorViewController::~ContactInfoEditorViewController() {}
32
33 std::unique_ptr<views::View>
34 ContactInfoEditorViewController::CreateHeaderView() {
35 return base::MakeUnique<views::View>();
36 }
37
38 std::vector<EditorField>
39 ContactInfoEditorViewController::GetFieldDefinitions() {
40 std::vector<EditorField> fields;
41 if (spec()->request_payer_name()) {
42 fields.push_back(EditorField(
43 autofill::NAME_FULL,
44 l10n_util::GetStringUTF16(IDS_PAYMENTS_NAME_FIELD_IN_CONTACT_DETAILS),
45 EditorField::LengthHint::HINT_LONG, /* required= */ true));
Mathieu 2017/04/17 02:50:09 very nit: I started preferring /*required=*/true s
tmartino 2017/04/18 19:39:17 Done
46 }
47 if (spec()->request_payer_phone()) {
48 fields.push_back(EditorField(
49 autofill::PHONE_HOME_WHOLE_NUMBER,
50 l10n_util::GetStringUTF16(IDS_PAYMENTS_PHONE_FIELD_IN_CONTACT_DETAILS),
51 EditorField::LengthHint::HINT_LONG, /* required= */ true));
52 }
53 if (spec()->request_payer_email()) {
54 fields.push_back(EditorField(
55 autofill::EMAIL_ADDRESS,
56 l10n_util::GetStringUTF16(IDS_PAYMENTS_EMAIL_FIELD_IN_CONTACT_DETAILS),
57 EditorField::LengthHint::HINT_LONG, /* required= */ true));
58 }
59 return fields;
60 }
61
62 base::string16 ContactInfoEditorViewController::GetInitialValueForType(
63 autofill::ServerFieldType type) {
64 if (!profile_to_edit_)
65 return base::string16();
66
67 return profile_to_edit_->GetInfo(autofill::AutofillType(type),
68 state()->GetApplicationLocale());
69 }
70
71 bool ContactInfoEditorViewController::ValidateModelAndSave() {
72 // TODO(tmartino): Move this method and its helpers to a base class shared
Mathieu 2017/04/17 02:50:09 Since the code is getting pretty mature, we should
tmartino 2017/04/18 19:39:17 crbug.com/712224
73 // with the Shipping Address editor.
74 if (!ValidateModel())
75 return false;
76
77 if (profile_to_edit_) {
78 PopulateProfile(profile_to_edit_);
79 state()->GetPersonalDataManager()->UpdateProfile(*profile_to_edit_);
80 } else {
81 std::unique_ptr<autofill::AutofillProfile> profile =
82 base::MakeUnique<autofill::AutofillProfile>();
83 PopulateProfile(profile.get());
84 state()->GetPersonalDataManager()->AddProfile(*profile);
85 // TODO(tmartino): Add to profile cache in state_.
86 }
87 return true;
88 }
89
90 std::unique_ptr<ValidationDelegate>
91 ContactInfoEditorViewController::CreateValidationDelegate(
92 const EditorField& field) {
93 return base::MakeUnique<ContactInfoValidationDelegate>(
94 field, state()->GetApplicationLocale(), this);
95 }
96
97 std::unique_ptr<ui::ComboboxModel>
98 ContactInfoEditorViewController::GetComboboxModelForType(
99 const autofill::ServerFieldType& type) {
100 NOTREACHED();
101 return std::unique_ptr<ui::ComboboxModel>(nullptr);
Mathieu 2017/04/17 02:50:09 nit: I wonder if "return nullptr;" also works here
tmartino 2017/04/18 19:39:17 Yup! Done.
102 }
103
104 base::string16 ContactInfoEditorViewController::GetSheetTitle() {
105 return profile_to_edit_ ? l10n_util::GetStringUTF16(
106 IDS_PAYMENTS_EDIT_CONTACT_DETAILS_LABEL)
107 : l10n_util::GetStringUTF16(
108 IDS_PAYMENTS_ADD_CONTACT_DETAILS_LABEL);
Mathieu 2017/04/17 02:50:09 Cool, I filed crbug.com/712074 for so that the oth
109 }
110
111 bool ContactInfoEditorViewController::ValidateModel() {
112 for (const auto& field : text_fields()) {
113 // Force a blur, as validation only occurs after the first blur.
114 field.first->OnBlur();
Mathieu 2017/04/17 02:50:09 interesting, I thought when this was called it was
tmartino 2017/04/18 19:39:17 I got this behavior from the Shipping Address Edit
115 if (field.first->invalid())
116 return false;
117 }
118 return true;
119 }
120
121 void ContactInfoEditorViewController::PopulateProfile(
122 autofill::AutofillProfile* profile) {
123 const std::string& locale = state()->GetApplicationLocale();
124 for (const auto& field : text_fields()) {
125 profile->SetInfo(autofill::AutofillType(field.second.type),
126 field.first->text(), locale);
Mathieu 2017/04/17 02:50:09 nit: can inline state()->GetApplicationLocale() wi
tmartino 2017/04/18 19:39:17 Done
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