aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2016-08-29 12:05:06 -0700
committerMakoto Onuki <omakoto@google.com>2016-08-29 13:35:20 -0700
commit2ee1d54fa1e22b2c88897c1a60e7f642a81f9562 (patch)
tree1382123bae84307dfaa766f699c0473afd8fa161
parenta0722de4886cdc06acf344052b70954415d25d80 (diff)
downloadContactsProvider-2ee1d54fa1e22b2c88897c1a60e7f642a81f9562.tar.gz
Fix multi-locale issues
- Don't ignore LOCALE_CHANGED sent when CP2 is already updating locales. - Don't add multiple Chinese locales. - Don't add any Chinese locales after Japanese. - Also fix the flakiness in the test. Bug 31115382 Change-Id: Ib17d08f7947cb02aa7052d8ed6b67690361c47bf
-rw-r--r--src/com/android/providers/contacts/ContactLocaleUtils.java101
-rw-r--r--src/com/android/providers/contacts/ContactsProvider2.java34
-rw-r--r--src/com/android/providers/contacts/LocaleSet.java8
-rw-r--r--tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java122
4 files changed, 177 insertions, 88 deletions
diff --git a/src/com/android/providers/contacts/ContactLocaleUtils.java b/src/com/android/providers/contacts/ContactLocaleUtils.java
index 553442d4..9a0ac272 100644
--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -34,6 +34,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Locale;
import java.util.Set;
@@ -45,6 +46,8 @@ import java.util.Set;
public class ContactLocaleUtils {
public static final String TAG = "ContactLocale";
+ private static final boolean DEBUG = false; // don't submit with true
+
public static final Locale LOCALE_ARABIC = new Locale("ar");
public static final Locale LOCALE_GREEK = new Locale("el");
public static final Locale LOCALE_HEBREW = new Locale("he");
@@ -97,38 +100,84 @@ public class ContactLocaleUtils {
private final int mNumberBucketIndex;
private final boolean mUsePinyinTransliterator;
- public ContactLocaleUtilsBase(LocaleSet locales) {
- mUsePinyinTransliterator = locales.shouldPreferSimplifiedChinese();
+ public ContactLocaleUtilsBase(LocaleSet systemLocales) {
+ mUsePinyinTransliterator = systemLocales.shouldPreferSimplifiedChinese();
- final ArraySet<Locale> addedLocales = new ArraySet<>();
+ // Build the index buckets based on the current system locale set and
+ // sDefaultLabelLocales.
+ if (DEBUG) {
+ Log.d(TAG, "Building index buckets...");
+ }
+ final List<Locale> locales = getLocalesForBuckets(systemLocales);
- // First, add from the primary locale (which may not be the first locale in the locale
- // list).
- AlphabeticIndex ai = new AlphabeticIndex(locales.getPrimaryLocale())
+ AlphabeticIndex ai = new AlphabeticIndex(locales.get(0))
.setMaxLabelCount(300);
- addedLocales.add(locales.getPrimaryLocale());
-
- // Next, add all locale form the locale list.
- final LocaleList localeList = locales.getAllLocales();
- for (int i = 0; i < localeList.size(); i++) {
- addLabels(ai, localeList.get(i), addedLocales);
- }
- // Then add the default locales.
- for (int i = 0; i < sDefaultLabelLocales.length; i++) {
- addLabels(ai, sDefaultLabelLocales[i], addedLocales);
+ for (int i = 1; i < locales.size(); i++) {
+ ai.addLabels(locales.get(i));
}
+
mAlphabeticIndex = ai.buildImmutableIndex();
mAlphabeticIndexBucketCount = mAlphabeticIndex.getBucketCount();
mNumberBucketIndex = mAlphabeticIndexBucketCount - 1;
+ if (DEBUG) {
+ final StringBuilder labels = new StringBuilder();
+ String sep = "";
+ for (int i = 0; i < mAlphabeticIndexBucketCount; i++) {
+ labels.append(sep);
+ labels.append(mAlphabeticIndex.getBucket(i).getLabel());
+ sep = ",";
+ }
+ Log.d(TAG, "Labels=[" + labels + "]");
+ }
}
- private static void addLabels(
- AlphabeticIndex ai, Locale locale, ArraySet<Locale> addedLocales) {
- if (addedLocales.contains(locale)) {
- return;
+ static List<Locale> getLocalesForBuckets(LocaleSet systemLocales) {
+
+ // Create a list of locales that should be used to generate the index buckets.
+ // - Source: the system locales and sDefaultLabelLocales.
+ // - Rules:
+ // - Don't add the same locale multiple times.
+ // - Also special rules for Chinese (b/31115382):
+ // - Don't add multiple Chinese locales.
+ // - Don't add any Chinese locales after Japanese.
+
+ // First, collect all the locales (allowing duplicates).
+ final LocaleList localeList = systemLocales.getAllLocales();
+
+ final List<Locale> locales = new ArrayList<>(
+ localeList.size() + sDefaultLabelLocales.length);
+ for (int i = 0; i < localeList.size(); i++) {
+ locales.add(localeList.get(i));
+ }
+ for (int i = 0; i < sDefaultLabelLocales.length; i++) {
+ locales.add(sDefaultLabelLocales[i]);
}
- ai.addLabels(locale);
- addedLocales.add(locale);
+
+ // Then apply the rules to generate the final list.
+ final List<Locale> ret = new ArrayList<>(locales.size());
+ boolean allowChinese = true;
+
+ for (int i = 0; i < locales.size(); i++) {
+ final Locale locale = locales.get(i);
+
+ if (ret.contains(locale)) {
+ continue;
+ }
+ if (LocaleSet.isLanguageChinese(locale)) {
+ if (!allowChinese) {
+ continue;
+ }
+ allowChinese = false;
+ }
+ if (LocaleSet.isLanguageJapanese(locale)) {
+ allowChinese = false;
+ }
+ if (DEBUG) {
+ Log.d(TAG, " Adding locale: " + locale);
+ }
+ ret.add(locale);
+ }
+ return ret;
}
public String getSortKey(String name) {
@@ -472,12 +521,20 @@ public class ContactLocaleUtils {
}
@VisibleForTesting
+ public static ContactLocaleUtils newInstanceForTest(Locale... locales) {
+ return new ContactLocaleUtils(LocaleSet.newForTest(locales));
+ }
+
+ @VisibleForTesting
public static synchronized void setLocaleForTest(Locale... locales) {
setLocales(LocaleSet.newForTest(locales));
}
public static synchronized void setLocales(LocaleSet locales) {
if (sSingleton == null || !sSingleton.isLocale(locales)) {
+ if (DEBUG) {
+ Log.d(TAG, "Setting locale(s) to " + locales);
+ }
sSingleton = new ContactLocaleUtils(locales);
}
}
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index ac8b5d6b..eb5dcfdd 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -16,10 +16,10 @@
package com.android.providers.contacts;
-import android.annotation.Nullable;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener;
+import android.annotation.Nullable;
import android.app.AppOpsManager;
import android.app.SearchManager;
import android.content.ContentProviderOperation;
@@ -41,7 +41,6 @@ import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.database.AbstractCursor;
import android.database.Cursor;
-import android.database.CursorWrapper;
import android.database.DatabaseUtils;
import android.database.MatrixCursor;
import android.database.MatrixCursor.RowBuilder;
@@ -107,18 +106,15 @@ import android.provider.ContactsContract.Settings;
import android.provider.ContactsContract.StatusUpdates;
import android.provider.ContactsContract.StreamItemPhotos;
import android.provider.ContactsContract.StreamItems;
-import android.provider.MediaStore;
-import android.provider.MediaStore.Audio.Media;
import android.provider.OpenableColumns;
import android.provider.Settings.Global;
import android.provider.SyncStateContract;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.Base64;
import android.util.Log;
+
import com.android.common.content.ProjectionMap;
import com.android.common.content.SyncStateContentProviderHelper;
import com.android.common.io.MoreCloseables;
@@ -153,6 +149,11 @@ import com.android.providers.contacts.ContactsDatabaseHelper.StreamItemsColumns;
import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
import com.android.providers.contacts.ContactsDatabaseHelper.ViewGroupsColumns;
import com.android.providers.contacts.ContactsDatabaseHelper.Views;
+import com.android.providers.contacts.MetadataEntryParser.AggregationData;
+import com.android.providers.contacts.MetadataEntryParser.FieldData;
+import com.android.providers.contacts.MetadataEntryParser.MetadataEntry;
+import com.android.providers.contacts.MetadataEntryParser.RawContactInfo;
+import com.android.providers.contacts.MetadataEntryParser.UsageStats;
import com.android.providers.contacts.SearchIndexManager.FtsQueryBuilder;
import com.android.providers.contacts.aggregation.AbstractContactAggregator;
import com.android.providers.contacts.aggregation.AbstractContactAggregator.AggregationSuggestionParameter;
@@ -165,11 +166,6 @@ import com.android.providers.contacts.database.DeletedContactsTableUtil;
import com.android.providers.contacts.database.MoreDatabaseUtils;
import com.android.providers.contacts.enterprise.EnterpriseContactsCursorWrapper;
import com.android.providers.contacts.enterprise.EnterprisePolicyGuard;
-import com.android.providers.contacts.MetadataEntryParser.AggregationData;
-import com.android.providers.contacts.MetadataEntryParser.FieldData;
-import com.android.providers.contacts.MetadataEntryParser.MetadataEntry;
-import com.android.providers.contacts.MetadataEntryParser.RawContactInfo;
-import com.android.providers.contacts.MetadataEntryParser.UsageStats;
import com.android.providers.contacts.util.Clock;
import com.android.providers.contacts.util.ContactsPermissions;
import com.android.providers.contacts.util.DbQueryUtils;
@@ -177,6 +173,9 @@ import com.android.providers.contacts.util.NeededForTesting;
import com.android.providers.contacts.util.UserUtils;
import com.android.vcard.VCardComposer;
import com.android.vcard.VCardConfig;
+
+import libcore.io.IoUtils;
+
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
import com.google.android.collect.Sets;
@@ -184,8 +183,6 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.primitives.Ints;
-import libcore.io.IoUtils;
-
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -193,15 +190,10 @@ import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
import java.io.Writer;
-import java.lang.reflect.Array;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -1891,6 +1883,12 @@ public class ContactsProvider2 extends AbstractContactsProvider
mSearchIndexManager.updateIndex(true);
prefs.edit().putString(PREF_LOCALE, currentLocales.toString()).commit();
setProviderStatus(providerStatus);
+
+ // The system locale set might have changed while we've being updating the locales.
+ // So double check.
+ if (!mCurrentLocales.isCurrent()) {
+ scheduleBackgroundTask(BACKGROUND_TASK_CHANGE_LOCALE);
+ }
}
// Static update routine for use by ContactsUpgradeReceiver during startup.
diff --git a/src/com/android/providers/contacts/LocaleSet.java b/src/com/android/providers/contacts/LocaleSet.java
index a926a6fd..b2a80b14 100644
--- a/src/com/android/providers/contacts/LocaleSet.java
+++ b/src/com/android/providers/contacts/LocaleSet.java
@@ -24,6 +24,7 @@ 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";
@@ -155,6 +156,13 @@ public class LocaleSet {
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) {
diff --git a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
index 17342726..8e71befd 100644
--- a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
@@ -37,28 +37,37 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
private static final String PHONE_NUMBER_2 = "650-555-1212";
private static final String LATIN_NAME = "John Smith";
private static final String LATIN_NAME_2 = "John Paul Jones";
- private static final String KANJI_NAME = "\u65e5";
- private static final String ARABIC_NAME = "\u0646\u0648\u0631"; /* Noor */
- private static final String CHINESE_NAME = "\u675C\u9D51";
- private static final String SERBIAN_NAME = "\u0408\u0435\u043B\u0435\u043D\u0430";
- private static final String UKRAINIAN_NAME = "\u0406";
- private static final String UKRAINIAN_NAME_2 = "\u0407";
- private static final String UKRAINIAN_NAME_3 = "\u0490";
- private static final String CHINESE_LATIN_MIX_NAME_1 = "D\u675C\u9D51";
- private static final String CHINESE_LATIN_MIX_NAME_2 = "MARY \u675C\u9D51";
- private static final String[] CHINESE_NAME_KEY = {"\u9D51", "\u675C\u9D51", "JUAN", "DUJUAN",
- "J", "DJ"};
- private static final String[] CHINESE_LATIN_MIX_NAME_1_KEY = {"\u9D51", "\u675C\u9D51",
- "D \u675C\u9D51", "JUAN", "DUJUAN", "J", "DJ", "D DUJUAN", "DDJ"};
- private static final String[] CHINESE_LATIN_MIX_NAME_2_KEY = {"\u9D51", "\u675C\u9D51",
- "MARY \u675C\u9D51", "JUAN", "DUJUAN", "MARY DUJUAN", "J", "DJ", "MDJ"};
+ private static final String KANJI_NAME = "\u65e5"; // 日
+ private static final String ARABIC_NAME = "\u0646\u0648\u0631"; /* Noor نور */
+ private static final String CHINESE_NAME = "\u675C\u9D51"; // 杜鵑
+ private static final String SERBIAN_NAME = "\u0408\u0435\u043B\u0435\u043D\u0430"; // Јелена
+ private static final String UKRAINIAN_NAME = "\u0406"; // І
+ private static final String UKRAINIAN_NAME_2 = "\u0407"; // Ї
+ private static final String UKRAINIAN_NAME_3 = "\u0490"; // Ґ
+ private static final String CHINESE_LATIN_MIX_NAME_1 = "D\u675C\u9D51"; // D杜鵑
+ private static final String CHINESE_LATIN_MIX_NAME_2 = "MARY \u675C\u9D51"; // MARY 杜鵑
+ private static final String[] CHINESE_NAME_KEY = {
+ "\u9D51",// 鵑
+ "\u675C\u9D51", // 杜鵑
+ "JUAN", "DUJUAN", "J", "DJ"};
+ private static final String[] CHINESE_LATIN_MIX_NAME_1_KEY = {
+ "\u9D51", // 鵑
+ "\u675C\u9D51", // 杜鵑
+ "D \u675C\u9D51", // D 杜鵑
+ "JUAN", "DUJUAN", "J", "DJ", "D DUJUAN", "DDJ"};
+ private static final String[] CHINESE_LATIN_MIX_NAME_2_KEY = {
+ "\u9D51", // 鵑
+ "\u675C\u9D51", // 杜鵑
+ "MARY \u675C\u9D51", // MARY 杜鵑
+ "JUAN", "DUJUAN", "MARY DUJUAN", "J", "DJ", "MDJ"};
private static final String[] LATIN_NAME_KEY = {"John Smith", "Smith", "JS", "S"};
private static final String[] LATIN_NAME_KEY_2 = {
- "John Paul Jones", "Paul Jones", "Jones", "JPJ", "PJ", "J"};
+ "John Paul Jones", "Paul Jones", "Jones", "JPJ", "PJ", "J"};
private static final String[] LABELS_EN_US = {
- "\u2026", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
- "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
- "#", ""};
+ "\u2026", // …
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "#", ""};
private static final String[] LABELS_JA_JP = {
"…", "\u3042", "\u304B", "\u3055", "\u305F", "\u306A", "\u306F",
"\u307E", "\u3084", "\u3089", "\u308F", "\u4ED6",
@@ -93,7 +102,7 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"#", ""};
- private static final String JAPANESE_MISC = "\u4ed6";
+ private static final String JAPANESE_MISC = "\u4ed6"; // 他
private static final Locale LOCALE_ARABIC = new Locale("ar");
private static final Locale LOCALE_SERBIAN = new Locale("sr");
@@ -101,24 +110,27 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
private static final Locale LOCALE_SPANISH = new Locale("es");
private static final Locale LOCALE_GREEK = new Locale("el");
+ private ContactLocaleUtils mTargetUtils;
+
+ private void setLocales(Locale... locales) {
+ mTargetUtils = ContactLocaleUtils.newInstanceForTest(locales);
+ }
+
private String getLabel(String name) {
- ContactLocaleUtils utils = ContactLocaleUtils.getInstance();
- int bucketIndex = utils.getBucketIndex(name);
- return utils.getBucketLabel(bucketIndex);
+ int bucketIndex = mTargetUtils.getBucketIndex(name);
+ return mTargetUtils.getBucketLabel(bucketIndex);
}
private Iterator<String> getNameLookupKeys(String name, int nameStyle) {
- ContactLocaleUtils utils = ContactLocaleUtils.getInstance();
- return utils.getNameLookupKeys(name, nameStyle);
+ return mTargetUtils.getNameLookupKeys(name, nameStyle);
}
private ArrayList<String> getLabels() {
- ContactLocaleUtils utils = ContactLocaleUtils.getInstance();
- return utils.getLabels();
+ return mTargetUtils.getLabels();
}
public void testEnglishContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.ENGLISH);
+ setLocales(Locale.ENGLISH);
assertEquals("#", getLabel(PHONE_NUMBER_1));
assertEquals("#", getLabel(PHONE_NUMBER_2));
assertEquals("J", getLabel(LATIN_NAME));
@@ -137,7 +149,7 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testJapaneseContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.JAPAN);
+ setLocales(Locale.JAPAN);
assertEquals("#", getLabel(PHONE_NUMBER_1));
assertEquals("#", getLabel(PHONE_NUMBER_2));
assertEquals(JAPANESE_MISC, getLabel(KANJI_NAME));
@@ -153,7 +165,7 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testChineseContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.SIMPLIFIED_CHINESE);
+ setLocales(Locale.SIMPLIFIED_CHINESE);
assertEquals("#", getLabel(PHONE_NUMBER_1));
assertEquals("#", getLabel(PHONE_NUMBER_2));
assertEquals("J", getLabel(LATIN_NAME));
@@ -162,14 +174,14 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
assertEquals("B", getLabel("Bob Smith"));
verifyLabels(getLabels(), LABELS_EN_US);
- ContactLocaleUtils.setLocaleForTest(Locale.TRADITIONAL_CHINESE);
+ setLocales(Locale.TRADITIONAL_CHINESE);
assertEquals("#", getLabel(PHONE_NUMBER_1));
assertEquals("#", getLabel(PHONE_NUMBER_2));
assertEquals("J", getLabel(LATIN_NAME));
assertEquals("7\u5283", getLabel(CHINESE_NAME));
assertEquals("D", getLabel(CHINESE_LATIN_MIX_NAME_1));
- ContactLocaleUtils.setLocaleForTest(Locale.SIMPLIFIED_CHINESE);
+ setLocales(Locale.SIMPLIFIED_CHINESE);
Iterator<String> keys = getNameLookupKeys(CHINESE_NAME,
FullNameStyle.CHINESE);
verifyKeys(keys, CHINESE_NAME_KEY);
@@ -180,14 +192,13 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
keys = getNameLookupKeys(CHINESE_LATIN_MIX_NAME_2, FullNameStyle.CHINESE);
verifyKeys(keys, CHINESE_LATIN_MIX_NAME_2_KEY);
- ContactLocaleUtils.setLocaleForTest(Locale.TRADITIONAL_CHINESE);
+ setLocales(Locale.TRADITIONAL_CHINESE);
assertEquals("B", getLabel("Bob Smith"));
verifyLabels(getLabels(), LABELS_ZH_TW);
}
public void testPinyinEnabledSecondaryLocale() throws Exception {
- ContactLocaleUtils.setLocales(
- LocaleSet.newForTest(Locale.ENGLISH, Locale.SIMPLIFIED_CHINESE));
+ setLocales(Locale.ENGLISH, Locale.SIMPLIFIED_CHINESE);
assertEquals("D", getLabel(CHINESE_NAME));
Iterator<String> keys = getNameLookupKeys(CHINESE_NAME,
@@ -196,20 +207,35 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testPinyinDisabledSecondaryLocale() throws Exception {
- ContactLocaleUtils.setLocales(
- LocaleSet.newForTest(Locale.ENGLISH, Locale.JAPAN));
+ setLocales(Locale.ENGLISH, Locale.JAPAN);
assertEquals(JAPANESE_MISC, getLabel(CHINESE_NAME));
assertNull(getNameLookupKeys(CHINESE_NAME, FullNameStyle.CHINESE));
assertNull(getNameLookupKeys(CHINESE_NAME, FullNameStyle.CJK));
}
+ public void testChineseChinese() throws Exception {
+ setLocales(Locale.SIMPLIFIED_CHINESE, Locale.TRADITIONAL_CHINESE);
+ assertEquals("D", getLabel(CHINESE_NAME)); // Prefer pinyin
+
+ setLocales(Locale.TRADITIONAL_CHINESE, Locale.SIMPLIFIED_CHINESE);
+ assertEquals("7\u5283", getLabel(CHINESE_NAME)); // 7劃 -- Prefer # of strokes
+ }
+
+ public void testJapaneseChinese() throws Exception {
+ setLocales(Locale.JAPAN, Locale.TRADITIONAL_CHINESE);
+ assertEquals(JAPANESE_MISC, getLabel(CHINESE_NAME)); // Prefer Japanese
+
+ setLocales(Locale.JAPAN, Locale.SIMPLIFIED_CHINESE);
+ assertEquals(JAPANESE_MISC, getLabel(CHINESE_NAME)); // Prefer Japanese
+ }
+
public void testChineseStyleNameWithDifferentLocale() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.ENGLISH);
+ setLocales(Locale.ENGLISH);
assertNull(getNameLookupKeys(CHINESE_NAME, FullNameStyle.CHINESE));
assertNull(getNameLookupKeys(CHINESE_NAME, FullNameStyle.CJK));
- ContactLocaleUtils.setLocaleForTest(Locale.SIMPLIFIED_CHINESE);
+ setLocales(Locale.SIMPLIFIED_CHINESE);
Iterator<String> keys = getNameLookupKeys(CHINESE_NAME,
FullNameStyle.CJK);
verifyKeys(keys, CHINESE_NAME_KEY);
@@ -218,12 +244,12 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
keys = getNameLookupKeys(LATIN_NAME_2, FullNameStyle.WESTERN);
verifyKeys(keys, LATIN_NAME_KEY_2);
- ContactLocaleUtils.setLocaleForTest(Locale.TRADITIONAL_CHINESE);
+ setLocales(Locale.TRADITIONAL_CHINESE);
assertNull(getNameLookupKeys(CHINESE_NAME, FullNameStyle.CJK));
}
public void testKoreanContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.KOREA);
+ setLocales(Locale.KOREA);
assertEquals("\u3131", getLabel("\u1100"));
assertEquals("\u3131", getLabel("\u3131"));
assertEquals("\u3131", getLabel("\u1101"));
@@ -233,20 +259,20 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testArabicContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(LOCALE_ARABIC);
+ setLocales(LOCALE_ARABIC);
assertEquals("\u0646", getLabel(ARABIC_NAME));
assertEquals("B", getLabel("Bob Smith"));
verifyLabels(getLabels(), LABELS_AR);
}
public void testSerbianContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(LOCALE_SERBIAN);
+ setLocales(LOCALE_SERBIAN);
assertEquals("\u0408", getLabel(SERBIAN_NAME));
assertEquals("B", getLabel("Bob Smith"));
}
public void testUkrainianContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(LOCALE_UKRAINIAN);
+ setLocales(LOCALE_UKRAINIAN);
assertEquals("\u0406", getLabel(UKRAINIAN_NAME));
assertEquals("\u0407", getLabel(UKRAINIAN_NAME_2));
assertEquals("\u0490", getLabel(UKRAINIAN_NAME_3));
@@ -254,7 +280,7 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testGermanContactLocaleUtils() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.GERMANY);
+ setLocales(Locale.GERMANY);
assertEquals("S", getLabel("Sacher"));
// ICU 51 has labels Sch and St. These were removed in ICU 52
@@ -264,17 +290,17 @@ public class ContactLocaleUtilsTest extends AndroidTestCase {
}
public void testOtherLocales() throws Exception {
- ContactLocaleUtils.setLocaleForTest(Locale.ENGLISH);
+ setLocales(Locale.ENGLISH);
assertEquals("N", getLabel("n"));
assertEquals("N", getLabel("ñ"));
- ContactLocaleUtils.setLocaleForTest(LOCALE_SPANISH);
+ setLocales(LOCALE_SPANISH);
assertEquals("N", getLabel("n"));
assertEquals("Ñ", getLabel("ñ"));
- ContactLocaleUtils.setLocaleForTest(Locale.ENGLISH, LOCALE_SPANISH);
+ setLocales(Locale.ENGLISH, LOCALE_SPANISH);
assertEquals("N", getLabel("n"));
assertEquals("N", getLabel("ñ")); // TODO This should ideally return Ñ.