diff options
author | Salvador Martinez <dehboxturtle@google.com> | 2018-09-24 10:36:11 -0700 |
---|---|---|
committer | Salvador Martinez <dehboxturtle@google.com> | 2018-09-28 14:25:25 -0700 |
commit | a80bbab54c8cc02729508f6c7b1d51a0eabb331f (patch) | |
tree | ec23f559c51b8f82c9a7fd4de71fe33c4ba1c2eb | |
parent | 960165c0d786c08eaacb3427b33753623754207b (diff) |
Add new POWER_SAVER permission & update api
This CL adds a new privileged permission called POWER_SAVER that
will allow whitelisted packages to toggle battery saver on the
device. This can be done via PowerManager, where the API for
setting battery saver has been updated to accept calls from apps
with either DEVICE_POWER or the POWER_SAVER permission.
Additionally, we whitelist Turbo for the permission.
Test: Framework builds, Turbo can toggle EBS
Bug: 115524274
Change-Id: I49d9747b2d42f792a2f3ba90a15aa23c47e489b3
-rw-r--r-- | api/system-current.txt | 2 | ||||
-rw-r--r-- | api/test-current.txt | 4 | ||||
-rw-r--r-- | config/hiddenapi-light-greylist.txt | 1 | ||||
-rw-r--r-- | core/java/android/os/PowerManager.java | 9 | ||||
-rw-r--r-- | core/res/AndroidManifest.xml | 6 | ||||
-rw-r--r-- | services/core/java/com/android/server/power/PowerManagerService.java | 7 |
6 files changed, 24 insertions, 5 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 1f74cbf6312c..38ec39902522 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -128,6 +128,7 @@ package android { field public static final java.lang.String PEERS_MAC_ADDRESS = "android.permission.PEERS_MAC_ADDRESS"; field public static final java.lang.String PERFORM_CDMA_PROVISIONING = "android.permission.PERFORM_CDMA_PROVISIONING"; field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION"; + field public static final java.lang.String POWER_SAVER = "android.permission.POWER_SAVER"; field public static final java.lang.String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE"; field public static final java.lang.String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT"; field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES"; @@ -3995,6 +3996,7 @@ package android.os { } public final class PowerManager { + method public boolean setPowerSaveMode(boolean); method public void userActivity(long, int, int); field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3 field public static final int USER_ACTIVITY_EVENT_BUTTON = 1; // 0x1 diff --git a/api/test-current.txt b/api/test-current.txt index 956761615254..53ff06800182 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -708,6 +708,10 @@ package android.os { method public void removeSyncBarrier(int); } + public final class PowerManager { + method public boolean setPowerSaveMode(boolean); + } + public class Process { method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException; } diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index 04724616420b..1ad8e7e56330 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -867,7 +867,6 @@ Landroid/os/PowerManager;->GO_TO_SLEEP_REASON_TIMEOUT:I Landroid/os/PowerManager;->isLightDeviceIdleMode()Z Landroid/os/PowerManager;->mHandler:Landroid/os/Handler; Landroid/os/PowerManager;->mService:Landroid/os/IPowerManager; -Landroid/os/PowerManager;->setPowerSaveMode(Z)Z Landroid/os/PowerManager;->validateWakeLockParameters(ILjava/lang/String;)V Landroid/os/PowerManager;->wakeUp(JLjava/lang/String;)V Landroid/os/Process;->BLUETOOTH_UID:I diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 89a5defd221d..8ea061e4a8d0 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1154,10 +1154,15 @@ public final class PowerManager { * * @return True if the set was allowed. * - * @see #isPowerSaveMode() - * * @hide + * @see #isPowerSaveMode() */ + @SystemApi + @TestApi + @RequiresPermission(anyOf = { + android.Manifest.permission.DEVICE_POWER, + android.Manifest.permission.POWER_SAVER + }) public boolean setPowerSaveMode(boolean mode) { try { return mService.setPowerSaveMode(mode); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5a1f2e8d870c..f97873e566a4 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3407,6 +3407,12 @@ <permission android:name="android.permission.DEVICE_POWER" android:protectionLevel="signature" /> + <!-- Allows toggling battery saver on the system. + Superseded by DEVICE_POWER permission. @hide @SystemApi + --> + <permission android:name="android.permission.POWER_SAVER" + android:protectionLevel="signature|privileged" /> + <!-- Allows access to the PowerManager.userActivity function. <p>Not for use by third-party applications. @hide @SystemApi --> <permission android:name="android.permission.USER_ACTIVITY" diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 9f6b3dde5a49..b3f2a27cf99a 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -4404,8 +4404,11 @@ public final class PowerManagerService extends SystemService @Override // Binder call public boolean setPowerSaveMode(boolean enabled) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.DEVICE_POWER, null); + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER) + != PackageManager.PERMISSION_GRANTED) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + } final long ident = Binder.clearCallingIdentity(); try { return setLowPowerModeInternal(enabled); |