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

Commit 30594e82 authored by Adam Bookatz's avatar Adam Bookatz
Browse files

Measured screen energy into BatteryStatsHelper

Use measured screen energy usage (where available)
in battery reporting in BatteryStatsHelper, including
total and per-app screen energy usage.

Regardless of the data source (measured screen power usage vs.
estimating from screen time), the blame on apps is 'smeared',
meaning that it is apportioned (after-the-fact) based on each
app's foreground usage. That does not change here.

Also fixes a mistake in Uid.getScreenOnEnergy().

Future followups to do
1. Make getMeasuredOrEstimatedPower more universal (as more
   PowerCalculators follow suit)
2. Support for BatteryUsageStats
3. Deal with voltage properly
4. Toggle whether to report the measured energy on/off.

Test: atest BatteryStatsHelperTest
Bug: 174818228
Change-Id: I0eaa4bc594cb31b4a26b5488b08114cbf80e3884
parent 33feab1d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1656,6 +1656,7 @@ public abstract class BatteryStats implements Parcelable {
        public byte batteryPlugType;

        public short batteryTemperature;
        // Battery voltage in millivolts (mV).
        @UnsupportedAppUsage
        public char batteryVoltage;

+11 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
                    .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah)
                    .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs);
        }
        // TODO(b/178140704): Attribute *measured* total usage for BatteryUsageStats.
    }

    /**
@@ -66,7 +67,8 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
    public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
            long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
        final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType);
        final double powerMah = mPowerEstimator.calculatePower(durationMs);
        final double powerMah = getMeasuredOrEstimatedPower(
                batteryStats.getScreenDozeEnergy(), durationMs);
        if (powerMah > 0) {
            BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0);
            bs.usagePowerMah = powerMah;
@@ -79,4 +81,12 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
    private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) {
        return batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000;
    }

    private double getMeasuredOrEstimatedPower(long measuredEnergyUJ, long durationMs) {
        if (measuredEnergyUJ != BatteryStats.ENERGY_DATA_UNAVAILABLE) {
            return mAhToUJ(measuredEnergyUJ);
        } else {
            return mPowerEstimator.calculatePower(durationMs);
        }
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ public class BatterySipper implements Comparable<BatterySipper> {
    /**
     * Smeared power from screen usage.
     * We split the screen usage power and smear them among apps, based on activity time.
     * The actual screen usage power may be measured or estimated, affecting the granularity and
     * accuracy of the smearing, but the smearing algorithm is essentially the same.
     */
    public double screenPowerMah;

+0 −1
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
+1 −5
Original line number Diff line number Diff line
@@ -8633,11 +8633,7 @@ public class BatteryStatsImpl extends BatteryStats {
        @Override
        public long getScreenOnEnergy() {
            if (mUidMeasuredEnergyStats == null) {
                return ENERGY_DATA_UNAVAILABLE;
            }
            return mUidMeasuredEnergyStats.getAccumulatedBucketEnergy(
                    MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON);
            return getMeasuredEnergyMicroJoules(MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON);
        }
        void initNetworkActivityLocked() {
Loading