There should be a way to clear additional subtypes.
InputMethodManager#setAdditionalInputMethodSubtypes() is the only API
that allows IMEs to add and remove additional subtypes. However, due to
a bug, there is no way to clear the last entry of additional subtypes
because the API in question does nothing if the given array is emptry.
With this CL, an empty array is treated as a valid input.
This CL also adds a JavaDoc comment about a possible way to work around
this limitation in Android M and prior devices.
Bug: 26298984
Change-Id: I3731f84531247d071d9d88861e9079afc244a4e8
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 5e07347..43c14ee 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -2163,6 +2163,17 @@
* by changing its extra value. The different subtype won't get affected by the stored past
* status. (You may want to take a look at {@link InputMethodSubtype#hashCode()} to refer
* to the current implementation.)
+ *
+ * <p>NOTE: If the same subtype exists in both the manifest XML file and additional subtypes
+ * specified by {@code subtypes}, those multiple instances are automatically merged into one
+ * instance.</p>
+ *
+ * <p>CAVEAT: In API Level 23 and prior, the system may do nothing if an empty
+ * {@link InputMethodSubtype} is specified in {@code subtypes}, which prevents you from removing
+ * the last one entry of additional subtypes. If your IME statically defines one or more
+ * subtypes in the manifest XML file, you may be able to work around this limitation by
+ * specifying one of those statically defined subtypes in {@code subtypes}.</p>
+ *
* @param imiId Id of InputMethodInfo which additional input method subtypes will be added to.
* @param subtypes subtypes will be added as additional subtypes of the current input method.
*/
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 04abcca..bcfb193 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -2541,7 +2541,7 @@
}
// By this IPC call, only a process which shares the same uid with the IME can add
// additional input method subtypes to the IME.
- if (TextUtils.isEmpty(imiId) || subtypes == null || subtypes.length == 0) return;
+ if (TextUtils.isEmpty(imiId) || subtypes == null) return;
synchronized (mMethodMap) {
final InputMethodInfo imi = mMethodMap.get(imiId);
if (imi == null) return;