diff options
| author | 2019-01-23 15:16:10 +0000 | |
|---|---|---|
| committer | 2019-01-25 10:19:38 +0000 | |
| commit | 150ad9865e8a92f36d27e4bf9bbd1a6404e2a909 (patch) | |
| tree | 5fdbffc5a187bf114ad2dd5ccf2dd12b5e5cae98 | |
| parent | 0a79b323320d09dd0d4478283e5d999da728b168 (diff) | |
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
4 files changed, 39 insertions, 50 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 1c63aa35ea9f..8b67deb4877d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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(); diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl index 420bcb69e0c4..63d75a097d24 100644 --- a/core/java/android/content/rollback/IRollbackManager.aidl +++ b/core/java/android/content/rollback/IRollbackManager.aidl @@ -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, diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java index c1c0bc1d3e07..564839b46896 100644 --- a/core/java/android/content/rollback/RollbackManager.java +++ b/core/java/android/content/rollback/RollbackManager.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.IntentSender; import android.os.RemoteException; +import java.util.ArrayList; import java.util.List; /** @@ -50,6 +51,21 @@ public final class RollbackManager { } /** + * 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. * <p> @@ -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; } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 815fca31095b..7d2f2ab95de3 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -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 |