summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvador Martinez <dehboxturtle@google.com>2018-09-24 10:36:11 -0700
committerSalvador Martinez <dehboxturtle@google.com>2018-09-28 14:25:25 -0700
commita80bbab54c8cc02729508f6c7b1d51a0eabb331f (patch)
treeec23f559c51b8f82c9a7fd4de71fe33c4ba1c2eb
parent960165c0d786c08eaacb3427b33753623754207b (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.txt2
-rw-r--r--api/test-current.txt4
-rw-r--r--config/hiddenapi-light-greylist.txt1
-rw-r--r--core/java/android/os/PowerManager.java9
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java7
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);