From 2d4b343b69a8c9d86216fea772eddaedaa474bb2 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 10 Apr 2019 23:23:25 -0700 Subject: [PATCH] Add '-u ' 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 ' 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 --- .../InputMethodManagerService.java | 99 ++++++++++++------- .../server/inputmethod/InputMethodUtils.java | 2 +- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 7f9b3bd8fe03e..e88d62f585079 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -4616,10 +4616,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub pw.decreaseIndent(); pw.decreaseIndent(); - pw.println("reset"); + pw.println("reset [--user ]"); 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 : 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 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 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 methodMap = new ArrayMap<>(); + final ArrayList methodList = new ArrayList<>(); + final ArrayMap> 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; } /** diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java index 4349b4aa36032..b5e19aeed0c59 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java @@ -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); }