Change the API for getting PowerProfile-only BatteryUsageStats
Bug: 175644968 Test: mp :BatteryStatsViewer && adb shell am start -n com.android.frameworks.core.batterystatsviewer/.BatteryStatsViewerActivity Change-Id: I66ce64321805423d2545df4691a4df8508f40440
This commit is contained in:
@@ -69,17 +69,6 @@ public abstract class BatteryConsumer {
|
||||
public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000;
|
||||
public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
|
||||
|
||||
/**
|
||||
* Modeled power components are used for testing only. They are returned if the
|
||||
* {@link BatteryUsageStatsQuery#FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED} is set.
|
||||
* The modeled power components are retrieved with {@link #getConsumedPowerForCustomComponent}.
|
||||
* The ID of a modeled power component is calculated as
|
||||
* (FIRST_MODELED_POWER_COMPONENT_ID + powerComponentId), e.g.
|
||||
* FIRST_MODELED_POWER_COMPONENT_ID + POWER_COMPONENT_CPU.
|
||||
*/
|
||||
public static final int FIRST_MODELED_POWER_COMPONENT_ID = 10000;
|
||||
public static final int LAST_MODELED_POWER_COMPONENT_ID = 19999;
|
||||
|
||||
/**
|
||||
* Time usage component, describing the particular part of the system
|
||||
* that was used for the corresponding amount of time.
|
||||
@@ -182,10 +171,9 @@ public abstract class BatteryConsumer {
|
||||
protected abstract static class BaseBuilder<T extends BaseBuilder<?>> {
|
||||
final PowerComponents.Builder mPowerComponentsBuilder;
|
||||
|
||||
public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount,
|
||||
boolean includeModeledComponents) {
|
||||
public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount) {
|
||||
mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount,
|
||||
customTimeComponentCount, includeModeledComponents);
|
||||
customTimeComponentCount);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,6 +32,7 @@ import com.android.internal.app.IBatteryStats;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This class provides an API surface for internal system components to report events that are
|
||||
@@ -183,8 +184,20 @@ public final class BatteryStatsManager {
|
||||
@RequiresPermission(android.Manifest.permission.BATTERY_STATS)
|
||||
@NonNull
|
||||
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
|
||||
return getBatteryUsageStats(List.of(query)).get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
|
||||
* and per-UID basis.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.BATTERY_STATS)
|
||||
@NonNull
|
||||
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
|
||||
try {
|
||||
return mBatteryStats.getBatteryUsageStats(query);
|
||||
return mBatteryStats.getBatteryUsageStats(queries);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
@@ -114,7 +114,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
public static final class Builder {
|
||||
private final int mCustomPowerComponentCount;
|
||||
private final int mCustomTimeComponentCount;
|
||||
private final boolean mIncludeModeledComponents;
|
||||
private double mConsumedPower;
|
||||
private int mDischargePercentage;
|
||||
private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
|
||||
@@ -122,11 +121,9 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
|
||||
new SparseArray<>();
|
||||
|
||||
public Builder(int customPowerComponentCount, int customTimeComponentCount,
|
||||
boolean includeModeledComponents) {
|
||||
public Builder(int customPowerComponentCount, int customTimeComponentCount) {
|
||||
mCustomPowerComponentCount = customPowerComponentCount;
|
||||
mCustomTimeComponentCount = customTimeComponentCount;
|
||||
mIncludeModeledComponents = includeModeledComponents;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -169,7 +166,7 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
|
||||
if (builder == null) {
|
||||
builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount,
|
||||
mCustomTimeComponentCount, mIncludeModeledComponents, batteryStatsUid);
|
||||
mCustomTimeComponentCount, batteryStatsUid);
|
||||
mUidBatteryConsumerBuilders.put(uid, builder);
|
||||
}
|
||||
return builder;
|
||||
@@ -185,7 +182,7 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
|
||||
if (builder == null) {
|
||||
builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount,
|
||||
mCustomTimeComponentCount, mIncludeModeledComponents, drainType);
|
||||
mCustomTimeComponentCount, drainType);
|
||||
mSystemBatteryConsumerBuilders.put(drainType, builder);
|
||||
}
|
||||
return builder;
|
||||
|
||||
@@ -38,18 +38,19 @@ public final class BatteryUsageStatsQuery implements Parcelable {
|
||||
* @hide
|
||||
*/
|
||||
@IntDef(flag = true, prefix = { "FLAG_BATTERY_USAGE_STATS_" }, value = {
|
||||
FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED,
|
||||
FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface BatteryUsageStatsFlags {}
|
||||
|
||||
/**
|
||||
* Indicates that modeled battery usage stats should be returned along with
|
||||
* measured ones.
|
||||
* Indicates that power estimations should be based on the usage time and
|
||||
* average power constants provided in the PowerProfile, even if on-device power monitoring
|
||||
* is available.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED = 1;
|
||||
public static final int FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL = 1;
|
||||
|
||||
private final int mFlags;
|
||||
|
||||
@@ -112,11 +113,13 @@ public final class BatteryUsageStatsQuery implements Parcelable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests to include modeled battery usage stats along with measured ones.
|
||||
* Requests to return modeled battery usage stats only, even if on-device
|
||||
* power monitoring data is available.
|
||||
*
|
||||
* Should only be used for testing and debugging.
|
||||
*/
|
||||
public Builder includeModeled() {
|
||||
mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED;
|
||||
public Builder powerProfileModeledOnly() {
|
||||
mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,11 +33,9 @@ class PowerComponents {
|
||||
private final double[] mPowerComponents;
|
||||
private final long[] mTimeComponents;
|
||||
private final int mCustomPowerComponentCount;
|
||||
private final int mModeledPowerComponentOffset;
|
||||
|
||||
PowerComponents(@NonNull Builder builder) {
|
||||
mCustomPowerComponentCount = builder.mCustomPowerComponentCount;
|
||||
mModeledPowerComponentOffset = builder.mModeledPowerComponentOffset;
|
||||
mPowerComponents = builder.mPowerComponents;
|
||||
mTimeComponents = builder.mTimeComponents;
|
||||
double totalPower = 0;
|
||||
@@ -50,9 +48,6 @@ class PowerComponents {
|
||||
PowerComponents(@NonNull Parcel source) {
|
||||
mTotalPowerConsumed = source.readDouble();
|
||||
mCustomPowerComponentCount = source.readInt();
|
||||
mModeledPowerComponentOffset =
|
||||
BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
|
||||
- BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
|
||||
mPowerComponents = source.createDoubleArray();
|
||||
mTimeComponents = source.createLongArray();
|
||||
}
|
||||
@@ -106,14 +101,6 @@ class PowerComponents {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported custom power component ID: " + componentId);
|
||||
}
|
||||
} else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
&& componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
|
||||
try {
|
||||
return mPowerComponents[mModeledPowerComponentOffset + componentId];
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported modeled power component ID: " + componentId);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported custom power component ID: " + componentId);
|
||||
@@ -165,20 +152,12 @@ class PowerComponents {
|
||||
private final double[] mPowerComponents;
|
||||
private final int mCustomPowerComponentCount;
|
||||
private final long[] mTimeComponents;
|
||||
private final int mModeledPowerComponentOffset;
|
||||
|
||||
Builder(int customPowerComponentCount, int customTimeComponentCount,
|
||||
boolean includeModeledPowerComponents) {
|
||||
Builder(int customPowerComponentCount, int customTimeComponentCount) {
|
||||
mCustomPowerComponentCount = customPowerComponentCount;
|
||||
int powerComponentCount =
|
||||
BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount;
|
||||
if (includeModeledPowerComponents) {
|
||||
powerComponentCount += BatteryConsumer.POWER_COMPONENT_COUNT;
|
||||
}
|
||||
mPowerComponents = new double[powerComponentCount];
|
||||
mModeledPowerComponentOffset =
|
||||
BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
|
||||
- BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
|
||||
mTimeComponents =
|
||||
new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
|
||||
}
|
||||
@@ -222,14 +201,6 @@ class PowerComponents {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported custom power component ID: " + componentId);
|
||||
}
|
||||
} else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
&& componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
|
||||
try {
|
||||
mPowerComponents[mModeledPowerComponentOffset + componentId] = componentPower;
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported modeled power component ID: " + componentId);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported custom power component ID: " + componentId);
|
||||
|
||||
@@ -123,8 +123,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
|
||||
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
|
||||
|
||||
Builder(int customPowerComponentCount, int customTimeComponentCount,
|
||||
boolean includeModeledComponents, @DrainType int drainType) {
|
||||
super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
|
||||
@DrainType int drainType) {
|
||||
super(customPowerComponentCount, customTimeComponentCount);
|
||||
mDrainType = drainType;
|
||||
}
|
||||
|
||||
|
||||
@@ -98,8 +98,8 @@ public final class UidBatteryConsumer extends BatteryConsumer implements Parcela
|
||||
private boolean mSystemComponent;
|
||||
|
||||
public Builder(int customPowerComponentCount, int customTimeComponentCount,
|
||||
boolean includeModeledComponents, BatteryStats.Uid batteryStatsUid) {
|
||||
super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
|
||||
BatteryStats.Uid batteryStatsUid) {
|
||||
super(customPowerComponentCount, customTimeComponentCount);
|
||||
mBatteryStatsUid = batteryStatsUid;
|
||||
mUid = batteryStatsUid.getUid();
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ interface IBatteryStats {
|
||||
|
||||
// Remaining methods are only used in Java.
|
||||
|
||||
BatteryUsageStats getBatteryUsageStats(in BatteryUsageStatsQuery query);
|
||||
List<BatteryUsageStats> getBatteryUsageStats(in List<BatteryUsageStatsQuery> queries);
|
||||
|
||||
@UnsupportedAppUsage
|
||||
byte[] getStatistics();
|
||||
|
||||
@@ -83,7 +83,7 @@ public class BatteryUsageStatsProvider {
|
||||
/**
|
||||
* Returns a snapshot of battery attribution data.
|
||||
*/
|
||||
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
|
||||
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
|
||||
|
||||
// TODO(b/174186345): instead of BatteryStatsHelper, use PowerCalculators directly.
|
||||
final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(mContext,
|
||||
@@ -100,17 +100,21 @@ public class BatteryUsageStatsProvider {
|
||||
|
||||
batteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, users);
|
||||
|
||||
ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size());
|
||||
for (int i = 0; i < queries.size(); i++) {
|
||||
results.add(getBatteryUsageStats(queries.get(i), batteryStatsHelper, users));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query,
|
||||
BatteryStatsHelper batteryStatsHelper, SparseArray<UserHandle> users) {
|
||||
// TODO(b/174186358): read extra power component number from configuration
|
||||
final int customPowerComponentCount = 0;
|
||||
final int customTimeComponentCount = 0;
|
||||
final boolean includeModeledComponents =
|
||||
(query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED)
|
||||
!= 0;
|
||||
|
||||
|
||||
final BatteryUsageStats.Builder batteryUsageStatsBuilder =
|
||||
new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount,
|
||||
includeModeledComponents)
|
||||
new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount)
|
||||
.setDischargePercentage(batteryStatsHelper.getStats().getDischargeAmount(0))
|
||||
.setConsumedPower(batteryStatsHelper.getTotalPower());
|
||||
|
||||
|
||||
@@ -122,11 +122,5 @@ public class CpuPowerCalculator extends PowerCalculator {
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, cpuTimeMs)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, cpuFgTimeMs)
|
||||
.setPackageWithHighestDrain(packageWithHighestDrain);
|
||||
|
||||
if ((query.getFlags()
|
||||
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED) != 0) {
|
||||
app.setConsumedPowerForCustomComponent(BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU, cpuPowerMah);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ public abstract class PowerCalculator {
|
||||
|
||||
// TODO(b/175156498): Temporary code during the transition from BatterySippers to
|
||||
// BatteryConsumers.
|
||||
UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, false, u);
|
||||
UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, u);
|
||||
calculateApp(builder, u, rawRealtimeUs, rawUptimeUs, BatteryUsageStatsQuery.DEFAULT);
|
||||
final UidBatteryConsumer uidBatteryConsumer = builder.build();
|
||||
app.cpuPowerMah = uidBatteryConsumer.getConsumedPower(
|
||||
|
||||
@@ -63,7 +63,9 @@ public class BatteryConsumerData {
|
||||
private final List<Entry> mEntries = new ArrayList<>();
|
||||
|
||||
public BatteryConsumerData(Context context, BatteryStatsHelper batteryStatsHelper,
|
||||
BatteryUsageStats batteryUsageStats, String batteryConsumerId) {
|
||||
List<BatteryUsageStats> batteryUsageStatsList, String batteryConsumerId) {
|
||||
BatteryUsageStats batteryUsageStats = batteryUsageStatsList.get(0);
|
||||
BatteryUsageStats powerProfileModeledUsageStats = batteryUsageStatsList.get(1);
|
||||
List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
|
||||
BatteryStats batteryStats = batteryStatsHelper.getStats();
|
||||
|
||||
@@ -142,16 +144,22 @@ public class BatteryConsumerData {
|
||||
}
|
||||
|
||||
BatteryConsumer requestedBatteryConsumer = null;
|
||||
double totalModeledCpuPowerMah = 0;
|
||||
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
|
||||
requestedBatteryConsumer = consumer;
|
||||
}
|
||||
}
|
||||
|
||||
totalModeledCpuPowerMah += consumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU);
|
||||
double totalModeledCpuPowerMah = 0;
|
||||
BatteryConsumer requestedBatteryConsumerPowerProfileModeled = null;
|
||||
for (BatteryConsumer consumer : powerProfileModeledUsageStats.getUidBatteryConsumers()) {
|
||||
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
|
||||
requestedBatteryConsumerPowerProfileModeled = consumer;
|
||||
}
|
||||
|
||||
totalModeledCpuPowerMah += consumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU);
|
||||
}
|
||||
|
||||
if (requestedBatterySipper == null) {
|
||||
@@ -196,11 +204,10 @@ public class BatteryConsumerData {
|
||||
addEntry("CPU", EntryType.POWER,
|
||||
requestedBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU),
|
||||
totalCpuPowerMah);
|
||||
if (totalModeledCpuPowerMah != 0) {
|
||||
if (requestedBatteryConsumerPowerProfileModeled != null) {
|
||||
addEntry("CPU (modeled)", EntryType.POWER,
|
||||
requestedBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU),
|
||||
requestedBatteryConsumerPowerProfileModeled.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU),
|
||||
totalModeledCpuPowerMah);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -68,7 +68,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
private ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult(
|
||||
BatteryConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
|
||||
private BatteryStatsHelper mBatteryStatsHelper;
|
||||
private BatteryUsageStats mBatteryUsageStats;
|
||||
private List<BatteryUsageStats> mBatteryUsageStats;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
@@ -188,7 +188,8 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
}
|
||||
}
|
||||
|
||||
private static class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats> {
|
||||
private static class BatteryUsageStatsLoader extends
|
||||
AsyncLoaderCompat<List<BatteryUsageStats>> {
|
||||
private final BatteryStatsManager mBatteryStatsManager;
|
||||
|
||||
BatteryUsageStatsLoader(Context context) {
|
||||
@@ -197,33 +198,38 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public BatteryUsageStats loadInBackground() {
|
||||
final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder()
|
||||
.includeModeled()
|
||||
.build();
|
||||
return mBatteryStatsManager.getBatteryUsageStats(query);
|
||||
public List<BatteryUsageStats> loadInBackground() {
|
||||
final BatteryUsageStatsQuery queryDefault =
|
||||
new BatteryUsageStatsQuery.Builder().build();
|
||||
final BatteryUsageStatsQuery queryPowerProfileModeledOnly =
|
||||
new BatteryUsageStatsQuery.Builder()
|
||||
.powerProfileModeledOnly()
|
||||
.build();
|
||||
return mBatteryStatsManager.getBatteryUsageStats(
|
||||
List.of(queryDefault, queryPowerProfileModeledOnly));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(BatteryUsageStats result) {
|
||||
protected void onDiscardResult(List<BatteryUsageStats> result) {
|
||||
}
|
||||
}
|
||||
|
||||
private class BatteryUsageStatsLoaderCallbacks implements LoaderCallbacks<BatteryUsageStats> {
|
||||
private class BatteryUsageStatsLoaderCallbacks
|
||||
implements LoaderCallbacks<List<BatteryUsageStats>> {
|
||||
@NonNull
|
||||
@Override
|
||||
public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) {
|
||||
public Loader<List<BatteryUsageStats>> onCreateLoader(int id, Bundle args) {
|
||||
return new BatteryUsageStatsLoader(BatteryStatsViewerActivity.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(@NonNull Loader<BatteryUsageStats> loader,
|
||||
BatteryUsageStats batteryUsageStats) {
|
||||
public void onLoadFinished(@NonNull Loader<List<BatteryUsageStats>> loader,
|
||||
List<BatteryUsageStats> batteryUsageStats) {
|
||||
onBatteryUsageStatsLoaded(batteryUsageStats);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(@NonNull Loader<BatteryUsageStats> loader) {
|
||||
public void onLoaderReset(@NonNull Loader<List<BatteryUsageStats>> loader) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,7 +238,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
onBatteryStatsDataLoaded();
|
||||
}
|
||||
|
||||
private void onBatteryUsageStatsLoaded(BatteryUsageStats batteryUsageStats) {
|
||||
private void onBatteryUsageStatsLoaded(List<BatteryUsageStats> batteryUsageStats) {
|
||||
mBatteryUsageStats = batteryUsageStats;
|
||||
onBatteryStatsDataLoaded();
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ public class BatteryUsageStatsRule implements TestRule {
|
||||
}
|
||||
|
||||
void apply(PowerCalculator calculator) {
|
||||
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0, false);
|
||||
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0);
|
||||
SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
|
||||
for (int i = 0; i < uidStats.size(); i++) {
|
||||
builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
|
||||
|
||||
@@ -66,7 +66,7 @@ public class BatteryUsageStatsTest {
|
||||
final MockBatteryStatsImpl batteryStats = new MockBatteryStatsImpl(clocks);
|
||||
final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(2000);
|
||||
|
||||
final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(1, 1, true);
|
||||
final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(1, 1);
|
||||
builder.setConsumedPower(100);
|
||||
builder.setDischargePercentage(20);
|
||||
|
||||
@@ -77,9 +77,6 @@ public class BatteryUsageStatsTest {
|
||||
uidBatteryConsumerBuilder.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 400);
|
||||
uidBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 500);
|
||||
uidBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU, 510);
|
||||
uidBatteryConsumerBuilder.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, 600);
|
||||
uidBatteryConsumerBuilder.setUsageDurationMillis(
|
||||
BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, 700);
|
||||
@@ -92,9 +89,6 @@ public class BatteryUsageStatsTest {
|
||||
systemBatteryConsumerBuilder.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 10100);
|
||||
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200);
|
||||
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU, 10210);
|
||||
systemBatteryConsumerBuilder.setUsageDurationMillis(
|
||||
BatteryConsumer.TIME_COMPONENT_CPU, 10300);
|
||||
systemBatteryConsumerBuilder.setUsageDurationForCustomComponentMillis(
|
||||
@@ -118,9 +112,6 @@ public class BatteryUsageStatsTest {
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(400);
|
||||
assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(500);
|
||||
assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(510);
|
||||
assertThat(uidBatteryConsumer.getUsageDurationMillis(
|
||||
BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(600);
|
||||
assertThat(uidBatteryConsumer.getUsageDurationMillis(
|
||||
@@ -141,9 +132,6 @@ public class BatteryUsageStatsTest {
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10100);
|
||||
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
|
||||
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
|
||||
+ BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10210);
|
||||
assertThat(systemBatteryConsumer.getUsageDurationMillis(
|
||||
BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(10300);
|
||||
assertThat(systemBatteryConsumer.getUsageDurationForCustomComponentMillis(
|
||||
|
||||
@@ -561,10 +561,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
|
||||
* Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
|
||||
* and per-UID basis.
|
||||
*/
|
||||
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
|
||||
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
|
||||
mContext.enforceCallingPermission(
|
||||
android.Manifest.permission.BATTERY_STATS, null);
|
||||
return mBatteryUsageStatsProvider.getBatteryUsageStats(query);
|
||||
return mBatteryUsageStatsProvider.getBatteryUsageStats(queries);
|
||||
}
|
||||
|
||||
public byte[] getStatistics() {
|
||||
|
||||
Reference in New Issue
Block a user