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

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

Merge "Make RoleManager inject DefaultBrowserProvider into PackageManager."

parents 3ea3ef34 85fd0622
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -136,6 +136,32 @@ public abstract class PackageManagerInternal {
        public String[] getPackages(String authority, int userId);
    }

    /**
     * Provider for default browser
     */
    public interface DefaultBrowserProvider {

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

        /**
         * Set the package name of the default browser.
         *
         * @param packageName package name of the default browser, or {@code null} to remove
         * @param userId the user id
         *
         * @return whether the default browser was successfully set.
         */
        boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId);
    }

    /**
     * Sets the location provider packages provider.
     * @param provider The packages provider.
@@ -853,4 +879,11 @@ public abstract class PackageManagerInternal {
     */
    @Nullable
    public abstract String removeLegacyDefaultBrowserPackageName(int userId);

    /**
     * Sets the default browser provider.
     *
     * @param provider the provider
     */
    public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider);
}
+7 −0
Original line number Diff line number Diff line
@@ -334,6 +334,13 @@ public class CollectionUtils {
        return isEmpty(cur) ? null : cur.get(0);
    }

    /**
     * @return the first element if not empty/null, null otherwise
     */
    public static @Nullable <T> T firstOrNull(@Nullable Collection<T> cur) {
        return isEmpty(cur) ? null : cur.iterator().next();
    }

    /**
     * @return list of single given element if it's not null, empty list otherwise
     */
+32 −28
Original line number Diff line number Diff line
@@ -131,8 +131,6 @@ import android.app.ResourcesManager;
import android.app.admin.IDevicePolicyManager;
import android.app.admin.SecurityLog;
import android.app.backup.IBackupManager;
import android.app.role.RoleManager;
import android.app.role.RoleManagerCallback;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -290,7 +288,6 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.os.Zygote;
import com.android.internal.telephony.CarrierAppUtils;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
@@ -372,10 +369,8 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@@ -989,6 +984,9 @@ public class PackageManagerService extends IPackageManager.Stub
    @GuardedBy("mPackages")
    private CheckPermissionDelegate mCheckPermissionDelegate;
    @GuardedBy("mPackages")
    private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider;
    private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> {
        private Context mContext;
        private ComponentName mIntentFilterVerifierComponent;
@@ -13581,31 +13579,25 @@ public class PackageManagerService extends IPackageManager.Stub
            mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
        }
        if (userId == UserHandle.USER_ALL) {
            return false;
        }
        RoleManager roleManager = mContext.getSystemService(RoleManager.class);
        UserHandle user = UserHandle.of(userId);
        RoleManagerCallback.Future future = new RoleManagerCallback.Future();
        if (packageName != null) {
            Binder.withCleanCallingIdentity(() -> roleManager.addRoleHolderAsUser(
                    RoleManager.ROLE_BROWSER, packageName, user, AsyncTask.THREAD_POOL_EXECUTOR,
                    future));
        } else {
            Binder.withCleanCallingIdentity(() -> roleManager.clearRoleHoldersAsUser(
                    RoleManager.ROLE_BROWSER, user, AsyncTask.THREAD_POOL_EXECUTOR, future));
        PackageManagerInternal.DefaultBrowserProvider provider;
        synchronized (mPackages) {
            provider = mDefaultBrowserProvider;
        }
        try {
            future.get(5, TimeUnit.SECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            Slog.e(TAG, "Exception while setting default browser package name: " + packageName, e);
        if (provider == null) {
            Slog.e(TAG, "mDefaultBrowserProvider is null");
            return false;
        }
        boolean successful = provider.setDefaultBrowser(packageName, userId);
        if (!successful) {
            return false;
        }
        synchronized (mPackages) {
        if (packageName != null) {
                mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(
                        packageName, userId);
            synchronized (mPackages) {
                mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
                        userId);
            }
        }
        return true;
@@ -13620,10 +13612,15 @@ public class PackageManagerService extends IPackageManager.Stub
        if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
            return null;
        }
        RoleManager roleManager = mContext.getSystemService(RoleManager.class);
        List<String> packageNames = Binder.withCleanCallingIdentity(() ->
                roleManager.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, UserHandle.of(userId)));
        return CollectionUtils.firstOrNull(packageNames);
        PackageManagerInternal.DefaultBrowserProvider provider;
        synchronized (mPackages) {
            provider = mDefaultBrowserProvider;
        }
        if (provider == null) {
            Slog.e(TAG, "mDefaultBrowserProvider is null");
            return null;
        }
        return provider.getDefaultBrowser(userId);
    }
    /**
@@ -23922,6 +23919,13 @@ public class PackageManagerService extends IPackageManager.Stub
                return mSettings.removeDefaultBrowserPackageNameLPw(userId);
            }
        }
        @Override
        public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) {
            synchronized (mPackages) {
                mDefaultBrowserProvider = provider;
            }
        }
    }
    @GuardedBy("mPackages")
+8 −7
Original line number Diff line number Diff line
@@ -17,22 +17,23 @@
package com.android.server.role;

import android.annotation.NonNull;
import android.os.UserHandle;
import android.annotation.UserIdInt;
import android.util.ArrayMap;
import android.util.ArraySet;

/**
 * Internal calls into {@link RoleManagerService}
 * Internal calls into {@link RoleManagerService}.
 */
