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

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

Use battery capacity estimates provided by Health HAL

Bug: 186807039
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryChargeCalculatorTest
Change-Id: I4eb1606843ca1f2f2c0589e0abe6408f6be149c5
parent acc4e145
Loading
Loading
Loading
Loading
+23 −7
Original line number Diff line number Diff line
@@ -3233,6 +3233,11 @@ public abstract class BatteryStats implements Parcelable {
     */
    public abstract int getMaxLearnedBatteryCapacity() ;

    /**
     * @return The latest learned battery capacity in uAh.
     */
    public abstract int getLearnedBatteryCapacity();

    /**
     * Return the array of discharge step durations.
     */
@@ -3925,7 +3930,9 @@ public abstract class BatteryStats implements Parcelable {
                getStartClockTime(),
                whichBatteryScreenOffRealtime / 1000, whichBatteryScreenOffUptime / 1000,
                getEstimatedBatteryCapacity(),
                getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity(),
                getLearnedBatteryCapacity(),
                getMinLearnedBatteryCapacity(),
                getMaxLearnedBatteryCapacity(),
                screenDozeTime / 1000);


@@ -4688,6 +4695,15 @@ public abstract class BatteryStats implements Parcelable {
            pw.println(sb.toString());
        }

        final int lastLearnedBatteryCapacity = getLearnedBatteryCapacity();
        if (lastLearnedBatteryCapacity > 0) {
            sb.setLength(0);
            sb.append(prefix);
            sb.append("  Last learned battery capacity: ");
            sb.append(BatteryStatsHelper.makemAh(lastLearnedBatteryCapacity / 1000));
            sb.append(" mAh");
            pw.println(sb.toString());
        }
        final int minLearnedBatteryCapacity = getMinLearnedBatteryCapacity();
        if (minLearnedBatteryCapacity > 0) {
            sb.setLength(0);
+13 −8
Original line number Diff line number Diff line
@@ -28,19 +28,24 @@ import java.util.List;
 * Estimates the battery discharge amounts.
 */
public class BatteryChargeCalculator extends PowerCalculator {
    private final double mBatteryCapacity;

    public BatteryChargeCalculator(PowerProfile powerProfile) {
        mBatteryCapacity = powerProfile.getBatteryCapacity();
    }

    @Override
    public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
        builder.setDischargePercentage(
                batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));

        int batteryCapacityMah = batteryStats.getLearnedBatteryCapacity() / 1000;
        if (batteryCapacityMah <= 0) {
            batteryCapacityMah = batteryStats.getMinLearnedBatteryCapacity() / 1000;
            if (batteryCapacityMah <= 0) {
                batteryCapacityMah = batteryStats.getEstimatedBatteryCapacity();
            }
        }
        final double dischargedPowerLowerBoundMah =
                batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100;
                batteryStats.getLowDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
        final double dischargedPowerUpperBoundMah =
                batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100;
                batteryStats.getHighDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
        builder.setDischargePercentage(
                batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
                .setDischargedPowerRange(dischargedPowerLowerBoundMah,
+13 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ public class BatteryStatsImpl extends BatteryStats {
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
    // Current on-disk Parcel version
    static final int VERSION = 198;
    static final int VERSION = 199;
    // The maximum number of names wakelocks we will keep track of
    // per uid; once the limit is reached, we batch the remaining wakelocks
@@ -1056,6 +1056,7 @@ public class BatteryStatsImpl extends BatteryStats {
    private int mBatteryVoltageMv = -1;
    private int mEstimatedBatteryCapacityMah = -1;
    private int mLastLearnedBatteryCapacityUah = -1;
    private int mMinLearnedBatteryCapacityUah = -1;
    private int mMaxLearnedBatteryCapacityUah = -1;
@@ -1141,6 +1142,11 @@ public class BatteryStatsImpl extends BatteryStats {
        return mEstimatedBatteryCapacityMah;
    }
    @Override
    public int getLearnedBatteryCapacity() {
        return mLastLearnedBatteryCapacityUah;
    }
    @Override
    public int getMinLearnedBatteryCapacity() {
        return mMinLearnedBatteryCapacityUah;
@@ -11199,6 +11205,7 @@ public class BatteryStatsImpl extends BatteryStats {
        } else {
            mEstimatedBatteryCapacityMah = -1;
        }
        mLastLearnedBatteryCapacityUah = -1;
        mMinLearnedBatteryCapacityUah = -1;
        mMaxLearnedBatteryCapacityUah = -1;
        mInteractiveTimer.reset(false, elapsedRealtimeUs);
@@ -13799,6 +13806,7 @@ public class BatteryStatsImpl extends BatteryStats {
            mRecordingHistory = DEBUG;
        }
        mLastLearnedBatteryCapacityUah = chargeFullUah;
        if (mMinLearnedBatteryCapacityUah == -1) {
            mMinLearnedBatteryCapacityUah = chargeFullUah;
        } else {
@@ -15066,6 +15074,7 @@ public class BatteryStatsImpl extends BatteryStats {
        mDischargeCurrentLevel = in.readInt();
        mCurrentBatteryLevel = in.readInt();
        mEstimatedBatteryCapacityMah = in.readInt();
        mLastLearnedBatteryCapacityUah = in.readInt();
        mMinLearnedBatteryCapacityUah = in.readInt();
        mMaxLearnedBatteryCapacityUah = in.readInt();
        mLowDischargeAmountSinceCharge = in.readInt();
@@ -15570,6 +15579,7 @@ public class BatteryStatsImpl extends BatteryStats {
        out.writeInt(mDischargeCurrentLevel);
        out.writeInt(mCurrentBatteryLevel);
        out.writeInt(mEstimatedBatteryCapacityMah);
        out.writeInt(mLastLearnedBatteryCapacityUah);
        out.writeInt(mMinLearnedBatteryCapacityUah);
        out.writeInt(mMaxLearnedBatteryCapacityUah);
        out.writeInt(getLowDischargeAmountSinceCharge());
@@ -16071,6 +16081,7 @@ public class BatteryStatsImpl extends BatteryStats {
        mRealtimeStartUs = in.readLong();
        mOnBattery = in.readInt() != 0;
        mEstimatedBatteryCapacityMah = in.readInt();
        mLastLearnedBatteryCapacityUah = in.readInt();
        mMinLearnedBatteryCapacityUah = in.readInt();
        mMaxLearnedBatteryCapacityUah = in.readInt();
        mOnBatteryInternal = false; // we are no longer really running.
@@ -16310,6 +16321,7 @@ public class BatteryStatsImpl extends BatteryStats {
        out.writeLong(mRealtimeStartUs);
        out.writeInt(mOnBattery ? 1 : 0);
        out.writeInt(mEstimatedBatteryCapacityMah);
        out.writeInt(mLastLearnedBatteryCapacityUah);
        out.writeInt(mMinLearnedBatteryCapacityUah);
        out.writeInt(mMaxLearnedBatteryCapacityUah);
        mOnBatteryTimeBase.writeToParcel(out, uSecUptime, uSecRealtime);
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ public class BatteryUsageStatsProvider {
                mPowerCalculators = new ArrayList<>();

                // Power calculators are applied in the order of registration
                mPowerCalculators.add(new BatteryChargeCalculator(mPowerProfile));
                mPowerCalculators.add(new BatteryChargeCalculator());
                mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
+2 −7
Original line number Diff line number Diff line
@@ -36,18 +36,12 @@ public class BatteryChargeCalculatorTest {

    @Rule
    public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
            .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0);
            .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); // Should be ignored

    @Test
    public void testDischargeTotals() {
        BatteryChargeCalculator calculator =
                new BatteryChargeCalculator(mStatsRule.getPowerProfile());

        final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();

        mStatsRule.setTime(1000, 1000);
        batteryStats.resetAllStatsCmdLocked();
        batteryStats.setNoAutoReset(true);
        batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
                /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
                1_000_000, 1_000_000, 1_000_000);
@@ -58,6 +52,7 @@ public class BatteryChargeCalculatorTest {
                /* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0,
                2_000_000, 2_000_000, 2_000_000);

        BatteryChargeCalculator calculator = new BatteryChargeCalculator();
        BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);

        assertThat(batteryUsageStats.getConsumedPower())