Specify status results for RollbackManager.commitRollback.

Rather than implicitly reusing the PackageInstaller status codes.

Bug: 112431924
Test: atest RollbackTest
Change-Id: I86929c0c1a5153c7f58e255e104b30fe96ddeca8
This commit is contained in:
Richard Uhler
2019-01-28 17:33:48 +00:00
parent 66a23d0504
commit 2a48c29cb6
4 changed files with 81 additions and 18 deletions

View File

@@ -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
}
}

View File

@@ -92,6 +92,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
@@ -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.
*/

View File

@@ -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.

View File

@@ -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);
}
}
/**