From fa265ed97026e3b8675a2ccbf4035cad6dc1523f Mon Sep 17 00:00:00 2001 From: Guliz Tuncay Date: Wed, 16 Aug 2017 12:02:31 -0700 Subject: [PATCH] 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 --- .../android/server/TextServicesManagerService.java | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 4b0d4be11b14..14fe6a271434 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -183,7 +183,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { buildSpellCheckerMapLocked(mContext, mSpellCheckerList, mSpellCheckerMap, mSettings); SpellCheckerInfo sci = getCurrentSpellChecker(null); if (sci == null) { - sci = findAvailSpellCheckerLocked(null); + sci = findAvailSystemSpellCheckerLocked(null); if (sci != null) { // 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 @@ -227,7 +227,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE // Package modified || isPackageModified(packageName)) { - sci = findAvailSpellCheckerLocked(packageName); + sci = findAvailSystemSpellCheckerLocked(packageName); if (sci != null) { setCurrentSpellCheckerLocked(sci.getId()); } @@ -371,8 +371,16 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { mSpellCheckerBindGroups.clear(); } - private SpellCheckerInfo findAvailSpellCheckerLocked(String prefPackage) { - final int spellCheckersCount = mSpellCheckerList.size(); + private SpellCheckerInfo findAvailSystemSpellCheckerLocked(String prefPackage) { + // Filter the spell checker list to remove spell checker services that are not pre-installed + ArrayList 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) { Slog.w(TAG, "no available spell checker services found"); return null; @@ -382,7 +390,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { final SpellCheckerInfo sci = mSpellCheckerList.get(i); if (prefPackage.equals(sci.getPackageName())) { if (DBG) { - Slog.d(TAG, "findAvailSpellCheckerLocked: " + sci.getPackageName()); + Slog.d(TAG, "findAvailSystemSpellCheckerLocked: " + sci.getPackageName()); } return sci; } @@ -396,7 +404,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { final ArrayList suitableLocales = InputMethodUtils.getSuitableLocalesForSpellChecker(systemLocal); if (DBG) { - Slog.w(TAG, "findAvailSpellCheckerLocked suitableLocales=" + Slog.w(TAG, "findAvailSystemSpellCheckerLocked suitableLocales=" + Arrays.toString(suitableLocales.toArray(new Locale[suitableLocales.size()]))); } final int localeCount = suitableLocales.size(); -- 2.11.0