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