Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8efc0add authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Fix privateImeOptions parsing

This change deprecates "nm" private IME options and introduces new
private option, <package name>.noMicrophone, instead.

Change-Id: I9d5e3daaead2cdd42e017cd29f5f786ef3ba3649
parent 05a6c48d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ public class InputLanguageSelection extends PreferenceActivity {
        conf.locale = locale;
        res.updateConfiguration(conf, res.getDisplayMetrics());

        int mainDicResId = LatinIME.getMainDictionaryResourceId(res);
        int mainDicResId = Utils.getMainDictionaryResourceId(res);
        BinaryDictionary bd = BinaryDictionary.initDictionary(this, mainDicResId, Suggest.DIC_MAIN);

        // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of
+19 −13
Original line number Diff line number Diff line
@@ -81,11 +81,27 @@ import java.util.Locale;
 * Input method implementation for Qwerty'ish keyboard.
 */
public class LatinIME extends InputMethodService implements KeyboardActionListener {
    private static final String TAG = "LatinIME";
    private static final String TAG = LatinIME.class.getSimpleName();
    private static final boolean PERF_DEBUG = false;
    private static final boolean TRACE = false;
    private static boolean DEBUG = LatinImeLogger.sDBG;

    /**
     * The private IME option used to indicate that no microphone should be
     * shown for a given text field. For instance, this is specified by the
     * search dialog when the dialog is already showing a voice search button.
     *
     * @deprecated Use {@link LatinIME#IME_OPTION_NO_MICROPHONE} with package name prefixed.
     */
    public static final String IME_OPTION_NO_MICROPHONE_COMPAT = "nm";

    /**
     * The private IME option used to indicate that no microphone should be
     * shown for a given text field. For instance, this is specified by the
     * search dialog when the dialog is already showing a voice search button.
     */
    public static final String IME_OPTION_NO_MICROPHONE = "noMicrophone";

    private static final int DELAY_UPDATE_SUGGESTIONS = 180;
    private static final int DELAY_UPDATE_OLD_SUGGESTIONS = 300;
    private static final int DELAY_UPDATE_SHIFT_STATE = 300;
@@ -345,7 +361,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        super.onCreate();

        mImm = ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE));
        mInputMethodId = Utils.getInputMethodId(mImm, getApplicationInfo().packageName);
        mInputMethodId = Utils.getInputMethodId(mImm, getPackageName());
        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
        mKeyboardSwitcher = KeyboardSwitcher.getInstance();

@@ -394,16 +410,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        mVoiceConnector = VoiceIMEConnector.init(this, prefs, mHandler);
    }

    /**
     * Returns a main dictionary resource id
     * @return main dictionary resource id
     */
    public static int getMainDictionaryResourceId(Resources res) {
        final String MAIN_DIC_NAME = "main";
        String packageName = LatinIME.class.getPackage().getName();
        return res.getIdentifier(MAIN_DIC_NAME, "raw", packageName);
    }

    private void initSuggest() {
        updateAutoTextEnabled();
        String locale = mSubtypeSwitcher.getInputLocaleStr();
@@ -416,7 +422,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        mQuickFixes = isQuickFixesEnabled(prefs);

        final Resources res = mResources;
        int mainDicResId = getMainDictionaryResourceId(res);
        int mainDicResId = Utils.getMainDictionaryResourceId(res);
        mSuggest = new Suggest(this, mainDicResId);
        loadAndSetAutoCorrectionThreshold(prefs);

+27 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.inputmethod.latin;

import com.android.inputmethod.keyboard.KeyboardId;

import android.content.res.Resources;
import android.inputmethodservice.InputMethodService;
import android.os.AsyncTask;
import android.os.Handler;
@@ -526,4 +527,30 @@ public class Utils {
        return variation
                == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
    }

    public static boolean containsInCsv(String key, String csv) {
        if (csv == null)
            return false;
        for (String option : csv.split(",")) {
            if (option.equals(key))
                return true;
        }
        return false;
    }

    public static boolean inPrivateImeOptions(String packageName, String key,
            EditorInfo attribute) {
        if (attribute == null)
            return false;
        return containsInCsv(packageName != null ? packageName + "." + key : key,
                attribute.privateImeOptions);
    }

    /**
     * Returns a main dictionary resource id
     * @return main dictionary resource id
     */
    public static int getMainDictionaryResourceId(Resources res) {
        return res.getIdentifier("main", "raw", LatinIME.class.getPackage().getName());
    }
}
+6 −7
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SharedPreferencesCompat;
import com.android.inputmethod.latin.SubtypeSwitcher;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.Utils;

import android.app.AlertDialog;
import android.content.Context;
@@ -74,10 +75,6 @@ public class VoiceIMEConnector implements VoiceInput.UiListener {
    // For example, the user has a Chinese UI but activates voice input.
    private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
            "has_used_voice_input_unsupported_locale";
    // The private IME option used to indicate that no microphone should be shown for a
    // given text field. For instance this is specified by the search dialog when the
    // dialog is already showing a voice search button.
    private static final String IME_OPTION_NO_MICROPHONE = "nm";
    private static final int RECOGNITIONVIEW_HEIGHT_THRESHOLD_RATIO = 6;

    private static final String TAG = VoiceIMEConnector.class.getSimpleName();
@@ -627,9 +624,11 @@ public class VoiceIMEConnector implements VoiceInput.UiListener {
    }

    private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) {
        return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext)
                && !(attribute != null
                        && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions))
        final boolean noMic = Utils.inPrivateImeOptions(null,
                LatinIME.IME_OPTION_NO_MICROPHONE_COMPAT, attribute)
                || Utils.inPrivateImeOptions(mService.getPackageName(),
                        LatinIME.IME_OPTION_NO_MICROPHONE, attribute);
        return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) && !noMic
                && SpeechRecognizer.isRecognitionAvailable(mService);
    }