diff --git a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java index d21ceb2ec79e2..78a90d99f67d5 100644 --- a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java +++ b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java @@ -192,9 +192,9 @@ final class IInputMethodManagerInvoker { @AnyThread void setAdditionalInputMethodSubtypes(@NonNull String imeId, - @NonNull InputMethodSubtype[] subtypes) { + @NonNull InputMethodSubtype[] subtypes, @UserIdInt int userId) { try { - mTarget.setAdditionalInputMethodSubtypes(imeId, subtypes); + mTarget.setAdditionalInputMethodSubtypes(imeId, subtypes, 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 e7abbbcee7cad..899e5fc4d42c9 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -3610,7 +3610,7 @@ public final class InputMethodManager { @Deprecated public void setAdditionalInputMethodSubtypes(@NonNull String imiId, @NonNull InputMethodSubtype[] subtypes) { - mServiceInvoker.setAdditionalInputMethodSubtypes(imiId, subtypes); + mServiceInvoker.setAdditionalInputMethodSubtypes(imiId, subtypes, UserHandle.myUserId()); } @Nullable diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index d5f835295ee78..5f5886e38afba 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -92,7 +92,11 @@ interface IInputMethodManager { + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") @nullable InputMethodSubtype getCurrentInputMethodSubtype(int userId); - void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") + void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes, + int userId); + // This is kept due to @UnsupportedAppUsage. // TODO(Bug 113914148): Consider removing this. int getInputMethodWindowVisibleHeight(in IInputMethodClient client); diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 2b6ad0d8d4712..e2f26e6ae6ded 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4161,7 +4161,12 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } @Override - public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) { + public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes, + @UserIdInt int userId) { + if (UserHandle.getCallingUserId() != userId) { + mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); + } + // 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) return; @@ -4175,23 +4180,32 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } } synchronized (ImfLock.class) { - if (!calledFromValidUserLocked()) { - return; - } if (!mSystemReady) { return; } - if (!mSettings.setAdditionalInputMethodSubtypes(imiId, toBeAdded, - mAdditionalSubtypeMap, mIPackageManager)) { + + if (mSettings.getCurrentUserId() == userId) { + if (!mSettings.setAdditionalInputMethodSubtypes(imiId, toBeAdded, + mAdditionalSubtypeMap, mIPackageManager)) { + return; + } + final long ident = Binder.clearCallingIdentity(); + try { + buildInputMethodListLocked(false /* resetDefaultEnabledIme */); + } finally { + Binder.restoreCallingIdentity(ident); + } return; } - final long ident = Binder.clearCallingIdentity(); - try { - buildInputMethodListLocked(false /* resetDefaultEnabledIme */); - } finally { - Binder.restoreCallingIdentity(ident); - } + final ArrayMap methodMap = queryMethodMapForUser(userId); + final InputMethodSettings settings = new InputMethodSettings(mContext, methodMap, + userId, false); + final ArrayMap> additionalSubtypeMap = + new ArrayMap<>(); + AdditionalSubtypeUtils.load(additionalSubtypeMap, userId); + settings.setAdditionalInputMethodSubtypes(imiId, toBeAdded, additionalSubtypeMap, + mIPackageManager); } }