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

Commit 150ad986 authored by Richard Uhler's avatar Richard Uhler
Browse files

Add RollbackManager.getAvailableRollbacks API.

To replace getAvailableRollback and getPackagesWithAvailableRollbacks,
which will be removed in a subsequent CL.

Bug: 112431924
Test: atest RollbackTest
Change-Id: I67adeb41df974aa5b375f16becdad5910ccc9c76
parent 0a79b323
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1705,6 +1705,7 @@ package android.content.rollback {
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void executeRollback(@NonNull android.content.rollback.RollbackInfo, @NonNull android.content.IntentSender);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @Nullable public android.content.rollback.RollbackInfo getAvailableRollback(@NonNull String);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @NonNull public java.util.List<java.lang.String> getPackagesWithAvailableRollbacks();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getRecentlyExecutedRollbacks();
    method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void reloadPersistedData();
+1 −5
Original line number Diff line number Diff line
@@ -17,17 +17,13 @@
package android.content.rollback;

import android.content.pm.ParceledListSlice;
import android.content.pm.StringParceledListSlice;
import android.content.rollback.RollbackInfo;
import android.content.IntentSender;

/** {@hide} */
interface IRollbackManager {

    RollbackInfo getAvailableRollback(String packageName);

    StringParceledListSlice getPackagesWithAvailableRollbacks();

    ParceledListSlice getAvailableRollbacks();
    ParceledListSlice getRecentlyExecutedRollbacks();

    void executeRollback(in RollbackInfo rollback, String callerPackageName,
+32 −9
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.IntentSender;
import android.os.RemoteException;

import java.util.ArrayList;
import java.util.List;

/**
@@ -49,6 +50,21 @@ public final class RollbackManager {
        mBinder = binder;
    }

    /**
     * Returns a list of all currently available rollbacks.
     *
     * @throws SecurityException if the caller does not have the
     *            MANAGE_ROLLBACKS permission.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
    public List<RollbackInfo> getAvailableRollbacks() {
        try {
            return mBinder.getAvailableRollbacks().getList();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Returns the rollback currently available to be executed for the given
     * package.
@@ -57,7 +73,7 @@ public final class RollbackManager {
     * including package version codes before and after rollback. The rollback
     * can be initiated using {@link #executeRollback(RollbackInfo,IntentSender)}.
     * <p>
     * TODO: What if there is no package installed on device for packageName?
     * TODO: remove this API in favor of getAvailableRollbacks.
     *
     * @param packageName name of the package to get the availble RollbackInfo for.
     * @return the rollback available for the package, or null if no rollback
@@ -67,17 +83,22 @@ public final class RollbackManager {
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
    public @Nullable RollbackInfo getAvailableRollback(@NonNull String packageName) {
        try {
            return mBinder.getAvailableRollback(packageName);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        for (RollbackInfo rollback : getAvailableRollbacks()) {
            for (PackageRollbackInfo info : rollback.getPackages()) {
                if (packageName.equals(info.getPackageName())) {
                    return rollback;
                }
            }
        }
        return null;
    }

    /**
     * Gets the names of packages that are available for rollback.
     * Call {@link #getAvailableRollback(String)} to get more information
     * about the rollback available for a particular package.
     * <p>
     * TODO: remove this API in favor of getAvailableRollbacks.
     *
     * @return the names of packages that are available for rollback.
     * @throws SecurityException if the caller does not have the
@@ -85,11 +106,13 @@ public final class RollbackManager {
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
    public @NonNull List<String> getPackagesWithAvailableRollbacks() {
        try {
            return mBinder.getPackagesWithAvailableRollbacks().getList();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        List<String> packages = new ArrayList<>();
        for (RollbackInfo rollbacks : getAvailableRollbacks()) {
            for (PackageRollbackInfo info : rollbacks.getPackages()) {
                packages.add(info.getPackageName());
            }
        }
        return packages;
    }


+5 −36
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageParser;
import android.content.pm.ParceledListSlice;
import android.content.pm.StringParceledListSlice;
import android.content.pm.VersionedPackage;
import android.content.rollback.IRollbackManager;
import android.content.rollback.PackageRollbackInfo;
@@ -56,12 +55,10 @@ import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

/**
 * Implementation of service that manages APK level rollbacks.
@@ -200,48 +197,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
    }

    @Override
    public RollbackInfo getAvailableRollback(String packageName) {
    public ParceledListSlice getAvailableRollbacks() {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.MANAGE_ROLLBACKS,
                "getAvailableRollback");
                "getAvailableRollbacks");

        RollbackData data = getRollbackForPackage(packageName);
        if (data == null) {
            return null;
        }

        // Note: The rollback for the package ought to be for the currently
        // installed version, otherwise the rollback data is out of date. In
        // that rare case, we'll check when we execute the rollback whether
        // it's out of date or not, so no need to check package versions here.

        for (PackageRollbackInfo info : data.packages) {
            if (info.getPackageName().equals(packageName)) {
                // TODO: Once the RollbackInfo API supports info about
                // dependant packages, add that info here.
                return new RollbackInfo(data.rollbackId, data.packages);
            }
        }
        return null;
    }

    @Override
    public StringParceledListSlice getPackagesWithAvailableRollbacks() {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.MANAGE_ROLLBACKS,
                "getPackagesWithAvailableRollbacks");

        final Set<String> packageNames = new HashSet<>();
        synchronized (mLock) {
            ensureRollbackDataLoadedLocked();
            List<RollbackInfo> rollbacks = new ArrayList<>();
            for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
                RollbackData data = mAvailableRollbacks.get(i);
                for (PackageRollbackInfo info : data.packages) {
                    packageNames.add(info.getPackageName());
                }
                rollbacks.add(new RollbackInfo(data.rollbackId, data.packages));
            }
            return new ParceledListSlice<>(rollbacks);
        }
        return new StringParceledListSlice(new ArrayList<>(packageNames));
    }

    @Override