Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16b778a0 authored by Guliz Tuncay's avatar Guliz Tuncay Committed by Tim Schumacher
Browse files

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:
1. Open 'packages/inputmethods/LatinIME/java/AndroidManifest.xml'
     and remove 'AndroidSpellCheckerService'
2. lunch aosp_buillhead-userdebug && make -j
3. Flash the image
4. adb shell dumpsys textservices
    -> no spell checker is recognized
5. adb shell settings get secure selected_spell_checker
    -> null
6. tapas SampleSpellCheckerService
7. make -j
8. adb install -r $OUT/system/app/SampleSpellCheckerService/SampleSpellCheckerService.apk
9. adb shell dumpsys textservices
    -> SampleSpellCheckerService is recognized
10. adb shell settings get secure selected_spell_checker
    -> null

Change-Id: I16f12293d15258c9148677c7ee09fe6dcf81e81d
Merged-In: Idab3ecc246fe9344a09e6907a0ba39f8ea6506f9
(cherry picked from commit ed5973b8)
parent 013515e6
Loading
Loading
Loading
Loading
+16 −7
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ResolveInfo;
@@ -124,7 +125,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, null);
            sci = findAvailSystemSpellCheckerLocked(null, 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
@@ -163,7 +164,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(null, packageName);
                    sci = findAvailSystemSpellCheckerLocked(null, packageName);
                    if (sci != null) {
                    if (sci != null) {
                        setCurrentSpellCheckerLocked(sci.getId());
                        setCurrentSpellCheckerLocked(sci.getId());
                    }
                    }
@@ -262,18 +263,26 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
    }
    }


    // TODO: find an appropriate spell checker for specified locale
    // TODO: find an appropriate spell checker for specified locale
    private SpellCheckerInfo findAvailSpellCheckerLocked(String locale, String prefPackage) {
    private SpellCheckerInfo findAvailSystemSpellCheckerLocked(String locale, 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<SpellCheckerInfo>();
        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;
        }
        }
        if (prefPackage != null) {
        if (prefPackage != null) {
            for (int i = 0; i < spellCheckersCount; ++i) {
            for (int i = 0; i < spellCheckersCount; ++i) {
                final SpellCheckerInfo sci = mSpellCheckerList.get(i);
                final SpellCheckerInfo sci = spellCheckerList.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;
                }
                }
@@ -282,7 +291,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
        if (spellCheckersCount > 1) {
        if (spellCheckersCount > 1) {
            Slog.w(TAG, "more than one spell checker service found, picking first");
            Slog.w(TAG, "more than one spell checker service found, picking first");
        }
        }
        return mSpellCheckerList.get(0);
        return spellCheckerList.get(0);
    }
    }


    // TODO: Save SpellCheckerService by supported languages. Currently only one spell
    // TODO: Save SpellCheckerService by supported languages. Currently only one spell