From 9f730a8307c148b7bb542da72697447660a351b4 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Thu, 4 Feb 2021 10:53:37 -0800 Subject: [PATCH] Introduce BATTERY_PREDICTION permission. DEVICE_POWER is very powerful, so introduce the BATTERY_PREDICTION permission to allow privileged apps with the permission to provide the system with battery predictions. Bug: 139413884 Test: atest android.os.cts.PowerManagerTest Test: atest android.permission.cts.PowerManagerServicePermissionTest Test: atest CtsPermission2TestCases Test: atest SettingsProviderTest Change-Id: Ib52f20b5145785a5fc363601757ad9c57f40e254 --- core/api/system-current.txt | 3 ++- core/java/android/os/PowerManager.java | 8 ++++++-- core/res/AndroidManifest.xml | 6 ++++++ data/etc/privapp-permissions-platform.xml | 2 ++ packages/Shell/AndroidManifest.xml | 1 + .../com/android/server/power/PowerManagerService.java | 9 +++++++-- 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index f5a22543f9405..a38346ecad5d7 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -27,6 +27,7 @@ package android { field public static final String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER"; field public static final String APPROVE_INCIDENT_REPORTS = "android.permission.APPROVE_INCIDENT_REPORTS"; field public static final String BACKUP = "android.permission.BACKUP"; + field public static final String BATTERY_PREDICTION = "android.permission.BATTERY_PREDICTION"; field public static final String BIND_ATTENTION_SERVICE = "android.permission.BIND_ATTENTION_SERVICE"; field public static final String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE"; field public static final String BIND_CELL_BROADCAST_SERVICE = "android.permission.BIND_CELL_BROADCAST_SERVICE"; @@ -8529,7 +8530,7 @@ package android.os { method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isAmbientDisplaySuppressedForToken(@NonNull String); method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSaveEnabled(boolean); method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setAdaptivePowerSavePolicy(@NonNull android.os.BatterySaverPolicyConfig); - method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void setBatteryDischargePrediction(@NonNull java.time.Duration, boolean); + method @RequiresPermission(anyOf={android.Manifest.permission.BATTERY_PREDICTION, android.Manifest.permission.DEVICE_POWER}) public void setBatteryDischargePrediction(@NonNull java.time.Duration, boolean); method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setDynamicPowerSaveHint(boolean, int); method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setFullPowerSavePolicy(@NonNull android.os.BatterySaverPolicyConfig); method @RequiresPermission(anyOf={android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER}) public boolean setPowerSaveModeEnabled(boolean); diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 059e932a9da91..3774fb5956808 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1898,7 +1898,8 @@ public final class PowerManager { * These estimates will be displayed on system UI surfaces in place of the system computed * value. * - * Calling this requires the {@link android.Manifest.permission#DEVICE_POWER} permission. + * Calling this requires either the {@link android.Manifest.permission#DEVICE_POWER} or the + * {@link android.Manifest.permission#BATTERY_PREDICTION} permissions. * * @param timeRemaining The time remaining as a {@link Duration}. * @param isPersonalized true if personalized based on device usage history, false otherwise. @@ -1906,7 +1907,10 @@ public final class PowerManager { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.DEVICE_POWER) + @RequiresPermission(anyOf = { + android.Manifest.permission.BATTERY_PREDICTION, + android.Manifest.permission.DEVICE_POWER + }) public void setBatteryDischargePrediction(@NonNull Duration timeRemaining, boolean isPersonalized) { if (timeRemaining == null) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ba43ee79e6f36..99caecb635476 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4372,6 +4372,12 @@ + + + + + diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 35a4e81eefe44..539a81bf43a03 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -100,6 +100,7 @@ + diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 88fdc4aad5cfe..c0b8202936491 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -5138,10 +5138,15 @@ public final class PowerManagerService extends SystemService // Get current time before acquiring the lock so that the calculated end time is as // accurate as possible. final long nowElapsed = SystemClock.elapsedRealtime(); - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.BATTERY_PREDICTION) + != PackageManager.PERMISSION_GRANTED) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, "setBatteryDischargePrediction"); + } final long timeRemainingMs = timeRemaining.getDuration().toMillis(); - // A non-positive number means the battery should be dead right now... + // A non-positive number means the battery should be dead right now... Preconditions.checkArgumentPositive(timeRemainingMs, "Given time remaining is not positive: " + timeRemainingMs);