1 // Copyright (c) 2012 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 "ui/base/l10n/l10n_util_android.h" 6 7 #include "base/android/jni_android.h" 8 #include "base/android/jni_string.h" 9 #include "base/android/scoped_java_ref.h" 10 #include "base/i18n/rtl.h" 11 #include "base/logging.h" 12 #include "base/strings/string_util.h" 13 #include "base/time/time.h" 14 #include "jni/LocalizationUtils_jni.h" 15 #include "third_party/icu/source/common/unicode/uloc.h" 16 #include "ui/base/l10n/time_format.h" 17 18 namespace l10n_util { 19 20 jint GetFirstStrongCharacterDirection(JNIEnv* env, jclass clazz, 21 jstring string) { 22 return base::i18n::GetFirstStrongCharacterDirection( 23 base::android::ConvertJavaStringToUTF16(env, string)); 24 } 25 26 std::string GetDefaultLocale() { 27 JNIEnv* env = base::android::AttachCurrentThread(); 28 ScopedJavaLocalRef<jstring> locale = Java_LocalizationUtils_getDefaultLocale( 29 env); 30 return ConvertJavaStringToUTF8(locale); 31 } 32 33 bool IsLayoutRtl() { 34 static bool is_layout_rtl_cached = false; 35 static bool layout_rtl_cache; 36 37 if (!is_layout_rtl_cached) { 38 is_layout_rtl_cached = true; 39 JNIEnv* env = base::android::AttachCurrentThread(); 40 layout_rtl_cache = 41 static_cast<bool>(Java_LocalizationUtils_isLayoutRtl(env)); 42 } 43 44 return layout_rtl_cache; 45 } 46 47 namespace { 48 49 // Common prototype of ICU uloc_getXXX() functions. 50 typedef int32_t (*UlocGetComponentFunc)(const char*, char*, int32_t, 51 UErrorCode*); 52 53 std::string GetLocaleComponent(const std::string& locale, 54 UlocGetComponentFunc uloc_func, 55 int32_t max_capacity) { 56 std::string result; 57 UErrorCode error = U_ZERO_ERROR; 58 int32_t actual_length = uloc_func(locale.c_str(), 59 WriteInto(&result, max_capacity), 60 max_capacity, 61 &error); 62 DCHECK(U_SUCCESS(error)); 63 DCHECK(actual_length < max_capacity); 64 result.resize(actual_length); 65 return result; 66 } 67 68 ScopedJavaLocalRef<jobject> NewJavaLocale( 69 JNIEnv* env, 70 const std::string& locale) { 71 // TODO(wangxianzhu): Use new Locale API once Android supports scripts. 72 std::string language = GetLocaleComponent( 73 locale, uloc_getLanguage, ULOC_LANG_CAPACITY); 74 std::string country = GetLocaleComponent( 75 locale, uloc_getCountry, ULOC_COUNTRY_CAPACITY); 76 std::string variant = GetLocaleComponent( 77 locale, uloc_getVariant, ULOC_FULLNAME_CAPACITY); 78 return Java_LocalizationUtils_getJavaLocale(env, 79 base::android::ConvertUTF8ToJavaString(env, language).obj(), 80 base::android::ConvertUTF8ToJavaString(env, country).obj(), 81 base::android::ConvertUTF8ToJavaString(env, variant).obj()); 82 } 83 84 } // namespace 85 86 base::string16 GetDisplayNameForLocale(const std::string& locale, 87 const std::string& display_locale) { 88 JNIEnv* env = base::android::AttachCurrentThread(); 89 ScopedJavaLocalRef<jobject> java_locale = 90 NewJavaLocale(env, locale); 91 ScopedJavaLocalRef<jobject> java_display_locale = 92 NewJavaLocale(env, display_locale); 93 94 ScopedJavaLocalRef<jstring> java_result( 95 Java_LocalizationUtils_getDisplayNameForLocale( 96 env, 97 java_locale.obj(), 98 java_display_locale.obj())); 99 return ConvertJavaStringToUTF16(java_result); 100 } 101 102 jstring GetDurationString(JNIEnv* env, jclass clazz, jlong timeInMillis) { 103 ScopedJavaLocalRef<jstring> jtime_remaining = 104 base::android::ConvertUTF16ToJavaString( 105 env, 106 ui::TimeFormat::Simple( 107 ui::TimeFormat::FORMAT_REMAINING, ui::TimeFormat::LENGTH_SHORT, 108 base::TimeDelta::FromMilliseconds(timeInMillis))); 109 return jtime_remaining.Release(); 110 } 111 112 bool RegisterLocalizationUtil(JNIEnv* env) { 113 return RegisterNativesImpl(env); 114 } 115 116 } // namespace l10n_util 117