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

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

Add batteryTimeRemaining and chargeTimeRemaining to BatteryUsageStats

Bug: 158137862
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryChargeCalculatorTest
Change-Id: I247a593de242a2864eef16b7c9ea956209f60cbe
parent 6c1dca2e
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ public final class BatteryUsageStats implements Parcelable {
    private final long mStatsStartRealtimeMs;
    private final double mDischargedPowerLowerBound;
    private final double mDischargedPowerUpperBound;
    private final long mBatteryTimeRemainingMs;
    private final long mChargeTimeRemainingMs;
    private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers;
    private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers;
    private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers;
@@ -50,6 +52,8 @@ public final class BatteryUsageStats implements Parcelable {
        mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah;
        mHistoryBuffer = builder.mHistoryBuffer;
        mHistoryTagPool = builder.mHistoryTagPool;
        mBatteryTimeRemainingMs = builder.mBatteryTimeRemainingMs;
        mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs;

        double totalPower = 0;

@@ -109,6 +113,25 @@ public final class BatteryUsageStats implements Parcelable {
        return Range.create(mDischargedPowerLowerBound, mDischargedPowerUpperBound);
    }

    /**
     * Returns an approximation for how much run time (in milliseconds) is remaining on
     * the battery.  Returns -1 if no time can be computed: either there is not
     * enough current data to make a decision, or the battery is currently
     * charging.
     */
    public long getBatteryTimeRemainingMs() {
        return mBatteryTimeRemainingMs;
    }

    /**
     * Returns an approximation for how much time (in milliseconds) remains until the battery
     * is fully charged.  Returns -1 if no time can be computed: either there is not
     * enough current data to make a decision, or the battery is currently discharging.
     */
    public long getChargeTimeRemainingMs() {
        return mChargeTimeRemainingMs;
    }

    /**
     * Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
     * charged), in mAh
@@ -156,6 +179,8 @@ public final class BatteryUsageStats implements Parcelable {
        mDischargePercentage = source.readInt();
        mDischargedPowerLowerBound = source.readDouble();
        mDischargedPowerUpperBound = source.readDouble();
        mBatteryTimeRemainingMs = source.readLong();
        mChargeTimeRemainingMs = source.readLong();
        mUidBatteryConsumers = new ArrayList<>();
        source.readParcelableList(mUidBatteryConsumers, getClass().getClassLoader());
        mSystemBatteryConsumers = new ArrayList<>();
@@ -194,6 +219,8 @@ public final class BatteryUsageStats implements Parcelable {
        dest.writeInt(mDischargePercentage);
        dest.writeDouble(mDischargedPowerLowerBound);
        dest.writeDouble(mDischargedPowerUpperBound);
        dest.writeLong(mBatteryTimeRemainingMs);
        dest.writeLong(mChargeTimeRemainingMs);
        dest.writeParcelableList(mUidBatteryConsumers, flags);
        dest.writeParcelableList(mSystemBatteryConsumers, flags);
        dest.writeParcelableList(mUserBatteryConsumers, flags);
@@ -237,6 +264,8 @@ public final class BatteryUsageStats implements Parcelable {
        private int mDischargePercentage;
        private double mDischargedPowerLowerBoundMah;
        private double mDischargedPowerUpperBoundMah;
        private long mBatteryTimeRemainingMs = -1;
        private long mChargeTimeRemainingMs = -1;
        private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
                new SparseArray<>();
        private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
@@ -288,6 +317,26 @@ public final class BatteryUsageStats implements Parcelable {
            return this;
        }

        /**
         * Sets an approximation for how much time (in milliseconds) remains until the battery
         * is fully discharged.
         */
        @NonNull
        public Builder setBatteryTimeRemainingMs(long batteryTimeRemainingMs) {
            mBatteryTimeRemainingMs = batteryTimeRemainingMs;
            return this;
        }

        /**
         * Sets an approximation for how much time (in milliseconds) remains until the battery
         * is fully charged.
         */
        @NonNull
        public Builder setChargeTimeRemainingMs(long chargeTimeRemainingMs) {
            mChargeTimeRemainingMs = chargeTimeRemainingMs;
            return this;
        }

        /**
         * Sets the parceled recent history.
         */
+12 −2
Original line number Diff line number Diff line
@@ -27,10 +27,10 @@ import java.util.List;
/**
 * Estimates the battery discharge amounts.
 */
public class DischargedPowerCalculator extends PowerCalculator {
public class BatteryChargeCalculator extends PowerCalculator {
    private final double mBatteryCapacity;

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

@@ -42,6 +42,16 @@ public class DischargedPowerCalculator extends PowerCalculator {
                .setDischargedPowerRange(
                        batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100,
                        batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100);

        final long batteryTimeRemainingMs = batteryStats.computeBatteryTimeRemaining(rawRealtimeUs);
        if (batteryTimeRemainingMs != -1) {
            builder.setBatteryTimeRemainingMs(batteryTimeRemainingMs / 1000);
        }

        final long chargeTimeRemainingMs = batteryStats.computeChargeTimeRemaining(rawRealtimeUs);
        if (chargeTimeRemainingMs != -1) {
            builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000);
        }
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public class BatteryUsageStatsProvider {
                mPowerCalculators = new ArrayList<>();

                // Power calculators are applied in the order of registration
                mPowerCalculators.add(new DischargedPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new BatteryChargeCalculator(mPowerProfile));
                mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
+23 −9
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class DischargedPowerCalculatorTest {
public class BatteryChargeCalculatorTest {
    private static final double PRECISION = 0.00001;

    @Rule
@@ -40,27 +40,41 @@ public class DischargedPowerCalculatorTest {

    @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);
                /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
                1_000_000, 1_000_000, 1_000_000);
        batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
                /* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0, 2_000_000,
                2_000_000, 2_000_000);

        DischargedPowerCalculator calculator =
                new DischargedPowerCalculator(mStatsRule.getPowerProfile());
                /* plugType */ 0, 85, 72, 3700, 3_000_000, 4_000_000, 0,
                1_500_000, 1_500_000, 1_500_000);
        batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
                /* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0,
                2_000_000, 2_000_000, 2_000_000);

        final BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
        BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);

        assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10);
        assertThat(batteryUsageStats.getDischargedPowerRange().getLower())
                .isWithin(PRECISION).of(360.0);
        assertThat(batteryUsageStats.getDischargedPowerRange().getUpper())
                .isWithin(PRECISION).of(400.0);
        assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(8_000_000);
        assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(-1);

        // Plug in
        batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_CHARGING, 100,
                BatteryManager.BATTERY_PLUGGED_USB, 80, 72, 3700, 2_400_000, 4_000_000, 100,
                4_000_000, 4_000_000, 4_000_000);

        batteryUsageStats = mStatsRule.apply(calculator);

        assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(100_000);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import org.junit.runners.Suite;
@Suite.SuiteClasses({
        AmbientDisplayPowerCalculatorTest.class,
        AudioPowerCalculatorTest.class,
        BatteryChargeCalculatorTest.class,
        BatteryStatsCpuTimesTest.class,
        BatteryStatsBackgroundStatsTest.class,
        BatteryStatsBinderCallStatsTest.class,
@@ -49,7 +50,6 @@ import org.junit.runners.Suite;
        CameraPowerCalculatorTest.class,
        CpuPowerCalculatorTest.class,
        CustomMeasuredPowerCalculatorTest.class,
        DischargedPowerCalculatorTest.class,
        FlashlightPowerCalculatorTest.class,
        GnssPowerCalculatorTest.class,
        IdlePowerCalculatorTest.class,