Merge "Refactor proximity info state"
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index c412635..850b1b8 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -87,10 +87,8 @@
         <attr name="keyRepeatStartTimeout" format="integer" />
         <!-- Key repeat interval in millisecond. -->
         <attr name="keyRepeatInterval" format="integer" />
-        <!-- Long press timeout of letter key in millisecond. -->
-        <attr name="longPressKeyTimeout" format="integer" />
-        <!-- Long press timeout of shift key in millisecond. -->
-        <attr name="longPressShiftKeyTimeout" format="integer" />
+        <!-- Long press timeout of shift key to shift lock in millisecond. -->
+        <attr name="longPressShiftLockTimeout" format="integer" />
         <!-- Ignore special key timeout while typing in millisecond. -->
         <attr name="ignoreAltCodeKeyTimeout" format="integer" />
         <!-- Layout resource for key press feedback.-->
diff --git a/java/res/values/config.xml b/java/res/values/config.xml
index 503e923..6b3c891 100644
--- a/java/res/values/config.xml
+++ b/java/res/values/config.xml
@@ -64,10 +64,13 @@
     <bool name="config_sliding_key_input_enabled">true</bool>
     <integer name="config_key_repeat_start_timeout">400</integer>
     <integer name="config_key_repeat_interval">50</integer>
-    <integer name="config_long_press_key_timeout">400</integer>
+    <integer name="config_default_longpress_key_timeout">300</integer>  <!-- milliseconds -->
+    <integer name="config_longpress_timeout_step">10</integer> <!-- milliseconds -->
+    <integer name="config_min_longpress_timeout">100</integer> <!-- milliseconds -->
+    <integer name="config_max_longpress_timeout">700</integer> <!-- milliseconds -->
     <!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 -->
-    <integer name="config_long_press_shift_key_timeout">1200</integer>
-    <integer name="config_ignore_alt_code_key_timeout">350</integer>
+    <integer name="config_longpress_shift_lock_timeout">1200</integer> <!-- milliseconds -->
+    <integer name="config_ignore_alt_code_key_timeout">350</integer> <!-- milliseconds -->
     <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if
          false -->
     <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool>
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index fdae302..e39cafc 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -374,6 +374,8 @@
 
     <!-- Title of an option for usability study mode -->
     <string name="prefs_usability_study_mode">Usability study mode</string>
+    <!-- Title of the settings for key long press delay -->
+    <string name="prefs_key_longpress_timeout_settings">Key long press delay settings</string>
     <!-- Title of the settings for keypress vibration duration -->
     <string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration settings</string>
     <!-- Title of the settings for keypress sound volume -->
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index c398b59..f71963a 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -80,8 +80,7 @@
         <item name="slidingKeyInputEnable">@bool/config_sliding_key_input_enabled</item>
         <item name="keyRepeatStartTimeout">@integer/config_key_repeat_start_timeout</item>
         <item name="keyRepeatInterval">@integer/config_key_repeat_interval</item>
-        <item name="longPressKeyTimeout">@integer/config_long_press_key_timeout</item>
-        <item name="longPressShiftKeyTimeout">@integer/config_long_press_shift_key_timeout</item>
+        <item name="longPressShiftLockTimeout">@integer/config_longpress_shift_lock_timeout</item>
         <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item>
         <item name="keyPreviewLayout">@layout/key_preview</item>
         <item name="keyPreviewOffset">@dimen/key_preview_offset</item>
diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml
index cc1b52b..84e7f54 100644
--- a/java/res/xml/prefs.xml
+++ b/java/res/xml/prefs.xml
@@ -146,6 +146,13 @@
                 android:key="pref_key_preview_popup_dismiss_delay"
                 android:title="@string/key_preview_popup_dismiss_delay" />
             <com.android.inputmethod.latin.SeekBarDialogPreference
