Merge "Adjust debug warning log"
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/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index e720275..8c6a525 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -71,9 +71,9 @@
         mSampledTimes.clear();
         mSampledInputIndice.clear();
         mSampledLengthCache.clear();
-        mDistanceCache_G.clear();
-        mNearKeysVector.clear();
-        mSearchKeysVector.clear();
+        mSampledDistanceCache_G.clear();
+        mSampledNearKeysVector.clear();
+        mSampledSearchKeysVector.clear();
         mSpeedRates.clear();
         mBeelineSpeedPercentiles.clear();
         mCharProbabilities.clear();
@@ -108,16 +108,17 @@
         ProximityInfoStateUtils::initGeometricDistanceInfos(
                 mProximityInfo, mProximityInfo->getKeyCount(),
                 mSampledInputSize, lastSavedInputSize, &mSampledInputXs, &mSampledInputYs,
-                &mNearKeysVector, &mSearchKeysVector, &mDistanceCache_G);
+                &mSampledNearKeysVector, &mSampledDistanceCache_G);
         if (isGeometric) {
             // updates probabilities of skipping or mapping each key for all points.
             ProximityInfoStateUtils::updateAlignPointProbabilities(
                     mMaxPointToKeyLength, mProximityInfo->getMostCommonKeyWidth(),
                     mProximityInfo->getKeyCount(), lastSavedInputSize, mSampledInputSize,
                     &mSampledInputXs, &mSampledInputYs, &mSpeedRates, &mSampledLengthCache,
-                    &mDistanceCache_G, &mNearKeysVector, &mCharProbabilities);
-            ProximityInfoStateUtils::updateSearchKeysVector(mProximityInfo, mSampledInputSize,
-                    lastSavedInputSize, &mSampledLengthCache, &mNearKeysVector, &mSearchKeysVector);
+                    &mSampledDistanceCache_G, &mSampledNearKeysVector, &mCharProbabilities);
+            ProximityInfoStateUtils::updateSampledSearchKeysVector(mProximityInfo,
+                    mSampledInputSize, lastSavedInputSize, &mSampledLengthCache,
+                    &mSampledNearKeysVector, &mSampledSearchKeysVector);
         }
     }
 
