Query right user's system IMEs in AppRestrictionsHelper
It turns out that AppRestrictionsHelper#addSystemImes() has always
queried for the owner user's system IMEs despite the fact that it's
trying to query system IMEs for a restricted profile user. This
behavior has not changed since its beginning [1].
Most likely people would not have noticed this though, because:
* Settings app does not show a menu item to create a restricted user
on phone devices.
* Even if it's available, most people do not use restricted users.
* Even if someone created a restrected user, most likely the owner
user and the restrected user share the same set of system IMEs,
which are defined as "pre-installed" IMEs.
Anyway, AppRestrictionsHelper#addSystemImes() will start using a newly
introduced @hide API IMM#getEnabledInputMethodListAsUser() so that it
can query for the right user's system IMEs, instead of querying owner
user's ones.
[1]: Ifced841ad3bfbde33d2403356216dd1749b7fa9a
a7a93784d1f9798d37cb618def1a558f8d626f0f
Bug: 122164939
Test: atest SettingsLibTests:AppRestrictionsHelperTest
Test: manually done as follows.
1. Build aosp_taimen-userdebug and flash it.
2. adb shell pm create-user --restricted test_profile
3. adb shell am start -a android.settings.USER_SETTINGS
4. Click the gear icon next to the "test_profile" user.
5. By adding a log, make sure that IMMS#getInputMethodList()
gets called with userId = 10.
Change-Id: I5b50b5fe143c74c87b331bda3e5bcc4d6248436e
This commit is contained in:
@@ -966,7 +966,26 @@ public final class InputMethodManager {
|
||||
*/
|
||||
public List<InputMethodInfo> getInputMethodList() {
|
||||
try {
|
||||
return mService.getInputMethodList();
|
||||
// We intentionally do not use UserHandle.getCallingUserId() here because for system
|
||||
// services InputMethodManagerInternal.getInputMethodListAsUser() should be used
|
||||
// instead.
|
||||
return mService.getInputMethodList(UserHandle.myUserId());
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of installed 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> getInputMethodListAsUser(@UserIdInt int userId) {
|
||||
try {
|
||||
return mService.getInputMethodList(userId);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ interface IInputMethodManager {
|
||||
int untrustedDisplayId);
|
||||
|
||||
// TODO: Use ParceledListSlice instead
|
||||
List<InputMethodInfo> getInputMethodList();
|
||||
List<InputMethodInfo> getInputMethodList(int userId);
|
||||
// TODO: Use ParceledListSlice instead
|
||||
List<InputMethodInfo> getEnabledInputMethodList(int userId);
|
||||
List<InputMethodSubtype> getEnabledInputMethodSubtypeList(in String imiId,
|
||||
|
||||
@@ -420,7 +420,7 @@ public class AppRestrictionsHelper {
|
||||
List<InputMethodInfo> getInputMethodList() {
|
||||
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(
|
||||
Context.INPUT_METHOD_SERVICE);
|
||||
return imm.getInputMethodList();
|
||||
return imm.getInputMethodListAsUser(mUser.getIdentifier());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1627,10 +1627,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<InputMethodInfo> getInputMethodList() {
|
||||
final int callingUserId = UserHandle.getCallingUserId();
|
||||
public List<InputMethodInfo> getInputMethodList(@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();
|
||||
|
||||
@@ -1236,8 +1236,11 @@ public final class MultiClientInputMethodManagerService {
|
||||
|
||||
@BinderThread
|
||||
@Override
|
||||
public List<InputMethodInfo> getInputMethodList() {
|
||||
return mInputMethodInfoMap.getAsList(UserHandle.getUserId(Binder.getCallingUid()));
|
||||
public List<InputMethodInfo> getInputMethodList(@UserIdInt int userId) {
|
||||
if (UserHandle.getCallingUserId() != userId) {
|
||||
mContext.enforceCallingPermission(INTERACT_ACROSS_USERS_FULL, null);
|
||||
}
|
||||
return mInputMethodInfoMap.getAsList(userId);
|
||||
}
|
||||
|
||||
@BinderThread
|
||||
|
||||
Reference in New Issue
Block a user