+                android:key="pref_key_longpress_timeout"
+                android:title="@string/prefs_key_longpress_timeout_settings"
+                latin:valueFormatText="@string/abbreviation_unit_milliseconds"
+                latin:minValue="@integer/config_min_longpress_timeout"
+                latin:maxValue="@integer/config_max_longpress_timeout"
+                latin:stepValue="@integer/config_longpress_timeout_step" />
+            <com.android.inputmethod.latin.SeekBarDialogPreference
                 android:key="pref_vibration_duration_settings"
                 android:title="@string/prefs_keypress_vibration_duration_settings"
                 latin:valueFormatText="@string/abbreviation_unit_milliseconds"
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 28a22f3..cf89ef2 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -65,6 +65,7 @@
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.ResourceUtils;
+import com.android.inputmethod.latin.Settings;
 import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
 import com.android.inputmethod.latin.StringUtils;
 import com.android.inputmethod.latin.SubtypeLocale;
@@ -205,8 +206,7 @@
 
         private final int mKeyRepeatStartTimeout;
         private final int mKeyRepeatInterval;
-        private final int mLongPressKeyTimeout;
-        private final int mLongPressShiftKeyTimeout;
+        private final int mLongPressShiftLockTimeout;
         private final int mIgnoreAltCodeKeyTimeout;
         private final int mGestureRecognitionUpdateTime;
 
@@ -218,10 +218,8 @@
                     R.styleable.MainKeyboardView_keyRepeatStartTimeout, 0);
             mKeyRepeatInterval = mainKeyboardViewAttr.getInt(
                     R.styleable.MainKeyboardView_keyRepeatInterval, 0);
