OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/android/preferences/autofill/autofill_profile_bridge.h" |
| 6 |
| 7 #include <jni.h> |
| 8 |
| 9 #include "base/android/jni_android.h" |
| 10 #include "base/android/jni_array.h" |
| 11 #include "base/android/jni_string.h" |
| 12 #include "base/bind.h" |
| 13 #include "jni/AutofillProfileBridge_jni.h" |
| 14 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui
.h" |
| 15 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui
_component.h" |
| 16 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/localizati
on.h" |
| 17 #include "ui/base/l10n/l10n_util.h" |
| 18 |
| 19 using base::android::ConvertJavaStringToUTF8; |
| 20 using base::android::ToJavaArrayOfStrings; |
| 21 using ::i18n::addressinput::AddressUiComponent; |
| 22 using ::i18n::addressinput::BuildComponents; |
| 23 using ::i18n::addressinput::GetRegionCodes; |
| 24 using ::i18n::addressinput::Localization; |
| 25 |
| 26 namespace autofill{ |
| 27 namespace android{ |
| 28 |
| 29 static void GetAvailableCountries(JNIEnv* env, |
| 30 jclass clazz, |
| 31 jobject j_country_list) { |
| 32 std::vector<std::string> regionCodes = GetRegionCodes(); |
| 33 Java_AutofillProfileBridge_stringArrayToList(env, |
| 34 ToJavaArrayOfStrings( |
| 35 env, regionCodes).obj(), |
| 36 j_country_list); |
| 37 } |
| 38 |
| 39 static void GetAddressUiComponents(JNIEnv* env, |
| 40 jclass clazz, |
| 41 jstring country_code, |
| 42 jstring ui_language_tag, |
| 43 jobject j_id_list, |
| 44 jobject j_name_list) { |
| 45 std::string best_language_tag; |
| 46 std::string language_code; |
| 47 std::vector<std::string> componentIds; |
| 48 std::vector<std::string> componentLabels; |
| 49 Localization localization; |
| 50 localization.SetGetter(l10n_util::GetStringUTF8); |
| 51 |
| 52 // Format ui_langage_tag by replacing _'s with -'s. The Java strings coming |
| 53 // from Android are in the format en_US and the C++ equivalent is en-US |
| 54 std::string language_tag = ConvertJavaStringToUTF8(env, ui_language_tag); |
| 55 std::replace(language_tag.begin(), language_tag.end(), '_', '-'); |
| 56 |
| 57 std::vector<AddressUiComponent> uiComponents = BuildComponents( |
| 58 ConvertJavaStringToUTF8(env, country_code), localization, |
| 59 ConvertJavaStringToUTF8(env, ui_language_tag), &best_language_tag); |
| 60 |
| 61 for (auto uiComponent : uiComponents) { |
| 62 // TODO(twellington): debug localization problem: |
| 63 // If the language is changed in the phone's settings menu after Chrome |
| 64 // settings have been launched, when this method gets triggered the strings |
| 65 // returned are still in the original language. E.g. If I open Chrome |
| 66 // settings then switch from English to Spanish, then go to the autofill |
| 67 // address form, the field labels (obtained from this function) are |
| 68 // still in English. If I back out of settings then reopen settings and go |
| 69 // to the autofill address form, the field labels are in Spanish. |
| 70 componentLabels.push_back(uiComponent.name); |
| 71 |
| 72 switch (uiComponent.field) { |
| 73 case ::i18n::addressinput::COUNTRY: |
| 74 componentIds.push_back("country"); |
| 75 break; |
| 76 case ::i18n::addressinput::ADMIN_AREA: |
| 77 componentIds.push_back("admin_area"); |
| 78 break; |
| 79 case ::i18n::addressinput::LOCALITY: |
| 80 componentIds.push_back("locality"); |
| 81 break; |
| 82 case ::i18n::addressinput::DEPENDENT_LOCALITY: |
| 83 componentIds.push_back("dependent_locality"); |
| 84 break; |
| 85 case ::i18n::addressinput::SORTING_CODE: |
| 86 componentIds.push_back("sorting_code"); |
| 87 break; |
| 88 case ::i18n::addressinput::POSTAL_CODE: |
| 89 componentIds.push_back("postal_code"); |
| 90 break; |
| 91 case ::i18n::addressinput::STREET_ADDRESS: |
| 92 componentIds.push_back("street_address"); |
| 93 break; |
| 94 case ::i18n::addressinput::ORGANIZATION: |
| 95 componentIds.push_back("organization"); |
| 96 break; |
| 97 case ::i18n::addressinput::RECIPIENT: |
| 98 componentIds.push_back("recipient"); |
| 99 break; |
| 100 } |
| 101 } |
| 102 |
| 103 Java_AutofillProfileBridge_stringArrayToList(env, |
| 104 ToJavaArrayOfStrings( |
| 105 env, componentIds).obj(), |
| 106 j_id_list); |
| 107 Java_AutofillProfileBridge_stringArrayToList(env, |
| 108 ToJavaArrayOfStrings( |
| 109 env, componentLabels).obj(), |
| 110 j_name_list); |
| 111 } |
| 112 |
| 113 // static |
| 114 bool RegisterAutofillProfileBridge(JNIEnv* env) { |
| 115 return RegisterNativesImpl(env); |
| 116 } |
| 117 |
| 118 } // namespace android |
| 119 } // namespace autofill |
OLD | NEW |