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

Commit 726c4597 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Stop granting default Contacts permission to IMEs.

This partially reverts the previous commit [1], which allowed special
components to be granted some pre-configured default permissions.

With this CL, we no longer grant Contacts permissions to pre-installed
IMEs.  Rationals are:

  1. Even without this CL, not the all pre-installed IMEs are granted
     Contacts permission by default, because it was done during the boot
     time where InputMethodManagerService is not yet completely
     initialized.  The current behavior is confusing not only for users
     but also for developers.
  2. In almost all the cases, IMEs are supposed to be able to work
     without Contacts permission.  Hence it is not too late to ask users
     to grant the permission to the IME after the initial setup is
     completed.
  3. It is difficult to add new features such as File-Based Encryption
     (FBE) with keeping the current implementation, because currently we
     dynamically call mSettings.setCurrentUserId(userId) just to
     enumerate what IMEs will be enabled for a given user.  Adding
     another condition (whether the user has already unlocked the device
     or not) would make things more complicated.

Note that LatinIME has already support the case where Contacts
permission is not granted by default.  It does not ask users for
anything until Setup-Wizard is completed, and requests Contacts
permission only when the user taps a message in the suggestion strip
that suggests users to use contacts name for typing suggestions.

 [1] If8b8cadbd1980ffe7a6fc15bbb5f54a425f6e8f9
     adc1cf46

Bug: 24756974
Bug: 26743676
Change-Id: Ief2a40b5971b3eb97d765f934d20ce7f2ef25665
parent 88072ab9
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -58,12 +58,6 @@ public abstract class PackageManagerInternal {
     */
    public abstract void setLocationPackagesProvider(PackagesProvider provider);

    /**
     * Sets the input method packages provider.
     * @param provider The packages provider.
     */
    public abstract void setImePackagesProvider(PackagesProvider provider);

    /**
     * Sets the voice interaction packages provider.
     * @param provider The packages provider.
+0 −34
Original line number Diff line number Diff line
@@ -61,7 +61,6 @@ import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
@@ -859,39 +858,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        mSettings = new InputMethodSettings(
                mRes, context.getContentResolver(), mMethodMap, mMethodList, userId, !mSystemReady);

        // Let the package manager query which are the default imes
        // as they get certain permissions granted by default.
        PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
        packageManagerInternal.setImePackagesProvider(
                new PackageManagerInternal.PackagesProvider() {
                    @Override
                    public String[] getPackages(int userId) {
                        synchronized (mMethodMap) {
                            final int currentUserId = mSettings.getCurrentUserId();
                            // TODO: We are switching the current user id in the settings
                            // object to query it and then revert the user id. Ideally, we
                            // should call a API in settings with the user id as an argument.
                            mSettings.switchCurrentUser(userId, true /* copyOnWrite */);
                            List<InputMethodInfo> imes = mSettings
                                    .getEnabledInputMethodListLocked();
                            String[] packageNames = null;
                            if (imes != null) {
                                final int imeCount = imes.size();
                                packageNames = new String[imeCount];
                                for (int i = 0; i < imeCount; i++) {
                                    InputMethodInfo ime = imes.get(i);
                                    packageNames[i] = ime.getPackageName();
                                }
                            }
                            // If the system is not ready, then we use copy-on-write mode.
                            final boolean useCopyOnWriteSettings = !mSystemReady;
                            mSettings.switchCurrentUser(currentUserId, useCopyOnWriteSettings);
                            return packageNames;
                        }
                    }
                });

        updateCurrentProfileIds();
        mFileManager = new InputMethodFileManager(mMethodMap, userId);
        synchronized (mMethodMap) {
+0 −20
Original line number Diff line number Diff line
@@ -124,7 +124,6 @@ final class DefaultPermissionGrantPolicy {

    private final PackageManagerService mService;

    private PackagesProvider mImePackagesProvider;
    private PackagesProvider mLocationPackagesProvider;
    private PackagesProvider mVoiceInteractionPackagesProvider;
    private PackagesProvider mSmsAppPackagesProvider;
@@ -136,10 +135,6 @@ final class DefaultPermissionGrantPolicy {
        mService = service;
    }

    public void setImePackagesProviderLPr(PackagesProvider provider) {
        mImePackagesProvider = provider;
    }

    public void setLocationPackagesProviderLPw(PackagesProvider provider) {
        mLocationPackagesProvider = provider;
    }
@@ -198,7 +193,6 @@ final class DefaultPermissionGrantPolicy {
    private void grantDefaultSystemHandlerPermissions(int userId) {
        Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);

        final PackagesProvider imePackagesProvider;
        final PackagesProvider locationPackagesProvider;
        final PackagesProvider voiceInteractionPackagesProvider;
        final PackagesProvider smsAppPackagesProvider;
@@ -207,7 +201,6 @@ final class DefaultPermissionGrantPolicy {
        final SyncAdapterPackagesProvider syncAdapterPackagesProvider;

        synchronized (mService.mPackages) {
            imePackagesProvider = mImePackagesProvider;
            locationPackagesProvider = mLocationPackagesProvider;
            voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
            smsAppPackagesProvider = mSmsAppPackagesProvider;
@@ -216,8 +209,6 @@ final class DefaultPermissionGrantPolicy {
            syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
        }

        String[] imePackageNames = (imePackagesProvider != null)
                ? imePackagesProvider.getPackages(userId) : null;
        String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
                ? voiceInteractionPackagesProvider.getPackages(userId) : null;
        String[] locationPackageNames = (locationPackagesProvider != null)
@@ -500,17 +491,6 @@ final class DefaultPermissionGrantPolicy {
                grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
            }

            // IME
            if (imePackageNames != null) {
                for (String imePackageName : imePackageNames) {
                    PackageParser.Package imePackage = getSystemPackageLPr(imePackageName);
                    if (imePackage != null
                            && doesPackageSupportRuntimePermissions(imePackage)) {
                        grantRuntimePermissionsLPw(imePackage, CONTACTS_PERMISSIONS, userId);
                    }
                }
            }

            // Voice interaction
            if (voiceInteractPackageNames != null) {
                for (String voiceInteractPackageName : voiceInteractPackageNames) {
+0 −7
Original line number Diff line number Diff line
@@ -18881,13 +18881,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
            }
        }
        @Override
        public void setImePackagesProvider(PackagesProvider provider) {
            synchronized (mPackages) {
                mDefaultPermissionPolicy.setImePackagesProviderLPr(provider);
            }
        }
        @Override
        public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
            synchronized (mPackages) {