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

Commit ecd4cfb4 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Fix screen-off power estimation error caused by proportional distribution

Bug: 383037808
Test: atest PowerStatsTests
Flag: EXEMPT bugfix
Change-Id: I77f7d1aa9841ccfaf959838de94e15e0de95c805
parent 79f3b89e
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -5723,7 +5723,9 @@ public class BatteryStatsImpl extends BatteryStats {
                    displayStats.screenDozeTimer.stopRunningLocked(elapsedRealtimeMs);
                    shouldScheduleSync = true;
                    break;
                case Display.STATE_OFF: // fallthrough
                case Display.STATE_OFF:
                    shouldScheduleSync = true;
                    break;
                case Display.STATE_UNKNOWN:
                    // Not tracked by timers.
                    break;
@@ -5756,7 +5758,9 @@ public class BatteryStatsImpl extends BatteryStats {
                    displayStats.screenDozeTimer.startRunningLocked(elapsedRealtimeMs);
                    shouldScheduleSync = true;
                    break;
                case Display.STATE_OFF: // fallthrough
                case Display.STATE_OFF:
                    shouldScheduleSync = true;
                    break;
                case Display.STATE_UNKNOWN:
                    // Not tracked by timers.
                    break;
@@ -5873,7 +5877,7 @@ public class BatteryStatsImpl extends BatteryStats {
        if (shouldScheduleSync) {
            if (mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_SCREEN)) {
                mScreenPowerStatsCollector.schedule();
                mScreenPowerStatsCollector.onScreenStateChange();
            } else {
                final int numDisplays = mPerDisplayBatteryStats.length;
                final int[] displayStates = new int[numDisplays];
+21 −4
Original line number Diff line number Diff line
@@ -111,6 +111,22 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector {
        return true;
    }

    /**
     * Must be called whenever the screen state (on/off/doze) changes.
     */
    public void onScreenStateChange() {
        if (ensureInitialized() && mConsumedEnergyHelper.getEnergyConsumerCount() != 0) {
            // Sync power monitor reading immediately, because the estimation algorithm
            // distributes consumed power proportionally between screen states.
            // Since screen power consumption differs dramatically between different states,
            // this would lead an overestimation in the screen-off state.
            forceSchedule();
            return;
        }
        // Perhaps schedule a sync, allowing throttling
        schedule();
    }

    @Override
    public PowerStats collectStats() {
        if (!ensureInitialized()) {
@@ -126,7 +142,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector {
            long screenOnTimeMs = mScreenUsageTimeRetriever.getScreenOnTimeMs(display);
            if (!mFirstSample) {
                mLayout.setScreenOnDuration(mPowerStats.stats, display,
                        screenOnTimeMs - mLastScreenOnTime[display]);
                        Math.max(0, screenOnTimeMs - mLastScreenOnTime[display]));
            }
            mLastScreenOnTime[display] = screenOnTimeMs;

@@ -135,14 +151,15 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector {
                        mScreenUsageTimeRetriever.getBrightnessLevelTimeMs(display, level);
                if (!mFirstSample) {
                    mLayout.setBrightnessLevelDuration(mPowerStats.stats, display, level,
                            brightnessLevelTimeMs - mLastBrightnessLevelTime[display][level]);
                            Math.max(0, brightnessLevelTimeMs
                                    - mLastBrightnessLevelTime[display][level]));
                }
                mLastBrightnessLevelTime[display][level] = brightnessLevelTimeMs;
            }
            long screenDozeTimeMs = mScreenUsageTimeRetriever.getScreenDozeTimeMs(display);
            if (!mFirstSample) {
                mLayout.setScreenDozeDuration(mPowerStats.stats, display,
                        screenDozeTimeMs - mLastDozeTime[display]);
                        Math.max(0, screenDozeTimeMs - mLastDozeTime[display]));
            }
            mLastDozeTime[display] = screenDozeTimeMs;
        }
@@ -162,7 +179,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector {
            }

            mLayout.setUidTopActivityDuration(uidStats,
                    mLayout.getUidTopActivityDuration(uidStats) + topActivityDuration);
                    Math.max(0, mLayout.getUidTopActivityDuration(uidStats) + topActivityDuration));
        });

        long elapsedRealtime = mClock.elapsedRealtime();