summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/system-current.txt6
-rw-r--r--core/java/android/content/rollback/RollbackManager.java50
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java35
-rw-r--r--tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java8
4 files changed, 81 insertions, 18 deletions
diff --git a/api/system-current.txt b/api/system-current.txt
index 90191b603718..da3b7f4239ed 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1713,6 +1713,12 @@ package android.content.rollback {
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<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void reloadPersistedData();
+ field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
+ field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE";
+ field public static final int STATUS_FAILURE = 1; // 0x1
+ field public static final int STATUS_FAILURE_INSTALL = 3; // 0x3
+ field public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2; // 0x2
+ field public static final int STATUS_SUCCESS = 0; // 0x0
}
}
diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java
index 7795df5e4249..2788f821e9f5 100644
--- a/core/java/android/content/rollback/RollbackManager.java
+++ b/core/java/android/content/rollback/RollbackManager.java
@@ -93,6 +93,50 @@ public final class RollbackManager {
}
/**
+ * Status of a rollback commit. Will be one of
+ * {@link #STATUS_SUCCESS}, {@link #STATUS_FAILURE},
+ * {@link #STATUS_FAILURE_ROLLBACK_UNAVAILABLE}, {@link #STATUS_FAILURE_INSTALL}
+ *
+ * @see Intent#getIntExtra(String, int)
+ */
+ public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS";
+
+ /**
+ * Detailed string representation of the status, including raw details that
+ * are useful for debugging.
+ *
+ * @see Intent#getStringExtra(String)
+ */
+ public static final String EXTRA_STATUS_MESSAGE =
+ "android.content.rollback.extra.STATUS_MESSAGE";
+
+ /**
+ * The rollback was successfully committed.
+ */
+ public static final int STATUS_SUCCESS = 0;
+
+ /**
+ * The rollback could not be committed due to some generic failure.
+ *
+ * @see #EXTRA_STATUS_MESSAGE
+ */
+ public static final int STATUS_FAILURE = 1;
+
+ /**
+ * The rollback could not be committed because it was no longer available.
+ *
+ * @see #EXTRA_STATUS_MESSAGE
+ */
+ public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2;
+
+ /**
+ * The rollback failed to install successfully.
+ *
+ * @see #EXTRA_STATUS_MESSAGE
+ */
+ public static final int STATUS_FAILURE_INSTALL = 3;
+
+ /**
* Commit the rollback with given id, rolling back all versions of the
* packages to the last good versions previously installed on the device
* as specified in the corresponding RollbackInfo object. The
@@ -101,13 +145,13 @@ public final class RollbackManager {
* rollback object, which can happen if a package has been updated or a
* rollback expired since the rollback object was retrieved from
* {@link #getAvailableRollbacks()}.
- * <p>
- * TODO: Specify the returns status codes.
*
* @param rollbackId ID of the rollback to commit
* @param causePackages package versions to record as the motivation for this
* rollback.
- * @param statusReceiver where to deliver the results
+ * @param statusReceiver where to deliver the results. Intents sent to
+ * this receiver contain {@link #EXTRA_STATUS}
+ * and {@link #EXTRA_STATUS_MESSAGE}.
* @throws SecurityException if the caller does not have the
* MANAGE_ROLLBACKS permission.
*/
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 14d74428d3e1..289618eb133c 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -32,6 +32,7 @@ import android.content.pm.VersionedPackage;
import android.content.rollback.IRollbackManager;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.RollbackInfo;
+import android.content.rollback.RollbackManager;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -255,12 +256,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
RollbackData data = getRollbackForId(rollbackId);
if (data == null) {
- sendFailure(statusReceiver, "Rollback unavailable");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+ "Rollback unavailable");
return;
}
if (data.inProgress) {
- sendFailure(statusReceiver, "Rollback for package is already in progress.");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+ "Rollback for package is already in progress.");
return;
}
@@ -276,13 +279,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName());
if (installedVersion == null) {
// TODO: Test this case
- sendFailure(statusReceiver, "Package to roll back is not installed");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+ "Package to roll back is not installed");
return;
}
if (!packageVersionsEqual(info.getVersionRolledBackFrom(), installedVersion)) {
// TODO: Test this case
- sendFailure(statusReceiver, "Package version to roll back not installed.");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE,
+ "Package version to roll back not installed.");
return;
}
}
@@ -293,7 +298,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
try {
context = mContext.createPackageContext(callerPackageName, 0);
} catch (PackageManager.NameNotFoundException e) {
- sendFailure(statusReceiver, "Invalid callerPackageName");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+ "Invalid callerPackageName");
return;
}
@@ -312,7 +318,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
String installerPackageName = pm.getInstallerPackageName(info.getPackageName());
if (installerPackageName == null) {
- sendFailure(statusReceiver, "Cannot find installer package");
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+ "Cannot find installer package");
return;
}
params.setInstallerPackageName(installerPackageName);
@@ -346,7 +353,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
PackageInstaller.STATUS_FAILURE);
if (status != PackageInstaller.STATUS_SUCCESS) {
- sendFailure(statusReceiver,
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_INSTALL,
"Rollback downgrade install failed: "
+ result.getStringExtra(
PackageInstaller.EXTRA_STATUS_MESSAGE));
@@ -372,7 +379,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
parentSession.commit(receiver.getIntentSender());
} catch (IOException e) {
Log.e(TAG, "Rollback failed", e);
- sendFailure(statusReceiver, "IOException: " + e.toString());
+ sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE,
+ "IOException: " + e.toString());
return;
}
}
@@ -534,16 +542,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
* Notifies an IntentSender of failure.
*
* @param statusReceiver where to send the failure
+ * @param status the RollbackManager.STATUS_* code with the failure.
* @param message the failure message.
*/
- private void sendFailure(IntentSender statusReceiver, String message) {
+ private void sendFailure(IntentSender statusReceiver, int status, String message) {
Log.e(TAG, message);
try {
- // TODO: More context on which rollback failed?
- // TODO: More refined failure code?
final Intent fillIn = new Intent();
- fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE);
- fillIn.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, message);
+ fillIn.putExtra(RollbackManager.EXTRA_STATUS, status);
+ fillIn.putExtra(RollbackManager.EXTRA_STATUS_MESSAGE, message);
statusReceiver.sendIntent(mContext, 0, fillIn, null, null);
} catch (IntentSender.SendIntentException e) {
// Nowhere to send the result back to, so don't bother.
@@ -556,7 +563,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
private void sendSuccess(IntentSender statusReceiver) {
try {
final Intent fillIn = new Intent();
- fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_SUCCESS);
+ fillIn.putExtra(RollbackManager.EXTRA_STATUS, RollbackManager.STATUS_SUCCESS);
statusReceiver.sendIntent(mContext, 0, fillIn, null, null);
} catch (IntentSender.SendIntentException e) {
// Nowhere to send the result back to, so don't bother.
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
index ad560f33230c..60c7a59d9456 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java
@@ -99,7 +99,13 @@ class RollbackTestUtils {
RollbackManager rm = getRollbackManager();
rm.commitRollback(rollbackId, Arrays.asList(causePackages),
LocalIntentSender.getIntentSender());
- assertStatusSuccess(LocalIntentSender.getIntentSenderResult());
+ Intent result = LocalIntentSender.getIntentSenderResult();
+ int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+ RollbackManager.STATUS_FAILURE);
+ if (status != RollbackManager.STATUS_SUCCESS) {
+ String message = result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE);
+ throw new AssertionError(message);
+ }
}
/**