From 6d945584516ec7eb1c3689751174da10c3a1115b Mon Sep 17 00:00:00 2001 From: ykhung Date: Mon, 30 Oct 2023 13:21:55 +0800 Subject: [PATCH] Add a flow to keep special apps in the battery unrestricted mode Fix: 306506148 Test: atest & presubmit Change-Id: I1636f4fe38394686b40c9f52d37bd9ae6f2c46ba --- res/values/config.xml | 6 +++- .../fuelgauge/BatteryBackupHelper.java | 2 +- .../fuelgauge/BatteryOptimizeUtils.java | 33 ++++++++++++++++--- .../BatterySettingsMigrateChecker.java | 21 ++++++++---- .../BatterySettingsMigrateCheckerTest.java | 25 +++++++++----- 5 files changed, 65 insertions(+), 22 deletions(-) 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); }