From ed1cdb24ba986231629fbfb244ed758fc2add0fc Mon Sep 17 00:00:00 2001 From: Satoshi Kataoka Date: Wed, 17 Apr 2013 16:41:58 +0900 Subject: [PATCH] Change the initial disabled state of disabled IMEs Bug: 8365223 This change is a supplement for I77f01c70610d82ce9070d4a The disabled state of disabled pre-installed imes should be changed to ENABLED_STATE_DISABLED_UNTIL_USED on boot or user switch. Change-Id: If8ff1b2b95c36d33148def2ab87bd006aa520cc0 --- .../internal/inputmethod/InputMethodUtils.java | 78 +++++++++++++++++++++- core/res/res/values/config.xml | 16 +++++ core/res/res/values/symbols.xml | 1 + .../android/server/InputMethodManagerService.java | 21 ++++-- 4 files changed, 109 insertions(+), 7 deletions(-) diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 655d148548ba..4e213247e503 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; @@ -28,6 +29,8 @@ import android.util.Pair; import android.util.Slog; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype; +import android.view.textservice.SpellCheckerInfo; +import android.view.textservice.TextServicesManager; import java.util.ArrayList; import java.util.HashMap; @@ -357,6 +360,78 @@ public class InputMethodUtils { return !subtype.isAuxiliary(); } + public static void setNonSelectedSystemImesDisabledUntilUsed( + PackageManager packageManager, List enabledImis) { + if (DEBUG) { + Slog.d(TAG, "setNonSelectedSystemImesDisabledUntilUsed"); + } + final String[] systemImesDisabledUntilUsed = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_disabledUntilUsedPreinstalledImes); + if (systemImesDisabledUntilUsed == null || systemImesDisabledUntilUsed.length == 0) { + return; + } + // Only the current spell checker should be treated as an enabled one. + final SpellCheckerInfo currentSpellChecker = + TextServicesManager.getInstance().getCurrentSpellChecker(); + for (final String packageName : systemImesDisabledUntilUsed) { + if (DEBUG) { + Slog.d(TAG, "check " + packageName); + } + boolean enabledIme = false; + for (int j = 0; j < enabledImis.size(); ++j) { + final InputMethodInfo imi = enabledImis.get(j); + if (packageName.equals(imi.getPackageName())) { + enabledIme = true; + break; + } + } + if (enabledIme) { + // enabled ime. skip + continue; + } + if (currentSpellChecker != null + && packageName.equals(currentSpellChecker.getPackageName())) { + // enabled spell checker. skip + if (DEBUG) { + Slog.d(TAG, packageName + " is the current spell checker. skip"); + } + continue; + } + ApplicationInfo ai = null; + try { + ai = packageManager.getApplicationInfo(packageName, + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); + } catch (NameNotFoundException e) { + Slog.w(TAG, "NameNotFoundException: " + packageName, e); + } + if (ai == null) { + // No app found for packageName + continue; + } + final boolean isSystemPackage = (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + if (!isSystemPackage) { + continue; + } + setDisabledUntilUsed(packageManager, packageName); + } + } + + private static void setDisabledUntilUsed(PackageManager packageManager, String packageName) { + final int state = packageManager.getApplicationEnabledSetting(packageName); + if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { + if (DEBUG) { + Slog.d(TAG, "Update state(" + packageName + "): DISABLED_UNTIL_USED"); + } + packageManager.setApplicationEnabledSetting(packageName, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0); + } else { + if (DEBUG) { + Slog.d(TAG, packageName + " is already DISABLED_UNTIL_USED"); + } + } + } + /** * Utility class for putting and getting settings for InputMethod * TODO: Move all putters and getters of settings to this class. @@ -405,8 +480,7 @@ public class InputMethodUtils { public void setCurrentUserId(int userId) { if (DEBUG) { - Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " - + userId + ", new ime = " + getSelectedInputMethod()); + Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " + userId); } // IMMS settings are kept per user, so keep track of current user mCurrentUserId = userId; diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5c772b2e99fa..0313308c4a5b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1108,4 +1108,20 @@ stream or master volumes. --> false + + + com.android.inputmethod.latin + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2158e90779f7..6a3bdaa3282f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -919,6 +919,7 @@ + diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index f872cc3b59a8..1dd5fc64039d 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -705,7 +705,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @Override public void onReceive(Context context, Intent intent) { synchronized(mMethodMap) { - checkCurrentLocaleChangedLocked(); + resetStateIfCurrentLocaleChangedLocked(); } } }, filter); @@ -781,7 +781,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - private void checkCurrentLocaleChangedLocked() { + private void resetStateIfCurrentLocaleChangedLocked() { resetAllInternalStateLocked(true /* updateOnlyWhenLocaleChanged */, true /* resetDefaultImeLocked */); } @@ -791,12 +791,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // InputMethodFileManager should be reset when the user is changed mFileManager = new InputMethodFileManager(mMethodMap, newUserId); final String defaultImiId = mSettings.getSelectedInputMethod(); - final boolean needsToResetDefaultIme = TextUtils.isEmpty(defaultImiId); + final boolean initialUserSwitch = TextUtils.isEmpty(defaultImiId); if (DEBUG) { Slog.d(TAG, "Switch user: " + newUserId + " current ime = " + defaultImiId); } resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */, - needsToResetDefaultIme); + initialUserSwitch /* needsToResetDefaultIme */); + if (initialUserSwitch) { + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mContext.getPackageManager(), + mSettings.getEnabledInputMethodListLocked()); + } } @Override @@ -838,7 +842,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub !mImeSelectedOnBoot /* resetDefaultEnabledIme */); if (!mImeSelectedOnBoot) { Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here."); - checkCurrentLocaleChangedLocked(); + resetStateIfCurrentLocaleChangedLocked(); + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed( + mContext.getPackageManager(), + mSettings.getEnabledInputMethodListLocked()); } mLastSystemLocale = mRes.getConfiguration().locale; try { @@ -1597,6 +1604,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mSettings.getCurrentUserId()); if (ai != null && ai.enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { + if (DEBUG) { + Slog.d(TAG, "Update state(" + imm.getId() + + "): DISABLED_UNTIL_USED -> DEFAULT"); + } mIPackageManager.setApplicationEnabledSetting(imm.getPackageName(), PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP, mSettings.getCurrentUserId(), -- 2.11.0