diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 4ddbaa6cb0af1..718f36f9a8985 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -81,7 +81,11 @@ interface IInputMethodManager { int auxiliarySubtypeMode, int displayId); void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId); + + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + + "android.Manifest.permission.TEST_INPUT_METHOD)") boolean isInputMethodPickerShownForTest(); + InputMethodSubtype getCurrentInputMethodSubtype(); void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes); // This is kept due to @UnsupportedAppUsage. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index c2fcd1d0612af..81808647f18e1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4068,6 +4068,11 @@ + + + + + + diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 4886e6e14c17c..411bfbe6324a0 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -294,6 +294,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub final IWindowManager mIWindowManager; private final SparseBooleanArray mLoggedDeniedGetInputMethodWindowVisibleHeightForUid = new SparseBooleanArray(0); + private final SparseBooleanArray mLoggedDeniedIsInputMethodPickerShownForTestForUid = + new SparseBooleanArray(0); final WindowManagerInternal mWindowManagerInternal; final PackageManagerInternal mPackageManagerInternal; final InputManagerInternal mInputManagerInternal; @@ -1465,6 +1467,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub public void onUidRemoved(int uid) { synchronized (ImfLock.class) { mLoggedDeniedGetInputMethodWindowVisibleHeightForUid.delete(uid); + mLoggedDeniedIsInputMethodPickerShownForTestForUid.delete(uid); } } @@ -4038,6 +4041,18 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub * A test API for CTS to make sure that the input method menu is showing. */ public boolean isInputMethodPickerShownForTest() { + if (mContext.checkCallingPermission(android.Manifest.permission.TEST_INPUT_METHOD) + != PackageManager.PERMISSION_GRANTED) { + final int callingUid = Binder.getCallingUid(); + synchronized (ImfLock.class) { + if (!mLoggedDeniedIsInputMethodPickerShownForTestForUid.get(callingUid)) { + EventLog.writeEvent(0x534e4554, "237317525", callingUid, ""); + mLoggedDeniedIsInputMethodPickerShownForTestForUid.put(callingUid, true); + } + } + throw new SecurityException( + "isInputMethodPickerShownForTest requires TEST_INPUT_METHOD permission"); + } synchronized (ImfLock.class) { return mMenuController.isisInputMethodPickerShownForTestLocked(); }