diff options
| author | 2019-12-20 02:27:51 +0000 | |
|---|---|---|
| committer | 2019-12-20 02:27:51 +0000 | |
| commit | 6af4789825dd28fd516df963203965564a004936 (patch) | |
| tree | 6b663bc7972124cd3ebc287933a76e42660371e9 | |
| parent | 3714b23180d489ddcdb92475ce48c692cbe6c3fb (diff) | |
| parent | 0b11673991d8bddf77d4706fbe1c8f0d43a68c02 (diff) | |
Merge "Add an API to tell whenever device supports userspace reboot" am: 670352e807 am: d1c0e074c0 am: 0b11673991
Change-Id: I797923d568645425aca0659d02cd8dc0364a25ff
| -rw-r--r-- | api/current.txt | 3 | ||||
| -rwxr-xr-x | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/os/PowerManager.java | 24 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/os/PowerManagerTest.java | 13 |
4 files changed, 39 insertions, 2 deletions
diff --git a/api/current.txt b/api/current.txt index 31857a23fc80..fa557cf84490 100644 --- a/api/current.txt +++ b/api/current.txt @@ -35445,11 +35445,12 @@ package android.os { method public boolean isIgnoringBatteryOptimizations(String); method public boolean isInteractive(); method public boolean isPowerSaveMode(); + method public boolean isRebootingUserspaceSupported(); method @Deprecated public boolean isScreenOn(); method public boolean isSustainedPerformanceModeSupported(); method public boolean isWakeLockLevelSupported(int); method public android.os.PowerManager.WakeLock newWakeLock(int, String); - method public void reboot(String); + method public void reboot(@Nullable String); method public void removeThermalStatusListener(@NonNull android.os.PowerManager.OnThermalStatusChangedListener); field public static final int ACQUIRE_CAUSES_WAKEUP = 268435456; // 0x10000000 field public static final String ACTION_DEVICE_IDLE_MODE_CHANGED = "android.os.action.DEVICE_IDLE_MODE_CHANGED"; diff --git a/api/system-current.txt b/api/system-current.txt index 8a147bbe5b08..d51b46dc6845 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6642,6 +6642,7 @@ package android.os { method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.USER_ACTIVITY}) public void userActivity(long, int, int); field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1 field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0 + field public static final String REBOOT_USERSPACE = "userspace"; field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3 field public static final int USER_ACTIVITY_EVENT_BUTTON = 1; // 0x1 field public static final int USER_ACTIVITY_EVENT_OTHER = 0; // 0x0 diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 2f8e30e42b7e..82b04a661b54 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -20,6 +20,7 @@ import android.Manifest.permission; import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SystemApi; @@ -552,6 +553,13 @@ public final class PowerManager { public static final String REBOOT_SAFE_MODE = "safemode"; /** + * The 'reason' value used for rebooting userspace. + * @hide + */ + @SystemApi + public static final String REBOOT_USERSPACE = "userspace"; + + /** * The 'reason' value used when rebooting the device without turning on the screen. * @hide */ @@ -1326,6 +1334,14 @@ public final class PowerManager { } /** + * Returns {@code true} if this device supports rebooting userspace. + */ + // TODO(b/138605180): add link to documentation once it's ready. + public boolean isRebootingUserspaceSupported() { + return SystemProperties.getBoolean("ro.init.userspace_reboot.is_supported", false); + } + + /** * Reboot the device. Will not return if the reboot is successful. * <p> * Requires the {@link android.Manifest.permission#REBOOT} permission. @@ -1333,8 +1349,14 @@ public final class PowerManager { * * @param reason code to pass to the kernel (e.g., "recovery") to * request special boot modes, or null. + * @throws UnsupportedOperationException if userspace reboot was requested on a device that + * doesn't support it. */ - public void reboot(String reason) { + public void reboot(@Nullable String reason) { + if (REBOOT_USERSPACE.equals(reason) && !isRebootingUserspaceSupported()) { + throw new UnsupportedOperationException( + "Attempted userspace reboot on a device that doesn't support it"); + } try { mService.reboot(false, reason, true); } catch (RemoteException e) { diff --git a/core/tests/coretests/src/android/os/PowerManagerTest.java b/core/tests/coretests/src/android/os/PowerManagerTest.java index 576ac73bc183..5cb7852f7acc 100644 --- a/core/tests/coretests/src/android/os/PowerManagerTest.java +++ b/core/tests/coretests/src/android/os/PowerManagerTest.java @@ -239,4 +239,17 @@ public class PowerManagerTest extends AndroidTestCase { verify(mListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onThermalStatusChanged(status); } + + @Test + public void testUserspaceRebootNotSupported_throwsUnsupportedOperationException() { + // Can't use assumption framework with AndroidTestCase :( + if (mPm.isRebootingUserspaceSupported()) { + return; + } + try { + mPm.reboot(PowerManager.REBOOT_USERSPACE); + fail("UnsupportedOperationException not thrown"); + } catch (UnsupportedOperationException expected) { + } + } } |