-            mLongPressKeyTimeout = mainKeyboardViewAttr.getInt(
-                    R.styleable.MainKeyboardView_longPressKeyTimeout, 0);
-            mLongPressShiftKeyTimeout = mainKeyboardViewAttr.getInt(
-                    R.styleable.MainKeyboardView_longPressShiftKeyTimeout, 0);
+            mLongPressShiftLockTimeout = mainKeyboardViewAttr.getInt(
+                    R.styleable.MainKeyboardView_longPressShiftLockTimeout, 0);
             mIgnoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
                     R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
             mGestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt(
@@ -285,7 +283,7 @@
             final int delay;
             switch (code) {
             case Constants.CODE_SHIFT:
-                delay = mLongPressShiftKeyTimeout;
+                delay = mLongPressShiftLockTimeout;
                 break;
             default:
                 delay = 0;
@@ -306,15 +304,17 @@
             final int delay;
             switch (key.mCode) {
             case Constants.CODE_SHIFT:
-                delay = mLongPressShiftKeyTimeout;
+                delay = mLongPressShiftLockTimeout;
                 break;
             default:
+                final int longpressTimeout =
+                        Settings.getInstance().getCurrent().mKeyLongpressTimeout;
                 if (KeyboardSwitcher.getInstance().isInMomentarySwitchState()) {
                     // We use longer timeout for sliding finger input started from the symbols
                     // mode key.
-                    delay = mLongPressKeyTimeout * 3;
+                    delay = longpressTimeout * 3;
                 } else {
-                    delay = mLongPressKeyTimeout;
+                    delay = longpressTimeout;
                 }
                 break;
             }
@@ -1371,7 +1371,7 @@
     private String layoutLanguageOnSpacebar(final Paint paint, final InputMethodSubtype subtype,
             final int width) {
         // Choose appropriate language name to fit into the width.
-        final String fullText = getFullDisplayName(subtype, getResources());
+        final String fullText = getFullDisplayName(subtype);
         if (fitsTextIntoWidth(width, fullText, paint)) {
             return fullText;
         }
@@ -1445,12 +1445,12 @@
     //  zz    azerty  T      AZERTY    AZERTY
 
     // Get InputMethodSubtype's full display name in its locale.
-    static String getFullDisplayName(final InputMethodSubtype subtype, final Resources res) {
+    static String getFullDisplayName(final InputMethodSubtype subtype) {
         if (SubtypeLocale.isNoLanguage(subtype)) {
             return SubtypeLocale.getKeyboardLayoutSetDisplayName(subtype);
         }
 
-        return SubtypeLocale.getSubtypeDisplayName(subtype, res);
+        return SubtypeLocale.getSubtypeDisplayName(subtype);
     }
 
     // Get InputMethodSubtype's short display name in its locale.
diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
index 9e5e183..a56c78b 100644
--- a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
+++ b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
@@ -103,7 +103,7 @@
                 if (DEBUG_SUBTYPE_ID) {
                     android.util.Log.d(TAG, String.format("%-6s 0x%08x %11d %s",
                             subtype.getLocale(), subtype.hashCode(), subtype.hashCode(),
-                            SubtypeLocale.getSubtypeDisplayName(subtype, context.getResources())));
+                            SubtypeLocale.getSubtypeDisplayName(subtype)));
                 }
                 if (subtype.containsExtraValueKey(ASCII_CAPABLE)) {
                     items.add(createItem(context, subtype.getLocale()));
@@ -205,8 +205,7 @@
                 setDialogTitle(R.string.add_style);
                 setKey(KEY_NEW_SUBTYPE);
             } else {
-                final String displayName = SubtypeLocale.getSubtypeDisplayName(
-                        subtype, getContext().getResources());
+                final String displayName = SubtypeLocale.getSubtypeDisplayName(subtype);
                 setTitle(displayName);
                 setDialogTitle(displayName);
                 setKey(KEY_PREFIX + subtype.getLocale() + "_"
@@ -498,7 +497,7 @@
         final Context context = getActivity();
         final Resources res = context.getResources();
         final String message = res.getString(R.string.custom_input_style_already_exists,
-                SubtypeLocale.getSubtypeDisplayName(subtype, res));
+                SubtypeLocale.getSubtypeDisplayName(subtype));
         Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Settings.java b/java/src/com/android/inputmethod/latin/Settings.java
index aa705da..408ea4a 100644
--- a/java/src/com/android/inputmethod/latin/Settings.java
+++ b/java/src/com/android/inputmethod/latin/Settings.java
@@ -55,6 +55,7 @@
     public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction";
     public static final String PREF_GESTURE_SETTINGS = "gesture_typing_settings";
     public static final String PREF_GESTURE_INPUT = "gesture_input";
+    public static final String PREF_KEY_LONGPRESS_TIMEOUT = "pref_key_longpress_timeout";
     public static final String PREF_VIBRATION_DURATION_SETTINGS =
             "pref_vibration_duration_settings";
     public static final String PREF_KEYPRESS_SOUND_VOLUME =
@@ -175,6 +176,16 @@
                 ResourceUtils.getDeviceOverrideValue(res, R.array.keypress_volumes));
     }
 
+    public static int readKeyLongpressTimeout(final SharedPreferences prefs,
+            final Resources res) {
+        final int ms = prefs.getInt(PREF_KEY_LONGPRESS_TIMEOUT, -1);
+        return (ms >= 0) ? ms : readDefaultKeyLongpressTimeout(res);
+    }
+
+    public static int readDefaultKeyLongpressTimeout(final Resources res) {
+        return res.getInteger(R.integer.config_default_longpress_key_timeout);
+    }
+
     public static int readKeypressVibrationDuration(final SharedPreferences prefs,
             final Resources res) {
         final int ms = prefs.getInt(PREF_VIBRATION_DURATION_SETTINGS, -1);
diff --git a/java/src/com/android/inputmethod/latin/SettingsFragment.java b/java/src/com/android/inputmethod/latin/SettingsFragment.java
index afe6f35..3ba24fb 100644
--- a/java/src/com/android/inputmethod/latin/SettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/SettingsFragment.java
@@ -164,6 +164,7 @@
             getPreferenceScreen().removePreference(gestureTypingSettings);
         }
 
+        setupKeyLongpressTimeoutSettings(prefs, res);
         setupKeypressVibrationDurationSettings(prefs, res);
         setupKeypressSoundVolumeSettings(prefs, res);
         refreshEnablingsOfKeypressSoundAndVibrationSettings(prefs, res);
@@ -236,7 +237,7 @@
         final StringBuilder styles = new StringBuilder();
         for (final InputMethodSubtype subtype : subtypes) {
             if (styles.length() > 0) styles.append(", ");
-            styles.append(SubtypeLocale.getSubtypeDisplayName(subtype, res));
+            styles.append(SubtypeLocale.getSubtypeDisplayName(subtype));
         }
         customInputStyles.setSummary(styles);
     }
