blob: ee0803368c96df23469a2cdefa25fbc932c3a997 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.providers.contacts;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.icu.util.ULocale;
import android.os.LocaleList;
import android.text.TextUtils;
import com.google.common.annotations.VisibleForTesting;
import java.util.Locale;
import java.util.Objects;
public class LocaleSet {
private static final String SCRIPT_SIMPLIFIED_CHINESE = "Hans";
private static final String SCRIPT_TRADITIONAL_CHINESE = "Hant";
private final Locale mDefaultLocaleOverrideForTest;
private final LocaleList mLocaleList;
private LocaleSet(LocaleList localeList, Locale defaultLocaleOverrideForTest) {
mLocaleList = localeList;
mDefaultLocaleOverrideForTest = defaultLocaleOverrideForTest;
}
public static LocaleSet newDefault() {
return new LocaleSet(LocaleList.getDefault(),
/*defaultLocaleOverrideForTest= */ null);
}
@VisibleForTesting
public static LocaleSet newForTest(Locale... locales) {
return new LocaleSet(new LocaleList(locales), locales[0]);
}
@VisibleForTesting
static boolean isLanguageChinese(@Nullable Locale locale) {
return locale != null && "zh".equals(locale.getLanguage());
}
@VisibleForTesting
static boolean isLanguageJapanese(@Nullable Locale locale) {
return locale != null && "ja".equals(locale.getLanguage());
}
@VisibleForTesting
static boolean isLanguageKorean(@Nullable Locale locale) {
return locale != null && "ko".equals(locale.getLanguage());
}
@VisibleForTesting
static boolean isLocaleCJK(@Nullable Locale locale) {
return isLanguageChinese(locale) ||
isLanguageJapanese(locale) ||
isLanguageKorean(locale);
}
private static String getLikelyScript(Locale locale) {
final String script = locale.getScript();
if (!script.isEmpty()) {
return script;
} else {
return ULocale.addLikelySubtags(ULocale.forLocale(locale)).getScript();
}
}
/**
* @return the script if the language is Chinese, and otherwise null.
*/
@VisibleForTesting
static String getScriptIfChinese(@Nullable Locale locale) {
return isLanguageChinese(locale) ? getLikelyScript(locale) : null;
}
static boolean isLocaleSimplifiedChinese(@Nullable Locale locale) {
return SCRIPT_SIMPLIFIED_CHINESE.equals(getScriptIfChinese(locale));
}
@VisibleForTesting
static boolean isLocaleTraditionalChinese(@Nullable Locale locale) {
return SCRIPT_TRADITIONAL_CHINESE.equals(getScriptIfChinese(locale));
}
/**
* Returns the primary locale, which may not be the first item of {@link #getAllLocales}.
* (See {@link LocaleList})
*/
public @NonNull Locale getPrimaryLocale() {
if (mDefaultLocaleOverrideForTest != null) {
return mDefaultLocaleOverrideForTest;
}
return Locale.getDefault();
}
public @NonNull LocaleList getAllLocales() {
return mLocaleList;
}
public boolean isPrimaryLocaleCJK() {
return isLocaleCJK(getPrimaryLocale());
}
/**
* @return true if Japanese is found in the list before simplified Chinese.
*/
public boolean shouldPreferJapanese() {
if (isLanguageJapanese(getPrimaryLocale())) {
return true;
}
for (int i = 0; i < mLocaleList.size(); i++) {
final Locale l = mLocaleList.get(i);
if (isLanguageJapanese(l)) {
return true;
}
if (isLanguageChinese(l)) {
return false;
}
}
return false;
}
/**
* @return true if simplified Chinese is found before Japanese or traditional Chinese.
*/
public boolean shouldPreferSimplifiedChinese() {
if (isLocaleSimplifiedChinese(getPrimaryLocale())) {
return true;
}
for (int i = 0; i < mLocaleList.size(); i++) {
final Locale l = mLocaleList.get(i);
if (isLocaleSimplifiedChinese(l)) {
return true;
}
if (isLanguageJapanese(l)) {
return false;
}
if (isLocaleTraditionalChinese(l)) { // Traditional chinese wins here.
return false;
}
}
return false;
}
/**
* @return true if the instance contains the current system locales.
*/
public boolean isCurrent() {
return Objects.equals(mLocaleList, LocaleList.getDefault());
}
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (object instanceof LocaleSet) {
final LocaleSet other = (LocaleSet) object;
return mLocaleList.equals(other.mLocaleList);
}
return false;
}
@Override
public final String toString() {
return mLocaleList.toString();
}
}