diff options
| author | 2019-04-10 23:23:25 -0700 | |
|---|---|---|
| committer | 2019-04-10 23:23:25 -0700 | |
| commit | 2d4b343b69a8c9d86216fea772eddaedaa474bb2 (patch) | |
| tree | 6ec7143d7aeffffff5e00d7f6a76aba60774cb75 | |
| parent | 099f80ce9762e8b20998759fd6082bdcd6291103 (diff) | |
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
| -rw-r--r-- | services/core/java/com/android/server/inputmethod/InputMethodManagerService.java | 99 | ||||
| -rw-r--r-- | services/core/java/com/android/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 7f9b3bd8fe03..e88d62f58507 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 <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; } /** diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java index 4349b4aa3603..b5e19aeed0c5 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); } |