Support REBOOT_READY broadcast Support the new REBOOT_READY broadcast by sending the broadcast with a positive extra when the device becomes ready to reboot, and by sending the broadcast with a negative extra if it becomes active again. Adds a new API that allows callers to cancel reboot readiness checks, provided that they are the only current client of the service. Test: atest CtsRebootReadinessTestCases Bug: 161353402 Change-Id: I57207cc84e5a8253fdcbaf61299e78fe7d6e80a6
diff --git a/framework/java/android/scheduling/RebootReadinessManager.java b/framework/java/android/scheduling/RebootReadinessManager.java index 46c5a5b..4e8ffb4 100644 --- a/framework/java/android/scheduling/RebootReadinessManager.java +++ b/framework/java/android/scheduling/RebootReadinessManager.java
@@ -23,6 +23,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -41,16 +42,16 @@ * rebooted, to determine when the device is in an unused state and is ready to be rebooted. When * an updater has notified this service that there is a pending update that requires a reboot, this * service will periodically check several signals which contribute to the reboot readiness - * decision. When the device has been deemed to be ready to reboot, a broadcast will be sent to - * the updater to inform it that the device is not being used and may be safely rebooted. + * decision. When the device's reboot-readiness changes, a + * {@link Intent#ACTION_REBOOT_READY} broadcast will be sent. The associated extra + * {@link Intent#EXTRA_IS_READY_TO_REBOOT} will be {@code true} when the device is ready to reboot, + * and {@code false} when it is not ready to reboot. * * <p>Subsystems may register callbacks with this service. These callbacks allow subsystems to * inform the reboot readiness decision in the case that they are performing important work * that should not be interrupted by a reboot. An example of reboot-blocking work is tethering * to another device. * - * TODO(b/161353402): Add link to broadcast once added. - * * @hide */ @SystemApi @@ -218,14 +219,39 @@ /** * Notifies the RebootReadinessManager that there is a pending update that requires a reboot to - * be applied. When the device is in a reboot-ready state, a broadcast will be sent. + * be applied. * - * TODO(b/161353402): Add API to allow caller to cancel reboot readiness checks. + * <p>When the device's reboot-readiness changes, a {@link Intent#ACTION_REBOOT_READY} broadcast + * will be sent. The associated extra {@link Intent#EXTRA_IS_READY_TO_REBOOT} will be + * {@code true} when the device is ready to reboot, and {@code false} when it is not ready to + * reboot. + * + * <p>If the same caller calls this method twice, the second call will be a no-op. + * + * TODO(b/161353402): Document and test multi-client cases. + * + * @param context the caller's context */ - @RequiresPermission(android.Manifest.permission.REBOOT) - public void markRebootPending() { + @RequiresPermission(Manifest.permission.REBOOT) + public void markRebootPending(@NonNull Context context) { try { - mService.markRebootPending(); + mService.markRebootPending(context.getPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Removes the caller from the set of packages that will receive reboot readiness broadcasts. + * If the caller is the only client that is receiving broadcasts, reboot readiness checks will + * be stopped. + * + * @param context the caller's context + */ + @RequiresPermission(Manifest.permission.REBOOT) + public void cancelPendingReboot(@NonNull Context context) { + try { + mService.cancelPendingReboot(context.getPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }