Loading res/values/config.xml +5 −1 Original line number Diff line number Diff line Loading @@ -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> Loading src/com/android/settings/fuelgauge/BatteryBackupHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +28 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -139,7 +143,7 @@ public class BatteryOptimizeUtils { */ public boolean isSystemOrDefaultApp() { mPowerAllowListBackend.refreshList(); return isSystemOrDefaultApp(mPowerAllowListBackend, mPackageName, mUid); return isSystemOrDefaultApp(mContext, mPowerAllowListBackend, mPackageName, mUid); } /** Loading Loading @@ -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; } Loading @@ -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, Loading src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java +15 −6 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); } }); Loading tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java +16 −9 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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); } Loading Loading
res/values/config.xml +5 −1 Original line number Diff line number Diff line Loading @@ -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> Loading
src/com/android/settings/fuelgauge/BatteryBackupHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -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() { Loading
src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +28 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -139,7 +143,7 @@ public class BatteryOptimizeUtils { */ public boolean isSystemOrDefaultApp() { mPowerAllowListBackend.refreshList(); return isSystemOrDefaultApp(mPowerAllowListBackend, mPackageName, mUid); return isSystemOrDefaultApp(mContext, mPowerAllowListBackend, mPackageName, mUid); } /** Loading Loading @@ -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; } Loading @@ -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, Loading
src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java +15 −6 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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); } }); Loading
tests/robotests/src/com/android/settings/fuelgauge/BatterySettingsMigrateCheckerTest.java +16 −9 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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); } Loading