@@ -298,6 +299,34 @@
         });
     }
 
+    private void setupKeyLongpressTimeoutSettings(final SharedPreferences sp,
+            final Resources res) {
+        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
+                Settings.PREF_KEY_LONGPRESS_TIMEOUT);
+        if (pref == null) {
+            return;
+        }
+        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
+            @Override
+            public void writeValue(final int value, final String key) {
+                sp.edit().putInt(key, value).apply();
+            }
+
+            @Override
+            public int readValue(final String key) {
+                return Settings.readKeyLongpressTimeout(sp, res);
+            }
+
+            @Override
+            public int readDefaultValue(final String key) {
+                return Settings.readDefaultKeyLongpressTimeout(res);
+            }
+
+            @Override
+            public void feedbackValue(final int value) {}
+        });
+    }
+
     private void setupKeypressSoundVolumeSettings(final SharedPreferences sp, final Resources res) {
         final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
                 Settings.PREF_KEYPRESS_SOUND_VOLUME);
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index d6556d6..29e79e4 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -59,6 +59,7 @@
     public final boolean mGestureInputEnabled;
     public final boolean mGesturePreviewTrailEnabled;
     public final boolean mGestureFloatingPreviewTextEnabled;
+    public final int mKeyLongpressTimeout;
 
     // From the input box
     public final InputAttributes mInputAttributes;
@@ -121,6 +122,7 @@
         mBigramPredictionEnabled = readBigramPredictionEnabled(prefs, res);
 
         // Compute other readable settings
+        mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res);
         mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs, res);
         mKeypressSoundVolume = Settings.readKeypressSoundVolume(prefs, res);
         mKeyPreviewPopupDismissDelay = Settings.readKeyPreviewPopupDismissDelay(prefs, res);
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
index 370a659..068c34e 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -42,6 +42,7 @@
     public static final int UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic;
 
     private static boolean sInitialized = false;
+    private static Resources sResources;
     private static String[] sPredefinedKeyboardLayoutSet;
     // Keyboard layout to its display name map.
     private static final HashMap<String, String> sKeyboardLayoutToDisplayNameMap =
@@ -71,10 +72,11 @@
     }
 
     // Note that this initialization method can be called multiple times.
