From 2ee1d54fa1e22b2c88897c1a60e7f642a81f9562 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Mon, 29 Aug 2016 12:05:06 -0700 Subject: 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 --- .../providers/contacts/ContactLocaleUtils.java | 101 +++++++++++++---- .../providers/contacts/ContactsProvider2.java | 34 +++--- src/com/android/providers/contacts/LocaleSet.java | 8 ++ .../providers/contacts/ContactLocaleUtilsTest.java | 122 +++++++++++++-------- 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 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 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 addedLocales) { - if (addedLocales.contains(locale)) { - return; + static List 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 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 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) { @@ -471,6 +520,11 @@ public class ContactLocaleUtils { return sSingleton; } + @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)); @@ -478,6 +532,9 @@ public class ContactLocaleUtils { 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 getNameLookupKeys(String name, int nameStyle) { - ContactLocaleUtils utils = ContactLocaleUtils.getInstance(); - return utils.getNameLookupKeys(name, nameStyle); + return mTargetUtils.getNameLookupKeys(name, nameStyle); } private ArrayList 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 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 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 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 Ñ. -- cgit v1.2.3