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:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user