1d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner/* 2d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * Copyright (C) 2014 The Android Open Source Project 3d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * 4d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * Licensed under the Apache License, Version 2.0 (the "License"); 5d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * you may not use this file except in compliance with the License. 6d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * You may obtain a copy of the License at 7d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * 8d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * http://www.apache.org/licenses/LICENSE-2.0 9d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * 10d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * Unless required by applicable law or agreed to in writing, software 11d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * distributed under the License is distributed on an "AS IS" BASIS, 12d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * See the License for the specific language governing permissions and 14d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * limitations under the License 15d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner */ 16d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 17d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shraunerpackage com.android.providers.contacts; 18d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 19d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shraunerimport android.text.TextUtils; 20d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shraunerimport com.google.common.annotations.VisibleForTesting; 21d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shraunerimport java.util.Locale; 22d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 23d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shraunerpublic class LocaleSet { 24d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static final String CHINESE_LANGUAGE = Locale.CHINESE.getLanguage().toLowerCase(); 25d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static final String JAPANESE_LANGUAGE = Locale.JAPANESE.getLanguage().toLowerCase(); 26d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static final String KOREAN_LANGUAGE = Locale.KOREAN.getLanguage().toLowerCase(); 27d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 28d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static class LocaleWrapper { 29d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private final Locale mLocale; 30d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private final String mLanguage; 31d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private final boolean mLocaleIsCJK; 32d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 33d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static boolean isLanguageCJK(String language) { 34d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return CHINESE_LANGUAGE.equals(language) || 35d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner JAPANESE_LANGUAGE.equals(language) || 36d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner KOREAN_LANGUAGE.equals(language); 37d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 38d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 39d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public LocaleWrapper(Locale locale) { 40d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mLocale = locale; 41d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (mLocale != null) { 42d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mLanguage = mLocale.getLanguage().toLowerCase(); 43d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mLocaleIsCJK = isLanguageCJK(mLanguage); 44d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } else { 45d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mLanguage = null; 46d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mLocaleIsCJK = false; 47d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 48d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 49d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 50d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean hasLocale() { 51d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLocale != null; 52d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 53d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 54d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public Locale getLocale() { 55d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLocale; 56d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 57d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 58d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isLocale(Locale locale) { 59d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLocale == null ? (locale == null) : mLocale.equals(locale); 60d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 61d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 62d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isLocaleCJK() { 63d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLocaleIsCJK; 64d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 65d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 66d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isLanguage(String language) { 67d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLanguage == null ? (language == null) 68d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner : mLanguage.equalsIgnoreCase(language); 69d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 70d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 71d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public String toString() { 72d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mLocale != null ? mLocale.toLanguageTag() : "(null)"; 73d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 74d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 75d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 76d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public static LocaleSet getDefault() { 77d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return new LocaleSet(Locale.getDefault()); 78d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 79d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 80d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public LocaleSet(Locale locale) { 81d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner this(locale, null); 82d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 83d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 84d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner /** 85d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * Returns locale set for a given set of IETF BCP-47 tags separated by ';'. 86d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * BCP-47 tags are what is used by ICU 52's toLanguageTag/forLanguageTag 87d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * methods to represent individual Locales: "en-US" for Locale.US, 88d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * "zh-CN" for Locale.CHINA, etc. So eg "en-US;zh-CN" specifies the locale 89d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * set LocaleSet(Locale.US, Locale.CHINA). 90d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * 91d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * @param localeString One or more BCP-47 tags separated by ';'. 92d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * @return LocaleSet for specified locale string, or default set if null 93d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner * or unable to parse. 94d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner */ 95d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public static LocaleSet getLocaleSet(String localeString) { 96d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // Locale.toString() generates strings like "en_US" and "zh_CN_#Hans". 97d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // Locale.toLanguageTag() generates strings like "en-US" and "zh-Hans-CN". 98d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // We can only parse language tags. 99d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (localeString != null && localeString.indexOf('_') == -1) { 100d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner final String[] locales = localeString.split(";"); 101d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner final Locale primaryLocale = Locale.forLanguageTag(locales[0]); 102d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // ICU tags undefined/unparseable locales "und" 103d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (primaryLocale != null && 104d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner !TextUtils.equals(primaryLocale.toLanguageTag(), "und")) { 105d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (locales.length > 1 && locales[1] != null) { 106d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner final Locale secondaryLocale = Locale.forLanguageTag(locales[1]); 107d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (secondaryLocale != null && 108d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner !TextUtils.equals(secondaryLocale.toLanguageTag(), "und")) { 109d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return new LocaleSet(primaryLocale, secondaryLocale); 110d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 111d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 112d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return new LocaleSet(primaryLocale); 113d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 114d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 115d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return getDefault(); 116d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 117d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 118d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private final LocaleWrapper mPrimaryLocale; 119d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private final LocaleWrapper mSecondaryLocale; 120d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 121d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public LocaleSet(Locale primaryLocale, Locale secondaryLocale) { 122d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mPrimaryLocale = new LocaleWrapper(primaryLocale); 123d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mSecondaryLocale = new LocaleWrapper( 124d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner mPrimaryLocale.equals(secondaryLocale) ? null : secondaryLocale); 125d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 126d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 127d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public LocaleSet normalize() { 128d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner final Locale primaryLocale = getPrimaryLocale(); 129d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (primaryLocale == null) { 130d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return getDefault(); 131d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 132d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner Locale secondaryLocale = getSecondaryLocale(); 133d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // disallow both locales with same language (redundant and/or conflicting) 134d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // disallow both locales CJK (conflicting rules) 135d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (secondaryLocale == null || 136d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner isPrimaryLanguage(secondaryLocale.getLanguage()) || 137d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner (isPrimaryLocaleCJK() && isSecondaryLocaleCJK())) { 138d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return new LocaleSet(primaryLocale); 139d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 140d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // unnecessary to specify English as secondary locale (redundant) 141d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (isSecondaryLanguage(Locale.ENGLISH.getLanguage())) { 142d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return new LocaleSet(primaryLocale); 143d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 144d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return this; 145d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 146d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 147d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean hasSecondaryLocale() { 148d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mSecondaryLocale.hasLocale(); 149d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 150d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 151d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public Locale getPrimaryLocale() { 152d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mPrimaryLocale.getLocale(); 153d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 154d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 155d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public Locale getSecondaryLocale() { 156d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mSecondaryLocale.getLocale(); 157d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 158d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 159d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isPrimaryLocale(Locale locale) { 160d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mPrimaryLocale.isLocale(locale); 161d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 162d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 163d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isSecondaryLocale(Locale locale) { 164d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mSecondaryLocale.isLocale(locale); 165d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 166d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 167d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static final String SCRIPT_SIMPLIFIED_CHINESE = "Hans"; 168d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner private static final String SCRIPT_TRADITIONAL_CHINESE = "Hant"; 169d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 170d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner @VisibleForTesting 171d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public static boolean isLocaleSimplifiedChinese(Locale locale) { 172d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // language must match 173d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (locale == null || !TextUtils.equals(locale.getLanguage(), CHINESE_LANGUAGE)) { 174d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return false; 175d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 176d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // script is optional but if present must match 177d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (!TextUtils.isEmpty(locale.getScript())) { 178d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return locale.getScript().equals(SCRIPT_SIMPLIFIED_CHINESE); 179d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 180d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // if no script, must match known country 181d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return locale.equals(Locale.SIMPLIFIED_CHINESE); 182d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 183d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 184d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isPrimaryLocaleSimplifiedChinese() { 185d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return isLocaleSimplifiedChinese(getPrimaryLocale()); 186d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 187d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 188d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isSecondaryLocaleSimplifiedChinese() { 189d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return isLocaleSimplifiedChinese(getSecondaryLocale()); 190d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 191d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 192d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner @VisibleForTesting 193d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public static boolean isLocaleTraditionalChinese(Locale locale) { 194d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // language must match 195d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (locale == null || !TextUtils.equals(locale.getLanguage(), CHINESE_LANGUAGE)) { 196d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return false; 197d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 198d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // script is optional but if present must match 199d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (!TextUtils.isEmpty(locale.getScript())) { 200d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return locale.getScript().equals(SCRIPT_TRADITIONAL_CHINESE); 201d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 202d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner // if no script, must match known country 203d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return locale.equals(Locale.TRADITIONAL_CHINESE); 204d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 205d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 206d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isPrimaryLocaleTraditionalChinese() { 207d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return isLocaleTraditionalChinese(getPrimaryLocale()); 208d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 209d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 210d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isSecondaryLocaleTraditionalChinese() { 211d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return isLocaleTraditionalChinese(getSecondaryLocale()); 212d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 213d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 214d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isPrimaryLocaleCJK() { 215d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mPrimaryLocale.isLocaleCJK(); 216d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 217d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 218d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isSecondaryLocaleCJK() { 219d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mSecondaryLocale.isLocaleCJK(); 220d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 221d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 222d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isPrimaryLanguage(String language) { 223d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mPrimaryLocale.isLanguage(language); 224d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 225d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 226d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean isSecondaryLanguage(String language) { 227d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return mSecondaryLocale.isLanguage(language); 228d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 229d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 230d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner @Override 231d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public boolean equals(Object object) { 232d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (object == this) { 233d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return true; 234d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 235d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (object instanceof LocaleSet) { 236d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner final LocaleSet other = (LocaleSet) object; 237d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return other.isPrimaryLocale(mPrimaryLocale.getLocale()) 238d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner && other.isSecondaryLocale(mSecondaryLocale.getLocale()); 239d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 240d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return false; 241d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 242d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner 243d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner @Override 244d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner public final String toString() { 245d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner StringBuilder builder = new StringBuilder(); 246d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner builder.append(mPrimaryLocale.toString()); 247d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner if (hasSecondaryLocale()) { 248d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner builder.append(";"); 249d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner builder.append(mSecondaryLocale.toString()); 250d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 251d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner return builder.toString(); 252d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner } 253d4dbd063cf88e70b045607aa865b2fdb2329bf45Jay Shrauner} 254