@@ -189,7 +190,7 @@
     const int keyId = mProximityInfo->getKeyIndexOf(codePoint);
     if (keyId != NOT_AN_INDEX) {
         const int index = inputIndex * mProximityInfo->getKeyCount() + keyId;
-        return min(mDistanceCache_G[index] * scale, mMaxPointToKeyLength);
+        return min(mSampledDistanceCache_G[index] * scale, mMaxPointToKeyLength);
     }
     if (isSkippableCodePoint(codePoint)) {
         return 0.0f;
@@ -206,7 +207,7 @@
 float ProximityInfoState::getPointToKeyByIdLength(
         const int inputIndex, const int keyId, const float scale) const {
     return ProximityInfoStateUtils::getPointToKeyByIdLength(mMaxPointToKeyLength,
-            &mDistanceCache_G, mProximityInfo->getKeyCount(), inputIndex, keyId, scale);
+            &mSampledDistanceCache_G, mProximityInfo->getKeyCount(), inputIndex, keyId, scale);
 }
 
 float ProximityInfoState::getPointToKeyByIdLength(const int inputIndex, const int keyId) const {
@@ -289,7 +290,7 @@
     int newFilterSize = filterSize;
     const int keyCount = mProximityInfo->getKeyCount();
     for (int j = 0; j < keyCount; ++j) {
-        if (mSearchKeysVector[index].test(j)) {
+        if (mSampledSearchKeysVector[index].test(j)) {
             const int keyCodePoint = mProximityInfo->getCodePointOf(j);
             bool insert = true;
             // TODO: Avoid linear search
@@ -310,7 +311,7 @@
 bool ProximityInfoState::isKeyInSerchKeysAfterIndex(const int index, const int keyId) const {
     ASSERT(keyId >= 0);
     ASSERT(index >= 0 && index < mSampledInputSize);
-    return mSearchKeysVector[index].test(keyId);
+    return mSampledSearchKeysVector[index].test(keyId);
 }
 
 void ProximityInfoState::popInputData() {
diff --git a/native/jni/src/proximity_info_state.h b/native/jni/src/proximity_info_state.h
index 8bada27..642925c 100644
--- a/native/jni/src/proximity_info_state.h
+++ b/native/jni/src/proximity_info_state.h
@@ -52,9 +52,9 @@
               mKeyCount(0), mCellHeight(0), mCellWidth(0), mGridHeight(0), mGridWidth(0),
               mIsContinuationPossible(false), mSampledInputXs(), mSampledInputYs(), mSampledTimes(),
               mSampledInputIndice(), mSampledLengthCache(), mBeelineSpeedPercentiles(),
-              mDistanceCache_G(), mSpeedRates(), mDirections(), mCharProbabilities(),
-              mNearKeysVector(), mSearchKeysVector(), mTouchPositionCorrectionEnabled(false),
-              mSampledInputSize(0) {
+              mSampledDistanceCache_G(), mSpeedRates(), mDirections(), mCharProbabilities(),
+              mSampledNearKeysVector(), mSampledSearchKeysVector(),
+              mTouchPositionCorrectionEnabled(false), mSampledInputSize(0) {
         memset(mInputProximities, 0, sizeof(mInputProximities));
         memset(mNormalizedSquaredDistances, 0, sizeof(mNormalizedSquaredDistances));
         memset(mPrimaryInputWord, 0, sizeof(mPrimaryInputWord));
@@ -240,20 +240,20 @@
     std::vector<int> mSampledInputIndice;
     std::vector<int> mSampledLengthCache;
     std::vector<int> mBeelineSpeedPercentiles;
-    std::vector<float> mDistanceCache_G;
+    std::vector<float> mSampledDistanceCache_G;
     std::vector<float> mSpeedRates;
     std::vector<float> mDirections;
     // probabilities of skipping or mapping to a key for each point.
     std::vector<hash_map_compat<int, float> > mCharProbabilities;
     // The vector for the key code set which holds nearby keys for each sampled input point
     // 1. Used to calculate the probability of the key
-    // 2. Used to calculate mSearchKeysVector
-    std::vector<ProximityInfoStateUtils::NearKeycodesSet> mNearKeysVector;
+    // 2. Used to calculate mSampledSearchKeysVector
+    std::vector<ProximityInfoStateUtils::NearKeycodesSet> mSampledNearKeysVector;
     // The vector for the key code set which holds nearby keys of some trailing sampled input points
     // for each sampled input point. These nearby keys contain the next characters which can be in
     // the dictionary. Specifically, currently we are looking for keys nearby trailing sampled
     // inputs including the current input point.
-    std::vector<ProximityInfoStateUtils::NearKeycodesSet> mSearchKeysVector;
+    std::vector<ProximityInfoStateUtils::NearKeycodesSet> mSampledSearchKeysVector;
     bool mTouchPositionCorrectionEnabled;
     int mInputProximities[MAX_PROXIMITY_CHARS_SIZE * MAX_WORD_LENGTH];
     int mNormalizedSquaredDistances[MAX_PROXIMITY_CHARS_SIZE * MAX_WORD_LENGTH];
diff --git a/native/jni/src/proximity_info_state_utils.cpp b/native/jni/src/proximity_info_state_utils.cpp
index 89e9a30..cbc191e 100644
--- a/native/jni/src/proximity_info_state_utils.cpp
+++ b/native/jni/src/proximity_info_state_utils.cpp
@@ -215,15 +215,12 @@
         const int sampledInputSize, const int lastSavedInputSize,
         const std::vector<int> *const sampledInputXs,
         const std::vector<int> *const sampledInputYs,
-        std::vector<NearKeycodesSet> *nearKeysVector,
-        std::vector<NearKeycodesSet> *searchKeysVector,
-        std::vector<float> *distanceCache_G) {
-    nearKeysVector->resize(sampledInputSize);
-    searchKeysVector->resize(sampledInputSize);
-    distanceCache_G->resize(sampledInputSize * keyCount);
+        std::vector<NearKeycodesSet> *SampledNearKeysVector,
+        std::vector<float> *SampledDistanceCache_G) {
+    SampledNearKeysVector->resize(sampledInputSize);
+    SampledDistanceCache_G->resize(sampledInputSize * keyCount);
     for (int i = lastSavedInputSize; i < sampledInputSize; ++i) {
-        (*nearKeysVector)[i].reset();
-        (*searchKeysVector)[i].reset();
+        (*SampledNearKeysVector)[i].reset();
         static const float NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD = 4.0f;
         for (int k = 0; k < keyCount; ++k) {
             const int index = i * keyCount + k;
@@ -231,9 +228,9 @@
             const int y = (*sampledInputYs)[i];
             const float normalizedSquaredDistance =
                     proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y);
-            (*distanceCache_G)[index] = normalizedSquaredDistance;
+            (*SampledDistanceCache_G)[index] = normalizedSquaredDistance;
             if (normalizedSquaredDistance < NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) {
-                (*nearKeysVector)[i][k] = true;
+                (*SampledNearKeysVector)[i][k] = true;
             }
         }
     }
@@ -638,21 +635,21 @@
 // This function basically converts from a length to an edit distance. Accordingly, it's obviously
 // wrong to compare with mMaxPointToKeyLength.
 /* static */ float ProximityInfoStateUtils::getPointToKeyByIdLength(const float maxPointToKeyLength,
-        const std::vector<float> *const distanceCache_G, const int keyCount,
+        const std::vector<float> *const SampledDistanceCache_G, const int keyCount,
         const int inputIndex, const int keyId, const float scale) {
     if (keyId != NOT_AN_INDEX) {
         const int index = inputIndex * keyCount + keyId;
-        return min((*distanceCache_G)[index] * scale, maxPointToKeyLength);
+        return min((*SampledDistanceCache_G)[index] * scale, maxPointToKeyLength);
     }
     // If the char is not a key on the keyboard then return the max length.
     return static_cast<float>(MAX_POINT_TO_KEY_LENGTH);
 }
 
 /* static */ float ProximityInfoStateUtils::getPointToKeyByIdLength(const float maxPointToKeyLength,
-        const std::vector<float> *const distanceCache_G, const int keyCount,
+        const std::vector<float> *const SampledDistanceCache_G, const int keyCount,
         const int inputIndex, const int keyId) {
-    return getPointToKeyByIdLength(maxPointToKeyLength, distanceCache_G, keyCount, inputIndex,
-            keyId, 1.0f);
+    return getPointToKeyByIdLength(
+            maxPointToKeyLength, SampledDistanceCache_G, keyCount, inputIndex, keyId, 1.0f);
 }
 
 // Updates probabilities of aligning to some keys and skipping.
@@ -663,8 +660,8 @@
         const std::vector<int> *const sampledInputYs,
         const std::vector<float> *const sampledSpeedRates,
         const std::vector<int> *const sampledLengthCache,
-        const std::vector<float> *const distanceCache_G,
-        std::vector<NearKeycodesSet> *nearKeysVector,
+        const std::vector<float> *const SampledDistanceCache_G,
+        std::vector<NearKeycodesSet> *SampledNearKeysVector,
         std::vector<hash_map_compat<int, float> > *charProbabilities) {
     static const float MIN_PROBABILITY = 0.000001f;
     static const float MAX_SKIP_PROBABILITY = 0.95f;
@@ -701,9 +698,9 @@
 
         float nearestKeyDistance = static_cast<float>(MAX_POINT_TO_KEY_LENGTH);
         for (int j = 0; j < keyCount; ++j) {
-            if ((*nearKeysVector)[i].test(j)) {
+            if ((*SampledNearKeysVector)[i].test(j)) {
                 const float distance = getPointToKeyByIdLength(
-                        maxPointToKeyLength, distanceCache_G, keyCount, i, j);
+                        maxPointToKeyLength, SampledDistanceCache_G, keyCount, i, j);
                 if (distance < nearestKeyDistance) {
                     nearestKeyDistance = distance;
                 }
@@ -786,14 +783,14 @@
         // Summing up probability densities of all near keys.
         float sumOfProbabilityDensities = 0.0f;
         for (int j = 0; j < keyCount; ++j) {
-            if ((*nearKeysVector)[i].test(j)) {
+            if ((*SampledNearKeysVector)[i].test(j)) {
                 float distance = sqrtf(getPointToKeyByIdLength(
-                        maxPointToKeyLength, distanceCache_G, keyCount, i, j));
+                        maxPointToKeyLength, SampledDistanceCache_G, keyCount, i, j));
                 if (i == 0 && i != sampledInputSize - 1) {
                     // For the first point, weighted average of distances from first point and the
                     // next point to the key is used as a point to key distance.
                     const float nextDistance = sqrtf(getPointToKeyByIdLength(
-                            maxPointToKeyLength, distanceCache_G, keyCount, i + 1, j));
+                            maxPointToKeyLength, SampledDistanceCache_G, keyCount, i + 1, j));
                     if (nextDistance < distance) {
                         // The distance of the first point tends to bigger than continuing
                         // points because the first touch by the user can be sloppy.
@@ -806,7 +803,7 @@
                     // For the first point, weighted average of distances from last point and
                     // the previous point to the key is used as a point to key distance.
                     const float previousDistance = sqrtf(getPointToKeyByIdLength(
-                            maxPointToKeyLength, distanceCache_G, keyCount, i - 1, j));
+                            maxPointToKeyLength, SampledDistanceCache_G, keyCount, i - 1, j));
                     if (previousDistance < distance) {
                         // The distance of the last point tends to bigger than continuing points
                         // because the last touch by the user can be sloppy. So we promote the
@@ -824,14 +821,14 @@
 
         // Split the probability of an input point to keys that are close to the input point.
         for (int j = 0; j < keyCount; ++j) {
-            if ((*nearKeysVector)[i].test(j)) {
+            if ((*SampledNearKeysVector)[i].test(j)) {
                 float distance = sqrtf(getPointToKeyByIdLength(
-                        maxPointToKeyLength, distanceCache_G, keyCount, i, j));
+                        maxPointToKeyLength, SampledDistanceCache_G, keyCount, i, j));
                 if (i == 0 && i != sampledInputSize - 1) {
                     // For the first point, weighted average of distances from the first point and
                     // the next point to the key is used as a point to key distance.
                     const float prevDistance = sqrtf(getPointToKeyByIdLength(
-                            maxPointToKeyLength, distanceCache_G, keyCount, i + 1, j));
+                            maxPointToKeyLength, SampledDistanceCache_G, keyCount, i + 1, j));
                     if (prevDistance < distance) {
                         distance = (distance + prevDistance * NEXT_DISTANCE_WEIGHT)
                                 / (1.0f + NEXT_DISTANCE_WEIGHT);
@@ -840,7 +837,7 @@
                     // For the first point, weighted average of distances from last point and
                     // the previous point to the key is used as a point to key distance.
                     const float prevDistance = sqrtf(getPointToKeyByIdLength(
-                            maxPointToKeyLength, distanceCache_G, keyCount, i - 1, j));
+                            maxPointToKeyLength, SampledDistanceCache_G, keyCount, i - 1, j));
                     if (prevDistance < distance) {
                         distance = (distance + prevDistance * PREV_DISTANCE_WEIGHT)
                                 / (1.0f + PREV_DISTANCE_WEIGHT);
@@ -906,10 +903,10 @@
         for (int j = 0; j < keyCount; ++j) {
             hash_map_compat<int, float>::iterator it = (*charProbabilities)[i].find(j);
             if (it == (*charProbabilities)[i].end()){
-                (*nearKeysVector)[i].reset(j);
+                (*SampledNearKeysVector)[i].reset(j);
             } else if(it->second < MIN_PROBABILITY) {
                 // Erases from near keys vector because it has very low probability.
-                (*nearKeysVector)[i].reset(j);
+                (*SampledNearKeysVector)[i].reset(j);
                 (*charProbabilities)[i].erase(j);
             } else {
                 it->second = -logf(it->second);
@@ -919,25 +916,26 @@
     }
 }
 
-/* static */ void ProximityInfoStateUtils::updateSearchKeysVector(
+/* static */ void ProximityInfoStateUtils::updateSampledSearchKeysVector(
         const ProximityInfo *const proximityInfo, const int sampledInputSize,
         const int lastSavedInputSize,
         const std::vector<int> *const sampledLengthCache,
-        const std::vector<NearKeycodesSet> *const nearKeysVector,
-        std::vector<NearKeycodesSet> *searchKeysVector) {
+        const std::vector<NearKeycodesSet> *const SampledNearKeysVector,
+        std::vector<NearKeycodesSet> *sampledSearchKeysVector) {
+    sampledSearchKeysVector->resize(sampledInputSize);
     const int readForwordLength = static_cast<int>(
             hypotf(proximityInfo->getKeyboardWidth(), proximityInfo->getKeyboardHeight())
                     * ProximityInfoParams::SEARCH_KEY_RADIUS_RATIO);
     for (int i = 0; i < sampledInputSize; ++i) {
         if (i >= lastSavedInputSize) {
-            (*searchKeysVector)[i].reset();
+            (*sampledSearchKeysVector)[i].reset();
         }
         for (int j = max(i, lastSavedInputSize); j < sampledInputSize; ++j) {
             // TODO: Investigate if this is required. This may not fail.
             if ((*sampledLengthCache)[j] - (*sampledLengthCache)[i] >= readForwordLength) {
                 break;
             }
-            (*searchKeysVector)[i] |= (*nearKeysVector)[j];
+            (*sampledSearchKeysVector)[i] |= (*SampledNearKeysVector)[j];
         }
     }
 }
diff --git a/native/jni/src/proximity_info_state_utils.h b/native/jni/src/proximity_info_state_utils.h
index b70121a..17ef1c3 100644
--- a/native/jni/src/proximity_info_state_utils.h
+++ b/native/jni/src/proximity_info_state_utils.h
@@ -69,29 +69,28 @@
             const std::vector<int> *const sampledInputYs,
             const std::vector<float> *const sampledSpeedRates,
             const std::vector<int> *const sampledLengthCache,
-            const std::vector<float> *const distanceCache_G,
-            std::vector<NearKeycodesSet> *nearKeysVector,
+            const std::vector<float> *const SampledDistanceCache_G,
+            std::vector<NearKeycodesSet> *SampledNearKeysVector,
             std::vector<hash_map_compat<int, float> > *charProbabilities);
-    static void updateSearchKeysVector(
+    static void updateSampledSearchKeysVector(
             const ProximityInfo *const proximityInfo, const int sampledInputSize,
             const int lastSavedInputSize,
             const std::vector<int> *const sampledLengthCache,
-            const std::vector<NearKeycodesSet> *const nearKeysVector,
-            std::vector<NearKeycodesSet> *searchKeysVector);
+            const std::vector<NearKeycodesSet> *const SampledNearKeysVector,
+            std::vector<NearKeycodesSet> *sampledSearchKeysVector);
     static float getPointToKeyByIdLength(const float maxPointToKeyLength,
-            const std::vector<float> *const distanceCache_G, const int keyCount,
+            const std::vector<float> *const SampledDistanceCache_G, const int keyCount,
             const int inputIndex, const int keyId, const float scale);
     static float getPointToKeyByIdLength(const float maxPointToKeyLength,
-            const std::vector<float> *const distanceCache_G, const int keyCount,
+            const std::vector<float> *const SampledDistanceCache_G, const int keyCount,
             const int inputIndex, const int keyId);
     static void initGeometricDistanceInfos(
             const ProximityInfo *const proximityInfo, const int keyCount,
             const int sampledInputSize, const int lastSavedInputSize,
             const std::vector<int> *const sampledInputXs,
             const std::vector<int> *const sampledInputYs,
-            std::vector<NearKeycodesSet> *nearKeysVector,
-            std::vector<NearKeycodesSet> *searchKeysVector,
-            std::vector<float> *distanceCache_G);
+            std::vector<NearKeycodesSet> *SampledNearKeysVector,
+            std::vector<float> *SampledDistanceCache_G);
     static void initPrimaryInputWord(
             const int inputSize, const int *const inputProximities, int *primaryInputWord);
     static void initNormalizedSquaredDistances(
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;
             }
         };