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> <item>content://com.android.settings.slices/intent/media_output_indicator</item>
</string-array> </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 name="config_force_battery_optimize_mode_apps" translatable="false">
</string-array> </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. --> <!-- Uri to query non-public Slice Uris. -->
<string name="config_non_public_slice_query_uri" translatable="false"></string> <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) { private boolean isSystemOrDefaultApp(String packageName, int uid) {
return BatteryOptimizeUtils.isSystemOrDefaultApp( return BatteryOptimizeUtils.isSystemOrDefaultApp(
getPowerAllowlistBackend(), packageName, uid); mContext, getPowerAllowlistBackend(), packageName, uid);
} }
private ArraySet<ApplicationInfo> getInstalledApplications() { private ArraySet<ApplicationInfo> getInstalledApplications() {

View File

@@ -45,6 +45,10 @@ public class BatteryOptimizeUtils {
private static final String TAG = "BatteryOptimizeUtils"; private static final String TAG = "BatteryOptimizeUtils";
private static final String UNKNOWN_PACKAGE = "unknown"; 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 AppOpsManager mAppOpsManager;
@VisibleForTesting BatteryUtils mBatteryUtils; @VisibleForTesting BatteryUtils mBatteryUtils;
@VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend; @VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend;
@@ -139,7 +143,7 @@ public class BatteryOptimizeUtils {
*/ */
public boolean isSystemOrDefaultApp() { public boolean isSystemOrDefaultApp() {
mPowerAllowListBackend.refreshList(); 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. // Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == MODE_OPTIMIZED if (optimizationMode == MODE_OPTIMIZED
|| optimizationMode == MODE_UNKNOWN || optimizationMode == MODE_UNKNOWN
|| isSystemOrDefaultApp(allowlistBackend, info.packageName, info.uid)) { || isSystemOrDefaultApp(
context, allowlistBackend, info.packageName, info.uid)) {
continue; continue;
} }
@@ -211,15 +216,33 @@ public class BatteryOptimizeUtils {
} }
static boolean isSystemOrDefaultApp( static boolean isSystemOrDefaultApp(
PowerAllowlistBackend powerAllowlistBackend, String packageName, int uid) { Context context,
PowerAllowlistBackend powerAllowlistBackend,
String packageName,
int uid) {
return powerAllowlistBackend.isSysAllowlisted(packageName) return powerAllowlistBackend.isSysAllowlisted(packageName)
// Always forced unrestricted apps are one type of system important apps.
|| getForceBatteryUnrestrictModeList(context).contains(packageName)
|| powerAllowlistBackend.isDefaultActiveApp(packageName, uid); || powerAllowlistBackend.isDefaultActiveApp(packageName, uid);
} }
static List<String> getForceBatteryOptimizeModeList(Context context) { 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)); 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( private static void setAppUsageStateInternal(
Context context, @OptimizationMode int mode, int uid, String packageName, 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 */ /** Avoid users set important apps into the unexpected battery optimize modes */
static void verifyBatteryOptimizeModes(Context context) { static void verifyBatteryOptimizeModes(Context context) {
Log.d(TAG, "invoke verifyOptimizationModes()"); Log.d(TAG, "invoke verifyOptimizationModes()");
verifyBatteryOptimizeModes(context, verifyBatteryOptimizeModeApps(
context,
BatteryOptimizeUtils.MODE_OPTIMIZED,
BatteryOptimizeUtils.getForceBatteryOptimizeModeList(context)); BatteryOptimizeUtils.getForceBatteryOptimizeModeList(context));
verifyBatteryOptimizeModeApps(
context,
BatteryOptimizeUtils.MODE_UNRESTRICTED,
BatteryOptimizeUtils.getForceBatteryUnrestrictModeList(context));
} }
@VisibleForTesting @VisibleForTesting
static void verifyBatteryOptimizeModes(Context context, List<String> allowList) { static void verifyBatteryOptimizeModeApps(
Context context,
@BatteryOptimizeUtils.OptimizationMode int optimizationMode,
List<String> allowList) {
allowList.forEach(packageName -> { allowList.forEach(packageName -> {
final BatteryOptimizeUtils batteryOptimizeUtils = final BatteryOptimizeUtils batteryOptimizeUtils =
BatteryBackupHelper.newBatteryOptimizeUtils(context, packageName, BatteryBackupHelper.newBatteryOptimizeUtils(context, packageName,
@@ -69,10 +78,10 @@ public final class BatterySettingsMigrateChecker extends BroadcastReceiver {
if (batteryOptimizeUtils == null) { if (batteryOptimizeUtils == null) {
return; return;
} }
if (batteryOptimizeUtils.getAppOptimizationMode() != if (batteryOptimizeUtils.getAppOptimizationMode() != optimizationMode) {
BatteryOptimizeUtils.MODE_OPTIMIZED) { Log.w(TAG, "Reset " + packageName + " battery mode into " + optimizationMode);
Log.w(TAG, "Reset optimization mode for: " + packageName); batteryOptimizeUtils.setAppUsageState(
batteryOptimizeUtils.setAppUsageState(BatteryOptimizeUtils.MODE_OPTIMIZED, optimizationMode,
BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET); BatteryOptimizeHistoricalLogEntry.Action.FORCE_RESET);
} }
}); });

View File

@@ -151,12 +151,15 @@ public final class BatterySettingsMigrateCheckerTest {
} }
@Test @Test
public void verifyBatteryOptimizeModes_inAllowList_resetOptimizationMode() throws Exception { public void verifyBatteryOptimizeModeApps_inAllowList_resetOptimizationMode()
throws Exception {
doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils) doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode(); .getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes( mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
mContext, Arrays.asList(PACKAGE_NAME)); mContext,
BatteryOptimizeUtils.MODE_OPTIMIZED,
Arrays.asList(PACKAGE_NAME));
final InOrder inOrder = inOrder(mBatteryOptimizeUtils); final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
inOrder.verify(mBatteryOptimizeUtils).getAppOptimizationMode(); inOrder.verify(mBatteryOptimizeUtils).getAppOptimizationMode();
@@ -166,23 +169,27 @@ public final class BatterySettingsMigrateCheckerTest {
} }
@Test @Test
public void verifyBatteryOptimizeModes_optimizedMode_noAction() throws Exception { public void verifyBatteryOptimizeModeApps_optimizedMode_noAction() throws Exception {
doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED).when(mBatteryOptimizeUtils) doReturn(BatteryOptimizeUtils.MODE_OPTIMIZED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode(); .getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes( mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
mContext, Arrays.asList(PACKAGE_NAME)); mContext,
BatteryOptimizeUtils.MODE_OPTIMIZED,
Arrays.asList(PACKAGE_NAME));
verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any()); verify(mBatteryOptimizeUtils, never()).setAppUsageState(anyInt(), any());
} }
@Test @Test
public void verifyBatteryOptimizeModes_notInAllowList_noAction() throws Exception { public void verifyBatteryOptimizeModeApps_notInAllowList_noAction() throws Exception {
doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils) doReturn(BatteryOptimizeUtils.MODE_RESTRICTED).when(mBatteryOptimizeUtils)
.getAppOptimizationMode(); .getAppOptimizationMode();
mBatterySettingsMigrateChecker.verifyBatteryOptimizeModes( mBatterySettingsMigrateChecker.verifyBatteryOptimizeModeApps(
mContext, new ArrayList<String>()); mContext,
BatteryOptimizeUtils.MODE_OPTIMIZED,
new ArrayList<String>());
verifyNoInteractions(mBatteryOptimizeUtils); verifyNoInteractions(mBatteryOptimizeUtils);
} }