Merge "Add batteryTimeRemaining and chargeTimeRemaining to BatteryUsageStats" into sc-dev

This commit is contained in:
Dmitri Plotnikov
2021-03-06 01:56:32 +00:00
committed by Android (Google) Code Review
5 changed files with 86 additions and 13 deletions

View File

@@ -37,6 +37,8 @@ public final class BatteryUsageStats implements Parcelable {
private final long mStatsStartRealtimeMs; private final long mStatsStartRealtimeMs;
private final double mDischargedPowerLowerBound; private final double mDischargedPowerLowerBound;
private final double mDischargedPowerUpperBound; private final double mDischargedPowerUpperBound;
private final long mBatteryTimeRemainingMs;
private final long mChargeTimeRemainingMs;
private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers; private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers;
private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers; private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers;
private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers; private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers;
@@ -50,6 +52,8 @@ public final class BatteryUsageStats implements Parcelable {
mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah; mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah;
mHistoryBuffer = builder.mHistoryBuffer; mHistoryBuffer = builder.mHistoryBuffer;
mHistoryTagPool = builder.mHistoryTagPool; mHistoryTagPool = builder.mHistoryTagPool;
mBatteryTimeRemainingMs = builder.mBatteryTimeRemainingMs;
mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs;
double totalPower = 0; double totalPower = 0;
@@ -109,6 +113,25 @@ public final class BatteryUsageStats implements Parcelable {
return Range.create(mDischargedPowerLowerBound, mDischargedPowerUpperBound); 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 * Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
* charged), in mAh * charged), in mAh
@@ -156,6 +179,8 @@ public final class BatteryUsageStats implements Parcelable {
mDischargePercentage = source.readInt(); mDischargePercentage = source.readInt();
mDischargedPowerLowerBound = source.readDouble(); mDischargedPowerLowerBound = source.readDouble();
mDischargedPowerUpperBound = source.readDouble(); mDischargedPowerUpperBound = source.readDouble();
mBatteryTimeRemainingMs = source.readLong();
mChargeTimeRemainingMs = source.readLong();
mUidBatteryConsumers = new ArrayList<>(); mUidBatteryConsumers = new ArrayList<>();
source.readParcelableList(mUidBatteryConsumers, getClass().getClassLoader()); source.readParcelableList(mUidBatteryConsumers, getClass().getClassLoader());
mSystemBatteryConsumers = new ArrayList<>(); mSystemBatteryConsumers = new ArrayList<>();
@@ -194,6 +219,8 @@ public final class BatteryUsageStats implements Parcelable {
dest.writeInt(mDischargePercentage); dest.writeInt(mDischargePercentage);
dest.writeDouble(mDischargedPowerLowerBound); dest.writeDouble(mDischargedPowerLowerBound);
dest.writeDouble(mDischargedPowerUpperBound); dest.writeDouble(mDischargedPowerUpperBound);
dest.writeLong(mBatteryTimeRemainingMs);
dest.writeLong(mChargeTimeRemainingMs);
dest.writeParcelableList(mUidBatteryConsumers, flags); dest.writeParcelableList(mUidBatteryConsumers, flags);
dest.writeParcelableList(mSystemBatteryConsumers, flags); dest.writeParcelableList(mSystemBatteryConsumers, flags);
dest.writeParcelableList(mUserBatteryConsumers, flags); dest.writeParcelableList(mUserBatteryConsumers, flags);
@@ -237,6 +264,8 @@ public final class BatteryUsageStats implements Parcelable {
private int mDischargePercentage; private int mDischargePercentage;
private double mDischargedPowerLowerBoundMah; private double mDischargedPowerLowerBoundMah;
private double mDischargedPowerUpperBoundMah; private double mDischargedPowerUpperBoundMah;
private long mBatteryTimeRemainingMs = -1;
private long mChargeTimeRemainingMs = -1;
private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders = private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
new SparseArray<>(); new SparseArray<>();
private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders = private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
@@ -288,6 +317,26 @@ public final class BatteryUsageStats implements Parcelable {
return this; 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. * Sets the parceled recent history.
*/ */

View File

@@ -27,10 +27,10 @@ import java.util.List;
/** /**
* Estimates the battery discharge amounts. * Estimates the battery discharge amounts.
*/ */
public class DischargedPowerCalculator extends PowerCalculator { public class BatteryChargeCalculator extends PowerCalculator {
private final double mBatteryCapacity; private final double mBatteryCapacity;
public DischargedPowerCalculator(PowerProfile powerProfile) { public BatteryChargeCalculator(PowerProfile powerProfile) {
mBatteryCapacity = powerProfile.getBatteryCapacity(); mBatteryCapacity = powerProfile.getBatteryCapacity();
} }
@@ -42,6 +42,16 @@ public class DischargedPowerCalculator extends PowerCalculator {
.setDischargedPowerRange( .setDischargedPowerRange(
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100, batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100,
batteryStats.getHighDischargeAmountSinceCharge() * 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 @Override

View File

@@ -55,7 +55,7 @@ public class BatteryUsageStatsProvider {
mPowerCalculators = new ArrayList<>(); mPowerCalculators = new ArrayList<>();
// Power calculators are applied in the order of registration // 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 CpuPowerCalculator(mPowerProfile));
mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile)); mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile)); mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));

View File

@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@SmallTest @SmallTest
public class DischargedPowerCalculatorTest { public class BatteryChargeCalculatorTest {
private static final double PRECISION = 0.00001; private static final double PRECISION = 0.00001;
@Rule @Rule
@@ -40,27 +40,41 @@ public class DischargedPowerCalculatorTest {
@Test @Test
public void testDischargeTotals() { public void testDischargeTotals() {
BatteryChargeCalculator calculator =
new BatteryChargeCalculator(mStatsRule.getPowerProfile());
final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
mStatsRule.setTime(1000, 1000); mStatsRule.setTime(1000, 1000);
batteryStats.resetAllStatsCmdLocked(); batteryStats.resetAllStatsCmdLocked();
batteryStats.setNoAutoReset(true); batteryStats.setNoAutoReset(true);
batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
/* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0, 1_000_000, /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
1_000_000, 1_000_000); 1_000_000, 1_000_000, 1_000_000);
batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100, batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
/* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0, 2_000_000, /* plugType */ 0, 85, 72, 3700, 3_000_000, 4_000_000, 0,
2_000_000, 2_000_000); 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);
DischargedPowerCalculator calculator = BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
new DischargedPowerCalculator(mStatsRule.getPowerProfile());
final BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10); assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10);
assertThat(batteryUsageStats.getDischargedPowerRange().getLower()) assertThat(batteryUsageStats.getDischargedPowerRange().getLower())
.isWithin(PRECISION).of(360.0); .isWithin(PRECISION).of(360.0);
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()) assertThat(batteryUsageStats.getDischargedPowerRange().getUpper())
.isWithin(PRECISION).of(400.0); .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);
} }
} }

