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
main
Yohei Yukawa 2014-04-28 07:39:00 +09:00
parent 2cc7c3321d
commit 8ba4f33709
4 changed files with 49 additions and 2 deletions

View File

@ -28,6 +28,12 @@ public final class InputMethodManagerCompatWrapper {
private static final Method METHOD_switchToNextInputMethod = CompatUtils.getMethod( private static final Method METHOD_switchToNextInputMethod = CompatUtils.getMethod(
InputMethodManager.class, "switchToNextInputMethod", IBinder.class, Boolean.TYPE); 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 final InputMethodManager mImm;
public InputMethodManagerCompatWrapper(final Context context) { public InputMethodManagerCompatWrapper(final Context context) {
@ -38,4 +44,9 @@ public final class InputMethodManagerCompatWrapper {
return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */, return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */,
METHOD_switchToNextInputMethod, token, onlyCurrentIme); METHOD_switchToNextInputMethod, token, onlyCurrentIme);
} }
public boolean shouldOfferSwitchingToNextInputMethod(final IBinder token) {
return (Boolean)CompatUtils.invoke(mImm, false /* defaultValue */,
METHOD_shouldOfferSwitchingToNextInputMethod, token);
}
} }

View File

@ -123,7 +123,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
builder.setOptions( builder.setOptions(
mSubtypeSwitcher.isShortcutImeEnabled(), mSubtypeSwitcher.isShortcutImeEnabled(),
settingsValues.mShowsVoiceInputKey, settingsValues.mShowsVoiceInputKey,
settingsValues.isLanguageSwitchKeyEnabled()); mLatinIME.shouldSwitchToOtherInputMethods());
mKeyboardLayoutSet = builder.build(); mKeyboardLayoutSet = builder.build();
mCurrentSettingsValues = settingsValues; mCurrentSettingsValues = settingsValues;
try { try {

View File

@ -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. // TODO: Revise the language switch key behavior to make it much smarter and more reasonable.
public void switchToNextSubtype() { public void switchToNextSubtype() {
final IBinder token = getWindow().getWindow().getAttributes().token; final IBinder token = getWindow().getWindow().getAttributes().token;
if (mSettings.getCurrent().mIncludesOtherImesInLanguageSwitchList) { if (shouldSwitchToOtherInputMethods()) {
mRichImm.switchToNextInputMethod(token, false /* onlyCurrentIme */); mRichImm.switchToNextInputMethod(token, false /* onlyCurrentIme */);
return; return;
} }
@ -1799,4 +1799,28 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
p.println(settingsValues.dump()); p.println(settingsValues.dump());
// TODO: Dump all settings values // 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);
}
} }

View File

@ -20,6 +20,7 @@ import static com.android.inputmethod.latin.Constants.Subtype.KEYBOARD_MODE;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
@ -406,4 +407,15 @@ public final class RichInputMethodManager {
mSubtypeListCacheWithoutImplicitlySelectedSubtypes.clear(); mSubtypeListCacheWithoutImplicitlySelectedSubtypes.clear();
mInputMethodInfoCache.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);
}
} }