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

Side by Side Diff: chrome/browser/android/preferences/autofill/autofill_profile_bridge.cc

Issue 2093363002: Autofill address editor in PaymentRequest UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@contact-editor
Patch Set: Fix try-bot Created 4 years, 5 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/preferences/autofill/autofill_profile_bridge.h" 5 #include "chrome/browser/android/preferences/autofill/autofill_profile_bridge.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_array.h" 10 #include "base/android/jni_array.h"
11 #include "base/android/jni_string.h" 11 #include "base/android/jni_string.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/browser_process.h" 14 #include "chrome/browser/browser_process.h"
15 #include "components/autofill/core/browser/autofill_country.h" 15 #include "components/autofill/core/browser/autofill_country.h"
16 #include "jni/AutofillProfileBridge_jni.h" 16 #include "jni/AutofillProfileBridge_jni.h"
17 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_fi eld.h"
18 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_me tadata.h"
17 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui .h" 19 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui .h"
18 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui _component.h" 20 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui _component.h"
19 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/localizati on.h" 21 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/localizati on.h"
20 #include "ui/base/l10n/l10n_util.h" 22 #include "ui/base/l10n/l10n_util.h"
21 23
24 namespace autofill {
25
22 using base::android::ConvertJavaStringToUTF8; 26 using base::android::ConvertJavaStringToUTF8;
23 using base::android::ConvertUTF8ToJavaString; 27 using base::android::ConvertUTF8ToJavaString;
24 using base::android::ToJavaArrayOfStrings; 28 using base::android::ToJavaArrayOfStrings;
25 using base::android::ToJavaIntArray; 29 using base::android::ToJavaIntArray;
26 30 using ::i18n::addressinput::AddressField;
27 namespace autofill { 31 using ::i18n::addressinput::AddressUiComponent;
28 32 using ::i18n::addressinput::BuildComponents;
29 namespace { 33 using ::i18n::addressinput::COUNTRY;
30 34 using ::i18n::addressinput::GetRegionCodes;
31 // Address field types. This list must be kept in-sync with the corresponding 35 using ::i18n::addressinput::IsFieldRequired;
32 // AddressField class in AutofillProfileBridge.java. 36 using ::i18n::addressinput::Localization;
33 enum AddressField { 37 using ::i18n::addressinput::RECIPIENT;
34 COUNTRY, // Country code.
35 ADMIN_AREA, // Administrative area such as a state, province,
36 // island, etc.
37 LOCALITY, // City or locality.
38 DEPENDENT_LOCALITY, // Dependent locality (may be an inner-city district or
39 // a suburb).
40 SORTING_CODE, // Sorting code.
41 POSTAL_CODE, // Zip or postal code.
42 STREET_ADDRESS, // Street address lines.
43 ORGANIZATION, // Organization, company, firm, institution, etc.
44 RECIPIENT // Name.
45 };
46
47 } // namespace
48 38
49 static ScopedJavaLocalRef<jstring> GetDefaultCountryCode( 39 static ScopedJavaLocalRef<jstring> GetDefaultCountryCode(
50 JNIEnv* env, 40 JNIEnv* env,
51 const JavaParamRef<jclass>& clazz) { 41 const JavaParamRef<jclass>& clazz) {
52 std::string default_country_code = 42 std::string default_country_code =
53 autofill::AutofillCountry::CountryCodeForLocale( 43 autofill::AutofillCountry::CountryCodeForLocale(
54 g_browser_process->GetApplicationLocale()); 44 g_browser_process->GetApplicationLocale());
55 return ConvertUTF8ToJavaString(env, default_country_code); 45 return ConvertUTF8ToJavaString(env, default_country_code);
56 } 46 }
57 47
58 static void GetSupportedCountries( 48 static void GetSupportedCountries(
59 JNIEnv* env, 49 JNIEnv* env,
60 const JavaParamRef<jclass>& clazz, 50 const JavaParamRef<jclass>& clazz,
61 const JavaParamRef<jobject>& j_country_code_list, 51 const JavaParamRef<jobject>& j_country_code_list,
62 const JavaParamRef<jobject>& j_country_name_list) { 52 const JavaParamRef<jobject>& j_country_name_list) {
63 std::vector<std::string> country_codes = 53 std::vector<std::string> country_codes = GetRegionCodes();
64 ::i18n::addressinput::GetRegionCodes();
65 std::vector<std::string> known_country_codes; 54 std::vector<std::string> known_country_codes;
66 std::vector<base::string16> known_country_names; 55 std::vector<base::string16> known_country_names;
67 std::string locale = g_browser_process->GetApplicationLocale(); 56 std::string locale = g_browser_process->GetApplicationLocale();
68 for (auto country_code : country_codes) { 57 for (auto country_code : country_codes) {
69 const base::string16& country_name = 58 const base::string16& country_name =
70 l10n_util::GetDisplayNameForCountry(country_code, locale); 59 l10n_util::GetDisplayNameForCountry(country_code, locale);
71 // Don't display a country code for which a name is not known yet. 60 // Don't display a country code for which a name is not known yet.
72 if (country_name != base::UTF8ToUTF16(country_code)) { 61 if (country_name != base::UTF8ToUTF16(country_code)) {
73 known_country_codes.push_back(country_code); 62 known_country_codes.push_back(country_code);
74 known_country_names.push_back(country_name); 63 known_country_names.push_back(country_name);
75 } 64 }
76 } 65 }
77 66
78 Java_AutofillProfileBridge_stringArrayToList( 67 Java_AutofillProfileBridge_stringArrayToList(
79 env, ToJavaArrayOfStrings(env, known_country_codes).obj(), 68 env, ToJavaArrayOfStrings(env, known_country_codes).obj(),
80 j_country_code_list); 69 j_country_code_list);
81 Java_AutofillProfileBridge_stringArrayToList( 70 Java_AutofillProfileBridge_stringArrayToList(
82 env, ToJavaArrayOfStrings(env, known_country_names).obj(), 71 env, ToJavaArrayOfStrings(env, known_country_names).obj(),
83 j_country_name_list); 72 j_country_name_list);
84 } 73 }
85 74
75 static void GetRequiredFields(
76 JNIEnv* env,
77 const JavaParamRef<jclass>& clazz,
78 const JavaParamRef<jstring>& j_country_code,
79 const JavaParamRef<jobject>& j_required_fields_list) {
80 std::string country_code = ConvertJavaStringToUTF8(env, j_country_code);
81 std::vector<int> required;
82
83 // Should iterate over all fields in:
84 // third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h
85 for (int i = COUNTRY; i <= RECIPIENT; ++i) {
86 AddressField field = static_cast<AddressField>(i);
87 if (IsFieldRequired(field, country_code)) {
88 required.push_back(field);
89 }
90 }
91
92 Java_AutofillProfileBridge_intArrayToList(
93 env, ToJavaIntArray(env, required).obj(), j_required_fields_list);
94 }
95
86 static ScopedJavaLocalRef<jstring> GetAddressUiComponents( 96 static ScopedJavaLocalRef<jstring> GetAddressUiComponents(
87 JNIEnv* env, 97 JNIEnv* env,
88 const JavaParamRef<jclass>& clazz, 98 const JavaParamRef<jclass>& clazz,
89 const JavaParamRef<jstring>& j_country_code, 99 const JavaParamRef<jstring>& j_country_code,
90 const JavaParamRef<jstring>& j_language_code, 100 const JavaParamRef<jstring>& j_language_code,
91 const JavaParamRef<jobject>& j_id_list, 101 const JavaParamRef<jobject>& j_id_list,
92 const JavaParamRef<jobject>& j_name_list) { 102 const JavaParamRef<jobject>& j_name_list,
103 const JavaParamRef<jobject>& j_required_list,
104 const JavaParamRef<jobject>& j_length_list) {
93 std::string best_language_tag; 105 std::string best_language_tag;
94 std::vector<int> component_ids; 106 std::vector<int> component_ids;
95 std::vector<std::string> component_labels; 107 std::vector<std::string> component_labels;
96 ::i18n::addressinput::Localization localization; 108 std::vector<int> component_required;
109 std::vector<int> component_length;
110 Localization localization;
97 localization.SetGetter(l10n_util::GetStringUTF8); 111 localization.SetGetter(l10n_util::GetStringUTF8);
98 112
99 std::string language_code; 113 std::string language_code;
100 if (j_language_code != NULL) { 114 if (j_language_code != NULL) {
101 language_code = ConvertJavaStringToUTF8(env, j_language_code); 115 language_code = ConvertJavaStringToUTF8(env, j_language_code);
102 } 116 }
103 if (language_code.empty()) { 117 if (language_code.empty()) {
104 language_code = g_browser_process->GetApplicationLocale(); 118 language_code = g_browser_process->GetApplicationLocale();
105 } 119 }
106 120
107 std::vector<::i18n::addressinput::AddressUiComponent> ui_components = 121 std::string country_code = ConvertJavaStringToUTF8(env, j_country_code);
108 ::i18n::addressinput::BuildComponents( 122 std::vector<AddressUiComponent> ui_components = BuildComponents(
109 ConvertJavaStringToUTF8(env, j_country_code), localization, 123 country_code, localization, language_code, &best_language_tag);
110 language_code, &best_language_tag);
111 124
112 for (auto ui_component : ui_components) { 125 for (const auto& ui_component : ui_components) {
113 component_labels.push_back(ui_component.name); 126 component_labels.push_back(ui_component.name);
114 127 component_required.push_back(
115 switch (ui_component.field) { 128 IsFieldRequired(ui_component.field, country_code));
116 case ::i18n::addressinput::COUNTRY: 129 component_length.push_back(ui_component.length_hint ==
117 component_ids.push_back(AddressField::COUNTRY); 130 AddressUiComponent::HINT_LONG);
118 break; 131 component_ids.push_back(ui_component.field);
119 case ::i18n::addressinput::ADMIN_AREA:
120 component_ids.push_back(AddressField::ADMIN_AREA);
121 break;
122 case ::i18n::addressinput::LOCALITY:
123 component_ids.push_back(AddressField::LOCALITY);
124 break;
125 case ::i18n::addressinput::DEPENDENT_LOCALITY:
126 component_ids.push_back(AddressField::DEPENDENT_LOCALITY);
127 break;
128 case ::i18n::addressinput::SORTING_CODE:
129 component_ids.push_back(AddressField::SORTING_CODE);
130 break;
131 case ::i18n::addressinput::POSTAL_CODE:
132 component_ids.push_back(AddressField::POSTAL_CODE);
133 break;
134 case ::i18n::addressinput::STREET_ADDRESS:
135 component_ids.push_back(AddressField::STREET_ADDRESS);
136 break;
137 case ::i18n::addressinput::ORGANIZATION:
138 component_ids.push_back(AddressField::ORGANIZATION);
139 break;
140 case ::i18n::addressinput::RECIPIENT:
141 component_ids.push_back(AddressField::RECIPIENT);
142 break;
143 default:
144 NOTREACHED();
145 }
146 } 132 }
147 133
148 Java_AutofillProfileBridge_intArrayToList(env, 134 Java_AutofillProfileBridge_intArrayToList(
149 ToJavaIntArray( 135 env, ToJavaIntArray(env, component_ids).obj(), j_id_list);
150 env, component_ids).obj(), 136 Java_AutofillProfileBridge_stringArrayToList(
151 j_id_list); 137 env, ToJavaArrayOfStrings(env, component_labels).obj(), j_name_list);
152 Java_AutofillProfileBridge_stringArrayToList(env, 138 Java_AutofillProfileBridge_intArrayToList(
153 ToJavaArrayOfStrings( 139 env, ToJavaIntArray(env, component_required).obj(), j_required_list);
154 env, component_labels).obj(), 140 Java_AutofillProfileBridge_intArrayToList(
155 j_name_list); 141 env, ToJavaIntArray(env, component_length).obj(), j_length_list);
156 142
157 return ConvertUTF8ToJavaString(env, best_language_tag); 143 return ConvertUTF8ToJavaString(env, best_language_tag);
158 } 144 }
159 145
160 // static 146 // static
161 bool RegisterAutofillProfileBridge(JNIEnv* env) { 147 bool RegisterAutofillProfileBridge(JNIEnv* env) {
162 return RegisterNativesImpl(env); 148 return RegisterNativesImpl(env);
163 } 149 }
164 150
165 } // namespace autofill 151 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698