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

Commit b225c56f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use role for default home."

parents 64cdaef8 8be463fe
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -162,6 +162,30 @@ public abstract class PackageManagerInternal {
        boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId);
    }

    /**
     * Provider for default home
     */
    public interface DefaultHomeProvider {

        /**
         * Get the package name of the default home.
         *
         * @param userId the user id
         *
         * @return the package name of the default home, or {@code null} if none
         */
        @Nullable
        String getDefaultHome(@UserIdInt int userId);

        /**
         * Set the package name of the default home.
         *
         * @param packageName package name of the default home, or {@code null} to remove
         * @param userId the user id
         */
        void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId);
    }

    /**
     * Sets the location provider packages provider.
     * @param provider The packages provider.
@@ -886,4 +910,11 @@ public abstract class PackageManagerInternal {
     * @param provider the provider
     */
    public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider);

    /**
     * Sets the default home provider.
     *
     * @param provider the provider
     */
    public abstract void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider);
}
+81 −12
Original line number Diff line number Diff line
@@ -985,6 +985,9 @@ public class PackageManagerService extends IPackageManager.Stub
    @GuardedBy("mPackages")
    private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider;
    @GuardedBy("mPackages")
    private PackageManagerInternal.DefaultHomeProvider mDefaultHomeProvider;
    private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> {
        private Context mContext;
        private ComponentName mIntentFilterVerifierComponent;
@@ -1349,7 +1352,7 @@ public class PackageManagerService extends IPackageManager.Stub
    final @Nullable String mRequiredVerifierPackage;
    final @NonNull String mRequiredInstallerPackage;
    final @NonNull String mRequiredUninstallerPackage;
    final String mRequiredPermissionControllerPackage;
    final @NonNull String mRequiredPermissionControllerPackage;
    final @Nullable String mSetupWizardPackage;
    final @Nullable String mStorageManagerPackage;
    final @Nullable String mSystemTextClassifierPackage;
@@ -1940,6 +1943,10 @@ public class PackageManagerService extends IPackageManager.Stub
                        // We may also need to apply pending (restored) runtime
                        // permission grants within these users.
                        mSettings.applyPendingPermissionGrantsLPw(packageName, userId);
                        // Persistent preferred activity might have came into effect due to this
                        // install.
                        updateDefaultHomeLPw(userId);
                    }
                }
            }
@@ -19077,6 +19084,7 @@ public class PackageManagerService extends IPackageManager.Stub
            pir.addFilter(new PreferredActivity(filter, match, set, activity, always));
            scheduleWritePackageRestrictionsLocked(userId);
            postPreferredActivityChangedBroadcast(userId);
            updateDefaultHomeLPw(userId);
        }
    }
@@ -19227,6 +19235,13 @@ public class PackageManagerService extends IPackageManager.Stub
    /** This method takes a specific user id as well as UserHandle.USER_ALL. */
    @GuardedBy("mPackages")
    boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) {
        return clearPackagePreferredActivitiesLPw(packageName, false, userId);
    }
    /** This method takes a specific user id as well as UserHandle.USER_ALL. */
    @GuardedBy("mPackages")
    private boolean clearPackagePreferredActivitiesLPw(String packageName,
            boolean skipUpdateDefaultHome, int userId) {
        ArrayList<PreferredActivity> removed = null;
        boolean changed = false;
        for (int i=0; i<mSettings.mPreferredActivities.size(); i++) {
@@ -19255,6 +19270,9 @@ public class PackageManagerService extends IPackageManager.Stub
                    pir.removeFilter(pa);
                }
                changed = true;
                if (!skipUpdateDefaultHome) {
                    updateDefaultHomeLPw(thisUserId);
                }
            }
        }
        if (changed) {
@@ -19314,8 +19332,9 @@ public class PackageManagerService extends IPackageManager.Stub
        // writer
        try {
            synchronized (mPackages) {
                clearPackagePreferredActivitiesLPw(null, userId);
                clearPackagePreferredActivitiesLPw(null, true, userId);
                mSettings.applyDefaultPreferredAppsLPw(userId);
                updateDefaultHomeLPw(userId);
                // TODO: We have to reset the default SMS and Phone. This requires
                // significant refactoring to keep all default apps in the package
                // manager (cleaner but more work) or have the services provide
@@ -19384,6 +19403,7 @@ public class PackageManagerService extends IPackageManager.Stub
                    new PersistentPreferredActivity(filter, activity));
            scheduleWritePackageRestrictionsLocked(userId);
            postPreferredActivityChangedBroadcast(userId);
            updateDefaultHomeLPw(userId);
        }
    }