public abstract class RoleManagerServiceInternal {
public abstract class RoleManagerInternal {

    /**
     * Get all roles and packages hold them.
     * Get all roles and their holders.
     *
     * @param user The user to query to roles for
     * @param userId The user to query to roles for
     *
     * @return The roles and their holders
     */
    @NonNull
    public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(
            @NonNull UserHandle user);
    public abstract ArrayMap<String, ArraySet<String>> getRolesAndHolders(
            @UserIdInt int userId);
}
+65 −53
Original line number Diff line number Diff line
@@ -146,8 +146,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
        mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
        mAppOpsManager = context.getSystemService(AppOpsManager.class);

        LocalServices.addService(RoleManagerServiceInternal.class,
                new RoleManagerServiceInternalImpl());
        LocalServices.addService(RoleManagerInternal.class, new Internal());

        PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
        packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider());

        registerUserRemovedReceiver();
    }
@@ -360,10 +363,10 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
            notifyRoleHoldersChangedForListeners(listeners, roleName, userId);
        }

        RemoteCallbackList<IOnRoleHoldersChangedListener> allUserListeners = getListeners(
        RemoteCallbackList<IOnRoleHoldersChangedListener> allUsersListeners = getListeners(
                UserHandle.USER_ALL);
        if (allUserListeners != null) {
            notifyRoleHoldersChangedForListeners(allUserListeners, roleName, userId);
        if (allUsersListeners != null) {
            notifyRoleHoldersChangedForListeners(allUsersListeners, roleName, userId);
        }
    }

@@ -386,19 +389,6 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
        }
    }

    /**
     * Get all roles and packages hold them.
     *
     * @param user The user to query to roles for
     *
     * @return The roles and their holders
     */
    @NonNull
    private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
        RoleUserState userState = getOrCreateUserState(user.getIdentifier());
        return userState.getRoleHolders();
    }

    private class Stub extends IRoleManager.Stub {

        @Override
@@ -406,8 +396,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
            Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty");

            int userId = UserHandle.getUserId(getCallingUid());
            RoleUserState userState = getOrCreateUserState(userId);
            return userState.isRoleAvailable(roleName);
            return getOrCreateUserState(userId).isRoleAvailable(roleName);
        }

        @Override
@@ -418,7 +407,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
            mAppOpsManager.checkPackage(callingUid, packageName);

            int userId = UserHandle.getUserId(callingUid);
            ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId);
            ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName);
            if (roleHolders == null) {
                return false;
            }
@@ -433,24 +422,17 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return Collections.emptyList();
            }
            userId = handleIncomingUser(userId, "getRoleHoldersAsUser", false);
            userId = handleIncomingUser(userId, false, "getRoleHoldersAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
                    "getRoleHoldersAsUser");

            ArraySet<String> roleHolders = getRoleHoldersInternal(roleName, userId);
            ArraySet<String> roleHolders = getOrCreateUserState(userId).getRoleHolders(roleName);
            if (roleHolders == null) {
                return Collections.emptyList();
            }
            return new ArrayList<>(roleHolders);
        }

        @Nullable
        private ArraySet<String> getRoleHoldersInternal(@NonNull String roleName,
                @UserIdInt int userId) {
            RoleUserState userState = getOrCreateUserState(userId);
            return userState.getRoleHolders(roleName);
        }

        @Override
        public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName,
                @UserIdInt int userId, @NonNull IRoleManagerCallback callback) {
@@ -461,7 +443,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return;
            }
            userId = handleIncomingUser(userId, "addRoleHolderAsUser", false);
            userId = handleIncomingUser(userId, false, "addRoleHolderAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
                    "addRoleHolderAsUser");

