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

Commit e031d509 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Update BatteryStatsImpl to handle multidisplay

Add screen on and doze timers for multiple displays.

For Battery history, charge/discharge logs and UnsupportedAppUsage, the
legacy screen state timers remain, as well. The legacy timers and
screen state tracking will now track overall screen state of the device.
The current overall screen state is the most "important" state currently
active.
Order of screen state importance is: on, doze, doze suspend, off.

Note: Utilizing per display measured energy will be handled in a follow
up CL.

Bug: 194107383
Test: atest FrameworksCoreTests:BatteryStatsTests
Change-Id: I4ad4f54b6897f406e4ec0f59834dd4762083e0d8
Merged-In: I4ad4f54b6897f406e4ec0f59834dd4762083e0d8
parent d54349db
Loading
Loading
Loading
Loading
+97 −0
Original line number Diff line number Diff line
@@ -2302,6 +2302,38 @@ public abstract class BatteryStats implements Parcelable {
     */
    public abstract Timer getScreenBrightnessTimer(int brightnessBin);

    /**
     * Returns the number of physical displays on the device.
     *
     * {@hide}
     */
    public abstract int getDisplayCount();

    /**
     * Returns the time in microseconds that the screen has been on for a display while the
     * device was running on battery.
     *
     * {@hide}
     */
    public abstract long getDisplayScreenOnTime(int display, long elapsedRealtimeUs);

    /**
     * Returns the time in microseconds that a display has been dozing while the device was
     * running on battery.
     *
     * {@hide}
     */
    public abstract long getDisplayScreenDozeTime(int display, long elapsedRealtimeUs);

    /**
     * Returns the time in microseconds that a display has been on with the given brightness
     * level while the device was running on battery.
     *
     * {@hide}
     */
    public abstract long getDisplayScreenBrightnessTime(int display, int brightnessBin,
            long elapsedRealtimeUs);

    /**
     * Returns the time in microseconds that power save mode has been enabled while the device was
     * running on battery.
@@ -5038,6 +5070,71 @@ public abstract class BatteryStats implements Parcelable {
            pw.println(sb.toString());
        }

        final int numDisplays = getDisplayCount();
        if (numDisplays > 1) {
            pw.println("");
            pw.print(prefix);
            sb.setLength(0);
            sb.append(prefix);
            sb.append("  MULTI-DISPLAY POWER SUMMARY START");
            pw.println(sb.toString());

            for (int display = 0; display < numDisplays; display++) {
                sb.setLength(0);
                sb.append(prefix);
                sb.append("  Display ");
                sb.append(display);
                sb.append(" Statistics:");
                pw.println(sb.toString());

                final long displayScreenOnTime = getDisplayScreenOnTime(display, rawRealtime);
                sb.setLength(0);
                sb.append(prefix);
                sb.append("    Screen on: ");
                formatTimeMs(sb, displayScreenOnTime / 1000);
                sb.append("(");
                sb.append(formatRatioLocked(displayScreenOnTime, whichBatteryRealtime));
                sb.append(") ");
                pw.println(sb.toString());

                sb.setLength(0);
                sb.append("    Screen brightness levels:");
                didOne = false;
                for (int bin = 0; bin < NUM_SCREEN_BRIGHTNESS_BINS; bin++) {
                    final long timeUs = getDisplayScreenBrightnessTime(display, bin, rawRealtime);
                    if (timeUs == 0) {
                        continue;
                    }
                    didOne = true;
                    sb.append("\n      ");
                    sb.append(prefix);
                    sb.append(SCREEN_BRIGHTNESS_NAMES[bin]);
                    sb.append(" ");
                    formatTimeMs(sb, timeUs / 1000);
                    sb.append("(");
                    sb.append(formatRatioLocked(timeUs, displayScreenOnTime));
                    sb.append(")");
                }
                if (!didOne) sb.append(" (no activity)");
                pw.println(sb.toString());

                final long displayScreenDozeTimeUs = getDisplayScreenDozeTime(display, rawRealtime);
                sb.setLength(0);
                sb.append(prefix);
                sb.append("    Screen Doze: ");
                formatTimeMs(sb, displayScreenDozeTimeUs / 1000);
                sb.append("(");
                sb.append(formatRatioLocked(displayScreenDozeTimeUs, whichBatteryRealtime));
                sb.append(") ");
                pw.println(sb.toString());
            }
            pw.print(prefix);
            sb.setLength(0);
            sb.append(prefix);
            sb.append("  MULTI-DISPLAY POWER SUMMARY END");
            pw.println(sb.toString());
        }

        pw.println("");
        pw.print(prefix);
        sb.setLength(0);
+357 −30

File changed.

Preview size limit exceeded, changes collapsed.

+4 −4
Original line number Diff line number Diff line
@@ -47,13 +47,13 @@ public class AmbientDisplayPowerCalculatorTest {

        stats.updateDisplayMeasuredEnergyStatsLocked(300_000_000, Display.STATE_ON, 0);

        stats.noteScreenStateLocked(Display.STATE_DOZE, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS,
        stats.noteScreenStateLocked(0, Display.STATE_DOZE, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS,
                30 * MINUTE_IN_MS);

        stats.updateDisplayMeasuredEnergyStatsLocked(200_000_000, Display.STATE_DOZE,
                30 * MINUTE_IN_MS);

        stats.noteScreenStateLocked(Display.STATE_OFF, 120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS,
        stats.noteScreenStateLocked(0, Display.STATE_OFF, 120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS,
                120 * MINUTE_IN_MS);

        stats.updateDisplayMeasuredEnergyStatsLocked(100_000_000, Display.STATE_OFF,
@@ -78,9 +78,9 @@ public class AmbientDisplayPowerCalculatorTest {
    public void testPowerProfileBasedModel() {
        BatteryStatsImpl stats = mStatsRule.getBatteryStats();

        stats.noteScreenStateLocked(Display.STATE_DOZE, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS,
        stats.noteScreenStateLocked(0, Display.STATE_DOZE, 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS,
                30 * MINUTE_IN_MS);
        stats.noteScreenStateLocked(Display.STATE_OFF, 120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS,
        stats.noteScreenStateLocked(0, Display.STATE_OFF, 120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS,
                120 * MINUTE_IN_MS);

        AmbientDisplayPowerCalculator calculator =
+429 −11

File changed.

Preview size limit exceeded, changes collapsed.

+13 −3
Original line number Diff line number Diff line
@@ -39,13 +39,14 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
    public BatteryStatsImpl.Clocks clocks;
    public boolean mForceOnBattery;
    private NetworkStats mNetworkStats;
    private DummyExternalStatsSync mExternalStatsSync = new DummyExternalStatsSync();

    MockBatteryStatsImpl(Clocks clocks) {
        super(clocks);
        this.clocks = mClocks;
        initTimersAndCounters();

        setExternalStatsSyncLocked(new DummyExternalStatsSync());
        setExternalStatsSyncLocked(mExternalStatsSync);
        informThatAllExternalStatsAreFlushed();

        // A no-op handler.
@@ -182,7 +183,15 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
        return mPendingUids;
    }

    public int getAndClearExternalStatsSyncFlags() {
        final int flags = mExternalStatsSync.flags;
        mExternalStatsSync.flags = 0;
        return flags;
    }

    private class DummyExternalStatsSync implements ExternalStatsSync {
        public int flags = 0;

        @Override
        public Future<?> scheduleSync(String reason, int flags) {
            return null;
@@ -211,8 +220,9 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {
        }

        @Override
        public Future<?> scheduleSyncDueToScreenStateChange(
                int flag, boolean onBattery, boolean onBatteryScreenOff, int screenState) {
        public Future<?> scheduleSyncDueToScreenStateChange(int flag, boolean onBattery,
                boolean onBatteryScreenOff, int screenState, int[] perDisplayScreenStates) {
            flags |= flag;
            return null;
        }

Loading