summaryrefslogtreecommitdiff
path: root/packages/SettingsLib/src
diff options
context:
space:
mode:
author Alex Johnston <acjohnston@google.com> 2023-02-06 17:29:34 +0000
committer Alex Johnston <acjohnston@google.com> 2023-02-14 22:58:11 +0000
commit740b086d44b041cbfd5869a3945b8682ec3db8b1 (patch)
tree68e3cc0f33680cc0f6bc56d18adf1a8430b66d71 /packages/SettingsLib/src
parent10e2930c58623b278dd49d4fd21874fc099b2c98 (diff)
Implement OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS exemption
OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS details: * An app with this appop will be made exempt from all power restrictions, including app standby and doze. * In addition, the app will be able to start fgs from the bg, and the user will not be able to stop fgs run by the app. Changes: * Add DevicePolicyManager constant to exempt an app from power restrictions * Link the constant with the OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS appop * Implement the OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS Bug: 246330879 Test: atest FgsManagerControllerTest atest ActiveServicesTest atest BackgroundRestrictionTest atest ApplicationExemptionsTest Manual testing: - Give OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS appop to TestDPC app - Verify the app can start fg services from the bg - Verify fgs started by the app cannot be stopped - Verify the app cannot be put into background restricted via Settings Change-Id: I98289082dbe2a526ee66d157748c3e9e964a2a7e
Diffstat (limited to 'packages/SettingsLib/src')
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerAllowlistBackend.java32
1 files changed, 27 insertions, 5 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerAllowlistBackend.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerAllowlistBackend.java
index 2e8f36834584..8fd4e912e04a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerAllowlistBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerAllowlistBackend.java
@@ -16,6 +16,9 @@
package com.android.settingslib.fuelgauge;
+import static android.provider.DeviceConfig.NAMESPACE_ACTIVITY_MANAGER;
+
+import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
@@ -23,6 +26,7 @@ import android.content.pm.PackageManager;
import android.os.IDeviceIdleController;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.provider.DeviceConfig;
import android.telecom.DefaultDialerManager;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -42,6 +46,10 @@ public class PowerAllowlistBackend {
private static final String DEVICE_IDLE_SERVICE = "deviceidle";
+ private static final String SYSTEM_EXEMPT_POWER_RESTRICTIONS_ENABLED =
+ "system_exempt_power_restrictions_enabled";
+ private static final boolean DEFAULT_SYSTEM_EXEMPT_POWER_RESTRICTIONS_ENABLED = true;
+
private static PowerAllowlistBackend sInstance;
private final Context mAppContext;
@@ -76,12 +84,12 @@ public class PowerAllowlistBackend {
/**
* Check if target package is in allow list
*/
- public boolean isAllowlisted(String pkg) {
+ public boolean isAllowlisted(String pkg, int uid) {
if (mAllowlistedApps.contains(pkg)) {
return true;
}
- if (isDefaultActiveApp(pkg)) {
+ if (isDefaultActiveApp(pkg, uid)) {
return true;
}
@@ -91,7 +99,7 @@ public class PowerAllowlistBackend {
/**
* Check if it is default active app in multiple area(i.e. SMS, Dialer, Device admin..)
*/
- public boolean isDefaultActiveApp(String pkg) {
+ public boolean isDefaultActiveApp(String pkg, int uid) {
// Additionally, check if pkg is default dialer/sms. They are considered essential apps and
// should be automatically allowlisted (otherwise user may be able to set restriction on
// them, leading to bad device behavior.)
@@ -106,9 +114,23 @@ public class PowerAllowlistBackend {
return true;
}
+ final AppOpsManager appOpsManager = mAppContext.getSystemService(AppOpsManager.class);
+ if (isSystemExemptFlagEnabled() && appOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS, uid, pkg)
+ == AppOpsManager.MODE_ALLOWED) {
+ return true;
+ }
+
return false;
}
+ private static boolean isSystemExemptFlagEnabled() {
+ return DeviceConfig.getBoolean(
+ NAMESPACE_ACTIVITY_MANAGER,
+ SYSTEM_EXEMPT_POWER_RESTRICTIONS_ENABLED,
+ DEFAULT_SYSTEM_EXEMPT_POWER_RESTRICTIONS_ENABLED);
+ }
+
/**
* Check if target package is in allow list except idle app
*/
@@ -126,12 +148,12 @@ public class PowerAllowlistBackend {
* @param pkgs a list of packageName
* @return true when one of package is in allow list
*/
- public boolean isAllowlisted(String[] pkgs) {
+ public boolean isAllowlisted(String[] pkgs, int uid) {
if (ArrayUtils.isEmpty(pkgs)) {
return false;
}
for (String pkg : pkgs) {
- if (isAllowlisted(pkg)) {
+ if (isAllowlisted(pkg, uid)) {
return true;
}
}