@@ -478,7 +460,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return;
            }
            userId = handleIncomingUser(userId, "removeRoleHolderAsUser", false);
            userId = handleIncomingUser(userId, false, "removeRoleHolderAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
                    "removeRoleHolderAsUser");

@@ -495,7 +477,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return;
            }
            userId = handleIncomingUser(userId, "clearRoleHoldersAsUser", false);
            userId = handleIncomingUser(userId, false, "clearRoleHoldersAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ROLE_HOLDERS,
                    "clearRoleHoldersAsUser");

@@ -510,8 +492,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return;
            }
            userId = handleIncomingUser(userId, "addOnRoleHoldersChangedListenerAsUser",
                    true);
            userId = handleIncomingUser(userId, true, "addOnRoleHoldersChangedListenerAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS,
                    "addOnRoleHoldersChangedListenerAsUser");

@@ -528,8 +509,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                Slog.e(LOG_TAG, "user " + userId + " does not exist");
                return;
            }
            userId = handleIncomingUser(userId, "removeOnRoleHoldersChangedListenerAsUser",
                    true);
            userId = handleIncomingUser(userId, true, "removeOnRoleHoldersChangedListenerAsUser");
            getContext().enforceCallingOrSelfPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS,
                    "removeOnRoleHoldersChangedListenerAsUser");

@@ -548,8 +528,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                    "setRoleNamesFromController");

            int userId = UserHandle.getCallingUserId();
            RoleUserState userState = getOrCreateUserState(userId);
            userState.setRoleNames(roleNames);
            getOrCreateUserState(userId).setRoleNames(roleNames);
        }

        @Override
@@ -562,8 +541,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                    "addRoleHolderFromController");

            int userId = UserHandle.getCallingUserId();
            RoleUserState userState = getOrCreateUserState(userId);
            return userState.addRoleHolder(roleName, packageName);
            return getOrCreateUserState(userId).addRoleHolder(roleName, packageName);
        }

        @Override
@@ -576,8 +554,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                    "removeRoleHolderFromController");

            int userId = UserHandle.getCallingUserId();
            RoleUserState userState = getOrCreateUserState(userId);
            return userState.removeRoleHolder(roleName, packageName);
            return getOrCreateUserState(userId).removeRoleHolder(roleName, packageName);
        }

        @Override
@@ -588,13 +565,12 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
                    "getRolesHeldFromController");

            int userId = UserHandle.getCallingUserId();
            RoleUserState userState = getOrCreateUserState(userId);
            return userState.getHeldRoles(packageName);
            return getOrCreateUserState(userId).getHeldRoles(packageName);
        }

        @CheckResult
        private int handleIncomingUser(@UserIdInt int userId, @NonNull String name,
                boolean allowAll) {
        private int handleIncomingUser(@UserIdInt int userId, boolean allowAll,
                @NonNull String name) {
            return ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
                    allowAll, true, name, null);
        }
@@ -694,15 +670,51 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
        }
    }

    /**
     * Entry point for internal calls into role manager
     */
    private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal {
    private class Internal extends RoleManagerInternal {

        @NonNull
        @Override
        public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) {
            return RoleManagerService.this.getRoleHoldersAsUser(user);
        public ArrayMap<String, ArraySet<String>> getRolesAndHolders(@UserIdInt int userId) {
            return getOrCreateUserState(userId).getRolesAndHolders();
        }
    }

    private class DefaultBrowserProvider implements PackageManagerInternal.DefaultBrowserProvider {

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

        @Override
        public boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId) {
            CompletableFuture<Void> future = new CompletableFuture<>();
            IRoleManagerCallback callback = new IRoleManagerCallback.Stub() {
                @Override
                public void onSuccess() {
                    future.complete(null);
                }
                @Override
                public void onFailure() {
                    future.completeExceptionally(new RuntimeException());
                }
            };
            if (packageName != null) {
                getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER,
                        packageName, callback);
            } else {
                getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER,
                        callback);
            }
            try {
                future.get(5, TimeUnit.SECONDS);
                return true;
            } catch (InterruptedException | ExecutionException | TimeoutException e) {
                Slog.e(LOG_TAG, "Exception while setting default browser: " + packageName, e);
                return false;
            }
        }
    }
}
Loading