-    public static synchronized void init(Context context) {
+    public static synchronized void init(final Context context) {
         if (sInitialized) return;
 
         final Resources res = context.getResources();
+        sResources = res;
 
         final String[] predefinedLayoutSet = res.getStringArray(R.array.predefined_layouts);
         sPredefinedKeyboardLayoutSet = predefinedLayoutSet;
@@ -121,15 +123,15 @@
         return sPredefinedKeyboardLayoutSet;
     }
 
-    public static boolean isExceptionalLocale(String localeString) {
+    public static boolean isExceptionalLocale(final String localeString) {
         return sExceptionalLocaleToWithLayoutNameIdsMap.containsKey(localeString);
     }
 
-    private static final String getNoLanguageLayoutKey(String keyboardLayoutName) {
+    private static final String getNoLanguageLayoutKey(final String keyboardLayoutName) {
         return NO_LANGUAGE + "_" + keyboardLayoutName;
     }
 
-    public static int getSubtypeNameId(String localeString, String keyboardLayoutName) {
+    public static int getSubtypeNameId(final String localeString, final String keyboardLayoutName) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
                 && isExceptionalLocale(localeString)) {
             return sExceptionalLocaleToWithLayoutNameIdsMap.get(localeString);
@@ -141,7 +143,7 @@
         return nameId == null ? UNKNOWN_KEYBOARD_LAYOUT : nameId;
     }
 
-    public static String getSubtypeLocaleDisplayName(String localeString) {
+    public static String getSubtypeLocaleDisplayName(final String localeString) {
         final String exceptionalValue = sExceptionalDisplayNamesMap.get(localeString);
         if (exceptionalValue != null) {
             return exceptionalValue;
@@ -166,12 +168,17 @@
     //  en_US azerty  T  English (US) (AZERTY)
     //  zz    azerty  T  No language (AZERTY)    in system locale
 
-    public static String getSubtypeDisplayName(final InputMethodSubtype subtype, Resources res) {
-        final String replacementString =
-                (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
-                        && subtype.containsExtraValueKey(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME))
-                ? subtype.getExtraValueOf(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME)
-                : getSubtypeLocaleDisplayName(subtype.getLocale());
+    private static String getReplacementString(final InputMethodSubtype subtype) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN
+                && subtype.containsExtraValueKey(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME)) {
+            return subtype.getExtraValueOf(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME);
+        } else {
+            return getSubtypeLocaleDisplayName(subtype.getLocale());
+        }
+    }
+
+    public static String getSubtypeDisplayName(final InputMethodSubtype subtype) {
+        final String replacementString = getReplacementString(subtype);
         final int nameResId = subtype.getNameResId();
         final RunInLocale<String> getSubtypeName = new RunInLocale<String>() {
             @Override
@@ -190,30 +197,30 @@
             }
         };
         final Locale locale = isNoLanguage(subtype)
-                ? res.getConfiguration().locale : getSubtypeLocale(subtype);
-        return getSubtypeName.runInLocale(res, locale);
+                ? sResources.getConfiguration().locale : getSubtypeLocale(subtype);
+        return getSubtypeName.runInLocale(sResources, locale);
     }
 
-    public static boolean isNoLanguage(InputMethodSubtype subtype) {
+    public static boolean isNoLanguage(final InputMethodSubtype subtype) {
         final String localeString = subtype.getLocale();
         return localeString.equals(NO_LANGUAGE);
     }
 
-    public static Locale getSubtypeLocale(InputMethodSubtype subtype) {
+    public static Locale getSubtypeLocale(final InputMethodSubtype subtype) {
         final String localeString = subtype.getLocale();
         return LocaleUtils.constructLocaleFromString(localeString);
     }
 
-    public static String getKeyboardLayoutSetDisplayName(InputMethodSubtype subtype) {
+    public static String getKeyboardLayoutSetDisplayName(final InputMethodSubtype subtype) {
         final String layoutName = getKeyboardLayoutSetName(subtype);
         return getKeyboardLayoutSetDisplayName(layoutName);
     }
 
-    public static String getKeyboardLayoutSetDisplayName(String layoutName) {
+    public static String getKeyboardLayoutSetDisplayName(final String layoutName) {
         return sKeyboardLayoutToDisplayNameMap.get(layoutName);
     }
 
-    public static String getKeyboardLayoutSetName(InputMethodSubtype subtype) {
+    public static String getKeyboardLayoutSetName(final InputMethodSubtype subtype) {
         String keyboardLayoutSet = subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET);
         if (keyboardLayoutSet == null) {
             // This subtype doesn't have a keyboardLayoutSet extra value, so lookup its keyboard
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index eb0ec39..2f9e34f 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -151,8 +151,7 @@
     // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
     public void onSubtypeChanged(final InputMethodSubtype newSubtype) {
         if (DBG) {
-            Log.w(TAG, "onSubtypeChanged: " + SubtypeLocale.getSubtypeDisplayName(
-                    newSubtype, mResources));
+            Log.w(TAG, "onSubtypeChanged: " + SubtypeLocale.getSubtypeDisplayName(newSubtype));
         }
 
         final Locale newLocale = SubtypeLocale.getSubtypeLocale(newSubtype);
diff --git a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
index 015c271..4db5447 100644
--- a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
@@ -17,7 +17,6 @@
 package com.android.inputmethod.keyboard;
 
 import android.content.Context;
-import android.content.res.Resources;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -35,7 +34,6 @@
     private final ArrayList<InputMethodSubtype> mSubtypesList = CollectionUtils.newArrayList();
 
     private RichInputMethodManager mRichImm;
-    private Resources mRes;
 
     @Override
     protected void setUp() throws Exception {
@@ -43,14 +41,13 @@
         final Context context = getContext();
         RichInputMethodManager.init(context);
         mRichImm = RichInputMethodManager.getInstance();
-        mRes = context.getResources();
         SubtypeLocale.init(context);
     }
 
     public void testAllFullDisplayName() {
         for (final InputMethodSubtype subtype : mSubtypesList) {
-            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype, mRes);
-            final String spacebarText = MainKeyboardView.getFullDisplayName(subtype, mRes);
+            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype);
+            final String spacebarText = MainKeyboardView.getFullDisplayName(subtype);
             final String languageName =
                     SubtypeLocale.getSubtypeLocaleDisplayName(subtype.getLocale());
             if (SubtypeLocale.isNoLanguage(subtype)) {
@@ -63,7 +60,7 @@
 
    public void testAllMiddleDisplayName() {
         for (final InputMethodSubtype subtype : mSubtypesList) {
-            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype, mRes);
+            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype);
             final String spacebarText = MainKeyboardView.getMiddleDisplayName(subtype);
             if (SubtypeLocale.isNoLanguage(subtype)) {
                 assertEquals(subtypeName,
@@ -78,7 +75,7 @@
 
     public void testAllShortDisplayName() {
         for (final InputMethodSubtype subtype : mSubtypesList) {
-            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype, mRes);
+            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype);
             final Locale locale = SubtypeLocale.getSubtypeLocale(subtype);
             final String spacebarText = MainKeyboardView.getShortDisplayName(subtype);
             final String languageCode = StringUtils.toTitleCase(locale.getLanguage(), locale);
@@ -120,17 +117,17 @@
                 SubtypeLocale.NO_LANGUAGE, "qwerty");
 
         assertEquals("en_US", "English (US)",
-                MainKeyboardView.getFullDisplayName(EN_US, mRes));
+                MainKeyboardView.getFullDisplayName(EN_US));
         assertEquals("en_GB", "English (UK)",
-                MainKeyboardView.getFullDisplayName(EN_GB, mRes));
+                MainKeyboardView.getFullDisplayName(EN_GB));
         assertEquals("fr   ", "Français",
-                MainKeyboardView.getFullDisplayName(FR, mRes));
+                MainKeyboardView.getFullDisplayName(FR));
         assertEquals("fr_CA", "Français (Canada)",
-                MainKeyboardView.getFullDisplayName(FR_CA, mRes));
+                MainKeyboardView.getFullDisplayName(FR_CA));
         assertEquals("de   ", "Deutsch",
-                MainKeyboardView.getFullDisplayName(DE, mRes));
+                MainKeyboardView.getFullDisplayName(DE));
         assertEquals("zz   ", "QWERTY",
-                MainKeyboardView.getFullDisplayName(ZZ, mRes));
+                MainKeyboardView.getFullDisplayName(ZZ));
 
         assertEquals("en_US", "English",  MainKeyboardView.getMiddleDisplayName(EN_US));
         assertEquals("en_GB", "English",  MainKeyboardView.getMiddleDisplayName(EN_GB));
@@ -158,13 +155,13 @@
                 SubtypeLocale.NO_LANGUAGE, "azerty", null);
 
         assertEquals("fr qwertz",    "Français (QWERTZ)",
-                MainKeyboardView.getFullDisplayName(FR_QWERTZ, mRes));
+                MainKeyboardView.getFullDisplayName(FR_QWERTZ));
         assertEquals("de qwerty",    "Deutsch (QWERTY)",
-                MainKeyboardView.getFullDisplayName(DE_QWERTY, mRes));
+                MainKeyboardView.getFullDisplayName(DE_QWERTY));
         assertEquals("en_US azerty", "English (US) (AZERTY)",
-                MainKeyboardView.getFullDisplayName(US_AZERTY, mRes));
+                MainKeyboardView.getFullDisplayName(US_AZERTY));
         assertEquals("zz azerty",    "AZERTY",
-                MainKeyboardView.getFullDisplayName(ZZ_AZERTY, mRes));
+                MainKeyboardView.getFullDisplayName(ZZ_AZERTY));
 
         assertEquals("fr qwertz",    "Français", MainKeyboardView.getMiddleDisplayName(FR_QWERTZ));
         assertEquals("de qwerty",    "Deutsch",  MainKeyboardView.getMiddleDisplayName(DE_QWERTY));
diff --git a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
index 4e81de6..9af6dbc 100644
--- a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
+++ b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
@@ -33,6 +33,18 @@
     private RichInputMethodManager mRichImm;
     private Resources mRes;
 
+    InputMethodSubtype EN_US;
+    InputMethodSubtype EN_GB;
+    InputMethodSubtype ES_US;
+    InputMethodSubtype FR;
+    InputMethodSubtype FR_CA;
+    InputMethodSubtype DE;
+    InputMethodSubtype ZZ;
+    InputMethodSubtype DE_QWERTY;
+    InputMethodSubtype FR_QWERTZ;
+    InputMethodSubtype US_AZERTY;
+    InputMethodSubtype ZZ_AZERTY;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -41,11 +53,35 @@
         mRichImm = RichInputMethodManager.getInstance();
         mRes = context.getResources();
         SubtypeLocale.init(context);
+
+        EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                Locale.US.toString(), "qwerty");
+        EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                Locale.UK.toString(), "qwerty");
+        ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                "es_US", "spanish");
+        FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                Locale.FRENCH.toString(), "azerty");
+        FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                Locale.CANADA_FRENCH.toString(), "qwerty");
+        DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                Locale.GERMAN.toString(), "qwertz");
+        ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
+                SubtypeLocale.NO_LANGUAGE, "qwerty");
+        DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.GERMAN.toString(), "qwerty", null);
+        FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
+                Locale.FRENCH.toString(), "qwertz", null);
+        US_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.US.toString(), "azerty", null);
+        ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                SubtypeLocale.NO_LANGUAGE, "azerty", null);
+
     }
 
     public void testAllFullDisplayName() {
         for (final InputMethodSubtype subtype : mSubtypesList) {
-            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype, mRes);
+            final String subtypeName = SubtypeLocale.getSubtypeDisplayName(subtype);
             if (SubtypeLocale.isNoLanguage(subtype)) {
                 final String noLanguage = mRes.getString(R.string.subtype_no_language);
                 assertTrue(subtypeName, subtypeName.contains(noLanguage));
@@ -74,21 +110,6 @@
     //  zz    azerty  T  No language (AZERTY)    in system locale
 
     public void testPredefinedSubtypesInEnglish() {
-        final InputMethodSubtype EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.US.toString(), "qwerty");
-        final InputMethodSubtype EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.UK.toString(), "qwerty");
-        final InputMethodSubtype ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                "es_US", "spanish");
-        final InputMethodSubtype FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.FRENCH.toString(), "azerty");
-        final InputMethodSubtype FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.CANADA_FRENCH.toString(), "qwerty");
-        final InputMethodSubtype DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.GERMAN.toString(), "qwertz");
-        final InputMethodSubtype ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                SubtypeLocale.NO_LANGUAGE, "qwerty");
-
         assertEquals("en_US", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(EN_US));
         assertEquals("en_GB", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(EN_GB));
         assertEquals("es_US", "spanish", SubtypeLocale.getKeyboardLayoutSetName(ES_US));
