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

Commit a7724753 authored by Mike Ma's avatar Mike Ma
Browse files

Attribute UNKNOWN display state to OFF

When device restarts, screen state is set to unknown, all
timebases stop. Then if setBatteryStateLocked() is called
with unplugged state, onBatteryTimeBase starts, but
onBatteryScreenOffTimeBase does not, so does ScreenOnTimer,
since screen state == unknown. So this duration is lost.
This fix attributes unknown state to ScreenOff.

Fixes: 67608353
Test: added a unit test in BatteryStatsNoteTest
Change-Id: Iee68898522564963e7d0b0110f1aee9248aacfe8
parent 056dd6aa
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3588,7 +3588,7 @@ public class BatteryStatsImpl extends BatteryStats {
    public void updateTimeBasesLocked(boolean unplugged, int screenState, long uptime,
            long realtime) {
        final boolean screenOff = isScreenOff(screenState) || isScreenDoze(screenState);
        final boolean screenOff = !isScreenOn(screenState);
        final boolean updateOnBatteryTimeBase = unplugged != mOnBatteryTimeBase.isRunning();
        final boolean updateOnBatteryScreenOffTimeBase =
                (unplugged && screenOff) != mOnBatteryScreenOffTimeBase.isRunning();
@@ -9463,7 +9463,7 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    public boolean isScreenOn(int state) {
        return state == Display.STATE_ON;
        return state == Display.STATE_ON || state == Display.STATE_VR;
    }
    public boolean isScreenOff(int state) {
+49 −1
Original line number Diff line number Diff line
@@ -214,7 +214,7 @@ public class BatteryStatsNoteTest extends TestCase{
        assertTrue(bi.getOnBatteryScreenOffTimeBase().isRunning());
    }

    /** Test BatteryStatsImpl.noteScreenStateLocked. */
    /** Test BatteryStatsImpl.noteScreenStateLocked sets timebases and screen states correctly. */
    @SmallTest
    public void testNoteScreenStateLocked() throws Exception {
        final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
@@ -233,4 +233,52 @@ public class BatteryStatsNoteTest extends TestCase{
        assertEquals(bi.getScreenState(), Display.STATE_OFF);
    }

    /** Test BatteryStatsImpl.noteScreenStateLocked updates timers correctly.
     *
     *  Unknown and doze should both be subset of off state
     *
     *  Timeline 0----100----200----310----400------------1000
     *  Unknown         -------
     *  On                     -------
     *  Off             -------       ----------------------
     *  Doze                                ----------------
     */
    @SmallTest
    public void testNoteScreenStateTimersLocked() throws Exception {
        final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
        MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);

        clocks.realtime = clocks.uptime = 100;
        // Device startup, setOnBatteryLocked calls updateTimebases
        bi.updateTimeBasesLocked(true, Display.STATE_UNKNOWN, 100_000, 100_000);
        // Turn on display at 200us
        clocks.realtime = clocks.uptime = 200;
        bi.noteScreenStateLocked(Display.STATE_ON);
        assertEquals(150_000, bi.computeBatteryRealtime(250_000, STATS_SINCE_CHARGED));
        assertEquals(100_000, bi.computeBatteryScreenOffRealtime(250_000, STATS_SINCE_CHARGED));
        assertEquals(50_000, bi.getScreenOnTime(250_000, STATS_SINCE_CHARGED));
        assertEquals(0, bi.getScreenDozeTime(250_000, STATS_SINCE_CHARGED));

        clocks.realtime = clocks.uptime = 310;
        bi.noteScreenStateLocked(Display.STATE_OFF);
        assertEquals(250_000, bi.computeBatteryRealtime(350_000, STATS_SINCE_CHARGED));
        assertEquals(140_000, bi.computeBatteryScreenOffRealtime(350_000, STATS_SINCE_CHARGED));
        assertEquals(110_000, bi.getScreenOnTime(350_000, STATS_SINCE_CHARGED));
        assertEquals(0, bi.getScreenDozeTime(350_000, STATS_SINCE_CHARGED));

        clocks.realtime = clocks.uptime = 400;
        bi.noteScreenStateLocked(Display.STATE_DOZE);
        assertEquals(400_000, bi.computeBatteryRealtime(500_000, STATS_SINCE_CHARGED));
        assertEquals(290_000, bi.computeBatteryScreenOffRealtime(500_000, STATS_SINCE_CHARGED));
        assertEquals(110_000, bi.getScreenOnTime(500_000, STATS_SINCE_CHARGED));
        assertEquals(100_000, bi.getScreenDozeTime(500_000, STATS_SINCE_CHARGED));

        clocks.realtime = clocks.uptime = 1000;
        bi.noteScreenStateLocked(Display.STATE_OFF);
        assertEquals(1400_000, bi.computeBatteryRealtime(1500_000, STATS_SINCE_CHARGED));
        assertEquals(1290_000, bi.computeBatteryScreenOffRealtime(1500_000, STATS_SINCE_CHARGED));
        assertEquals(110_000, bi.getScreenOnTime(1500_000, STATS_SINCE_CHARGED));
        assertEquals(600_000, bi.getScreenDozeTime(1500_000, STATS_SINCE_CHARGED));
    }

}