summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jakob Schneider <jakobschneider@google.com> 2023-10-23 17:03:14 +0100
committer Jakob Schneider <jakobschneider@google.com> 2023-10-24 17:16:24 +0000
commit468fa75695c92666399c593fb6028622f963d88e (patch)
tree988b3b6367f0a0f0ccb9b274e1d76ddd45825c4d
parent667a3785c408990cd9d32755b01007026826192b (diff)
Fix getInstalledApplications for archived apps.
Test: PackageInstallerArchiveTest Bug: 290776158 Change-Id: I86610eab699d993b104512cc830f71967adf2311
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java8
1 files changed, 7 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 30017be96085..980cada46119 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -4596,6 +4596,7 @@ public class ComputerEngine implements Computer {
flags = updateFlagsForApplication(flags, userId);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
final boolean listApex = (flags & MATCH_APEX) != 0;
+ final boolean listArchivedOnly = !listUninstalled && (flags & MATCH_ARCHIVED_PACKAGES) != 0;
enforceCrossUserPermission(
callingUid,
@@ -4607,7 +4608,7 @@ public class ComputerEngine implements Computer {
ArrayList<ApplicationInfo> list;
final ArrayMap<String, ? extends PackageStateInternal> packageStates =
getPackageStates();
- if (listUninstalled) {
+ if (listUninstalled || listArchivedOnly) {
list = new ArrayList<>(packageStates.size());
for (PackageStateInternal ps : packageStates.values()) {
ApplicationInfo ai;
@@ -4619,6 +4620,11 @@ public class ComputerEngine implements Computer {
if (!listApex && ps.getPkg().isApex()) {
continue;
}
+ PackageUserStateInternal userState = ps.getUserStateOrDefault(userId);
+ if (listArchivedOnly && !userState.isInstalled()
+ && userState.getArchiveState() == null) {
+ continue;
+ }
if (filterSharedLibPackage(ps, callingUid, userId, flags)) {
continue;
}