merge in nyc-mr1-release history after reset to nyc-mr1-dev
diff --git a/src/com/android/providers/contacts/ContactLocaleUtils.java b/src/com/android/providers/contacts/ContactLocaleUtils.java
index 553442d..9a0ac27 100644
--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -34,6 +34,7 @@
 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 @@
 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 @@
         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());
+            for (int i = 1; i < locales.size(); i++) {
+                ai.addLabels(locales.get(i));
+            }
 
-            // 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);
-            }
             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));
             }
-            ai.addLabels(locale);
-            addedLocales.add(locale);
+            for (int i = 0; i < sDefaultLabelLocales.length; i++) {
+                locales.add(sDefaultLabelLocales[i]);
+            }
+
+            // 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 @@
     }
 
     @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 ac8b5d6..eb5dcfd 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.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.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.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.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.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.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.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 @@
         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 a926a6f..b2a80b1 100644
--- a/src/com/android/providers/contacts/LocaleSet.java
+++ b/src/com/android/providers/contacts/LocaleSet.java
@@ -24,6 +24,7 @@
 
 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 @@
         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 1734272..8e71bef 100644
--- a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
@@ -37,28 +37,37 @@
     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 @@
         "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 @@
     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 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 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 @@
         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 @@
         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 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 @@
         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 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 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 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 Ñ.