Merge "Add a flow to keep special apps in the battery unrestricted mode" into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
0201afb9d5
@@ -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>
|
||||||
|
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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,
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user