View File

@@ -23,6 +23,7 @@ import org.junit.runners.Suite;
@Suite.SuiteClasses({ @Suite.SuiteClasses({
AmbientDisplayPowerCalculatorTest.class, AmbientDisplayPowerCalculatorTest.class,
AudioPowerCalculatorTest.class, AudioPowerCalculatorTest.class,
BatteryChargeCalculatorTest.class,
BatteryStatsCpuTimesTest.class, BatteryStatsCpuTimesTest.class,
BatteryStatsBackgroundStatsTest.class, BatteryStatsBackgroundStatsTest.class,
BatteryStatsBinderCallStatsTest.class, BatteryStatsBinderCallStatsTest.class,
@@ -49,7 +50,6 @@ import org.junit.runners.Suite;
CameraPowerCalculatorTest.class, CameraPowerCalculatorTest.class,
CpuPowerCalculatorTest.class, CpuPowerCalculatorTest.class,
CustomMeasuredPowerCalculatorTest.class, CustomMeasuredPowerCalculatorTest.class,
DischargedPowerCalculatorTest.class,
FlashlightPowerCalculatorTest.class, FlashlightPowerCalculatorTest.class,
GnssPowerCalculatorTest.class, GnssPowerCalculatorTest.class,
IdlePowerCalculatorTest.class, IdlePowerCalculatorTest.class,