summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Rhed Jao <rhedjao@google.com> 2022-12-15 03:17:08 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-12-15 03:17:08 +0000
commit42ea363e429314d051ce5e53d3ce62f66f61d2cb (patch)
tree010038e2ecb0a0a84f8828166f7bcc9bf51a57d7
parent3d43d701243f8bc99a2a6355541eaa318e3d7ce8 (diff)
parent1ad63a316796ef97a4f4a4a307a0d53da343c938 (diff)
Merge "Add an api to query the visibility list of target packages"
-rw-r--r--core/api/system-current.txt1
-rw-r--r--core/java/android/app/ApplicationPackageManager.java11
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--core/java/android/content/pm/PackageManager.java24
-rw-r--r--services/core/java/com/android/server/pm/Computer.java5
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java44
-rw-r--r--services/core/java/com/android/server/pm/IPackageManagerBase.java7
7 files changed, 72 insertions, 22 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 566ac4535b0d..aacb4024ff93 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3609,6 +3609,7 @@ package android.content.pm {
public abstract class PackageManager {
method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener);
method public abstract boolean arePermissionsIndividuallyControlled();
+ method @NonNull public boolean[] canPackageQuery(@NonNull String, @NonNull String[]) throws android.content.pm.PackageManager.NameNotFoundException;
method @NonNull public abstract java.util.List<android.content.IntentFilter> getAllIntentFilters(@NonNull String);
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, @NonNull android.content.pm.PackageManager.ApplicationInfoFlags, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException;
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 569f4dd8328c..4d3f9e457ae3 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -3816,8 +3816,17 @@ public class ApplicationPackageManager extends PackageManager {
@NonNull String targetPackageName) throws NameNotFoundException {
Objects.requireNonNull(sourcePackageName);
Objects.requireNonNull(targetPackageName);
+ return canPackageQuery(sourcePackageName, new String[]{targetPackageName})[0];
+ }
+
+ @Override
+ @NonNull
+ public boolean[] canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String[] targetPackageNames) throws NameNotFoundException {
+ Objects.requireNonNull(sourcePackageName);
+ Objects.requireNonNull(targetPackageNames);
try {
- return mPM.canPackageQuery(sourcePackageName, targetPackageName, getUserId());
+ return mPM.canPackageQuery(sourcePackageName, targetPackageNames, getUserId());
} catch (ParcelableException e) {
e.maybeRethrow(PackageManager.NameNotFoundException.class);
throw new RuntimeException(e);
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 35afe9f727db..81bea2e3573f 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -797,5 +797,5 @@ interface IPackageManager {
void setKeepUninstalledPackages(in List<String> packageList);
- boolean canPackageQuery(String sourcePackageName, String targetPackageName, int userId);
+ boolean[] canPackageQuery(String sourcePackageName, in String[] targetPackageNames, int userId);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index ec490d10d45e..8ae53100d4d5 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -10388,6 +10388,30 @@ public abstract class PackageManager {
}
/**
+ * Same as {@link #canPackageQuery(String, String)} but accepts an array of target packages to
+ * be queried.
+ *
+ * @param sourcePackageName The source package that would receive details about the
+ * target package.
+ * @param targetPackageNames An array of target packages whose details would be shared with the
+ * source package.
+ * @return An array of booleans where each member specifies whether the source package is able
+ * to query for details about the target package given by the corresponding value at the same
+ * index in the array of target packages.
+ * @throws NameNotFoundException if either a given package can not be found on the
+ * system, or if the caller is not able to query for details about the source or
+ * target packages.
+ * @hide
+ */
+ @SystemApi
+ @NonNull
+ public boolean[] canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String[] targetPackageNames) throws NameNotFoundException {
+ throw new UnsupportedOperationException(
+ "canPackageQuery not implemented in subclass");
+ }
+
+ /**
* Makes a package that provides an authority {@code visibleAuthority} become visible to the
* application {@code recipientUid}.
*
diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java
index 60621a0eaaef..ea8428351a81 100644
--- a/services/core/java/com/android/server/pm/Computer.java
+++ b/services/core/java/com/android/server/pm/Computer.java
@@ -570,8 +570,9 @@ public interface Computer extends PackageDataSnapshot {
@PackageManager.InstallReason
int getInstallReason(@NonNull String packageName, @UserIdInt int userId);
- boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName,
- @UserIdInt int userId);
+ @NonNull
+ boolean[] canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String[] targetPackageNames, @UserIdInt int userId);
boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
@UserIdInt int sourceUserId, @UserIdInt int targetUserId);
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index b8fba51c4d60..06aadd92dd51 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -159,6 +159,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -5337,29 +5338,42 @@ public class ComputerEngine implements Computer {
}
@Override
- public boolean canPackageQuery(@NonNull String sourcePackageName,
- @NonNull String targetPackageName, @UserIdInt int userId) {
- if (!mUserManager.exists(userId)) return false;
+ @NonNull
+ public boolean[] canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String[] targetPackageNames, @UserIdInt int userId) {
+ final int targetSize = targetPackageNames.length;
+ final boolean[] results = new boolean[targetSize];
+ if (!mUserManager.exists(userId)) {
+ return results;
+ }
final int callingUid = Binder.getCallingUid();
enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
- false /*checkShell*/, "may package query");
+ false /*checkShell*/, "can package query");
+
final PackageStateInternal sourceSetting = getPackageStateInternal(sourcePackageName);
- final PackageStateInternal targetSetting = getPackageStateInternal(targetPackageName);
- boolean throwException = sourceSetting == null || targetSetting == null;
- if (!throwException) {
- final boolean filterSource =
- shouldFilterApplicationIncludingUninstalled(sourceSetting, callingUid, userId);
- final boolean filterTarget =
- shouldFilterApplicationIncludingUninstalled(targetSetting, callingUid, userId);
- // The caller must have visibility of the both packages
- throwException = filterSource || filterTarget;
+ final PackageStateInternal[] targetSettings = new PackageStateInternal[targetSize];
+ // Throw exception if the caller without the visibility of source package
+ boolean throwException =
+ (sourceSetting == null || shouldFilterApplicationIncludingUninstalled(
+ sourceSetting, callingUid, userId));
+ for (int i = 0; !throwException && i < targetSize; i++) {
+ targetSettings[i] = getPackageStateInternal(targetPackageNames[i]);
+ // Throw exception if the caller without the visibility of target package
+ throwException =
+ (targetSettings[i] == null || shouldFilterApplicationIncludingUninstalled(
+ targetSettings[i], callingUid, userId));
}
if (throwException) {
throw new ParcelableException(new PackageManager.NameNotFoundException("Package(s) "
- + sourcePackageName + " and/or " + targetPackageName + " not found."));
+ + sourcePackageName + " and/or " + Arrays.toString(targetPackageNames)
+ + " not found."));
}
+
final int sourcePackageUid = UserHandle.getUid(userId, sourceSetting.getAppId());
- return !shouldFilterApplication(targetSetting, sourcePackageUid, userId);
+ for (int i = 0; i < targetSize; i++) {
+ results[i] = !shouldFilterApplication(targetSettings[i], sourcePackageUid, userId);
+ }
+ return results;
}
/*
diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java
index 5c3890c192dd..38efc104bdf9 100644
--- a/services/core/java/com/android/server/pm/IPackageManagerBase.java
+++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java
@@ -1153,9 +1153,10 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub {
@Override
@Deprecated
- public final boolean canPackageQuery(@NonNull String sourcePackageName,
- @NonNull String targetPackageName, @UserIdInt int userId) {
- return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId);
+ @NonNull
+ public final boolean[] canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String[] targetPackageNames, @UserIdInt int userId) {
+ return snapshot().canPackageQuery(sourcePackageName, targetPackageNames, userId);
}
@Override