From e960986554fb7969d83c57689abbcee949d6a37b Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Tue, 26 Jul 2022 08:12:34 +0900 Subject: [PATCH] Support background users to call IMM#getLastInputMethodSubtype() This is a follow up CL to my previous CL [1], which let query APIs defined in InputMethodManager support background users. With this CL, InputMethodManager#getLastInputMethodSubtype() is also fully supported under multi-user / multi-profile environment. [1]: I192a0f5a1375170d17a4c08af94f23966dbaea8b 7f8ee4b9ddd31ad36a12c5278b27990dc76011cc Bug: 34886274 Bug: 122164939 Test: atest CtsInputMethodTestCases:InputMethodSubtypeTest Change-Id: I48f57dc7184e85bdb422fd9d1d56e60381654125 --- .../inputmethod/IInputMethodManagerInvoker.java | 4 ++-- .../view/inputmethod/InputMethodManager.java | 2 +- .../internal/view/IInputMethodManager.aidl | 4 +++- .../inputmethod/InputMethodManagerService.java | 16 ++++++++++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java index 7783b343bdc82..8dbaec403de61 100644 --- a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java +++ b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java @@ -101,9 +101,9 @@ final class IInputMethodManagerInvoker { @AnyThread @Nullable - InputMethodSubtype getLastInputMethodSubtype() { + InputMethodSubtype getLastInputMethodSubtype(@UserIdInt int userId) { try { - return mTarget.getLastInputMethodSubtype(); + return mTarget.getLastInputMethodSubtype(userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index d73eecdf3e3ff..adeed256ebc1b 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -3517,7 +3517,7 @@ public final class InputMethodManager { @Nullable public InputMethodSubtype getLastInputMethodSubtype() { - return mServiceInvoker.getLastInputMethodSubtype(); + return mServiceInvoker.getLastInputMethodSubtype(UserHandle.myUserId()); } /** diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 84412bced26a6..1b771473207e1 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -50,7 +50,9 @@ interface IInputMethodManager { List getEnabledInputMethodSubtypeList(in @nullable String imiId, boolean allowsImplicitlySelectedSubtypes, int userId); - @nullable InputMethodSubtype getLastInputMethodSubtype(); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") + InputMethodSubtype getLastInputMethodSubtype(int userId); boolean showSoftInput(in IInputMethodClient client, @nullable IBinder windowToken, int flags, in @nullable ResultReceiver resultReceiver, int reason); diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 71aaf0bc7a610..e29f00bac7cb4 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4160,12 +4160,20 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } @Override - public InputMethodSubtype getLastInputMethodSubtype() { + public InputMethodSubtype getLastInputMethodSubtype(@UserIdInt int userId) { + if (UserHandle.getCallingUserId() != userId) { + mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); + } synchronized (ImfLock.class) { - if (!calledFromValidUserLocked()) { - return null; + if (mSettings.getCurrentUserId() == userId) { + return mSettings.getLastInputMethodSubtypeLocked(); } - return mSettings.getLastInputMethodSubtypeLocked(); + + final ArrayMap methodMap = queryMethodMapForUser(userId); + final InputMethodSettings settings = new InputMethodSettings( + mContext.getResources(), mContext.getContentResolver(), methodMap, + userId, false); + return settings.getLastInputMethodSubtypeLocked(); } }