Loading core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -3487,4 +3487,7 @@ <!-- Whether or not we should show the option to show battery percentage --> <bool name="config_battery_percentage_setting_available">true</bool> <!-- Whether or not battery saver should be "sticky" when manually enabled. --> <bool name="config_batterySaverStickyBehaviourDisabled">false</bool> </resources> core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3405,6 +3405,7 @@ <java-symbol type="string" name="notification_app_name_settings" /> <java-symbol type="integer" name="config_lowBatteryAutoTriggerDefaultLevel" /> <java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" /> <!-- For car devices --> <java-symbol type="string" name="car_loading_profile" /> Loading services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java +13 −4 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ public class BatterySaverStateMachine { @GuardedBy("mLock") private boolean mSettingBatterySaverEnabledSticky; /** Config flag to track if battery saver's sticky behaviour is disabled. */ private final boolean mBatterySaverStickyBehaviourDisabled; /** * Previously known value of Global.LOW_POWER_MODE_TRIGGER_LEVEL. * (Currently only used in dumpsys.) Loading Loading @@ -124,6 +127,9 @@ public class BatterySaverStateMachine { mLock = lock; mContext = context; mBatterySaverController = batterySaverController; mBatterySaverStickyBehaviourDisabled = mContext.getResources().getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled); } private boolean isBatterySaverEnabled() { Loading Loading @@ -304,7 +310,7 @@ public class BatterySaverStateMachine { BatterySaverController.REASON_PLUGGED_IN, "Plugged in"); } else if (mSettingBatterySaverEnabledSticky) { } else if (mSettingBatterySaverEnabledSticky && !mBatterySaverStickyBehaviourDisabled) { // Re-enable BS. enableBatterySaverLocked(/*enable=*/ true, /*manual=*/ true, BatterySaverController.REASON_STICKY_RESTORE, Loading Loading @@ -383,8 +389,9 @@ public class BatterySaverStateMachine { putGlobalSetting(Global.LOW_POWER_MODE, enable ? 1 : 0); if (manual) { mSettingBatterySaverEnabledSticky = enable; putGlobalSetting(Global.LOW_POWER_MODE_STICKY, enable ? 1 : 0); mSettingBatterySaverEnabledSticky = !mBatterySaverStickyBehaviourDisabled && enable; putGlobalSetting(Global.LOW_POWER_MODE_STICKY, mSettingBatterySaverEnabledSticky ? 1 : 0); } mBatterySaverController.enableBatterySaver(enable, intReason); Loading Loading @@ -449,6 +456,8 @@ public class BatterySaverStateMachine { pw.println(mSettingBatterySaverEnabledSticky); pw.print(" mSettingBatterySaverTriggerThreshold="); pw.println(mSettingBatterySaverTriggerThreshold); pw.print(" mBatterySaverStickyBehaviourDisabled="); pw.println(mBatterySaverStickyBehaviourDisabled); } } Loading services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java +87 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.res.Resources; import android.provider.Settings.Global; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; Loading @@ -48,12 +49,18 @@ public class BatterySaverStateMachineTest { private BatterySaverController mMockBatterySaverController; private Device mDevice; private TestableBatterySaverStateMachine mTarget; private Resources mMockResources; private class MyMockContext extends MockContext { @Override public ContentResolver getContentResolver() { return mMockContextResolver; } @Override public Resources getResources() { return mMockResources; } } private DevicePersistedState mPersistedState; Loading Loading @@ -157,11 +164,15 @@ public class BatterySaverStateMachineTest { mMockContext = new MyMockContext(); mMockContextResolver = mock(ContentResolver.class); mMockBatterySaverController = mock(BatterySaverController.class); mMockResources = mock(Resources.class); doAnswer((inv) -> mDevice.batterySaverEnabled = inv.getArgument(0)) .when(mMockBatterySaverController).enableBatterySaver(anyBoolean(), anyInt()); when(mMockBatterySaverController.isEnabled()) .thenAnswer((inv) -> mDevice.batterySaverEnabled); when(mMockResources.getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled)) .thenReturn(false); mPersistedState = new DevicePersistedState(); initDevice(); Loading Loading @@ -497,8 +508,83 @@ public class BatterySaverStateMachineTest { } @Test public void testNoAutoBatterySaver_fromAdb() { public void testAutoBatterySaver_withStickyDisabled() { when(mMockResources.getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled)) .thenReturn(true); initDevice(); mDevice.putGlobalSetting(Global.LOW_POWER_MODE_TRIGGER_LEVEL, 50); mTarget.setBatterySaverEnabledManually(true); assertEquals(true, mDevice.batterySaverEnabled); assertEquals(100, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setBatteryLevel(30); assertEquals(true, mDevice.batterySaverEnabled); assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setBatteryLevel(80); assertEquals(false, mDevice.batterySaverEnabled); // Not sticky. assertEquals(80, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setPowered(true); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(80, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setBatteryLevel(30); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setPowered(false); assertEquals(true, mDevice.batterySaverEnabled); // Restores BS. assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setPowered(true); mDevice.setBatteryLevel(90); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); initDevice(); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setPowered(false); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mTarget.setBatterySaverEnabledManually(false); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); initDevice(); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); } @Test public void testNoAutoBatterySaver_fromAdb() { assertEquals(0, mDevice.getLowPowerModeTriggerLevel()); assertEquals(false, mDevice.batterySaverEnabled); Loading Loading
core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -3487,4 +3487,7 @@ <!-- Whether or not we should show the option to show battery percentage --> <bool name="config_battery_percentage_setting_available">true</bool> <!-- Whether or not battery saver should be "sticky" when manually enabled. --> <bool name="config_batterySaverStickyBehaviourDisabled">false</bool> </resources>
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3405,6 +3405,7 @@ <java-symbol type="string" name="notification_app_name_settings" /> <java-symbol type="integer" name="config_lowBatteryAutoTriggerDefaultLevel" /> <java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" /> <!-- For car devices --> <java-symbol type="string" name="car_loading_profile" /> Loading
services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java +13 −4 Original line number Diff line number Diff line Loading @@ -84,6 +84,9 @@ public class BatterySaverStateMachine { @GuardedBy("mLock") private boolean mSettingBatterySaverEnabledSticky; /** Config flag to track if battery saver's sticky behaviour is disabled. */ private final boolean mBatterySaverStickyBehaviourDisabled; /** * Previously known value of Global.LOW_POWER_MODE_TRIGGER_LEVEL. * (Currently only used in dumpsys.) Loading Loading @@ -124,6 +127,9 @@ public class BatterySaverStateMachine { mLock = lock; mContext = context; mBatterySaverController = batterySaverController; mBatterySaverStickyBehaviourDisabled = mContext.getResources().getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled); } private boolean isBatterySaverEnabled() { Loading Loading @@ -304,7 +310,7 @@ public class BatterySaverStateMachine { BatterySaverController.REASON_PLUGGED_IN, "Plugged in"); } else if (mSettingBatterySaverEnabledSticky) { } else if (mSettingBatterySaverEnabledSticky && !mBatterySaverStickyBehaviourDisabled) { // Re-enable BS. enableBatterySaverLocked(/*enable=*/ true, /*manual=*/ true, BatterySaverController.REASON_STICKY_RESTORE, Loading Loading @@ -383,8 +389,9 @@ public class BatterySaverStateMachine { putGlobalSetting(Global.LOW_POWER_MODE, enable ? 1 : 0); if (manual) { mSettingBatterySaverEnabledSticky = enable; putGlobalSetting(Global.LOW_POWER_MODE_STICKY, enable ? 1 : 0); mSettingBatterySaverEnabledSticky = !mBatterySaverStickyBehaviourDisabled && enable; putGlobalSetting(Global.LOW_POWER_MODE_STICKY, mSettingBatterySaverEnabledSticky ? 1 : 0); } mBatterySaverController.enableBatterySaver(enable, intReason); Loading Loading @@ -449,6 +456,8 @@ public class BatterySaverStateMachine { pw.println(mSettingBatterySaverEnabledSticky); pw.print(" mSettingBatterySaverTriggerThreshold="); pw.println(mSettingBatterySaverTriggerThreshold); pw.print(" mBatterySaverStickyBehaviourDisabled="); pw.println(mBatterySaverStickyBehaviourDisabled); } } Loading
services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java +87 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.res.Resources; import android.provider.Settings.Global; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; Loading @@ -48,12 +49,18 @@ public class BatterySaverStateMachineTest { private BatterySaverController mMockBatterySaverController; private Device mDevice; private TestableBatterySaverStateMachine mTarget; private Resources mMockResources; private class MyMockContext extends MockContext { @Override public ContentResolver getContentResolver() { return mMockContextResolver; } @Override public Resources getResources() { return mMockResources; } } private DevicePersistedState mPersistedState; Loading Loading @@ -157,11 +164,15 @@ public class BatterySaverStateMachineTest { mMockContext = new MyMockContext(); mMockContextResolver = mock(ContentResolver.class); mMockBatterySaverController = mock(BatterySaverController.class); mMockResources = mock(Resources.class); doAnswer((inv) -> mDevice.batterySaverEnabled = inv.getArgument(0)) .when(mMockBatterySaverController).enableBatterySaver(anyBoolean(), anyInt()); when(mMockBatterySaverController.isEnabled()) .thenAnswer((inv) -> mDevice.batterySaverEnabled); when(mMockResources.getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled)) .thenReturn(false); mPersistedState = new DevicePersistedState(); initDevice(); Loading Loading @@ -497,8 +508,83 @@ public class BatterySaverStateMachineTest { } @Test public void testNoAutoBatterySaver_fromAdb() { public void testAutoBatterySaver_withStickyDisabled() { when(mMockResources.getBoolean( com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled)) .thenReturn(true); initDevice(); mDevice.putGlobalSetting(Global.LOW_POWER_MODE_TRIGGER_LEVEL, 50); mTarget.setBatterySaverEnabledManually(true); assertEquals(true, mDevice.batterySaverEnabled); assertEquals(100, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setBatteryLevel(30); assertEquals(true, mDevice.batterySaverEnabled); assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setBatteryLevel(80); assertEquals(false, mDevice.batterySaverEnabled); // Not sticky. assertEquals(80, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setPowered(true); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(80, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setBatteryLevel(30); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setPowered(false); assertEquals(true, mDevice.batterySaverEnabled); // Restores BS. assertEquals(30, mPersistedState.batteryLevel); assertEquals(true, mPersistedState.batteryLow); mDevice.setPowered(true); mDevice.setBatteryLevel(90); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); initDevice(); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mDevice.setPowered(false); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); mTarget.setBatterySaverEnabledManually(false); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); initDevice(); assertEquals(false, mDevice.batterySaverEnabled); assertEquals(90, mPersistedState.batteryLevel); assertEquals(false, mPersistedState.batteryLow); } @Test public void testNoAutoBatterySaver_fromAdb() { assertEquals(0, mDevice.getLowPowerModeTriggerLevel()); assertEquals(false, mDevice.batterySaverEnabled); Loading