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 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.
*/

View File

@@ -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

View File

@@ -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));

View File

@@ -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);
/* 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);
DischargedPowerCalculator calculator =
new DischargedPowerCalculator(mStatsRule.getPowerProfile());
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);
}
}

View File

@@ -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,