@@ -101,19 +122,19 @@
             @Override
             protected Void job(Resources res) {
                 assertEquals("en_US", "English (US)",
-                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                        SubtypeLocale.getSubtypeDisplayName(EN_US));
                 assertEquals("en_GB", "English (UK)",
-                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB));
                 assertEquals("es_US", "Español (EE.UU.)",
-                        SubtypeLocale.getSubtypeDisplayName(ES_US, res));
+                        SubtypeLocale.getSubtypeDisplayName(ES_US));
                 assertEquals("fr   ", "Français",
-                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR));
                 assertEquals("fr_CA", "Français (Canada)",
-                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA));
                 assertEquals("de   ", "Deutsch",
-                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                        SubtypeLocale.getSubtypeDisplayName(DE));
                 assertEquals("zz   ", "No language (QWERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(ZZ, res));
+                        SubtypeLocale.getSubtypeDisplayName(ZZ));
                 return null;
             }
         };
@@ -121,26 +142,17 @@
     }
 
     public void testAdditionalSubtypesInEnglish() {
-        final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
-                Locale.GERMAN.toString(), "qwerty", null);
-        final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
-                Locale.FRENCH.toString(), "qwertz", null);
-        final InputMethodSubtype US_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                Locale.US.toString(), "azerty", null);
-        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                SubtypeLocale.NO_LANGUAGE, "azerty", null);
-
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
             protected Void job(Resources res) {
                 assertEquals("fr qwertz",    "Français (QWERTZ)",
-                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ));
                 assertEquals("de qwerty",    "Deutsch (QWERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY));
                 assertEquals("en_US azerty", "English (US) (AZERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY));
                 assertEquals("zz azerty",    "No language (AZERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY));
                 return null;
             }
         };
@@ -148,38 +160,23 @@
     }
 
     public void testPredefinedSubtypesInFrench() {
-        final InputMethodSubtype EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.US.toString(), "qwerty");
-        final InputMethodSubtype EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.UK.toString(), "qwerty");
-        final InputMethodSubtype ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                "es_US", "spanish");
-        final InputMethodSubtype FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.FRENCH.toString(), "azerty");
-        final InputMethodSubtype FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.CANADA_FRENCH.toString(), "qwerty");
-        final InputMethodSubtype DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                Locale.GERMAN.toString(), "qwertz");
-        final InputMethodSubtype ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
-                SubtypeLocale.NO_LANGUAGE, "qwerty");
-
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
             protected Void job(Resources res) {
                 assertEquals("en_US", "English (US)",
-                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                        SubtypeLocale.getSubtypeDisplayName(EN_US));
                 assertEquals("en_GB", "English (UK)",
-                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB));
                 assertEquals("es_US", "Español (EE.UU.)",
-                        SubtypeLocale.getSubtypeDisplayName(ES_US, res));
+                        SubtypeLocale.getSubtypeDisplayName(ES_US));
                 assertEquals("fr   ", "Français",
-                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR));
                 assertEquals("fr_CA", "Français (Canada)",
-                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA));
                 assertEquals("de   ", "Deutsch",
-                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                        SubtypeLocale.getSubtypeDisplayName(DE));
                 assertEquals("zz   ", "Pas de langue (QWERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(ZZ, res));
+                        SubtypeLocale.getSubtypeDisplayName(ZZ));
                 return null;
             }
         };
@@ -187,26 +184,17 @@
     }
 
     public void testAdditionalSubtypesInFrench() {
-        final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
-                Locale.GERMAN.toString(), "qwerty", null);
-        final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
-                Locale.FRENCH.toString(), "qwertz", null);
-        final InputMethodSubtype US_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                Locale.US.toString(), "azerty", null);
-        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                SubtypeLocale.NO_LANGUAGE, "azerty", null);
-
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
             protected Void job(Resources res) {
                 assertEquals("fr qwertz",    "Français (QWERTZ)",
-                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ));
                 assertEquals("de qwerty",    "Deutsch (QWERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY));
                 assertEquals("en_US azerty", "English (US) (AZERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY));
                 assertEquals("zz azerty",    "Aucune langue (AZERTY)",
-                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
+                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY));
                 return null;
             }
         };