Add '-u <user id>' option to 'adb shell ime reset'

This is a preparation to add end-to-end CTS for per-profile IME mode.

In order to allow CTS tests to switch IME via shell command in
multi-user environment, this CL adds '-u <user id>' option to
  adb shell ime reset

Bug: 122924287
Test: Manually tested as follows:
  1. Build aosp_blueline-userdebug and flash it
  2. make -j SoftKeyboard
  3. adb install -r $OUT/system/app/SoftKeyboard/SoftKeyboard.apk
  4. adb shell ime enable com.example.android.softkeyboard/.SoftKeyboard
  5. adb shell ime set com.example.android.softkeyboard/.SoftKeyboard
  6. adb shell pm create-user test
  7. adb shell am switch-user 10
  8. adb shell ime list -s -u 0
     -> com.android.inputmethod.latin/.LatinIME
        com.example.android.softkeyboard/.SoftKeyboard
  9. adb shell ime reset -u 0
     -> Reset current and enabled IMEs for user #0
          Selected: com.android.inputmethod.latin/.LatinIME
           Enabled: com.android.inputmethod.latin/.LatinIME
 10. adb shell ime list -s -u 0
     -> com.android.inputmethod.latin/.LatinIME
Test: Manually tested as follows.
  1. Build aosp_blueline-userdebug and flash it
  2. adb shell pm create-user restricted_test
  3. adb root
  4. adb shell pm set-user-restriction --user 10 no_debugging_features 1
  5. adb shell ime reset -u all
     -> Reset current and enabled IMEs for user #0
          Selected: com.android.inputmethod.latin/.LatinIME
           Enabled: com.android.inputmethod.latin/.LatinIME
        User #10 is restricted with DISALLOW_DEBUGGING_FEATURES
Change-Id: Ie330c6faa76f366b78c15c0161873a051a3d40e3
This commit is contained in:
Yohei Yukawa
2019-04-10 23:23:25 -07:00
parent 099f80ce97
commit 2d4b343b69
2 changed files with 64 additions and 37 deletions

View File

@@ -4616,10 +4616,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
pw.decreaseIndent();
pw.decreaseIndent();
pw.println("reset");
pw.println("reset [--user <USER_ID>]");
pw.increaseIndent();
pw.println("reset currently selected/enabled IMEs to the default ones as if "
+ "the device is initially booted with the current locale.");
pw.increaseIndent();
pw.print("--user <USER_ID>: Specify which user to reset.");
pw.println(" Assumes the current user if not specified.");
pw.decreaseIndent();
pw.decreaseIndent();
pw.decreaseIndent();
@@ -4874,45 +4879,67 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@BinderThread
@ShellCommandResult
private int handleShellCommandResetInputMethod(@NonNull ShellCommand shellCommand) {
final PrintWriter out = shellCommand.getOutPrintWriter();
final int userIdToBeResolved = handleOptionsForCommandsThatOnlyHaveUserOption(shellCommand);
synchronized (mMethodMap) {
if (!userHasDebugPriv(mSettings.getCurrentUserId(), shellCommand)) {
return ShellCommandResult.SUCCESS;
}
final String nextIme;
final List<InputMethodInfo> nextEnabledImes;
hideCurrentInputLocked(0, null);
unbindCurrentMethodLocked();
// Reset the current IME
resetSelectedInputMethodAndSubtypeLocked(null);
// Also reset the settings of the current IME
mSettings.putSelectedInputMethod(null);
// Disable all enabled IMEs.
mSettings.getEnabledInputMethodListLocked().forEach(
imi -> setInputMethodEnabledLocked(imi.getId(), false));
// Re-enable with default enabled IMEs.
InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList).forEach(
imi -> setInputMethodEnabledLocked(imi.getId(), true));
updateInputMethodsFromSettingsLocked(true /* enabledMayChange */);
InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager,
mSettings.getEnabledInputMethodListLocked(),
mSettings.getCurrentUserId(),
mContext.getBasePackageName());
nextIme = mSettings.getSelectedInputMethod();
nextEnabledImes = mSettings.getEnabledInputMethodListLocked();
final PrintWriter pr = shellCommand.getOutPrintWriter();
pr.println("Reset current and enabled IMEs");
pr.println("Newly selected IME:");
pr.print(" "); pr.println(nextIme);
pr.println("Newly enabled IMEs:");
{
final int N = nextEnabledImes.size();
for (int i = 0; i < N; ++i) {
pr.print(" ");
pr.println(nextEnabledImes.get(i).getId());
final int[] userIds = InputMethodUtils.resolveUserId(userIdToBeResolved,
mSettings.getCurrentUserId(), shellCommand.getErrPrintWriter());
for (int userId : userIds) {
if (!userHasDebugPriv(userId, shellCommand)) {
continue;
}
final String nextIme;
final List<InputMethodInfo> nextEnabledImes;
if (userId == mSettings.getCurrentUserId()) {
hideCurrentInputLocked(0, null);
unbindCurrentMethodLocked();
// Reset the current IME
resetSelectedInputMethodAndSubtypeLocked(null);
// Also reset the settings of the current IME
mSettings.putSelectedInputMethod(null);
// Disable all enabled IMEs.
mSettings.getEnabledInputMethodListLocked().forEach(
imi -> setInputMethodEnabledLocked(imi.getId(), false));
// Re-enable with default enabled IMEs.
InputMethodUtils.getDefaultEnabledImes(mContext, mMethodList).forEach(
imi -> setInputMethodEnabledLocked(imi.getId(), true));
updateInputMethodsFromSettingsLocked(true /* enabledMayChange */);
InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager,
mSettings.getEnabledInputMethodListLocked(),
mSettings.getCurrentUserId(),
mContext.getBasePackageName());
nextIme = mSettings.getSelectedInputMethod();
nextEnabledImes = mSettings.getEnabledInputMethodListLocked();
} else {
final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap =
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
methodMap, methodList);
final InputMethodSettings settings = new InputMethodSettings(
mContext.getResources(), mContext.getContentResolver(), methodMap,
userId, false);
nextEnabledImes = InputMethodUtils.getDefaultEnabledImes(mContext, methodList);
nextIme = InputMethodUtils.getMostApplicableDefaultIME(nextEnabledImes).getId();
// Reset enabled IMEs.
settings.putEnabledInputMethodsStr("");
nextEnabledImes.forEach(imi -> settings.appendAndPutEnabledInputMethodLocked(
imi.getId(), false));
// Reset selected IME.
settings.putSelectedInputMethod(nextIme);
settings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
}
out.println("Reset current and enabled IMEs for user #" + userId);
out.println(" Selected: " + nextIme);
nextEnabledImes.forEach(ime -> out.println(" Enabled: " + ime.getId()));
}
return ShellCommandResult.SUCCESS;
}
return ShellCommandResult.SUCCESS;
}
/**

View File

@@ -1003,7 +1003,7 @@ final class InputMethodUtils {
return res;
}
private void putEnabledInputMethodsStr(@Nullable String str) {
void putEnabledInputMethodsStr(@Nullable String str) {
if (DEBUG) {
Slog.d(TAG, "putEnabledInputMethodStr: " + str);
}