Loading core/java/com/android/internal/view/InputMethodClient.java +4 −4 Original line number Diff line number Diff line Loading @@ -75,12 +75,12 @@ public final class InputMethodClient { public static final int UNBIND_REASON_DISCONNECT_IME = 3; public static final int UNBIND_REASON_NO_IME = 4; public static final int UNBIND_REASON_SWITCH_IME_FAILED = 5; public static final int UNBIND_REASON_RESET_IME = 6; public static final int UNBIND_REASON_SWITCH_USER = 6; @Retention(SOURCE) @IntDef({UNBIND_REASON_UNSPECIFIED, UNBIND_REASON_SWITCH_CLIENT, UNBIND_REASON_SWITCH_IME, UNBIND_REASON_DISCONNECT_IME, UNBIND_REASON_NO_IME, UNBIND_REASON_SWITCH_IME_FAILED, UNBIND_REASON_RESET_IME}) UNBIND_REASON_SWITCH_USER}) public @interface UnbindReason {} public static String getUnbindReason(@UnbindReason final int reason) { Loading @@ -97,8 +97,8 @@ public final class InputMethodClient { return "NO_IME"; case UNBIND_REASON_SWITCH_IME_FAILED: return "SWITCH_IME_FAILED"; case UNBIND_REASON_RESET_IME: return "RESET_IME"; case UNBIND_REASON_SWITCH_USER: return "SWITCH_USER"; default: return "Unknown=" + reason; } Loading services/core/java/com/android/server/InputMethodManagerService.java +43 −50 Original line number Diff line number Diff line Loading @@ -599,15 +599,35 @@ public class InputMethodManagerService extends IInputMethodManager.Stub restoreEnabledInputMethods(mContext, prevValue, newValue); } } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { synchronized (mMethodMap) { resetStateIfCurrentLocaleChangedLocked(); } onActionLocaleChanged(); } else { Slog.w(TAG, "Unexpected intent " + intent); } } } /** * Handles {@link Intent#ACTION_LOCALE_CHANGED}. * * <p>Note: For historical reasons, {@link Intent#ACTION_LOCALE_CHANGED} has been sent to all * the users. We should ignore this event if this is about any background user's locale.</p> * * <p>Caution: This method must not be called when system is not ready.</p> */ void onActionLocaleChanged() { synchronized (mMethodMap) { final LocaleList possibleNewLocale = mRes.getConfiguration().getLocales(); if (possibleNewLocale != null && possibleNewLocale.equals(mLastSystemLocales)) { return; } buildInputMethodListLocked(true); // If the locale is changed, needs to reset the default ime resetDefaultImeLocked(mContext); updateFromSettingsLocked(true); mLastSystemLocales = possibleNewLocale; } } // Apply the results of a restore operation to the set of enabled IMEs. Note that this // does not attempt to validate on the fly with any installed device policy, so must only // be run in the context of initial device setup. Loading Loading @@ -979,51 +999,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub setSelectedInputMethodAndSubtypeLocked(defIm, NOT_A_SUBTYPE_ID, false); } private void resetAllInternalStateLocked(final boolean updateOnlyWhenLocaleChanged, final boolean resetDefaultEnabledIme) { if (!mSystemReady) { // not system ready return; } final LocaleList newLocales = mRes.getConfiguration().getLocales(); if (!updateOnlyWhenLocaleChanged || (newLocales != null && !newLocales.equals(mLastSystemLocales))) { if (!updateOnlyWhenLocaleChanged) { hideCurrentInputLocked(0, null); resetCurrentMethodAndClient(InputMethodClient.UNBIND_REASON_RESET_IME); } if (DEBUG) { Slog.i(TAG, "LocaleList has been changed to " + newLocales); } buildInputMethodListLocked(resetDefaultEnabledIme); if (!updateOnlyWhenLocaleChanged) { final String selectedImiId = mSettings.getSelectedInputMethod(); if (TextUtils.isEmpty(selectedImiId)) { // This is the first time of the user switch and // set the current ime to the proper one. resetDefaultImeLocked(mContext); } } else { // If the locale is changed, needs to reset the default ime resetDefaultImeLocked(mContext); } updateFromSettingsLocked(true); mLastSystemLocales = newLocales; if (!updateOnlyWhenLocaleChanged) { try { startInputInnerLocked(); } catch (RuntimeException e) { Slog.w(TAG, "Unexpected exception", e); } } } } private void resetStateIfCurrentLocaleChangedLocked() { resetAllInternalStateLocked(true /* updateOnlyWhenLocaleChanged */, true /* resetDefaultImeLocked */); } private void switchUserLocked(int newUserId) { if (DEBUG) Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId + " currentUserId=" + mSettings.getCurrentUserId()); Loading @@ -1050,8 +1025,26 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // Even in such cases, IMMS works fine because it will find the most applicable // IME for that user. final boolean initialUserSwitch = TextUtils.isEmpty(defaultImiId); resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */, initialUserSwitch /* needsToResetDefaultIme */); mLastSystemLocales = mRes.getConfiguration().getLocales(); // TODO: Is it really possible that switchUserLocked() happens before system ready? if (mSystemReady) { hideCurrentInputLocked(0, null); resetCurrentMethodAndClient(InputMethodClient.UNBIND_REASON_SWITCH_USER); buildInputMethodListLocked(initialUserSwitch); if (TextUtils.isEmpty(mSettings.getSelectedInputMethod())) { // This is the first time of the user switch and // set the current ime to the proper one. resetDefaultImeLocked(mContext); } updateFromSettingsLocked(true); try { startInputInnerLocked(); } catch (RuntimeException e) { Slog.w(TAG, "Unexpected exception", e); } } if (initialUserSwitch) { InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager, mSettings.getEnabledInputMethodListLocked(), newUserId, Loading Loading
core/java/com/android/internal/view/InputMethodClient.java +4 −4 Original line number Diff line number Diff line Loading @@ -75,12 +75,12 @@ public final class InputMethodClient { public static final int UNBIND_REASON_DISCONNECT_IME = 3; public static final int UNBIND_REASON_NO_IME = 4; public static final int UNBIND_REASON_SWITCH_IME_FAILED = 5; public static final int UNBIND_REASON_RESET_IME = 6; public static final int UNBIND_REASON_SWITCH_USER = 6; @Retention(SOURCE) @IntDef({UNBIND_REASON_UNSPECIFIED, UNBIND_REASON_SWITCH_CLIENT, UNBIND_REASON_SWITCH_IME, UNBIND_REASON_DISCONNECT_IME, UNBIND_REASON_NO_IME, UNBIND_REASON_SWITCH_IME_FAILED, UNBIND_REASON_RESET_IME}) UNBIND_REASON_SWITCH_USER}) public @interface UnbindReason {} public static String getUnbindReason(@UnbindReason final int reason) { Loading @@ -97,8 +97,8 @@ public final class InputMethodClient { return "NO_IME"; case UNBIND_REASON_SWITCH_IME_FAILED: return "SWITCH_IME_FAILED"; case UNBIND_REASON_RESET_IME: return "RESET_IME"; case UNBIND_REASON_SWITCH_USER: return "SWITCH_USER"; default: return "Unknown=" + reason; } Loading
services/core/java/com/android/server/InputMethodManagerService.java +43 −50 Original line number Diff line number Diff line Loading @@ -599,15 +599,35 @@ public class InputMethodManagerService extends IInputMethodManager.Stub restoreEnabledInputMethods(mContext, prevValue, newValue); } } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { synchronized (mMethodMap) { resetStateIfCurrentLocaleChangedLocked(); } onActionLocaleChanged(); } else { Slog.w(TAG, "Unexpected intent " + intent); } } } /** * Handles {@link Intent#ACTION_LOCALE_CHANGED}. * * <p>Note: For historical reasons, {@link Intent#ACTION_LOCALE_CHANGED} has been sent to all * the users. We should ignore this event if this is about any background user's locale.</p> * * <p>Caution: This method must not be called when system is not ready.</p> */ void onActionLocaleChanged() { synchronized (mMethodMap) { final LocaleList possibleNewLocale = mRes.getConfiguration().getLocales(); if (possibleNewLocale != null && possibleNewLocale.equals(mLastSystemLocales)) { return; } buildInputMethodListLocked(true); // If the locale is changed, needs to reset the default ime resetDefaultImeLocked(mContext); updateFromSettingsLocked(true); mLastSystemLocales = possibleNewLocale; } } // Apply the results of a restore operation to the set of enabled IMEs. Note that this // does not attempt to validate on the fly with any installed device policy, so must only // be run in the context of initial device setup. Loading Loading @@ -979,51 +999,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub setSelectedInputMethodAndSubtypeLocked(defIm, NOT_A_SUBTYPE_ID, false); } private void resetAllInternalStateLocked(final boolean updateOnlyWhenLocaleChanged, final boolean resetDefaultEnabledIme) { if (!mSystemReady) { // not system ready return; } final LocaleList newLocales = mRes.getConfiguration().getLocales(); if (!updateOnlyWhenLocaleChanged || (newLocales != null && !newLocales.equals(mLastSystemLocales))) { if (!updateOnlyWhenLocaleChanged) { hideCurrentInputLocked(0, null); resetCurrentMethodAndClient(InputMethodClient.UNBIND_REASON_RESET_IME); } if (DEBUG) { Slog.i(TAG, "LocaleList has been changed to " + newLocales); } buildInputMethodListLocked(resetDefaultEnabledIme); if (!updateOnlyWhenLocaleChanged) { final String selectedImiId = mSettings.getSelectedInputMethod(); if (TextUtils.isEmpty(selectedImiId)) { // This is the first time of the user switch and // set the current ime to the proper one. resetDefaultImeLocked(mContext); } } else { // If the locale is changed, needs to reset the default ime resetDefaultImeLocked(mContext); } updateFromSettingsLocked(true); mLastSystemLocales = newLocales; if (!updateOnlyWhenLocaleChanged) { try { startInputInnerLocked(); } catch (RuntimeException e) { Slog.w(TAG, "Unexpected exception", e); } } } } private void resetStateIfCurrentLocaleChangedLocked() { resetAllInternalStateLocked(true /* updateOnlyWhenLocaleChanged */, true /* resetDefaultImeLocked */); } private void switchUserLocked(int newUserId) { if (DEBUG) Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId + " currentUserId=" + mSettings.getCurrentUserId()); Loading @@ -1050,8 +1025,26 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // Even in such cases, IMMS works fine because it will find the most applicable // IME for that user. final boolean initialUserSwitch = TextUtils.isEmpty(defaultImiId); resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */, initialUserSwitch /* needsToResetDefaultIme */); mLastSystemLocales = mRes.getConfiguration().getLocales(); // TODO: Is it really possible that switchUserLocked() happens before system ready? if (mSystemReady) { hideCurrentInputLocked(0, null); resetCurrentMethodAndClient(InputMethodClient.UNBIND_REASON_SWITCH_USER); buildInputMethodListLocked(initialUserSwitch); if (TextUtils.isEmpty(mSettings.getSelectedInputMethod())) { // This is the first time of the user switch and // set the current ime to the proper one. resetDefaultImeLocked(mContext); } updateFromSettingsLocked(true); try { startInputInnerLocked(); } catch (RuntimeException e) { Slog.w(TAG, "Unexpected exception", e); } } if (initialUserSwitch) { InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mIPackageManager, mSettings.getEnabledInputMethodListLocked(), newUserId, Loading