diff options
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); + } } /** |