diff --git a/res/values/config.xml b/res/values/config.xml
index f60b58c7ec0..99052ca2d7c 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -529,10 +529,14 @@
- content://com.android.settings.slices/intent/media_output_indicator
-
+
+
+
+
+
diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
index 76200fef746..821501c005f 100644
--- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
+++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
@@ -342,7 +342,7 @@ public final class BatteryBackupHelper implements BackupHelper {
private boolean isSystemOrDefaultApp(String packageName, int uid) {
return BatteryOptimizeUtils.isSystemOrDefaultApp(
- getPowerAllowlistBackend(), packageName, uid);
+ mContext, getPowerAllowlistBackend(), packageName, uid);
}
private ArraySet getInstalledApplications() {
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
index 3ced79034dd..7b3a6ad33dc 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
@@ -45,6 +45,10 @@ public class BatteryOptimizeUtils {
private static final String TAG = "BatteryOptimizeUtils";
private static final String UNKNOWN_PACKAGE = "unknown";
+ // Avoid reload the data again since it is predefined in the resource/config.
+ private static List sBatteryOptimizeModeList = null;
+ private static List sBatteryUnrestrictModeList = null;
+
@VisibleForTesting AppOpsManager mAppOpsManager;
@VisibleForTesting BatteryUtils mBatteryUtils;
@VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend;
@@ -139,7 +143,7 @@ public class BatteryOptimizeUtils {
*/
public boolean isSystemOrDefaultApp() {
mPowerAllowListBackend.refreshList();
- return isSystemOrDefaultApp(mPowerAllowListBackend, mPackageName, mUid);
+ return isSystemOrDefaultApp(mContext, mPowerAllowListBackend, mPackageName, mUid);
}
/**
@@ -191,7 +195,8 @@ public class BatteryOptimizeUtils {
// Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == MODE_OPTIMIZED
|| optimizationMode == MODE_UNKNOWN
- || isSystemOrDefaultApp(allowlistBackend, info.packageName, info.uid)) {
+ || isSystemOrDefaultApp(
+ context, allowlistBackend, info.packageName, info.uid)) {
continue;
}
@@ -211,14 +216,32 @@ public class BatteryOptimizeUtils {
}
static boolean isSystemOrDefaultApp(
- PowerAllowlistBackend powerAllowlistBackend, String packageName, int uid) {
+ Context context,
+ PowerAllowlistBackend powerAllowlistBackend,
+ String packageName,
+ int uid) {
return powerAllowlistBackend.isSysAllowlisted(packageName)
+ // Always forced unrestricted apps are one type of system important apps.
+ || getForceBatteryUnrestrictModeList(context).contains(packageName)
|| powerAllowlistBackend.isDefaultActiveApp(packageName, uid);
}
static List getForceBatteryOptimizeModeList(Context context) {
- return Arrays.asList(context.getResources().getStringArray(
- R.array.config_force_battery_optimize_mode_apps));
+ if (sBatteryOptimizeModeList == null) {
+ sBatteryOptimizeModeList = Arrays.asList(
+ context.getResources().getStringArray(
+ R.array.config_force_battery_optimize_mode_apps));
+ }
+ return sBatteryOptimizeModeList;
+ }
+
+ static List getForceBatteryUnrestrictModeList(Context context) {
+ if (sBatteryUnrestrictModeList == null) {
+ sBatteryUnrestrictModeList = Arrays.asList(
+ context.getResources().getStringArray(
+ R.array.config_force_battery_unrestrict_mode_apps));
+ }
+ return sBatteryUnrestrictModeList;
}
private static void setAppUsageStateInternal(
diff --git a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
index dac2abfec24..b41e153ef82 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java
@@ -56,12 +56,21 @@ public final class BatterySettingsMigrateChecker extends BroadcastReceiver {
/** Avoid users set important apps into the unexpected battery optimize modes */
static void verifyBatteryOptimizeModes(Context context) {
Log.d(TAG, "invoke verifyOptimizationModes()");
- verifyBatteryOptimizeModes(context,
+ verifyBatteryOptimizeModeApps(
+ context,
+ BatteryOptimizeUtils.MODE_OPTIMIZED,
BatteryOptimizeUtils.getForceBatteryOptimizeModeList(context));
+ verifyBatteryOptimizeModeApps(
+ context,
+ BatteryOptimizeUtils.MODE_UNRESTRICTED,
+ BatteryOptimizeUtils.getForceBatteryUnrestrictModeList(context));
}
@VisibleForTesting
- static void verifyBatteryOptimizeModes(Context context, List allowList) {
+ static void verifyBatteryOptimizeModeApps(
+ Context context,
+ @BatteryOptimizeUtils.OptimizationMode int optimizationMode,
+ List allowList) {
allowList.forEach(packageName -> {
final BatteryOptimizeUtils batteryOptimizeUtils =
BatteryBackupHelper.newBatteryOptimizeUtils(context, packageName,
@@ -69,10 +78,10 @@ public final class BatterySettingsMigrateChecker extends BroadcastReceiver {
if (batteryOptimizeUtils == null) {
return;
}
- if (batteryOptimizeUtils.getAppOptimizationMode() !=
- BatteryOptimizeUtils.MODE_OPTIMIZED) {
- Log.w(TAG, "Reset optimization mode for: " + packageName);
- batteryOptimizeUtils.setAppUsageState(BatteryOptimizeUtils.MODE_OPTIMIZED,
+ if (batteryOptimizeUtils.getAppOptimizationMode() != optimizationMode) {
+ Log.w(TAG, "Reset " + packageName + " battery mode into " + optimizationMode);
+ batteryOptimizeUtils.setAppUsageState(
+ optimizationMode,
BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
}
});
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
index 16b789546b8..e2058e7c1ab 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java
@@ -151,12 +151,15 @@ public final class BatterySettingsMigrateCheckerTest {
}
@Test
- public void verifyBatteryOptimizeModes_inAllowList_resetOptimizationMode() throws Exception {
+ public void verifyBatteryOptimizeModeApps_inAllowList_resetOptimizationMode()
+ throws Exception {
doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
- mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes(
- mContext, Arrays.asList(PACKAGE_NAME));
+ mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
+ mContext,
+ BatteryOptimizeUtils.MODE_OPTIMIZED,
+ Arrays.asList(PACKAGE_NAME));
final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
inOrder.verify(mBatteryOptimizeUtils).getAppOptimizationMode();
@@ -166,23 +169,27 @@ public final class BatterySettingsMigrateCheckerTest {
}
@Test
- public void verifyBatteryOptimizeModes_optimizedMode_noAction() throws Exception {
+ public void verifyBatteryOptimizeModeApps_optimizedMode_noAction() throws Exception {
doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
- mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes(
- mContext, Arrays.asList(PACKAGE_NAME));
+ mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
+ mContext,
+ BatteryOptimizeUtils.MODE_OPTIMIZED,
+ Arrays.asList(PACKAGE_NAME));
verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any());
}
@Test
- public void verifyBatteryOptimizeModes_notInAllowList_noAction() throws Exception {
+ public void verifyBatteryOptimizeModeApps_notInAllowList_noAction() throws Exception {
doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode();
- mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes(
- mContext, new ArrayList());
+ mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
+ mContext,
+ BatteryOptimizeUtils.MODE_OPTIMIZED,
+ new ArrayList());
verifyNoInteractions(mBatteryOptimizeUtils);
}