@GuardedBy("mLock")
private int mBatteryLevel;
- /** Whether the battery level is considered to be "low" or not.*/
+ /** Whether the battery level is considered to be "low" or not. */
@GuardedBy("mLock")
private boolean mIsBatteryLevelLow;
@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.)
mLock = lock;
mContext = context;
mBatterySaverController = batterySaverController;
+
+ mBatterySaverStickyBehaviourDisabled = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled);
}
private boolean isBatterySaverEnabled() {
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,
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);
pw.println(mSettingBatterySaverEnabledSticky);
pw.print(" mSettingBatterySaverTriggerThreshold=");
pw.println(mSettingBatterySaverTriggerThreshold);
+ pw.print(" mBatterySaverStickyBehaviourDisabled=");
+ pw.println(mBatterySaverStickyBehaviourDisabled);
}
}
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;
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;
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();
mTarget = new TestableBatterySaverStateMachine();
mDevice.pushBatteryStatus();
- mDevice.pushGlobalSettings();
mTarget.onBootCompleted();
}
}
@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);