Merge "Rename some boolean variables for readability"
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 096b946..284dadd 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -189,6 +189,7 @@
     private static native void closeNative(long dict);
     private static native int getFormatVersionNative(long dict);
     private static native int getProbabilityNative(long dict, int[] word);
+    private static native int getMaxProbabilityOfExactMatchesNative(long dict, int[] word);
     private static native int getBigramProbabilityNative(long dict, int[] word0,
             boolean isBeginningOfSentence, int[] word1);
     private static native void getWordPropertyNative(long dict, int[] word,
@@ -350,11 +351,17 @@
 
     @Override
     public int getFrequency(final String word) {
-        if (word == null) return NOT_A_PROBABILITY;
+        if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY;
         int[] codePoints = StringUtils.toCodePointArray(word);
         return getProbabilityNative(mNativeDict, codePoints);
     }
 
+    public int getMaxFrequencyOfExactMatches(final String word) {
+        if (TextUtils.isEmpty(word)) return NOT_A_PROBABILITY;
+        int[] codePoints = StringUtils.toCodePointArray(word);
+        return getMaxProbabilityOfExactMatchesNative(mNativeDict, codePoints);
+    }
+
     @UsedForTesting
     public boolean isValidNgram(final PrevWordsInfo prevWordsInfo, final String word) {
         return getNgramProbability(prevWordsInfo, word) != NOT_A_PROBABILITY;
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index 5e4b389..4cdc6e3 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -318,18 +318,18 @@
 
     private static boolean needsToShowVoiceInputKey(final SharedPreferences prefs,
             final Resources res) {
-        if (!prefs.contains(Settings.PREF_VOICE_INPUT_KEY)) {
-            // Migrate preference from {@link Settings#PREF_VOICE_MODE_OBSOLETE} to
-            // {@link Settings#PREF_VOICE_INPUT_KEY}.
+        // Migrate preference from {@link Settings#PREF_VOICE_MODE_OBSOLETE} to
+        // {@link Settings#PREF_VOICE_INPUT_KEY}.
+        if (prefs.contains(Settings.PREF_VOICE_MODE_OBSOLETE)) {
             final String voiceModeMain = res.getString(R.string.voice_mode_main);
             final String voiceMode = prefs.getString(
                     Settings.PREF_VOICE_MODE_OBSOLETE, voiceModeMain);
             final boolean shouldShowVoiceInputKey = voiceModeMain.equals(voiceMode);
-            prefs.edit().putBoolean(Settings.PREF_VOICE_INPUT_KEY, shouldShowVoiceInputKey).apply();
-        }
-        // Remove the obsolete preference if exists.
-        if (prefs.contains(Settings.PREF_VOICE_MODE_OBSOLETE)) {
-            prefs.edit().remove(Settings.PREF_VOICE_MODE_OBSOLETE).apply();
+            prefs.edit()
+                    .putBoolean(Settings.PREF_VOICE_INPUT_KEY, shouldShowVoiceInputKey)
+                    // Remove the obsolete preference if exists.
+                    .remove(Settings.PREF_VOICE_MODE_OBSOLETE)
+                    .apply();
         }
         return prefs.getBoolean(Settings.PREF_VOICE_INPUT_KEY, true);
     }
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index d6a6196..bbeb8dd 100644
--- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
+++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
@@ -273,6 +273,17 @@
     return dictionary->getProbability(codePoints, wordLength);
 }
 
+static jint latinime_BinaryDictionary_getMaxProbabilityOfExactMatches(
+        JNIEnv *env, jclass clazz, jlong dict, jintArray word) {
+    Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
+    if (!dictionary) return NOT_A_PROBABILITY;
+    const jsize wordLength = env->GetArrayLength(word);
+    int codePoints[wordLength];
+    env->GetIntArrayRegion(word, 0, wordLength, codePoints);
+    // TODO: Implement.
+    return NOT_A_PROBABILITY;
+}
+
 static jint latinime_BinaryDictionary_getBigramProbability(JNIEnv *env, jclass clazz,
         jlong dict, jintArray word0, jboolean isBeginningOfSentence, jintArray word1) {
     Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
@@ -634,6 +645,11 @@
         reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability)
     },
     {
+        const_cast<char *>("getMaxProbabilityOfExactMatchesNative"),
+        const_cast<char *>("(J[I)I"),
+        reinterpret_cast<void *>(latinime_BinaryDictionary_getMaxProbabilityOfExactMatches)
+    },
+    {
         const_cast<char *>("getBigramProbabilityNative"),
         const_cast<char *>("(J[IZ[I)I"),
         reinterpret_cast<void *>(latinime_BinaryDictionary_getBigramProbability)