diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index be1ea31169f..c0670942834 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -19,8 +19,8 @@ package com.android.settings.fuelgauge; import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; -import android.app.settings.SettingsEnums; import android.app.backup.BackupManager; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -361,18 +361,20 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final String stateString; final String footerString; - if (!mBatteryOptimizeUtils.isValidPackageName()) { - //Present optimized only string when the package name is invalid. + if (!mBatteryOptimizeUtils.isValidPackageName() + || mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) { + // Present optimized only string when the package name is invalid or + // it's in allow list not idle app. stateString = context.getString(R.string.manager_battery_usage_optimized_only); footerString = context.getString( R.string.manager_battery_usage_footer_limited, stateString); } else if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) { - //Present unrestricted only string when the package is system or default active app. + // Present unrestricted only string when the package is system or default active app. stateString = context.getString(R.string.manager_battery_usage_unrestricted_only); footerString = context.getString( R.string.manager_battery_usage_footer_limited, stateString); } else { - //Present default string to normal app. + // Present default string to normal app. footerString = context.getString(R.string.manager_battery_usage_footer); } mFooterPreference.setTitle(footerString); diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index db29ac6e549..11528a66186 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -130,6 +130,13 @@ public class BatteryOptimizeUtils { || mPowerAllowListBackend.isDefaultActiveApp(mPackageName); } + /** + * Return {@code true} if this package is in allow list except idle app. + */ + public boolean isAllowlistedExceptIdleApp() { + return mPowerAllowListBackend.isAllowlistedExceptIdle(mPackageName); + } + String getPackageName() { return mPackageName == null ? UNKNOWN_PACKAGE : mPackageName; } diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java index ffec50d4f53..ef2339729f5 100644 --- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java @@ -57,6 +57,10 @@ public class OptimizedPreferenceController extends AbstractPreferenceController Log.d(TAG, "is system or default app, disable pref"); ((RadioButtonPreference) preference).setChecked(false); preference.setEnabled(false); + } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) { + Log.d(TAG, "in allow list not idle app, optimized states only"); + preference.setEnabled(true); + ((RadioButtonPreference) preference).setChecked(true); } else if (mBatteryOptimizeUtils.getAppOptimizationMode() == BatteryOptimizeUtils.MODE_OPTIMIZED) { Log.d(TAG, "is optimized states"); diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java index d50926e6177..230b1fcb415 100644 --- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java @@ -55,6 +55,9 @@ public class RestrictedPreferenceController extends AbstractPreferenceController Log.d(TAG, "is system or default app, disable pref"); ((RadioButtonPreference) preference).setChecked(false); preference.setEnabled(false); + } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) { + Log.d(TAG, "in allow list not idle app, disable perf"); + preference.setEnabled(false); } else if (mBatteryOptimizeUtils.getAppOptimizationMode() == BatteryOptimizeUtils.MODE_RESTRICTED) { Log.d(TAG, "is restricted states"); diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java index 1d66c6c6cdd..f8ee6513779 100644 --- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java @@ -53,6 +53,9 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) { Log.d(TAG, "is system or default app, unrestricted states only"); ((RadioButtonPreference) preference).setChecked(true); + } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) { + Log.d(TAG, "in allow list not idle app, disable perf"); + preference.setEnabled(false); } else if (mBatteryOptimizeUtils.getAppOptimizationMode() == BatteryOptimizeUtils.MODE_UNRESTRICTED) { Log.d(TAG, "is unrestricted states"); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index a2e78c3a2b5..ac85d976a4f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -745,6 +745,16 @@ public class AdvancedPowerUsageDetailTest { .isEqualTo("This app requires optimized battery usage."); } + @Test + public void testInitPreferenceForTriState_isAllowlistedExceptIdleApp_hasCorrectString() { + when(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true); + + mFragment.initPreferenceForTriState(mContext); + + assertThat(mFooterPreference.getTitle().toString()) + .isEqualTo("This app requires optimized battery usage."); + } + @Test public void testInitPreferenceForTriState_isSystemOrDefaultApp_hasCorrectString() { when(mBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 53101c04d1b..c32be187e37 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -124,6 +124,18 @@ public class BatteryOptimizeUtilsTest { assertThat(mBatteryOptimizeUtils.isValidPackageName()).isTrue(); } + @Test + public void testIsAllowlistedExpectIdle_isAllowlistedExceptIdle_returnTrue() { + when(mMockBackend.isAllowlistedExceptIdle(anyString())).thenReturn(true); + + assertThat(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).isTrue(); + } + + @Test + public void testIsAllowlistedExpectIdle_notAllowlistedExpectIdle_returnFalse() { + assertThat(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).isFalse(); + } + @Test public void testSetAppOptimizationMode_Restricted_verifyAction() { // Sets the current mode as MODE_UNRESTRICTED. diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java index 9df3ac90cb4..923855d3e30 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java @@ -93,6 +93,16 @@ public class OptimizedPreferenceControllerTest { assertThat(mPreference.isChecked()).isFalse(); } + @Test + public void testUpdateState_isAllowlistedExceptIdleApp_prefEnabled() { + when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mPreference.isChecked()).isTrue(); + } + @Test public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() { mPreference.setKey(mController.KEY_OPTIMIZED_PREF); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java index 09861536edd..7b4271f564c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java @@ -101,6 +101,16 @@ public class RestrictedPreferenceControllerTest { assertThat(mPreference.isChecked()).isFalse(); } + @Test + public void testUpdateState_isAllowlistedExceptIdleApp_prefDisabled() { + when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isChecked()).isFalse(); + assertThat(mPreference.isEnabled()).isFalse(); + } + @Test public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() { mPreference.setKey(mController.KEY_RESTRICTED_PREF); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java index 004e97ce6fe..505278419d8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java @@ -101,6 +101,16 @@ public class UnrestrictedPreferenceControllerTest { assertThat(mPreference.isChecked()).isFalse(); } + @Test + public void testUpdateState_isAllowlistedExceptIdleApp_prefDisabled() { + when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true); + + mController.updateState(mPreference); + + assertThat(mPreference.isChecked()).isFalse(); + assertThat(mPreference.isEnabled()).isFalse(); + } + @Test public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() { mPreference.setKey(mController.KEY_UNRESTRICTED_PREF);