Merge "Change the initial disabled state of disabled IMEs" into jb-mr2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
245a3e1c1e
@ -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<InputMethodInfo> 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;
|
||||
|
@ -1108,4 +1108,20 @@
|
||||
stream or master volumes. -->
|
||||
<bool name="config_useFixedVolume">false</bool>
|
||||
|
||||
<!-- The list of IMEs which should be disabled until used.
|
||||
This function suppresses update notifications for these pre-installed apps.
|
||||
We need to set this configuration carefully that they should not have functionarities
|
||||
other than "IME" or "Spell Checker". In InputMethodManagerService,
|
||||
the listed IMEs are disabled until used when all of the following conditions are met.
|
||||
1. Not selected as an enabled IME in the Settings
|
||||
2. Not selected as a spell checker in the Settings
|
||||
3. Installed
|
||||
4. A pre-installed IME
|
||||
5. Not enabled
|
||||
And the disabled_until_used state for an IME is released by InputMethodManagerService
|
||||
when the IME is selected as an enabled IME. -->
|
||||
<string-array name="config_disabledUntilUsedPreinstalledImes" translatable="false">
|
||||
<item>com.android.inputmethod.latin</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
|
@ -919,6 +919,7 @@
|
||||
<java-symbol type="array" name="special_locale_names" />
|
||||
<java-symbol type="array" name="config_masterVolumeRamp" />
|
||||
<java-symbol type="array" name="config_cdma_dun_supported_types" />
|
||||
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" />
|
||||
|
||||
<java-symbol type="drawable" name="default_wallpaper" />
|
||||
<java-symbol type="drawable" name="indicator_input_error" />
|
||||
|
@ -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(),
|
||||
|
Reference in New Issue
Block a user