Commit rollbacks by ID, not by RollbackInfo.
To make it clear that the system only pays attention to the provided rollback ID when committing a rollback. Also, rename executeRollback to commitRollback in IRollbackManager.aidl, now that we are touching the code anyway. Bug: 112431924 Test: atest RollbackTest Change-Id: I315e75c39019536fb2f090a0c84ed4cf7c03ce8c
This commit is contained in:
@@ -1707,7 +1707,7 @@ package android.content.rollback {
|
||||
}
|
||||
|
||||
public final class RollbackManager {
|
||||
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void commitRollback(@NonNull android.content.rollback.RollbackInfo, @NonNull android.content.IntentSender);
|
||||
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void commitRollback(int, @NonNull android.content.IntentSender);
|
||||
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void expireRollbackForPackage(@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<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks();
|
||||
|
||||
@@ -26,7 +26,7 @@ interface IRollbackManager {
|
||||
ParceledListSlice getAvailableRollbacks();
|
||||
ParceledListSlice getRecentlyExecutedRollbacks();
|
||||
|
||||
void executeRollback(in RollbackInfo rollback, String callerPackageName,
|
||||
void commitRollback(int rollbackId, String callerPackageName,
|
||||
in IntentSender statusReceiver);
|
||||
|
||||
// Exposed for use from the system server only. Callback from the package
|
||||
|
||||
@@ -102,16 +102,15 @@ public final class RollbackManager {
|
||||
* <p>
|
||||
* TODO: Specify the returns status codes.
|
||||
*
|
||||
* @param rollback to commit
|
||||
* @param rollbackId ID of the rollback to commit
|
||||
* @param statusReceiver where to deliver the results
|
||||
* @throws SecurityException if the caller does not have the
|
||||
* MANAGE_ROLLBACKS permission.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS)
|
||||
public void commitRollback(@NonNull RollbackInfo rollback,
|
||||
@NonNull IntentSender statusReceiver) {
|
||||
public void commitRollback(int rollbackId, @NonNull IntentSender statusReceiver) {
|
||||
try {
|
||||
mBinder.executeRollback(rollback, mCallerPackageName, statusReceiver);
|
||||
mBinder.commitRollback(rollbackId, mCallerPackageName, statusReceiver);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void executeRollback(RollbackInfo rollback, String callerPackageName,
|
||||
public void commitRollback(int rollbackId, String callerPackageName,
|
||||
IntentSender statusReceiver) {
|
||||
mContext.enforceCallingOrSelfPermission(
|
||||
android.Manifest.permission.MANAGE_ROLLBACKS,
|
||||
@@ -238,19 +238,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
|
||||
appOps.checkPackage(callingUid, callerPackageName);
|
||||
|
||||
getHandler().post(() ->
|
||||
executeRollbackInternal(rollback, callerPackageName, statusReceiver));
|
||||
commitRollbackInternal(rollbackId, callerPackageName, statusReceiver));
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the actual work to execute a rollback.
|
||||
* Performs the actual work to commit a rollback.
|
||||
* The work is done on the current thread. This may be a long running
|
||||
* operation.
|
||||
*/
|
||||
private void executeRollbackInternal(RollbackInfo rollback,
|
||||
private void commitRollbackInternal(int rollbackId,
|
||||
String callerPackageName, IntentSender statusReceiver) {
|
||||
Log.i(TAG, "Initiating rollback");
|
||||
|
||||
RollbackData data = getRollbackForId(rollback.getRollbackId());
|
||||
RollbackData data = getRollbackForId(rollbackId);
|
||||
if (data == null) {
|
||||
sendFailure(statusReceiver, "Rollback unavailable");
|
||||
return;
|
||||
@@ -350,7 +350,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
|
||||
return;
|
||||
}
|
||||
|
||||
addRecentlyExecutedRollback(rollback);
|
||||
addRecentlyExecutedRollback(
|
||||
new RollbackInfo(data.rollbackId, data.packages));
|
||||
sendSuccess(statusReceiver);
|
||||
|
||||
Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED);
|
||||
|
||||
@@ -86,7 +86,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
|
||||
// TODO(zezeozue): Log initiated metrics
|
||||
mHandler.post(() ->
|
||||
mRollbackManager.commitRollback(rollback, rollbackReceiver.getIntentSender()));
|
||||
mRollbackManager.commitRollback(rollback.getRollbackId(),
|
||||
rollbackReceiver.getIntentSender()));
|
||||
// Assume rollback executed successfully
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ public class RollbackTest {
|
||||
assertNull(broadcastReceiver.poll(0, TimeUnit.SECONDS));
|
||||
|
||||
// Roll back the app.
|
||||
RollbackTestUtils.rollback(rollback);
|
||||
RollbackTestUtils.rollback(rollback.getRollbackId());
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
|
||||
// Verify we received a broadcast for the rollback.
|
||||
@@ -211,7 +211,7 @@ public class RollbackTest {
|
||||
assertRollbackInfoEquals(TEST_APP_B, 2, 1, rollbackB);
|
||||
|
||||
// Rollback of B should not rollback A
|
||||
RollbackTestUtils.rollback(rollbackB);
|
||||
RollbackTestUtils.rollback(rollbackB.getRollbackId());
|
||||
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
|
||||
} finally {
|
||||
@@ -268,7 +268,7 @@ public class RollbackTest {
|
||||
assertRollbackInfoForAandB(rollbackB);
|
||||
|
||||
// Rollback of B should rollback A as well
|
||||
RollbackTestUtils.rollback(rollbackB);
|
||||
RollbackTestUtils.rollback(rollbackB.getRollbackId());
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
|
||||
} finally {
|
||||
@@ -303,7 +303,7 @@ public class RollbackTest {
|
||||
rm.getAvailableRollbacks(), TEST_APP_A);
|
||||
|
||||
// Roll back the app.
|
||||
RollbackTestUtils.rollback(rollback);
|
||||
RollbackTestUtils.rollback(rollback.getRollbackId());
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
|
||||
// Verify the recent rollback has been recorded.
|
||||
@@ -430,7 +430,7 @@ public class RollbackTest {
|
||||
RollbackManager rm = RollbackTestUtils.getRollbackManager();
|
||||
RollbackInfo rollback = getUniqueRollbackInfoForPackage(
|
||||
rm.getAvailableRollbacks(), TEST_APP_A);
|
||||
RollbackTestUtils.rollback(rollback);
|
||||
RollbackTestUtils.rollback(rollback.getRollbackId());
|
||||
processUserData(TEST_APP_A);
|
||||
} finally {
|
||||
RollbackTestUtils.dropShellPermissionIdentity();
|
||||
@@ -500,7 +500,7 @@ public class RollbackTest {
|
||||
assertRollbackInfoEquals(TEST_APP_B, 2, 1, rollbackB);
|
||||
|
||||
// Executing rollback should roll back the correct package.
|
||||
RollbackTestUtils.rollback(rollbackA);
|
||||
RollbackTestUtils.rollback(rollbackA.getRollbackId());
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
|
||||
|
||||
@@ -509,7 +509,7 @@ public class RollbackTest {
|
||||
RollbackTestUtils.install("RollbackTestAppAv2.apk", true);
|
||||
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
|
||||
RollbackTestUtils.rollback(rollbackB);
|
||||
RollbackTestUtils.rollback(rollbackB.getRollbackId());
|
||||
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
|
||||
} finally {
|
||||
@@ -544,7 +544,7 @@ public class RollbackTest {
|
||||
try {
|
||||
// TODO: What if the implementation checks arguments for non-null
|
||||
// first? Then this test isn't valid.
|
||||
rm.commitRollback(null, null);
|
||||
rm.commitRollback(0, null);
|
||||
fail("expected SecurityException");
|
||||
} catch (SecurityException e) {
|
||||
// Expected.
|
||||
@@ -598,7 +598,7 @@ public class RollbackTest {
|
||||
|
||||
// Rollback the app. It should cause both test apps to be rolled
|
||||
// back.
|
||||
RollbackTestUtils.rollback(rollback);
|
||||
RollbackTestUtils.rollback(rollback.getRollbackId());
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
|
||||
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageInstaller;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.rollback.RollbackInfo;
|
||||
import android.content.rollback.RollbackManager;
|
||||
import android.support.test.InstrumentationRegistry;
|
||||
|
||||
@@ -93,9 +92,9 @@ class RollbackTestUtils {
|
||||
* Commit the given rollback.
|
||||
* @throws AssertionError if the rollback fails.
|
||||
*/
|
||||
static void rollback(RollbackInfo rollback) throws InterruptedException {
|
||||
static void rollback(int rollbackId) throws InterruptedException {
|
||||
RollbackManager rm = getRollbackManager();
|
||||
rm.commitRollback(rollback, LocalIntentSender.getIntentSender());
|
||||
rm.commitRollback(rollbackId, LocalIntentSender.getIntentSender());
|
||||
assertStatusSuccess(LocalIntentSender.getIntentSenderResult());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user