@@ -19427,6 +19447,7 @@ public class PackageManagerService extends IPackageManager.Stub
            if (changed) {
                scheduleWritePackageRestrictionsLocked(userId);
                postPreferredActivityChangedBroadcast(userId);
                updateDefaultHomeLPw(userId);
            }
        }
    }
@@ -19514,6 +19535,7 @@ public class PackageManagerService extends IPackageManager.Stub
                    (readParser, readUserId) -> {
                        synchronized (mPackages) {
                            mSettings.readPreferredActivitiesLPw(readParser, readUserId);
                            updateDefaultHomeLPw(readUserId);
                        }
                    });
        } catch (Exception e) {
@@ -19937,19 +19959,59 @@ public class PackageManagerService extends IPackageManager.Stub
    ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
            int userId) {
        Intent intent  = getHomeIntent();
        List<ResolveInfo> list = queryIntentActivitiesInternal(intent, null,
        List<ResolveInfo> resolveInfos = queryIntentActivitiesInternal(intent, null,
                PackageManager.GET_META_DATA, userId);
        ResolveInfo preferred = findPreferredActivity(intent, null, 0, list, 0,
                true, false, false, userId);
        allHomeCandidates.clear();
        if (list != null) {
            allHomeCandidates.addAll(list);
        if (resolveInfos == null) {
            return null;
        }
        return (preferred == null || preferred.activityInfo == null)
                ? null
                : new ComponentName(preferred.activityInfo.packageName,
                        preferred.activityInfo.name);
        allHomeCandidates.addAll(resolveInfos);
        PackageManagerInternal.DefaultHomeProvider provider;
        synchronized (mPackages) {
            provider = mDefaultHomeProvider;
        }
        if (provider == null) {
            Slog.e(TAG, "mDefaultHomeProvider is null");
            return null;
        }
        String packageName = provider.getDefaultHome(userId);
        if (packageName == null) {
            return null;
        }
        int resolveInfosSize = resolveInfos.size();
        for (int i = 0; i < resolveInfosSize; i++) {
            ResolveInfo resolveInfo = resolveInfos.get(i);
            if (resolveInfo.activityInfo != null && TextUtils.equals(
                    resolveInfo.activityInfo.packageName, packageName)) {
                return new ComponentName(resolveInfo.activityInfo.packageName,
                        resolveInfo.activityInfo.name);
            }
        }
        return null;
    }
    private void updateDefaultHomeLPw(int userId) {
        Intent intent = getHomeIntent();
        List<ResolveInfo> resolveInfos = queryIntentActivitiesInternal(intent, null,
                PackageManager.GET_META_DATA, userId);
        ResolveInfo preferredResolveInfo = findPreferredActivity(intent, null, 0, resolveInfos,
                0, true, false, false, userId);
        String packageName = preferredResolveInfo != null
                && preferredResolveInfo.activityInfo != null
                ? preferredResolveInfo.activityInfo.packageName : null;
        String currentPackageName = mDefaultHomeProvider.getDefaultHome(userId);
        if (TextUtils.equals(currentPackageName, packageName)) {
            return;
        }
        String[] callingPackages = getPackagesForUid(Binder.getCallingUid());
        if (callingPackages != null && ArrayUtils.contains(callingPackages,
                mRequiredPermissionControllerPackage)) {
            // PermissionController manages default home directly.
            return;
        }
        mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId);
    }
    @Override
@@ -23839,6 +23901,13 @@ public class PackageManagerService extends IPackageManager.Stub
                mDefaultBrowserProvider = provider;
            }
        }
        @Override
        public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) {
            synchronized (mPackages) {
                mDefaultHomeProvider = provider;
            }
        }
    }
    @GuardedBy("mPackages")
+37 −29
Original line number Diff line number Diff line
@@ -17,10 +17,13 @@
package com.android.server.policy.role;

