Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bb68081 authored by JW Wang's avatar JW Wang
Browse files

Add rollback data policy (1/n)

1. Do the plumbing to pass the data policy all the way to
   SessionInfo.
2. SessionInfo#rollbackDataPolicy will be used by RollbackManager to
   determine whether to wipe user data when enabling/committing
   rollback.

Bug: 144683152
Test: atest RollbackStoreTest RollbackUnitTest AppDataRollbackHelperTest
Test: atest RollbackTest StagedRollbackTest

Change-Id: Ie1e5457d0304f9cf8fc34fce17d707be75407a2b
parent 195a4f72
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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<java.lang.String> 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();
+2 −0
Original line number Diff line number Diff line
@@ -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<java.lang.String> 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);
+52 −1
Original line number Diff line number Diff line
@@ -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.
         *
         * <p>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.
         *
         * <p>If the parent session is staged or has rollback enabled, all children sessions
         * must have the same properties.
         *
         * <p> 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<SessionParams>
@@ -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<SessionInfo>
+23 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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) {