Select only preinstalled Spell Checker Services

When we are setting a new spell checker as the default one in
Secure.Settings, TSMS#findAvailSpellCheckerLocked can pick up
any available spell checker service. This violates the principle
that user should be warned whenever we are setting an untrusted
spell checker service as the default service, since the warning
dialog is never shown.

Fixes: 64764051
Bug: 118694079
Test: Manually as follows:
0. Make sure AOSP keyboard is pre-installed.
1. adb shell settings put --user 0 secure selected_spell_checker com.android.inputmethod.latin/.spellcheck.AndroidSpellCheckerService
2. tapas SampleSpellCheckerService
3. make -j
4. adb install --user 0  -r out/target/product/generic/system/app/SampleSpellCheckerService/SampleSpellCheckerService.apk
5. adb shell pm disable com.android.inputmethod.latin
6. adb shell settings get --user 0 secure selected_spell_checker
    -> com.android.inputmethod.latin/.spellcheck.AndroidSpellCheckerService
7. adb reboot
8. adb shell settings get --user 0 secure selected_spell_checker
    -> com.android.inputmethod.latin/.spellcheck.AndroidSpellCheckerService
Change-Id: I298ffbcfa5e32f43753f54fbebc40a414a5c0f9e
Merged-In: I298ffbcfa5e32f43753f54fbebc40a414a5c0f9e
This commit is contained in:
Guliz Tuncay
2017-08-16 12:02:31 -07:00
committed by Atanas Kirilov
parent 301d17e4dd
commit fa265ed970

View File

@@ -183,7 +183,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
buildSpellCheckerMapLocked(mContext, mSpellCheckerList, mSpellCheckerMap, mSettings); buildSpellCheckerMapLocked(mContext, mSpellCheckerList, mSpellCheckerMap, mSettings);
SpellCheckerInfo sci = getCurrentSpellChecker(null); SpellCheckerInfo sci = getCurrentSpellChecker(null);
if (sci == null) { if (sci == null) {
sci = findAvailSpellCheckerLocked(null); sci = findAvailSystemSpellCheckerLocked(null);
if (sci != null) { if (sci != null) {
// Set the current spell checker if there is one or more spell checkers // Set the current spell checker if there is one or more spell checkers
// available. In this case, "sci" is the first one in the available spell // available. In this case, "sci" is the first one in the available spell
@@ -227,7 +227,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE
// Package modified // Package modified
|| isPackageModified(packageName)) { || isPackageModified(packageName)) {
sci = findAvailSpellCheckerLocked(packageName); sci = findAvailSystemSpellCheckerLocked(packageName);
if (sci != null) { if (sci != null) {
setCurrentSpellCheckerLocked(sci.getId()); setCurrentSpellCheckerLocked(sci.getId());
} }
@@ -371,8 +371,16 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
mSpellCheckerBindGroups.clear(); mSpellCheckerBindGroups.clear();
} }
private SpellCheckerInfo findAvailSpellCheckerLocked(String prefPackage) { private SpellCheckerInfo findAvailSystemSpellCheckerLocked(String prefPackage) {
final int spellCheckersCount = mSpellCheckerList.size(); // Filter the spell checker list to remove spell checker services that are not pre-installed
ArrayList<SpellCheckerInfo> spellCheckerList = new ArrayList<>();
for (SpellCheckerInfo sci : mSpellCheckerList) {
if ((sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
spellCheckerList.add(sci);
}
}
final int spellCheckersCount = spellCheckerList.size();
if (spellCheckersCount == 0) { if (spellCheckersCount == 0) {
Slog.w(TAG, "no available spell checker services found"); Slog.w(TAG, "no available spell checker services found");
return null; return null;
@@ -382,7 +390,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
final SpellCheckerInfo sci = mSpellCheckerList.get(i); final SpellCheckerInfo sci = mSpellCheckerList.get(i);
if (prefPackage.equals(sci.getPackageName())) { if (prefPackage.equals(sci.getPackageName())) {
if (DBG) { if (DBG) {
Slog.d(TAG, "findAvailSpellCheckerLocked: " + sci.getPackageName()); Slog.d(TAG, "findAvailSystemSpellCheckerLocked: " + sci.getPackageName());
} }
return sci; return sci;
} }
@@ -396,7 +404,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
final ArrayList<Locale> suitableLocales = final ArrayList<Locale> suitableLocales =
InputMethodUtils.getSuitableLocalesForSpellChecker(systemLocal); InputMethodUtils.getSuitableLocalesForSpellChecker(systemLocal);
if (DBG) { if (DBG) {
Slog.w(TAG, "findAvailSpellCheckerLocked suitableLocales=" Slog.w(TAG, "findAvailSystemSpellCheckerLocked suitableLocales="
+ Arrays.toString(suitableLocales.toArray(new Locale[suitableLocales.size()]))); + Arrays.toString(suitableLocales.toArray(new Locale[suitableLocales.size()])));
} }
final int localeCount = suitableLocales.size(); final int localeCount = suitableLocales.size();