OLD | NEW |
---|---|
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 for (int i = COUNTRY; i <= RECIPIENT; ++i) { | |
gone
2016/06/28 17:30:29
This seems frought with peril. Is there any way t
please use gerrit instead
2016/06/29 00:28:45
https://cs.chromium.org/chromium/src/third_party/l
| |
84 AddressField field = static_cast<AddressField>(i); | |
85 if (IsFieldRequired(field, country_code)) { | |
86 required.push_back(field); | |
87 } | |
88 } | |
89 | |
90 Java_AutofillProfileBridge_intArrayToList( | |
91 env, ToJavaIntArray(env, required).obj(), j_required_fields_list); | |
92 } | |
93 | |
86 static ScopedJavaLocalRef<jstring> GetAddressUiComponents( | 94 static ScopedJavaLocalRef<jstring> GetAddressUiComponents( |
87 JNIEnv* env, | 95 JNIEnv* env, |
88 const JavaParamRef<jclass>& clazz, | 96 const JavaParamRef<jclass>& clazz, |
89 const JavaParamRef<jstring>& j_country_code, | 97 const JavaParamRef<jstring>& j_country_code, |
90 const JavaParamRef<jstring>& j_language_code, | 98 const JavaParamRef<jstring>& j_language_code, |
91 const JavaParamRef<jobject>& j_id_list, | 99 const JavaParamRef<jobject>& j_id_list, |
92 const JavaParamRef<jobject>& j_name_list) { | 100 const JavaParamRef<jobject>& j_name_list, |
101 const JavaParamRef<jobject>& j_required_list, | |
102 const JavaParamRef<jobject>& j_length_list) { | |
93 std::string best_language_tag; | 103 std::string best_language_tag; |
94 std::vector<int> component_ids; | 104 std::vector<int> component_ids; |
95 std::vector<std::string> component_labels; | 105 std::vector<std::string> component_labels; |
96 ::i18n::addressinput::Localization localization; | 106 std::vector<int> component_required; |
107 std::vector<int> component_length; | |
108 Localization localization; | |
97 localization.SetGetter(l10n_util::GetStringUTF8); | 109 localization.SetGetter(l10n_util::GetStringUTF8); |
98 | 110 |
99 std::string language_code; | 111 std::string language_code; |
100 if (j_language_code != NULL) { | 112 if (j_language_code != NULL) { |
101 language_code = ConvertJavaStringToUTF8(env, j_language_code); | 113 language_code = ConvertJavaStringToUTF8(env, j_language_code); |
102 } | 114 } |
103 if (language_code.empty()) { | 115 if (language_code.empty()) { |
104 language_code = g_browser_process->GetApplicationLocale(); | 116 language_code = g_browser_process->GetApplicationLocale(); |
105 } | 117 } |
106 | 118 |
107 std::vector<::i18n::addressinput::AddressUiComponent> ui_components = | 119 std::string country_code = ConvertJavaStringToUTF8(env, j_country_code); |
108 ::i18n::addressinput::BuildComponents( | 120 std::vector<AddressUiComponent> ui_components = BuildComponents( |
109 ConvertJavaStringToUTF8(env, j_country_code), localization, | 121 country_code, localization, language_code, &best_language_tag); |
110 language_code, &best_language_tag); | |
111 | 122 |
112 for (auto ui_component : ui_components) { | 123 for (const auto& ui_component : ui_components) { |
113 component_labels.push_back(ui_component.name); | 124 component_labels.push_back(ui_component.name); |
114 | 125 component_required.push_back( |
115 switch (ui_component.field) { | 126 IsFieldRequired(ui_component.field, country_code)); |
116 case ::i18n::addressinput::COUNTRY: | 127 component_length.push_back(ui_component.length_hint == |
117 component_ids.push_back(AddressField::COUNTRY); | 128 AddressUiComponent::HINT_LONG); |
118 break; | 129 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 } | 130 } |
147 | 131 |
148 Java_AutofillProfileBridge_intArrayToList(env, | 132 Java_AutofillProfileBridge_intArrayToList( |
149 ToJavaIntArray( | 133 env, ToJavaIntArray(env, component_ids).obj(), j_id_list); |
150 env, component_ids).obj(), | 134 Java_AutofillProfileBridge_stringArrayToList( |
151 j_id_list); | 135 env, ToJavaArrayOfStrings(env, component_labels).obj(), j_name_list); |
152 Java_AutofillProfileBridge_stringArrayToList(env, | 136 Java_AutofillProfileBridge_intArrayToList( |
153 ToJavaArrayOfStrings( | 137 env, ToJavaIntArray(env, component_required).obj(), j_required_list); |
154 env, component_labels).obj(), | 138 Java_AutofillProfileBridge_intArrayToList( |
155 j_name_list); | 139 env, ToJavaIntArray(env, component_length).obj(), j_length_list); |
156 | 140 |
157 return ConvertUTF8ToJavaString(env, best_language_tag); | 141 return ConvertUTF8ToJavaString(env, best_language_tag); |
158 } | 142 } |
159 | 143 |
160 // static | 144 // static |
161 bool RegisterAutofillProfileBridge(JNIEnv* env) { | 145 bool RegisterAutofillProfileBridge(JNIEnv* env) { |
162 return RegisterNativesImpl(env); | 146 return RegisterNativesImpl(env); |
163 } | 147 } |
164 | 148 |
165 } // namespace autofill | 149 } // namespace autofill |
OLD | NEW |