1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)package org.chromium.ui.base;
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.content.res.Configuration;
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.view.View;
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.base.ApiCompatibilityUtils;
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.base.ApplicationStatus;
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.base.CalledByNative;
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.base.JNINamespace;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.base.LocaleUtils;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.util.Locale;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This class provides the locale related methods for the native library.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)@JNINamespace("l10n_util")
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public class LocalizationUtils {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is mirrored from base/i18n/rtl.h. Please keep in sync.
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static final int UNKNOWN_DIRECTION = 0;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static final int RIGHT_TO_LEFT = 1;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static final int LEFT_TO_RIGHT = 2;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    private static Boolean sIsLayoutRtl;
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private LocalizationUtils() { /* cannot be instantiated */ }
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @return the default locale, translating Android deprecated
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * language codes into the modern ones used by Chromium.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @CalledByNative
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static String getDefaultLocale() {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        // TODO(vivekg): Native callers should use LocaleUtils directly instead of the redirection.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return LocaleUtils.getDefaultLocale();
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @CalledByNative
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private static Locale getJavaLocale(String language, String country, String variant) {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return new Locale(language, country, variant);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    @CalledByNative
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private static String getDisplayNameForLocale(Locale locale, Locale displayLocale) {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return locale.getDisplayName(displayLocale);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * Returns whether the Android layout direction is RTL.
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     *
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * Note that the locale direction can be different from layout direction. Two known cases:
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * - RTL languages on Android 4.1, due to the lack of RTL layout support on 4.1.
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * - When user turned on force RTL layout option under developer options.
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     *
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     * Therefore, only this function should be used to query RTL for layout purposes.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    @CalledByNative
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    public static boolean isLayoutRtl() {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (sIsLayoutRtl == null) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            Configuration configuration =
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ApplicationStatus.getApplicationContext().getResources().getConfiguration();
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            sIsLayoutRtl = Boolean.valueOf(
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    ApiCompatibilityUtils.getLayoutDirection(configuration) ==
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    View.LAYOUT_DIRECTION_RTL);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return sIsLayoutRtl.booleanValue();
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Jni binding to base::i18n::GetFirstStrongCharacterDirection
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @param string String to decide the direction.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * @return One of the UNKNOWN_DIRECTION, RIGHT_TO_LEFT, and LEFT_TO_RIGHT.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    public static int getFirstStrongCharacterDirection(String string) {
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return nativeGetFirstStrongCharacterDirection(string);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /**
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * Jni binding to ui::TimeFormat::TimeRemaining. Converts milliseconds to
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * time remaining format : "3 mins left", "2 days left".
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * @param timeInMillis time in milliseconds
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     * @return time remaining
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     */
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    public static String getDurationString(long timeInMillis) {
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return nativeGetDurationString(timeInMillis);
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    private static native int nativeGetFirstStrongCharacterDirection(String string);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private static native String nativeGetDurationString(long timeInMillis);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
98