diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index dada8142adc..f6bf921d14d 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; @@ -362,18 +362,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 d8bf27de6ca..2bb7ecf164f 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"); ((SelectorWithWidgetPreference) 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); + ((SelectorWithWidgetPreference) 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 ebe656375e5..07bd19da1e6 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"); ((SelectorWithWidgetPreference) 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 f55be58dda1..1b106a70de9 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"); ((SelectorWithWidgetPreference) 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 b99562add73..c92adf2bffc 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 3f8aaeb537e..088a906ab87 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 1776ad35c20..a9a784f5b23 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 47d59b4098d..6ff7f31676f 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);