diff options
| -rw-r--r-- | services/core/java/com/android/server/inputmethod/InputMethodManagerService.java | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 419a0a648775..c2d1c9a1cfbf 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -1268,9 +1268,15 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @Override public void onUserStarting(TargetUser user) { // Called on ActivityManager thread. - SecureSettingsWrapper.onUserStarting(user.getUserIdentifier()); + final int userId = user.getUserIdentifier(); + SecureSettingsWrapper.onUserStarting(userId); synchronized (ImfLock.class) { - mService.mUserDataRepository.getOrCreate(user.getUserIdentifier()); + mService.mUserDataRepository.getOrCreate(userId); + if (mService.mExperimentalConcurrentMultiUserModeEnabled) { + if (mService.mCurrentUserId != userId) { + mService.experimentalInitializeVisibleBackgroundUserLocked(userId); + } + } } } @@ -1291,6 +1297,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. // We need to rebuild IMEs. postInputMethodSettingUpdatedLocked(false /* resetDefaultEnabledIme */); updateInputMethodsFromSettingsLocked(true /* enabledChanged */); + } else if (mExperimentalConcurrentMultiUserModeEnabled) { + experimentalInitializeVisibleBackgroundUserLocked(userId); } } } @@ -2922,6 +2930,49 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. mMenuController.updateKeyboardFromSettingsLocked(); } + /** + * This is an experimental implementation used when and only when + * {@link #mExperimentalConcurrentMultiUserModeEnabled}. + * + * <p>Never assume what this method is doing is officially supported. For the canonical and + * desired behaviors always refer to single-user code paths such as + * {@link #updateInputMethodsFromSettingsLocked(boolean)}.</p> + * + * <p>Here are examples of missing features.</p> + * <ul> + * <li>Subtypes are not supported at all!</li> + * <li>Profiles are not supported.</li> + * <li> + * {@link PackageManager#COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED} is not updated. + * </li> + * <li>{@link #mDeviceIdToShowIme} is ignored.</li> + * <li>{@link #mSwitchingController} is ignored.</li> + * <li>{@link #mHardwareKeyboardShortcutController} is ignored.</li> + * <li>{@link #mPreventImeStartupUnlessTextEditor} is ignored.</li> + * <li>and so on.</li> + * </ul> + */ + @GuardedBy("ImfLock.class") + void experimentalInitializeVisibleBackgroundUserLocked(@UserIdInt int userId) { + if (!mUserManagerInternal.isUserVisible(userId)) { + return; + } + final var settings = InputMethodSettingsRepository.get(userId); + String id = settings.getSelectedInputMethod(); + if (TextUtils.isEmpty(id)) { + final InputMethodInfo imi = InputMethodInfoUtils.getMostApplicableDefaultIME( + settings.getEnabledInputMethodList()); + if (imi == null) { + return; + } + id = imi.getId(); + settings.putSelectedInputMethod(id); + } + final var userData = mUserDataRepository.getOrCreate(userId); + final var bindingController = userData.mBindingController; + bindingController.setSelectedMethodId(id); + } + @GuardedBy("ImfLock.class") void updateInputMethodsFromSettingsLocked(boolean enabledMayChange) { final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId); |