Merge "Mark archived package as not installed." into main
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index e5c4ccc..b2d4a2c 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -1500,15 +1500,14 @@
state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), installedPermissions,
grantedPermissions, state, userId, ps);
- if (packageInfo == null) {
- return null;
+ if (packageInfo != null) {
+ packageInfo.packageName = packageInfo.applicationInfo.packageName =
+ resolveExternalPackageName(p);
+ return packageInfo;
}
-
- packageInfo.packageName = packageInfo.applicationInfo.packageName =
- resolveExternalPackageName(p);
-
- return packageInfo;
- } else if ((flags & (MATCH_UNINSTALLED_PACKAGES | MATCH_ARCHIVED_PACKAGES)) != 0
+ }
+ // TODO(b/314808978): Set ps.setPkg to null during install-archived.
+ if ((flags & (MATCH_UNINSTALLED_PACKAGES | MATCH_ARCHIVED_PACKAGES)) != 0
&& PackageUserStateUtils.isAvailable(state, flags)) {
PackageInfo pi = new PackageInfo();
pi.packageName = ps.getPackageName();
@@ -1540,9 +1539,8 @@
+ ps.getPackageName() + "]. Provides a minimum info.");
}
return pi;
- } else {
- return null;
}
+ return null;
}
public final PackageInfo getPackageInfo(String packageName,
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 1a65297..3e7c8c4 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -2158,7 +2158,11 @@
}
}
if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
- mPm.createArchiveStateIfNeeded(ps,
+ // If this is an archival installation then we'll initialize the archive status,
+ // while also marking package as not installed.
+ // Doing this at the very end of the install as we are using ps.getInstalled
+ // to figure out which users were changed.
+ mPm.markPackageAsArchivedIfNeeded(ps,
installRequest.getArchivedPackage(),
installRequest.getNewUsers());
mPm.updateSequenceNumberLP(ps, installRequest.getNewUsers());
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5daada9..c0c98de 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -1518,8 +1518,8 @@
return archPkg;
}
- void createArchiveStateIfNeeded(PackageSetting pkgSetting, ArchivedPackageParcel archivePackage,
- int[] userIds) {
+ void markPackageAsArchivedIfNeeded(PackageSetting pkgSetting,
+ ArchivedPackageParcel archivePackage, int[] userIds) {
if (pkgSetting == null || archivePackage == null
|| archivePackage.archivedActivities == null || userIds == null
|| userIds.length == 0) {
@@ -1541,6 +1541,7 @@
}
pkgSetting
.modifyUserState(userId)
+ .setInstalled(false)
.setArchiveState(archiveState);
}
}
diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java
index fe80f74..4b3992e 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java
@@ -93,8 +93,8 @@
* this object exists means that the package must be installed or has data on at least one user;
* <li> If it is not installed but still has data (i.e., it was previously uninstalled with
* {@link PackageManager#DELETE_KEEP_DATA}), return true if the caller requested
- * {@link PackageManager#MATCH_UNINSTALLED_PACKAGES} or
- * {@link PackageManager#MATCH_ARCHIVED_PACKAGES};
+ * {@link PackageManager#MATCH_UNINSTALLED_PACKAGES}.
+ * Always available for {@link PackageManager#MATCH_ARCHIVED_PACKAGES}.
* </ul><p>
*/
public static boolean isAvailable(@NonNull PackageUserState state, long flags) {
@@ -109,11 +109,19 @@
if (state.isInstalled()) {
if (!state.isHidden()) {
return true;
- } else return matchDataExists;
- } else {
- // not installed
- return matchDataExists && state.dataExists();
+ } else {
+ return matchDataExists;
+ }
}
+
+ // not installed
+ if (matchUninstalled) {
+ return state.dataExists();
+ }
+
+ // archived or installed as archived
+ // TODO(b/314808978): Create data folders during install-archived.
+ return matchArchived;
}
public static boolean reportIfDebug(boolean result, long flags) {