Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e322502f authored by Michael Kwan's avatar Michael Kwan
Browse files

Add flag to disable sticky behaviour for battery saver.

Bug: 78239179
Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
Change-Id: I33ce8a0698f1aca8d09096574a3b9e0a31281557
parent 9852064d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3484,4 +3484,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>
+1 −0
Original line number Diff line number Diff line
@@ -3404,6 +3404,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" />
+13 −4
Original line number Diff line number Diff line
@@ -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.)
@@ -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() {
@@ -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,
@@ -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);

@@ -449,6 +456,8 @@ public class BatterySaverStateMachine {
            pw.println(mSettingBatterySaverEnabledSticky);
            pw.print("  mSettingBatterySaverTriggerThreshold=");
            pw.println(mSettingBatterySaverTriggerThreshold);
            pw.print("  mBatterySaverStickyBehaviourDisabled=");
            pw.println(mBatterySaverStickyBehaviourDisabled);
        }
    }

+87 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -173,7 +184,6 @@ public class BatterySaverStateMachineTest {
        mTarget = new TestableBatterySaverStateMachine();

        mDevice.pushBatteryStatus();
        mDevice.pushGlobalSettings();
        mTarget.onBootCompleted();
    }

@@ -498,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);