Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / base / l10n / l10n_util_android.cc
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 bool IsLayoutRtl() {
27   static bool is_layout_rtl_cached = false;
28   static bool layout_rtl_cache;
29
30   if (!is_layout_rtl_cached) {
31     is_layout_rtl_cached = true;
32     JNIEnv* env = base::android::AttachCurrentThread();
33     layout_rtl_cache =
34         static_cast<bool>(Java_LocalizationUtils_isLayoutRtl(env));
35   }
36
37   return layout_rtl_cache;
38 }
39
40 namespace {
41
42 // Common prototype of ICU uloc_getXXX() functions.
43 typedef int32_t (*UlocGetComponentFunc)(const char*, char*, int32_t,
44                                         UErrorCode*);
45
46 std::string GetLocaleComponent(const std::string& locale,
47                                UlocGetComponentFunc uloc_func,
48                                int32_t max_capacity) {
49   std::string result;
50   UErrorCode error = U_ZERO_ERROR;
51   int32_t actual_length = uloc_func(locale.c_str(),
52                                     WriteInto(&result, max_capacity),
53                                     max_capacity,
54                                     &error);
55   DCHECK(U_SUCCESS(error));
56   DCHECK(actual_length < max_capacity);
57   result.resize(actual_length);
58   return result;
59 }
60
61 ScopedJavaLocalRef<jobject> NewJavaLocale(
62     JNIEnv* env,
63     const std::string& locale) {
64   // TODO(wangxianzhu): Use new Locale API once Android supports scripts.
65   std::string language = GetLocaleComponent(
66       locale, uloc_getLanguage, ULOC_LANG_CAPACITY);
67   std::string country = GetLocaleComponent(
68       locale, uloc_getCountry, ULOC_COUNTRY_CAPACITY);
69   std::string variant = GetLocaleComponent(
70       locale, uloc_getVariant, ULOC_FULLNAME_CAPACITY);
71   return Java_LocalizationUtils_getJavaLocale(env,
72           base::android::ConvertUTF8ToJavaString(env, language).obj(),
73           base::android::ConvertUTF8ToJavaString(env, country).obj(),
74           base::android::ConvertUTF8ToJavaString(env, variant).obj());
75 }
76
77 }  // namespace
78
79 base::string16 GetDisplayNameForLocale(const std::string& locale,
80                                        const std::string& display_locale) {
81   JNIEnv* env = base::android::AttachCurrentThread();
82   ScopedJavaLocalRef<jobject> java_locale =
83       NewJavaLocale(env, locale);
84   ScopedJavaLocalRef<jobject> java_display_locale =
85       NewJavaLocale(env, display_locale);
86
87   ScopedJavaLocalRef<jstring> java_result(
88       Java_LocalizationUtils_getDisplayNameForLocale(
89           env,
90           java_locale.obj(),
91           java_display_locale.obj()));
92   return ConvertJavaStringToUTF16(java_result);
93 }
94
95 jstring GetDurationString(JNIEnv* env, jclass clazz, jlong timeInMillis) {
96   ScopedJavaLocalRef<jstring> jtime_remaining =
97       base::android::ConvertUTF16ToJavaString(
98           env,
99           ui::TimeFormat::Simple(
100               ui::TimeFormat::FORMAT_REMAINING, ui::TimeFormat::LENGTH_SHORT,
101               base::TimeDelta::FromMilliseconds(timeInMillis)));
102   return jtime_remaining.Release();
103 }
104
105 bool RegisterLocalizationUtil(JNIEnv* env) {
106   return RegisterNativesImpl(env);
107 }
108
109 }  // namespace l10n_util