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

Commit 4b1cde57 authored by Sanal Buvaev's avatar Sanal Buvaev
Browse files

Enable rollback lifetime API changes during install

Test: CTS and manual test
Bug: 288288803
Change-Id: Ia244caab1284d3468cbe75d3c6741f88a165f043
parent bce1ce8a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3872,6 +3872,7 @@ package android.content.pm {
    method public void setInstallAsInstantApp(boolean);
    method public void setInstallAsVirtualPreload();
    method public void setRequestDowngrade(boolean);
    method @FlaggedApi("android.content.pm.rollback_lifetime") @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void setRollbackLifetimeMillis(long);
    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged();
  }
+38 −6
Original line number Diff line number Diff line
@@ -2535,6 +2535,8 @@ public class PackageInstaller {
        public DataLoaderParams dataLoaderParams;
        /** {@hide} */
        public int rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE;
        /** @hide */
        public long rollbackLifetimeMillis = 0;
        /** {@hide} */
        public boolean forceQueryableOverride;
        /** {@hide} */
@@ -2589,6 +2591,7 @@ public class PackageInstaller {
                dataLoaderParams = new DataLoaderParams(dataLoaderParamsParcel);
            }
            rollbackDataPolicy = source.readInt();
            rollbackLifetimeMillis = source.readLong();
            requireUserAction = source.readInt();
            packageSource = source.readInt();
            applicationEnabledSettingPersistent = source.readBoolean();
@@ -2621,6 +2624,7 @@ public class PackageInstaller {
            ret.requiredInstalledVersionCode = requiredInstalledVersionCode;
            ret.dataLoaderParams = dataLoaderParams;
            ret.rollbackDataPolicy = rollbackDataPolicy;
            ret.rollbackLifetimeMillis = rollbackLifetimeMillis;
            ret.requireUserAction = requireUserAction;
            ret.packageSource = packageSource;
            ret.applicationEnabledSettingPersistent = applicationEnabledSettingPersistent;
@@ -2902,12 +2906,7 @@ public class PackageInstaller {
         */
        @SystemApi
        public void setEnableRollback(boolean enable) {
            if (enable) {
                installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK;
            } else {
                installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
            }
            rollbackDataPolicy = PackageManager.ROLLBACK_DATA_POLICY_RESTORE;
            setEnableRollback(enable, PackageManager.ROLLBACK_DATA_POLICY_RESTORE);
        }

        /**
@@ -2931,10 +2930,36 @@ public class PackageInstaller {
                installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK;
            } else {
                installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
                rollbackLifetimeMillis = 0;
            }
            rollbackDataPolicy = dataPolicy;
        }

        /**
         * If rollback enabled for this session (via {@link #setEnableRollback}, set time
         * after which rollback will no longer be possible
         *
         * <p>For multi-package installs, this value must be set on the parent session.
         * Child session rollback lifetime will be ignored.
         *
         * @param lifetimeMillis time after which rollback expires
         * @throws IllegalArgumentException if lifetimeMillis is negative or rollback is not
         * enabled via setEnableRollback.
         * @hide
         */
        @SystemApi
        @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
        @FlaggedApi(Flags.FLAG_ROLLBACK_LIFETIME)
        public void setRollbackLifetimeMillis(@DurationMillisLong long lifetimeMillis) {
            if (lifetimeMillis < 0) {
                throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative.");
            }
            if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) {
                throw new IllegalArgumentException(
                        "Can't set rollbackLifetimeMillis when rollback is not enabled");
            }
            rollbackLifetimeMillis = lifetimeMillis;
        }

        /**
         * @deprecated use {@link #setRequestDowngrade(boolean)}.
@@ -3295,6 +3320,7 @@ public class PackageInstaller {
            pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode);
            pw.printPair("dataLoaderParams", dataLoaderParams);
            pw.printPair("rollbackDataPolicy", rollbackDataPolicy);
            pw.printPair("rollbackLifetimeMillis", rollbackLifetimeMillis);
            pw.printPair("applicationEnabledSettingPersistent",
                    applicationEnabledSettingPersistent);
            pw.printHexPair("developmentInstallFlags", developmentInstallFlags);
@@ -3336,6 +3362,7 @@ public class PackageInstaller {
                dest.writeParcelable(null, flags);
            }
            dest.writeInt(rollbackDataPolicy);
            dest.writeLong(rollbackLifetimeMillis);
            dest.writeInt(requireUserAction);
            dest.writeInt(packageSource);
            dest.writeBoolean(applicationEnabledSettingPersistent);
@@ -3529,6 +3556,9 @@ public class PackageInstaller {
        /** {@hide} */
        public int rollbackDataPolicy;

        /** @hide */
        public long rollbackLifetimeMillis;

        /** {@hide} */
        public int requireUserAction;

@@ -3596,6 +3626,7 @@ public class PackageInstaller {
            isCommitted = source.readBoolean();
            isPreapprovalRequested = source.readBoolean();
            rollbackDataPolicy = source.readInt();
            rollbackLifetimeMillis = source.readLong();
            createdMillis = source.readLong();
            requireUserAction = source.readInt();
            installerUid = source.readInt();
@@ -4220,6 +4251,7 @@ public class PackageInstaller {
            dest.writeBoolean(isCommitted);
            dest.writeBoolean(isPreapprovalRequested);
            dest.writeInt(rollbackDataPolicy);
            dest.writeLong(rollbackLifetimeMillis);
            dest.writeLong(createdMillis);
            dest.writeInt(requireUserAction);
            dest.writeInt(installerUid);
+8 −0
Original line number Diff line number Diff line
@@ -58,3 +58,11 @@ flag {
    bug: "295827951"
    is_fixed_read_only: true
}

flag {
    name: "rollback_lifetime"
    namespace: "package_manager_service"
    description: "Feature flag to enable custom rollback lifetime during install."
    bug: "299670324"
    is_fixed_read_only: true
}
 No newline at end of file
+17 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.content.pm.ApplicationInfo;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.Flags;
import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageInstallerCallback;
import android.content.pm.IPackageInstallerSession;
@@ -745,6 +746,22 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
            params.installFlags &= ~PackageManager.INSTALL_DISABLE_VERIFICATION;
        }

        if (Flags.rollbackLifetime()) {
            if (params.rollbackLifetimeMillis > 0) {
                if ((params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) {
                    throw new IllegalArgumentException(
                            "Can't set rollbackLifetimeMillis when rollback is not enabled");
                }
                if (mContext.checkCallingOrSelfPermission(Manifest.permission.MANAGE_ROLLBACKS)
                        != PackageManager.PERMISSION_GRANTED) {
                    throw new SecurityException(
                            "Setting rollback lifetime requires the MANAGE_ROLLBACKS permission");
                }
            } else if (params.rollbackLifetimeMillis < 0) {
                throw new IllegalArgumentException("rollbackLifetimeMillis can't be negative.");
            }
        }

        boolean isApex = (params.installFlags & PackageManager.INSTALL_APEX) != 0;
        if (isApex) {
            if (mContext.checkCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGE_UPDATES)
+1 −0
Original line number Diff line number Diff line
@@ -1282,6 +1282,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            info.whitelistedRestrictedPermissions = params.whitelistedRestrictedPermissions;
            info.autoRevokePermissionsMode = params.autoRevokePermissionsMode;
            info.installFlags = params.installFlags;
            info.rollbackLifetimeMillis = params.rollbackLifetimeMillis;
            info.isMultiPackage = params.isMultiPackage;
            info.isStaged = params.isStaged;
            info.rollbackDataPolicy = params.rollbackDataPolicy;
Loading