• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GetFirstStrongCharacterDirection(JNIEnv * env,jclass clazz,jstring string)20 jint GetFirstStrongCharacterDirection(JNIEnv* env, jclass clazz,
21                                       jstring string) {
22   return base::i18n::GetFirstStrongCharacterDirection(
23       base::android::ConvertJavaStringToUTF16(env, string));
24 }
25 
GetDefaultLocale()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 
IsLayoutRtl()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 
GetLocaleComponent(const std::string & locale,UlocGetComponentFunc uloc_func,int32_t max_capacity)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 
NewJavaLocale(JNIEnv * env,const std::string & locale)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 
GetDisplayNameForLocale(const std::string & locale,const std::string & display_locale)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 
GetDurationString(JNIEnv * env,jclass clazz,jlong timeInMillis)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 
RegisterLocalizationUtil(JNIEnv * env)112 bool RegisterLocalizationUtil(JNIEnv* env) {
113   return RegisterNativesImpl(env);
114 }
115 
116 }  // namespace l10n_util
117