import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.os.Debug;
import android.provider.Settings;
import android.telecom.TelecomManager;
@@ -33,6 +36,7 @@ import com.android.internal.util.CollectionUtils;
import com.android.server.LocalServices;
import com.android.server.role.RoleManagerService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -54,19 +58,44 @@ public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHolder
    @NonNull
    private final Context mContext;

    public LegacyRoleResolutionPolicy(Context context) {
    public LegacyRoleResolutionPolicy(@NonNull Context context) {
        mContext = context;
    }

    @NonNull
    @Override
    public List<String> getRoleHolders(String roleName, int userId) {
    public List<String> getRoleHolders(@NonNull String roleName, @UserIdInt int userId) {
        switch (roleName) {
            case RoleManager.ROLE_ASSISTANT: {
                String legacyAssistant = Settings.Secure.getStringForUser(
                        mContext.getContentResolver(), Settings.Secure.ASSISTANT, userId);
                if (legacyAssistant == null || legacyAssistant.isEmpty()) {
                    return Collections.emptyList();
                } else {
                    return Collections.singletonList(
                            ComponentName.unflattenFromString(legacyAssistant).getPackageName());
                }
            }
            case RoleManager.ROLE_BROWSER: {
                PackageManagerInternal packageManagerInternal = LocalServices.getService(
                        PackageManagerInternal.class);
                String packageName = packageManagerInternal.removeLegacyDefaultBrowserPackageName(
                        userId);
                return CollectionUtils.singletonOrEmpty(packageName);
            }
            case RoleManager.ROLE_DIALER: {
                String setting = Settings.Secure.getStringForUser(
                        mContext.getContentResolver(),
                        Settings.Secure.DIALER_DEFAULT_APPLICATION, userId);
                return CollectionUtils.singletonOrEmpty(!TextUtils.isEmpty(setting)
                        ? setting
                        : mContext.getSystemService(TelecomManager.class).getSystemDialerPackage());
            }
            case RoleManager.ROLE_SMS: {
                // Moved over from SmsApplication#getApplication
                String result = Settings.Secure.getStringForUser(
                        mContext.getContentResolver(),
                        Settings.Secure.SMS_DEFAULT_APPLICATION, userId);

                // TODO: STOPSHIP: Remove the following code once we read the value of
                //  config_defaultSms in RoleControllerService.
                if (result == null) {
@@ -92,34 +121,13 @@ public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHolder
                    SmsApplication.SmsApplicationData app = applicationData;
                    result = app == null ? null : app.mPackageName;
                }

                return CollectionUtils.singletonOrEmpty(result);
            }
            case RoleManager.ROLE_ASSISTANT: {
                String legacyAssistant = Settings.Secure.getStringForUser(
                        mContext.getContentResolver(), Settings.Secure.ASSISTANT, userId);

                if (legacyAssistant == null || legacyAssistant.isEmpty()) {
                    return Collections.emptyList();
                } else {
                    return Collections.singletonList(
                            ComponentName.unflattenFromString(legacyAssistant).getPackageName());
                }
            }
            case RoleManager.ROLE_DIALER: {
                String setting = Settings.Secure.getStringForUser(
                        mContext.getContentResolver(),
                        Settings.Secure.DIALER_DEFAULT_APPLICATION, userId);

                return CollectionUtils.singletonOrEmpty(!TextUtils.isEmpty(setting)
                        ? setting
                        : mContext.getSystemService(TelecomManager.class).getSystemDialerPackage());
            }
            case RoleManager.ROLE_BROWSER: {
                PackageManagerInternal packageManagerInternal = LocalServices.getService(
                        PackageManagerInternal.class);
                String packageName = packageManagerInternal.removeLegacyDefaultBrowserPackageName(
                        userId);
            case RoleManager.ROLE_HOME: {
                PackageManager packageManager = mContext.getPackageManager();
                List<ResolveInfo> resolveInfos = new ArrayList<>();
                ComponentName componentName = packageManager.getHomeActivities(resolveInfos);
                String packageName = componentName != null ? componentName.getPackageName() : null;
                return CollectionUtils.singletonOrEmpty(packageName);
            }
            default: {
+32 −1
Original line number Diff line number Diff line
@@ -111,7 +111,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
    /** @see #getRoleHolders(String, int) */
    public interface RoleHoldersResolver {
        /** @return a list of packages that hold a given role for a given user */
        List<String> getRoleHolders(String roleName, int userId);
        @NonNull
        List<String> getRoleHolders(@NonNull String roleName, @UserIdInt int userId);
    }

    /**
@@ -154,6 +155,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
        PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
        packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider());
        packageManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider());

        registerUserRemovedReceiver();
    }
@@ -741,4 +743,33 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
            }
        }
    }

    private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider {

        @Nullable
        @Override
        public String getDefaultHome(@UserIdInt int userId) {
            return CollectionUtils.firstOrNull(getOrCreateUserState(userId).getRoleHolders(
                    RoleManager.ROLE_HOME));
        }

        @Override
        public void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId) {
            IRoleManagerCallback callback = new IRoleManagerCallback.Stub() {
                @Override
                public void onSuccess() {}
                @Override
                public void onFailure() {
                    Slog.e(LOG_TAG, "Failed to set default home: " + packageName);
                }
            };
            if (packageName != null) {
                getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_HOME,
                        packageName, 0, callback);
            } else {
                getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_HOME, 0,
                        callback);
            }
        }
    }
}