Loading api/test-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,7 @@ package android.content.rollback { } public final class RollbackManager { method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks(); Loading core/java/android/content/rollback/IRollbackManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -51,4 +51,7 @@ interface IRollbackManager { // Used by the staging manager to notify the RollbackManager of the apk // session for a staged session. void notifyStagedApkSession(int originalSessionId, int apkSessionId); // For test purposes only. void blockRollbackManager(long millis); } core/java/android/content/rollback/RollbackManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -250,4 +250,25 @@ public final class RollbackManager { throw e.rethrowFromSystemServer(); } } /** * Block the RollbackManager for a specified amount of time. * This API is meant to facilitate testing of race conditions in * RollbackManager. Blocks RollbackManager from processing anything for * the given number of milliseconds. * * @param millis number of milliseconds to block the RollbackManager for * @throws SecurityException if the caller does not have appropriate permissions. * * @hide */ @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) @TestApi public void blockRollbackManager(long millis) { try { mBinder.blockRollbackManager(millis); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +15 −2 Original line number Diff line number Diff line Loading @@ -45,10 +45,9 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.UserHandle; // duped to avoid merge conflict import android.os.UserManager; // out of order to avoid merge conflict import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.IntArray; Loading Loading @@ -575,6 +574,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } @Override public void blockRollbackManager(long millis) { mContext.enforceCallingOrSelfPermission( Manifest.permission.TEST_MANAGE_ROLLBACKS, "blockRollbackManager"); getHandler().post(() -> { try { Thread.sleep(millis); } catch (InterruptedException e) { // ignored. } }); } void onUnlockUser(int userId) { getHandler().post(() -> { final List<RollbackData> rollbacks; Loading tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -1058,6 +1058,10 @@ public class RollbackTest { Uninstall.packages(TestApp.A); Install.single(TestApp.A1).commit(); // Block the RollbackManager to make extra sure it will not be // able to enable the rollback in time. rm.blockRollbackManager(TimeUnit.SECONDS.toMillis(1)); Install.single(TestApp.A2).setEnableRollback().commit(); assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2); Loading Loading
api/test-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -795,6 +795,7 @@ package android.content.rollback { } public final class RollbackManager { method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks(); Loading
core/java/android/content/rollback/IRollbackManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -51,4 +51,7 @@ interface IRollbackManager { // Used by the staging manager to notify the RollbackManager of the apk // session for a staged session. void notifyStagedApkSession(int originalSessionId, int apkSessionId); // For test purposes only. void blockRollbackManager(long millis); }
core/java/android/content/rollback/RollbackManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -250,4 +250,25 @@ public final class RollbackManager { throw e.rethrowFromSystemServer(); } } /** * Block the RollbackManager for a specified amount of time. * This API is meant to facilitate testing of race conditions in * RollbackManager. Blocks RollbackManager from processing anything for * the given number of milliseconds. * * @param millis number of milliseconds to block the RollbackManager for * @throws SecurityException if the caller does not have appropriate permissions. * * @hide */ @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) @TestApi public void blockRollbackManager(long millis) { try { mBinder.blockRollbackManager(millis); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } }
services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +15 −2 Original line number Diff line number Diff line Loading @@ -45,10 +45,9 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.UserHandle; // duped to avoid merge conflict import android.os.UserManager; // out of order to avoid merge conflict import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.IntArray; Loading Loading @@ -575,6 +574,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } @Override public void blockRollbackManager(long millis) { mContext.enforceCallingOrSelfPermission( Manifest.permission.TEST_MANAGE_ROLLBACKS, "blockRollbackManager"); getHandler().post(() -> { try { Thread.sleep(millis); } catch (InterruptedException e) { // ignored. } }); } void onUnlockUser(int userId) { getHandler().post(() -> { final List<RollbackData> rollbacks; Loading
tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +4 −0 Original line number Diff line number Diff line Loading @@ -1058,6 +1058,10 @@ public class RollbackTest { Uninstall.packages(TestApp.A); Install.single(TestApp.A1).commit(); // Block the RollbackManager to make extra sure it will not be // able to enable the rollback in time. rm.blockRollbackManager(TimeUnit.SECONDS.toMillis(1)); Install.single(TestApp.A2).setEnableRollback().commit(); assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2); Loading