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

Commit 8ba4f337 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Use shouldOfferSwitchingToNextInputMethod when available

With this CL, LatinIME starts using
InputMethodManager#shouldOfferSwitchingToNextInputMethod when
available and API level is higher than 19 (KitKat).

Note that relevant settings of LatinIME will be ignored if
InputMethodManager#shouldOfferSwitchingToNextInputMethod is
considered to be available at the moment. We will revisit
here to reorganize the user visible settings before the
new global IME switching mechanism becomes publicly
available.

BUG: 12965588
Change-Id: I0188fa56cba8e983c61cef3ae3400a0e3821f718
parent 2cc7c332
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -28,6 +28,12 @@ public final class InputMethodManagerCompatWrapper {
    private static final Method METHOD_switchToNextInputMethod = CompatUtils.getMethod(
            InputMethodManager.class, "switchToNextInputMethod", IBinder.class, Boolean.TYPE);

    // Note that InputMethodManager.shouldOfferSwitchingToNextInputMethod() has been introduced
    // in API level 19 (Build.VERSION_CODES.KITKAT).
    private static final Method METHOD_shouldOfferSwitchingToNextInputMethod =
            CompatUtils.getMethod(InputMethodManager.class,
                    "shouldOfferSwitchingToNextInputMethod", IBinder.class);

    public final InputMethodManager mImm;

    public InputMethodManagerCompatWrapper(final Context context) {
@@ -38,4 +44,9 @@ public final class InputMethodManagerCompatWrapper {
        return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */,
                METHOD_switchToNextInputMethod, token, onlyCurrentIme);
    }

    public boolean shouldOfferSwitchingToNextInputMethod(final IBinder token) {
        return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */,
                METHOD_shouldOfferSwitchingToNextInputMethod, token);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
        builder.setOptions(
                mSubtypeSwitcher.isShortcutImeEnabled(),
                settingsValues.mShowsVoiceInputKey,
                settingsValues.isLanguageSwitchKeyEnabled());
                mLatinIME.shouldSwitchToOtherInputMethods());
        mKeyboardLayoutSet = builder.build();
        mCurrentSettingsValues = settingsValues;
        try {
+25 −1
Original line number Diff line number Diff line
@@ -1229,7 +1229,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
    // TODO: Revise the language switch key behavior to make it much smarter and more reasonable.
    public void switchToNextSubtype() {
        final IBinder token = getWindow().getWindow().getAttributes().token;
        if (mSettings.getCurrent().mIncludesOtherImesInLanguageSwitchList) {
        if (shouldSwitchToOtherInputMethods()) {
            mRichImm.switchToNextInputMethod(token, false /* onlyCurrentIme */);
            return;
        }
@@ -1799,4 +1799,28 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        p.println(settingsValues.dump());
        // TODO: Dump all settings values
    }

    public boolean shouldSwitchToOtherInputMethods() {
        // TODO: Revisit here to reorganize the settings. Probably we can/should use different
        // strategy once the implementation of
        // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} is defined well.
        final boolean fallbackValue = mSettings.getCurrent().mIncludesOtherImesInLanguageSwitchList;
        final IBinder token = getWindow().getWindow().getAttributes().token;
        if (token == null) {
            return fallbackValue;
        }
        return mRichImm.shouldOfferSwitchingToNextInputMethod(token, fallbackValue);
    }

    public boolean shouldShowLanguageSwitchKey() {
        // TODO: Revisit here to reorganize the settings. Probably we can/should use different
        // strategy once the implementation of
        // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} is defined well.
        final boolean fallbackValue = mSettings.getCurrent().isLanguageSwitchKeyEnabled();
        final IBinder token = getWindow().getWindow().getAttributes().token;
        if (token == null) {
            return fallbackValue;
        }
        return mRichImm.shouldOfferSwitchingToNextInputMethod(token, fallbackValue);
    }
}
+12 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.inputmethod.latin.Constants.Subtype.KEYBOARD_MODE;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;
@@ -406,4 +407,15 @@ public final class RichInputMethodManager {
        mSubtypeListCacheWithoutImplicitlySelectedSubtypes.clear();
        mInputMethodInfoCache.clear();
    }

    public boolean shouldOfferSwitchingToNextInputMethod(final IBinder binder,
            boolean defaultValue) {
        // Use the default value instead on Jelly Bean MR2 and previous where
        // {@link InputMethodManager#shouldOfferSwitchingToNextInputMethod} isn't yet available
        // and on KitKat where the API is still just a stub to return true always.
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
            return defaultValue;
        }
        return mImmWrapper.shouldOfferSwitchingToNextInputMethod(binder);
    }
}