diff options
5 files changed, 39 insertions, 8 deletions
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 8c770adcf2b5..18f757c07369 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -16,6 +16,7 @@ package android.view.inputmethod; +import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.WRITE_SECURE_SETTINGS; import android.annotation.DrawableRes; @@ -26,6 +27,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; +import android.annotation.UserIdInt; import android.app.ActivityThread; import android.content.ComponentName; import android.content.ContentResolver; @@ -46,6 +48,7 @@ import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.os.Trace; +import android.os.UserHandle; import android.provider.Settings; import android.text.style.SuggestionSpan; import android.util.Log; @@ -978,7 +981,26 @@ public final class InputMethodManager { */ public List<InputMethodInfo> getEnabledInputMethodList() { try { - return mService.getEnabledInputMethodList(); + // We intentionally do not use UserHandle.getCallingUserId() here because for system + // services InputMethodManagerInternal.getEnabledInputMethodListAsUser() should be used + // instead. + return mService.getEnabledInputMethodList(UserHandle.myUserId()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns the list of enabled input methods for the specified user. + * + * @param userId user ID to query + * @return {@link List} of {@link InputMethodInfo}. + * @hide + */ + @RequiresPermission(INTERACT_ACROSS_USERS_FULL) + public List<InputMethodInfo> getEnabledInputMethodListAsUser(@UserIdInt int userId) { + try { + return mService.getEnabledInputMethodList(userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 0752efe562a9..98e854cc40a2 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -36,7 +36,7 @@ interface IInputMethodManager { // TODO: Use ParceledListSlice instead List<InputMethodInfo> getInputMethodList(); // TODO: Use ParceledListSlice instead - List<InputMethodInfo> getEnabledInputMethodList(); + List<InputMethodInfo> getEnabledInputMethodList(int userId); List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in String imiId, boolean allowsImplicitlySelectedSubtypes); InputMethodSubtype getLastInputMethodSubtype(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index 64c5b1754fa8..261f391839b3 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -264,7 +264,8 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView */ private boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManager imm, final boolean shouldIncludeAuxiliarySubtypes) { - final List<InputMethodInfo> enabledImis = imm.getEnabledInputMethodList(); + final List<InputMethodInfo> enabledImis = + imm.getEnabledInputMethodListAsUser(KeyguardUpdateMonitor.getCurrentUser()); // Number of the filtered IMEs int filteredImisCount = 0; diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 9d9721d5d402..f0dce78722a2 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -1645,10 +1645,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @Override - public List<InputMethodInfo> getEnabledInputMethodList() { - final int callingUserId = UserHandle.getCallingUserId(); + public List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) { + if (UserHandle.getCallingUserId() != userId) { + mContext.enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); + } synchronized (mMethodMap) { - final int[] resolvedUserIds = InputMethodUtils.resolveUserId(callingUserId, + final int[] resolvedUserIds = InputMethodUtils.resolveUserId(userId, mSettings.getCurrentUserId(), null); if (resolvedUserIds.length != 1) { return Collections.emptyList(); diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index 3222143fc89f..109024d0d2f7 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -16,6 +16,7 @@ package com.android.server.inputmethod; +import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -1195,6 +1196,7 @@ public final class MultiClientInputMethodManagerService { * Takes care of IPCs exposed to the IME client. */ private static final class ApiCallbacks extends IInputMethodManager.Stub { + private final Context mContext; private final UserDataMap mUserDataMap; private final UserToInputMethodInfoMap mInputMethodInfoMap; private final AppOpsManager mAppOpsManager; @@ -1202,6 +1204,7 @@ public final class MultiClientInputMethodManagerService { ApiCallbacks(Context context, UserDataMap userDataMap, UserToInputMethodInfoMap inputMethodInfoMap) { + mContext = context; mUserDataMap = userDataMap; mInputMethodInfoMap = inputMethodInfoMap; mAppOpsManager = context.getSystemService(AppOpsManager.class); @@ -1239,8 +1242,11 @@ public final class MultiClientInputMethodManagerService { @BinderThread @Override - public List<InputMethodInfo> getEnabledInputMethodList() { - return mInputMethodInfoMap.getAsList(UserHandle.getUserId(Binder.getCallingUid())); + public List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) { + if (UserHandle.getCallingUserId() != userId) { + mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null); + } + return mInputMethodInfoMap.getAsList(userId); } @BinderThread |