Merge "Add a flow to keep special apps in the battery unrestricted mode" into main

This commit is contained in:
Treehugger Robot
2023-10-30 11:27:19 +00:00
committed by Android (Google) Code Review
5 changed files with 65 additions and 22 deletions

View File

@@ -529,10 +529,14 @@
<item>content://com.android.settings.slices/intent/media_output_indicator</item>
</string-array>
<!-- List containing the apps keep in battery mode = "Optimize" -->
<!-- List containing the apps keep in battery mode = "Optimized" -->
<string-array name="config_force_battery_optimize_mode_apps" translatable="false">
</string-array>
<!-- List containing the apps keep in battery mode = "Unrestricted" -->
<string-array name="config_force_battery_unrestrict_mode_apps" translatable="false">
</string-array>
<!-- Uri to query non-public Slice Uris. -->
<string name="config_non_public_slice_query_uri" translatable="false"></string>

View File

@@ -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<ApplicationInfo> getInstalledApplications() {

View File

@@ -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<String> sBatteryOptimizeModeList = null;
private static List<String> 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,15 +216,33 @@ 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<String> getForceBatteryOptimizeModeList(Context context) {
return Arrays.asList(context.getResources().getStringArray(
if (sBatteryOptimizeModeList == null) {
sBatteryOptimizeModeList = Arrays.asList(
context.getResources().getStringArray(
R.array.config_force_battery_optimize_mode_apps));
}
return sBatteryOptimizeModeList;
}
static List<String> 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(
Context context, @OptimizationMode int mode, int uid, String packageName,

View File

@@ -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<String> allowList) {
static void verifyBatteryOptimizeModeApps(
Context context,
@BatteryOptimizeUtils.OptimizationMode int optimizationMode,
List<String> 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);
}
});

View File

@@ -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<String>());
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
mContext,
BatteryOptimizeUtils.MODE_OPTIMIZED,
new ArrayList<String>());
verifyNoInteractions(mBatteryOptimizeUtils);
}