diff options
3 files changed, 19 insertions, 9 deletions
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 5f5327da412f..f101e7364c31 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -375,10 +375,15 @@ public abstract class PackageManagerInternal { int deviceOwnerUserId, String deviceOwner, SparseArray<String> profileOwners); /** - * Marks packages as protected for a given user or all users in case of USER_ALL. + * Marks packages as protected for a given user or all users in case of USER_ALL. Setting + * {@code packageNames} to {@code null} means unset all existing protected packages for the + * given user. + * + * <p> Note that setting it if set for a specific user, it takes precedence over the packages + * set globally using USER_ALL. */ public abstract void setOwnerProtectedPackages( - @UserIdInt int userId, @NonNull List<String> packageNames); + @UserIdInt int userId, @Nullable List<String> packageNames); /** * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}. diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java index cc9c1e0ac179..fb47c8aabbf3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -354,7 +354,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Override @Deprecated public final void setOwnerProtectedPackages( - @UserIdInt int userId, @NonNull List<String> packageNames) { + @UserIdInt int userId, @Nullable List<String> packageNames) { getProtectedPackages().setOwnerProtectedPackages(userId, packageNames); } diff --git a/services/core/java/com/android/server/pm/ProtectedPackages.java b/services/core/java/com/android/server/pm/ProtectedPackages.java index e9239889973a..98533725371f 100644 --- a/services/core/java/com/android/server/pm/ProtectedPackages.java +++ b/services/core/java/com/android/server/pm/ProtectedPackages.java @@ -16,7 +16,6 @@ package com.android.server.pm; -import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.Context; @@ -81,8 +80,8 @@ public class ProtectedPackages { /** Sets packages protected by a device or profile owner. */ public synchronized void setOwnerProtectedPackages( - @UserIdInt int userId, @NonNull List<String> packageNames) { - if (packageNames.isEmpty()) { + @UserIdInt int userId, @Nullable List<String> packageNames) { + if (packageNames == null) { mOwnerProtectedPackages.remove(userId); } else { mOwnerProtectedPackages.put(userId, new ArraySet<>(packageNames)); @@ -134,15 +133,21 @@ public class ProtectedPackages { */ private synchronized boolean isOwnerProtectedPackage( @UserIdInt int userId, String packageName) { - return isPackageProtectedForUser(UserHandle.USER_ALL, packageName) - || isPackageProtectedForUser(userId, packageName); + return hasProtectedPackages(userId) + ? isPackageProtectedForUser(userId, packageName) + : isPackageProtectedForUser(UserHandle.USER_ALL, packageName); } - private synchronized boolean isPackageProtectedForUser(int userId, String packageName) { + private synchronized boolean isPackageProtectedForUser( + @UserIdInt int userId, String packageName) { int userIdx = mOwnerProtectedPackages.indexOfKey(userId); return userIdx >= 0 && mOwnerProtectedPackages.valueAt(userIdx).contains(packageName); } + private synchronized boolean hasProtectedPackages(@UserIdInt int userId) { + return mOwnerProtectedPackages.indexOfKey(userId) >= 0; + } + /** * Returns {@code true} if a given package's state is protected. Otherwise, returns * {@code false}. |