diff --git a/core/api/current.txt b/core/api/current.txt
index f86544784dc4d..5622f4b14d94d 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1296,6 +1296,7 @@ package android {
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showForAllUsers = 16844015; // 0x10104ef
+ field public static final int showInInputMethodPicker = 16844361; // 0x1010649
field public static final int showMetadataInPreview = 16844079; // 0x101052f
field @Deprecated public static final int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index cc533eb3b5d73..6ba3b37ce2140 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -61,6 +61,7 @@ import java.util.List;
* @attr ref android.R.styleable#InputMethod_supportsSwitchingToNextInputMethod
* @attr ref android.R.styleable#InputMethod_supportsInlineSuggestions
* @attr ref android.R.styleable#InputMethod_suppressesSpellChecker
+ * @attr ref android.R.styleable#InputMethod_showInInputMethodPicker
*/
public final class InputMethodInfo implements Parcelable {
static final String TAG = "InputMethodInfo";
@@ -123,6 +124,11 @@ public final class InputMethodInfo implements Parcelable {
*/
private final boolean mSuppressesSpellChecker;
+ /**
+ * The flag whether this IME should be shown as an option in the IME picker.
+ */
+ private final boolean mShowInInputMethodPicker;
+
/**
* @param service the {@link ResolveInfo} corresponds in which the IME is implemented.
* @return a unique ID to be returned by {@link #getId()}. We have used
@@ -167,6 +173,7 @@ public final class InputMethodInfo implements Parcelable {
boolean supportsSwitchingToNextInputMethod = false; // false as default
boolean inlineSuggestionsEnabled = false; // false as default
boolean suppressesSpellChecker = false; // false as default
+ boolean showInInputMethodPicker = true; // true as default
mForceDefault = false;
PackageManager pm = context.getPackageManager();
@@ -212,6 +219,8 @@ public final class InputMethodInfo implements Parcelable {
com.android.internal.R.styleable.InputMethod_supportsInlineSuggestions, false);
suppressesSpellChecker = sa.getBoolean(
com.android.internal.R.styleable.InputMethod_suppressesSpellChecker, false);
+ showInInputMethodPicker = sa.getBoolean(
+ com.android.internal.R.styleable.InputMethod_showInInputMethodPicker, true);
sa.recycle();
final int depth = parser.getDepth();
@@ -284,6 +293,7 @@ public final class InputMethodInfo implements Parcelable {
mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod;
mInlineSuggestionsEnabled = inlineSuggestionsEnabled;
mSuppressesSpellChecker = suppressesSpellChecker;
+ mShowInInputMethodPicker = showInInputMethodPicker;
mIsVrOnly = isVrOnly;
}
@@ -295,6 +305,7 @@ public final class InputMethodInfo implements Parcelable {
mSupportsSwitchingToNextInputMethod = source.readInt() == 1;
mInlineSuggestionsEnabled = source.readInt() == 1;
mSuppressesSpellChecker = source.readBoolean();
+ mShowInInputMethodPicker = source.readBoolean();
mIsVrOnly = source.readBoolean();
mService = ResolveInfo.CREATOR.createFromParcel(source);
mSubtypes = new InputMethodSubtypeArray(source);
@@ -354,6 +365,7 @@ public final class InputMethodInfo implements Parcelable {
mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod;
mInlineSuggestionsEnabled = inlineSuggestionsEnabled;
mSuppressesSpellChecker = false;
+ mShowInInputMethodPicker = true;
mIsVrOnly = isVrOnly;
}
@@ -507,7 +519,8 @@ public final class InputMethodInfo implements Parcelable {
+ " mIsVrOnly=" + mIsVrOnly
+ " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod
+ " mInlineSuggestionsEnabled=" + mInlineSuggestionsEnabled
- + " mSuppressesSpellChecker=" + mSuppressesSpellChecker);
+ + " mSuppressesSpellChecker=" + mSuppressesSpellChecker
+ + " mShowInInputMethodPicker=" + mShowInInputMethodPicker);
pw.println(prefix + "mIsDefaultResId=0x"
+ Integer.toHexString(mIsDefaultResId));
pw.println(prefix + "Service:");
@@ -582,6 +595,14 @@ public final class InputMethodInfo implements Parcelable {
return mSuppressesSpellChecker;
}
+ /**
+ * Return {@code true} if this input method should be shown in the IME picker.
+ * @hide
+ */
+ public boolean showInInputMethodPicker() {
+ return mShowInInputMethodPicker;
+ }
+
/**
* Used to package this object into a {@link Parcel}.
*
@@ -597,6 +618,7 @@ public final class InputMethodInfo implements Parcelable {
dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0);
dest.writeInt(mInlineSuggestionsEnabled ? 1 : 0);
dest.writeBoolean(mSuppressesSpellChecker);
+ dest.writeBoolean(mShowInInputMethodPicker);
dest.writeBoolean(mIsVrOnly);
mService.writeToParcel(dest, flags);
mSubtypes.writeToParcel(dest);
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index eea379944a217..3940dc556d41c 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3579,6 +3579,12 @@
+
+
+
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index f646d5d22263c..e25b034819347 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -100,7 +100,8 @@ public class InputMethodMenuController {
synchronized (mMethodMap) {
final List imList = mSwitchingController
- .getSortedInputMethodAndSubtypeListLocked(showAuxSubtypes, isScreenLocked);
+ .getSortedInputMethodAndSubtypeListForImeMenuLocked(
+ showAuxSubtypes, isScreenLocked);
if (imList.isEmpty()) {
return;
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodSubtypeSwitchingController.java b/services/core/java/com/android/server/inputmethod/InputMethodSubtypeSwitchingController.java
index 8e84002dc6554..2969e53f2ba67 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodSubtypeSwitchingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodSubtypeSwitchingController.java
@@ -181,7 +181,7 @@ final class InputMethodSubtypeSwitchingController {
}
public List getSortedInputMethodAndSubtypeList(
- boolean includeAuxiliarySubtypes, boolean isScreenLocked) {
+ boolean includeAuxiliarySubtypes, boolean isScreenLocked, boolean forImeMenu) {
final ArrayList imis = mSettings.getEnabledInputMethodListLocked();
if (imis.isEmpty()) {
return Collections.emptyList();
@@ -196,6 +196,9 @@ final class InputMethodSubtypeSwitchingController {
final int numImes = imis.size();
for (int i = 0; i < numImes; ++i) {
final InputMethodInfo imi = imis.get(i);
+ if (forImeMenu && !imi.showInInputMethodPicker()) {
+ continue;
+ }
final List explicitlyOrImplicitlyEnabledSubtypeList =
mSettings.getEnabledInputMethodSubtypeListLocked(mContext, imi, true);
final ArraySet enabledSubtypeSet = new ArraySet<>();
@@ -513,7 +516,8 @@ final class InputMethodSubtypeSwitchingController {
mSubtypeList = new InputMethodAndSubtypeList(context, mSettings);
mController = ControllerImpl.createFrom(mController,
mSubtypeList.getSortedInputMethodAndSubtypeList(
- false /* includeAuxiliarySubtypes */, false /* isScreenLocked */));
+ false /* includeAuxiliarySubtypes */, false /* isScreenLocked */,
+ false /* forImeMenu */));
}
public ImeSubtypeListItem getNextInputMethodLocked(boolean onlyCurrentIme, InputMethodInfo imi,
@@ -527,10 +531,10 @@ final class InputMethodSubtypeSwitchingController {
return mController.getNextInputMethod(onlyCurrentIme, imi, subtype);
}
- public List getSortedInputMethodAndSubtypeListLocked(
+ public List getSortedInputMethodAndSubtypeListForImeMenuLocked(
boolean includingAuxiliarySubtypes, boolean isScreenLocked) {
return mSubtypeList.getSortedInputMethodAndSubtypeList(
- includingAuxiliarySubtypes, isScreenLocked);
+ includingAuxiliarySubtypes, isScreenLocked, true /* forImeMenu */);
}
public void dump(final Printer pw) {