summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Richard Uhler <ruhler@google.com> 2019-01-23 15:16:10 +0000
committer Richard Uhler <ruhler@google.com> 2019-01-25 10:19:38 +0000
commit150ad9865e8a92f36d27e4bf9bbd1a6404e2a909 (patch)
tree5fdbffc5a187bf114ad2dd5ccf2dd12b5e5cae98
parent0a79b323320d09dd0d4478283e5d999da728b168 (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
-rw-r--r--api/system-current.txt1
-rw-r--r--core/java/android/content/rollback/IRollbackManager.aidl6
-rw-r--r--core/java/android/content/rollback/RollbackManager.java41
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java41
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