diff --git a/api/system-current.txt b/api/system-current.txt index 77c40ea1b9c97..ce71533963a84 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2042,6 +2042,7 @@ package android.content.pm { method public boolean getInstallAsInstantApp(boolean); method public boolean getInstallAsVirtualPreload(); method public boolean getRequestDowngrade(); + method public int getRollbackDataPolicy(); method @NonNull public java.util.Set getWhitelistedRestrictedPermissions(); } @@ -2050,6 +2051,7 @@ package android.content.pm { method @Deprecated public void setAllowDowngrade(boolean); method public void setDontKillApp(boolean); method public void setEnableRollback(boolean); + method public void setEnableRollback(boolean, int); method @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[]); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setIncrementalParams(@NonNull android.content.pm.DataLoaderParams); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex(); diff --git a/api/test-current.txt b/api/test-current.txt index b020ee6b23c5f..503941c869396 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -778,11 +778,13 @@ package android.content.pm { } public static class PackageInstaller.SessionInfo implements android.os.Parcelable { + method public int getRollbackDataPolicy(); method @NonNull public java.util.Set getWhitelistedRestrictedPermissions(); } public static class PackageInstaller.SessionParams implements android.os.Parcelable { method public void setEnableRollback(boolean); + method public void setEnableRollback(boolean, int); method @RequiresPermission("android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS") public void setGrantedRuntimePermissions(String[]); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex(); method public void setInstallerPackageName(@Nullable String); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 1d07ec78ebc26..3d6d849bf03dc 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1465,6 +1465,8 @@ public class PackageInstaller { /** TODO(b/146080380): add a class name to make it fully compatible with ComponentName. * {@hide} */ public String dataLoaderPackageName; + /** {@hide} */ + public int rollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE; /** * Construct parameters for a new package install session. @@ -1505,6 +1507,7 @@ public class PackageInstaller { dataLoaderParamsParcel); } dataLoaderPackageName = source.readString(); + rollbackDataPolicy = source.readInt(); } /** {@hide} */ @@ -1530,6 +1533,7 @@ public class PackageInstaller { ret.requiredInstalledVersionCode = requiredInstalledVersionCode; ret.incrementalParams = incrementalParams; ret.dataLoaderPackageName = dataLoaderPackageName; + ret.rollbackDataPolicy = rollbackDataPolicy; return ret; } @@ -1686,12 +1690,14 @@ public class PackageInstaller { } /** - * Request that rollbacks be enabled or disabled for the given upgrade. + * Request that rollbacks be enabled or disabled for the given upgrade with rollback data + * policy set to RESTORE. * *

If the parent session is staged or has rollback enabled, all children sessions * must have the same properties. * * @param enable set to {@code true} to enable, {@code false} to disable + * @see SessionParams#setEnableRollback(boolean, int) * @hide */ @SystemApi @TestApi @@ -1701,8 +1707,35 @@ public class PackageInstaller { } else { installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; } + rollbackDataPolicy = PackageManager.RollbackDataPolicy.RESTORE; } + /** + * Request that rollbacks be enabled or disabled for the given upgrade. + * + *

If the parent session is staged or has rollback enabled, all children sessions + * must have the same properties. + * + *

For a multi-package install, this method must be called on each child session to + * specify rollback data policies explicitly. Note each child session is allowed to have + * different policies. + * + * @param enable set to {@code true} to enable, {@code false} to disable + * @param dataPolicy the rollback data policy for this session + * @hide + */ + @SystemApi @TestApi + public void setEnableRollback(boolean enable, + @PackageManager.RollbackDataPolicy int dataPolicy) { + if (enable) { + installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; + } else { + installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK; + } + rollbackDataPolicy = dataPolicy; + } + + /** * @deprecated use {@link #setRequestDowngrade(boolean)}. * {@hide} @@ -1906,6 +1939,7 @@ public class PackageInstaller { pw.printPair("isStaged", isStaged); pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode); pw.printPair("dataLoaderPackageName", dataLoaderPackageName); + pw.printPair("rollbackDataPolicy", rollbackDataPolicy); pw.println(); } @@ -1941,6 +1975,7 @@ public class PackageInstaller { dest.writeParcelable(null, flags); } dest.writeString(dataLoaderPackageName); + dest.writeInt(rollbackDataPolicy); } public static final Parcelable.Creator @@ -2077,6 +2112,9 @@ public class PackageInstaller { /** {@hide} */ public long updatedMillis; + /** {@hide} */ + public int rollbackDataPolicy; + /** {@hide} */ @UnsupportedAppUsage public SessionInfo() { @@ -2120,6 +2158,7 @@ public class PackageInstaller { mStagedSessionErrorCode = source.readInt(); mStagedSessionErrorMessage = source.readString(); isCommitted = source.readBoolean(); + rollbackDataPolicy = source.readInt(); } /** @@ -2436,6 +2475,17 @@ public class PackageInstaller { return isStaged; } + /** + * Return the data policy associated with the rollback for the given upgrade. + * + * @hide + */ + @SystemApi @TestApi + @PackageManager.RollbackDataPolicy + public int getRollbackDataPolicy() { + return rollbackDataPolicy; + } + /** * Returns {@code true} if this session is an active staged session. * @@ -2598,6 +2648,7 @@ public class PackageInstaller { dest.writeInt(mStagedSessionErrorCode); dest.writeString(mStagedSessionErrorMessage); dest.writeBoolean(isCommitted); + dest.writeInt(rollbackDataPolicy); } public static final Parcelable.Creator diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index ee27f4f8345f9..f792127bc0758 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -709,6 +709,29 @@ public abstract class PackageManager { */ public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = { + RollbackDataPolicy.RESTORE, + RollbackDataPolicy.WIPE, + RollbackDataPolicy.RETAIN + }) + public @interface RollbackDataPolicy { + /** + * User data will be backed up during install and restored during rollback. + */ + int RESTORE = 0; + /** + * User data won't be backed up during install but will be wiped out during rollback. + */ + int WIPE = 1; + /** + * User data won't be backed up during install and won't be restored during rollback. + * TODO: Not implemented yet. + */ + int RETAIN = 2; + } + /** @hide */ @IntDef(flag = true, prefix = { "INSTALL_" }, value = { INSTALL_REPLACE_EXISTING, diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 0acf7c8080a27..c12395e28e283 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -572,6 +572,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { info.installFlags = params.installFlags; info.isMultiPackage = params.isMultiPackage; info.isStaged = params.isStaged; + info.rollbackDataPolicy = params.rollbackDataPolicy; info.parentSessionId = mParentSessionId; info.childSessionIds = mChildSessionIds.copyKeys(); if (info.childSessionIds == null) {