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

Commit 42ef4d2a authored by Sanal Buvaev's avatar Sanal Buvaev Committed by Harshit Mahajan
Browse files

Enable rollback lifetime API changes during install

Original patch:
 From 4b1cde57 Mon Sep 17 00:00:00 2001
From: Sanal Buvaev <buvaev@google.com>
Date: Mon, 25 Sep 2023 08:12:43 +0000
Subject: [PATCH] Enable rollback lifetime API changes during install


Test: CTS and manual test
Bug: 288288803
Merged-In: Ia244caab1284d3468cbe75d3c6741f88a165f043
Change-Id: Ia244caab1284d3468cbe75d3c6741f88a165f043
parent d808fab4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3860,6 +3860,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();
  }
+39 −6
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.DurationMillisLong;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -2370,6 +2371,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} */
@@ -2424,6 +2427,7 @@ public class PackageInstaller {
                dataLoaderParams = new DataLoaderParams(dataLoaderParamsParcel);
            }
            rollbackDataPolicy = source.readInt();
            rollbackLifetimeMillis = source.readLong();
            requireUserAction = source.readInt();
            packageSource = source.readInt();
            applicationEnabledSettingPersistent = source.readBoolean();
@@ -2456,6 +2460,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;
@@ -2737,12 +2742,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);
        }

        /**
@@ -2766,10 +2766,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)}.
@@ -3124,6 +3150,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);
@@ -3165,6 +3192,7 @@ public class PackageInstaller {
                dest.writeParcelable(null, flags);
            }
            dest.writeInt(rollbackDataPolicy);
            dest.writeLong(rollbackLifetimeMillis);
            dest.writeInt(requireUserAction);
            dest.writeInt(packageSource);
            dest.writeBoolean(applicationEnabledSettingPersistent);
@@ -3358,6 +3386,9 @@ public class PackageInstaller {
        /** {@hide} */
        public int rollbackDataPolicy;

        /** @hide */
        public long rollbackLifetimeMillis;

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

@@ -3425,6 +3456,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();
@@ -4048,6 +4080,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
@@ -6,3 +6,11 @@ flag {
    description: "Feature flag to enable the features that rely on new ART Service APIs that are in the VIC version of the ART module."
    bug: "304741685"
}

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
}
+17 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.content.pm.ApplicationInfo;
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
@@ -1206,6 +1206,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