Remove SystemBatteryConsumer
which has been superceded by AggegateBatteryConsumer Bug: 186006876 Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests Test: Use BatteryStatsViewer to verify that it's still functional Change-Id: I2e4fe36ff310b6d68923fcecdfd22ce865b1f32d
This commit is contained in:
@@ -25,17 +25,22 @@ import android.annotation.NonNull;
|
||||
*/
|
||||
public final class AggregateBatteryConsumer extends BatteryConsumer implements Parcelable {
|
||||
|
||||
private final double mConsumedPowerMah;
|
||||
|
||||
public AggregateBatteryConsumer(@NonNull Builder builder) {
|
||||
super(builder.mPowerComponentsBuilder.build());
|
||||
mConsumedPowerMah = builder.mConsumedPowerMah;
|
||||
}
|
||||
|
||||
private AggregateBatteryConsumer(@NonNull Parcel source) {
|
||||
super(new PowerComponents(source));
|
||||
mConsumedPowerMah = source.readDouble();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
dest.writeDouble(mConsumedPowerMah);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,14 +60,29 @@ public final class AggregateBatteryConsumer extends BatteryConsumer implements P
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public double getConsumedPower() {
|
||||
return mConsumedPowerMah;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for DeviceBatteryConsumer.
|
||||
*/
|
||||
public static final class Builder extends BaseBuilder<AggregateBatteryConsumer.Builder> {
|
||||
private double mConsumedPowerMah;
|
||||
|
||||
public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) {
|
||||
super(customPowerComponentNames, includePowerModels);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the total power included in this aggregate.
|
||||
*/
|
||||
public Builder setConsumedPower(double consumedPowerMah) {
|
||||
mConsumedPowerMah = consumedPowerMah;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a read-only object out of the Builder values.
|
||||
*/
|
||||
|
||||
@@ -71,7 +71,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
|
||||
public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2;
|
||||
|
||||
private final double mConsumedPower;
|
||||
private final int mDischargePercentage;
|
||||
private final long mStatsStartTimestampMs;
|
||||
private final double mDischargedPowerLowerBound;
|
||||
@@ -80,7 +79,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
private final long mChargeTimeRemainingMs;
|
||||
private final String[] mCustomPowerComponentNames;
|
||||
private final List<UidBatteryConsumer> mUidBatteryConsumers;
|
||||
private final List<SystemBatteryConsumer> mSystemBatteryConsumers;
|
||||
private final List<UserBatteryConsumer> mUserBatteryConsumers;
|
||||
private final AggregateBatteryConsumer[] mAggregateBatteryConsumers;
|
||||
private final Parcel mHistoryBuffer;
|
||||
@@ -97,14 +95,7 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs;
|
||||
mCustomPowerComponentNames = builder.mCustomPowerComponentNames;
|
||||
|
||||
mAggregateBatteryConsumers =
|
||||
new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT];
|
||||
for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) {
|
||||
mAggregateBatteryConsumers[i] = builder.mAggregateBatteryConsumersBuilders[i].build();
|
||||
}
|
||||
|
||||
double totalPower = 0;
|
||||
|
||||
double totalPowerMah = 0;
|
||||
final int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size();
|
||||
mUidBatteryConsumers = new ArrayList<>(uidBatteryConsumerCount);
|
||||
for (int i = 0; i < uidBatteryConsumerCount; i++) {
|
||||
@@ -112,30 +103,28 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
builder.mUidBatteryConsumerBuilders.valueAt(i);
|
||||
if (!uidBatteryConsumerBuilder.isExcludedFromBatteryUsageStats()) {
|
||||
final UidBatteryConsumer consumer = uidBatteryConsumerBuilder.build();
|
||||
totalPower += consumer.getConsumedPower();
|
||||
totalPowerMah += consumer.getConsumedPower();
|
||||
mUidBatteryConsumers.add(consumer);
|
||||
}
|
||||
}
|
||||
|
||||
final int systemBatteryConsumerCount = builder.mSystemBatteryConsumerBuilders.size();
|
||||
mSystemBatteryConsumers = new ArrayList<>(systemBatteryConsumerCount);
|
||||
for (int i = 0; i < systemBatteryConsumerCount; i++) {
|
||||
final SystemBatteryConsumer consumer =
|
||||
builder.mSystemBatteryConsumerBuilders.valueAt(i).build();
|
||||
totalPower += consumer.getConsumedPower() - consumer.getPowerConsumedByApps();
|
||||
mSystemBatteryConsumers.add(consumer);
|
||||
}
|
||||
|
||||
final int userBatteryConsumerCount = builder.mUserBatteryConsumerBuilders.size();
|
||||
mUserBatteryConsumers = new ArrayList<>(userBatteryConsumerCount);
|
||||
for (int i = 0; i < userBatteryConsumerCount; i++) {
|
||||
final UserBatteryConsumer consumer =
|
||||
builder.mUserBatteryConsumerBuilders.valueAt(i).build();
|
||||
totalPower += consumer.getConsumedPower();
|
||||
totalPowerMah += consumer.getConsumedPower();
|
||||
mUserBatteryConsumers.add(consumer);
|
||||
}
|
||||
|
||||
mConsumedPower = totalPower;
|
||||
builder.getAggregateBatteryConsumerBuilder(AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
|
||||
.setConsumedPower(totalPowerMah);
|
||||
|
||||
mAggregateBatteryConsumers =
|
||||
new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT];
|
||||
for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) {
|
||||
mAggregateBatteryConsumers[i] = builder.mAggregateBatteryConsumersBuilders[i].build();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,6 +135,15 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
return mStatsStartTimestampMs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
|
||||
* charged), in mAh
|
||||
*/
|
||||
public double getConsumedPower() {
|
||||
return mAggregateBatteryConsumers[AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE]
|
||||
.getConsumedPower();
|
||||
}
|
||||
|
||||
/**
|
||||
* Portion of battery charge drained since BatteryStats reset (e.g. due to being fully
|
||||
* charged), as percentage of the full charge in the range [0:100]
|
||||
@@ -181,14 +179,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
return mChargeTimeRemainingMs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
|
||||
* charged), in mAh
|
||||
*/
|
||||
public double getConsumedPower() {
|
||||
return mConsumedPower;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a battery consumer for the specified battery consumer type.
|
||||
*/
|
||||
@@ -202,11 +192,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
return mUidBatteryConsumers;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<SystemBatteryConsumer> getSystemBatteryConsumers() {
|
||||
return mSystemBatteryConsumers;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<UserBatteryConsumer> getUserBatteryConsumers() {
|
||||
return mUserBatteryConsumers;
|
||||
@@ -232,7 +217,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
|
||||
private BatteryUsageStats(@NonNull Parcel source) {
|
||||
mStatsStartTimestampMs = source.readLong();
|
||||
mConsumedPower = source.readDouble();
|
||||
mDischargePercentage = source.readInt();
|
||||
mDischargedPowerLowerBound = source.readDouble();
|
||||
mDischargedPowerUpperBound = source.readDouble();
|
||||
@@ -254,14 +238,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
|
||||
mUidBatteryConsumers.add(consumer);
|
||||
}
|
||||
int sysCount = source.readInt();
|
||||
mSystemBatteryConsumers = new ArrayList<>(sysCount);
|
||||
for (int i = 0; i < sysCount; i++) {
|
||||
final SystemBatteryConsumer consumer =
|
||||
SystemBatteryConsumer.CREATOR.createFromParcel(source);
|
||||
consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
|
||||
mSystemBatteryConsumers.add(consumer);
|
||||
}
|
||||
int userCount = source.readInt();
|
||||
mUserBatteryConsumers = new ArrayList<>(userCount);
|
||||
for (int i = 0; i < userCount; i++) {
|
||||
@@ -298,7 +274,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
dest.writeLong(mStatsStartTimestampMs);
|
||||
dest.writeDouble(mConsumedPower);
|
||||
dest.writeInt(mDischargePercentage);
|
||||
dest.writeDouble(mDischargedPowerLowerBound);
|
||||
dest.writeDouble(mDischargedPowerUpperBound);
|
||||
@@ -312,10 +287,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) {
|
||||
mUidBatteryConsumers.get(i).writeToParcel(dest, flags);
|
||||
}
|
||||
dest.writeInt(mSystemBatteryConsumers.size());
|
||||
for (int i = mSystemBatteryConsumers.size() - 1; i >= 0; i--) {
|
||||
mSystemBatteryConsumers.get(i).writeToParcel(dest, flags);
|
||||
}
|
||||
dest.writeInt(mUserBatteryConsumers.size());
|
||||
for (int i = mUserBatteryConsumers.size() - 1; i >= 0; i--) {
|
||||
mUserBatteryConsumers.get(i).writeToParcel(dest, flags);
|
||||
@@ -367,8 +338,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
new AggregateBatteryConsumer.Builder[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT];
|
||||
private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
|
||||
new SparseArray<>();
|
||||
private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
|
||||
new SparseArray<>();
|
||||
private final SparseArray<UserBatteryConsumer.Builder> mUserBatteryConsumerBuilders =
|
||||
new SparseArray<>();
|
||||
private Parcel mHistoryBuffer;
|
||||
@@ -482,22 +451,6 @@ public final class BatteryUsageStats implements Parcelable {
|
||||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates or returns a SystemBatteryConsumer, which represents battery attribution
|
||||
* data for a specific drain type.
|
||||
*/
|
||||
@NonNull
|
||||
public SystemBatteryConsumer.Builder getOrCreateSystemBatteryConsumerBuilder(
|
||||
@SystemBatteryConsumer.DrainType int drainType) {
|
||||
SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
|
||||
if (builder == null) {
|
||||
builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentNames,
|
||||
mIncludePowerModels, drainType);
|
||||
mSystemBatteryConsumerBuilders.put(drainType, builder);
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates or returns a UserBatteryConsumer, which represents battery attribution
|
||||
* data for an individual {@link UserHandle}.
|
||||
|
||||
@@ -1,198 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.os;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.util.Slog;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* Contains power consumption data attributed to a system-wide drain type.
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable {
|
||||
private static final String TAG = "SystemBatteryConsumer";
|
||||
|
||||
// ****************
|
||||
// This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto)
|
||||
// so the constant values must never change.
|
||||
// ****************
|
||||
@IntDef(prefix = {"DRAIN_TYPE_"}, value = {
|
||||
DRAIN_TYPE_AMBIENT_DISPLAY,
|
||||
// Reserved: APP
|
||||
DRAIN_TYPE_BLUETOOTH,
|
||||
DRAIN_TYPE_CAMERA,
|
||||
DRAIN_TYPE_MOBILE_RADIO,
|
||||
DRAIN_TYPE_FLASHLIGHT,
|
||||
DRAIN_TYPE_IDLE,
|
||||
DRAIN_TYPE_MEMORY,
|
||||
// Reserved: OVERCOUNTED,
|
||||
DRAIN_TYPE_PHONE,
|
||||
DRAIN_TYPE_SCREEN,
|
||||
// Reserved: UNACCOUNTED,
|
||||
// Reserved: USER,
|
||||
DRAIN_TYPE_WIFI,
|
||||
DRAIN_TYPE_CUSTOM,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public static @interface DrainType {
|
||||
}
|
||||
|
||||
public static final int DRAIN_TYPE_AMBIENT_DISPLAY = 0;
|
||||
public static final int DRAIN_TYPE_BLUETOOTH = 2;
|
||||
public static final int DRAIN_TYPE_CAMERA = 3;
|
||||
public static final int DRAIN_TYPE_MOBILE_RADIO = 4;
|
||||
public static final int DRAIN_TYPE_FLASHLIGHT = 5;
|
||||
public static final int DRAIN_TYPE_IDLE = 6;
|
||||
public static final int DRAIN_TYPE_MEMORY = 7;
|
||||
public static final int DRAIN_TYPE_PHONE = 9;
|
||||
public static final int DRAIN_TYPE_SCREEN = 10;
|
||||
public static final int DRAIN_TYPE_WIFI = 13;
|
||||
public static final int DRAIN_TYPE_CUSTOM = 14;
|
||||
|
||||
@DrainType
|
||||
private final int mDrainType;
|
||||
|
||||
private final double mPowerConsumedByAppsMah;
|
||||
|
||||
@DrainType
|
||||
public int getDrainType() {
|
||||
return mDrainType;
|
||||
}
|
||||
|
||||
private SystemBatteryConsumer(@NonNull SystemBatteryConsumer.Builder builder) {
|
||||
super(builder.mPowerComponentsBuilder.build());
|
||||
mDrainType = builder.mDrainType;
|
||||
mPowerConsumedByAppsMah = builder.mPowerConsumedByAppsMah;
|
||||
if (mPowerConsumedByAppsMah > getConsumedPower()) {
|
||||
Slog.wtf(TAG,
|
||||
"Power attributed to apps exceeds total: drain type = " + mDrainType
|
||||
+ " total consumed power = " + getConsumedPower()
|
||||
+ " power consumed by apps = " + mPowerConsumedByAppsMah);
|
||||
}
|
||||
}
|
||||
|
||||
private SystemBatteryConsumer(Parcel in) {
|
||||
super(new PowerComponents(in));
|
||||
mDrainType = in.readInt();
|
||||
mPowerConsumedByAppsMah = in.readDouble();
|
||||
}
|
||||
|
||||
public double getPowerConsumedByApps() {
|
||||
return mPowerConsumedByAppsMah;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount of time this consumer was operating.
|
||||
*/
|
||||
public long getUsageDurationMillis() {
|
||||
return mPowerComponents.getMaxComponentUsageDurationMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the contents into a Parcel.
|
||||
*/
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
dest.writeInt(mDrainType);
|
||||
dest.writeDouble(mPowerConsumedByAppsMah);
|
||||
}
|
||||
|
||||
public static final Creator<SystemBatteryConsumer> CREATOR =
|
||||
new Creator<SystemBatteryConsumer>() {
|
||||
@Override
|
||||
public SystemBatteryConsumer createFromParcel(Parcel in) {
|
||||
return new SystemBatteryConsumer(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SystemBatteryConsumer[] newArray(int size) {
|
||||
return new SystemBatteryConsumer[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for SystemBatteryConsumer.
|
||||
*/
|
||||
public static final class Builder extends BaseBuilder<Builder> {
|
||||
@DrainType
|
||||
private final int mDrainType;
|
||||
private double mPowerConsumedByAppsMah;
|
||||
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
|
||||
|
||||
Builder(@NonNull String[] customPowerComponentNames,
|
||||
boolean includePowerModels, @DrainType int drainType) {
|
||||
super(customPowerComponentNames, includePowerModels);
|
||||
mDrainType = drainType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the amount of power used by this system component that is attributed to apps.
|
||||
* It should not exceed the total consumed power.
|
||||
*/
|
||||
public Builder setPowerConsumedByApps(double powerConsumedByAppsMah) {
|
||||
mPowerConsumedByAppsMah = powerConsumedByAppsMah;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a UidBatteryConsumer to this SystemBatteryConsumer. For example,
|
||||
* the UidBatteryConsumer with the UID == {@link Process#BLUETOOTH_UID} should
|
||||
* be added to the SystemBatteryConsumer with the drain type == {@link
|
||||
* #DRAIN_TYPE_BLUETOOTH}.
|
||||
* <p>
|
||||
* Calculated power and duration components of the added battery consumers
|
||||
* are aggregated at the time the SystemBatteryConsumer is built by the {@link #build()}
|
||||
* method.
|
||||
* </p>
|
||||
*/
|
||||
public void addUidBatteryConsumer(UidBatteryConsumer.Builder uidBatteryConsumerBuilder) {
|
||||
if (mUidBatteryConsumers == null) {
|
||||
mUidBatteryConsumers = new ArrayList<>();
|
||||
}
|
||||
mUidBatteryConsumers.add(uidBatteryConsumerBuilder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a read-only object out of the Builder values.
|
||||
*/
|
||||
@NonNull
|
||||
public SystemBatteryConsumer build() {
|
||||
if (mUidBatteryConsumers != null) {
|
||||
for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) {
|
||||
UidBatteryConsumer.Builder uidBatteryConsumer = mUidBatteryConsumers.get(i);
|
||||
mPowerComponentsBuilder.addPowerAndDuration(
|
||||
uidBatteryConsumer.mPowerComponentsBuilder);
|
||||
}
|
||||
}
|
||||
return new SystemBatteryConsumer(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.SparseArray;
|
||||
|
||||
@@ -55,11 +54,6 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
|
||||
powerMah, powerModel);
|
||||
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, durationMs);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,11 +37,14 @@ public class BatteryChargeCalculator extends PowerCalculator {
|
||||
@Override
|
||||
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
|
||||
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||
final double dischargedPowerLowerBoundMah =
|
||||
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100;
|
||||
final double dischargedPowerUpperBoundMah =
|
||||
batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100;
|
||||
builder.setDischargePercentage(
|
||||
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
|
||||
.setDischargedPowerRange(
|
||||
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100,
|
||||
batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100);
|
||||
.setDischargedPowerRange(dischargedPowerLowerBoundMah,
|
||||
dischargedPowerUpperBoundMah);
|
||||
|
||||
final long batteryTimeRemainingMs = batteryStats.computeBatteryTimeRemaining(rawRealtimeUs);
|
||||
if (batteryTimeRemainingMs != -1) {
|
||||
@@ -52,6 +55,11 @@ public class BatteryChargeCalculator extends PowerCalculator {
|
||||
if (chargeTimeRemainingMs != -1) {
|
||||
builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000);
|
||||
}
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setConsumedPower(
|
||||
(dischargedPowerLowerBoundMah + dischargedPowerUpperBoundMah) / 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.os.BatteryStats.ControllerActivityCounter;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
@@ -58,19 +57,11 @@ public class BluetoothPowerCalculator extends PowerCalculator {
|
||||
|
||||
final PowerAndDuration total = new PowerAndDuration();
|
||||
|
||||
SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH);
|
||||
|
||||
final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders =
|
||||
builder.getUidBatteryConsumerBuilders();
|
||||
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
|
||||
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
|
||||
calculateApp(app, total, query);
|
||||
if (app.getUid() == Process.BLUETOOTH_UID) {
|
||||
app.excludeFromBatteryUsageStats();
|
||||
systemBatteryConsumerBuilder.addUidBatteryConsumer(app);
|
||||
}
|
||||
}
|
||||
|
||||
final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
|
||||
@@ -87,12 +78,6 @@ public class BluetoothPowerCalculator extends PowerCalculator {
|
||||
Log.d(TAG, "Bluetooth active: time=" + (systemComponentDurationMs)
|
||||
+ " power=" + formatCharge(systemPowerMah));
|
||||
}
|
||||
systemBatteryConsumerBuilder
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
|
||||
systemComponentDurationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
|
||||
Math.max(systemPowerMah, total.powerMah), powerModel)
|
||||
.setPowerConsumedByApps(total.powerMah);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.util.SparseArray;
|
||||
|
||||
@@ -47,15 +46,6 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
|
||||
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
|
||||
batteryStats.getCustomConsumerMeasuredBatteryConsumptionUC());
|
||||
if (customMeasuredPowerMah != null) {
|
||||
final SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_CUSTOM);
|
||||
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
|
||||
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
|
||||
customMeasuredPowerMah[i]);
|
||||
}
|
||||
|
||||
final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder =
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
@@ -53,9 +52,6 @@ public class IdlePowerCalculator extends PowerCalculator {
|
||||
calculatePowerAndDuration(batteryStats, rawRealtimeUs, rawUptimeUs,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
if (mPowerMah != 0) {
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_IDLE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE, mDurationMs);
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah)
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.LongSparseArray;
|
||||
import android.util.SparseArray;
|
||||
@@ -31,9 +30,6 @@ public class MemoryPowerCalculator extends PowerCalculator {
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
final double powerMah = calculatePower(batteryStats, rawRealtimeUs,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_MEMORY)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah);
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs)
|
||||
|
||||
@@ -19,7 +19,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.telephony.CellSignalStrength;
|
||||
@@ -105,15 +104,6 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
|
||||
calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC);
|
||||
|
||||
if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) {
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
|
||||
total.durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
|
||||
total.remainingPowerMah + total.totalAppPowerMah,
|
||||
powerModel)
|
||||
.setPowerConsumedByApps(total.totalAppPowerMah);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.SparseArray;
|
||||
|
||||
@@ -44,9 +43,6 @@ public class PhonePowerCalculator extends PowerCalculator {
|
||||
BatteryStats.STATS_SINCE_CHARGED) / 1000;
|
||||
final double phoneOnPower = mPowerEstimator.calculatePower(phoneOnTimeMs);
|
||||
if (phoneOnPower != 0) {
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_PHONE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs);
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower)
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.text.format.DateUtils;
|
||||
@@ -109,13 +108,6 @@ public class ScreenPowerCalculator extends PowerCalculator {
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, totalAppPower, powerModel)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, totalAppDuration);
|
||||
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN,
|
||||
totalPowerAndDuration.durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
|
||||
Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel)
|
||||
.setPowerConsumedByApps(totalAppPower);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
@@ -79,10 +78,6 @@ public class WifiPowerCalculator extends PowerCalculator {
|
||||
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
|
||||
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||
|
||||
final SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_WIFI);
|
||||
|
||||
long totalAppDurationMs = 0;
|
||||
double totalAppPowerMah = 0;
|
||||
final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic();
|
||||
@@ -104,11 +99,6 @@ public class WifiPowerCalculator extends PowerCalculator {
|
||||
powerDurationAndTraffic.durationMs);
|
||||
app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
|
||||
powerDurationAndTraffic.powerMah, powerModel);
|
||||
|
||||
if (app.getUid() == Process.WIFI_UID) {
|
||||
systemBatteryConsumerBuilder.addUidBatteryConsumer(app);
|
||||
app.excludeFromBatteryUsageStats();
|
||||
}
|
||||
}
|
||||
|
||||
final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC();
|
||||
@@ -117,13 +107,6 @@ public class WifiPowerCalculator extends PowerCalculator {
|
||||
BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(),
|
||||
totalAppDurationMs, totalAppPowerMah, consumptionUC);
|
||||
|
||||
systemBatteryConsumerBuilder
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
|
||||
powerDurationAndTraffic.durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
|
||||
totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel)
|
||||
.setPowerConsumedByApps(totalAppPowerMah);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.frameworks.core.batterystatsviewer;
|
||||
import android.content.Context;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserHandle;
|
||||
import android.util.DebugUtils;
|
||||
@@ -133,11 +132,6 @@ public class BatteryConsumerData {
|
||||
}
|
||||
}
|
||||
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getSystemBatteryConsumers()) {
|
||||
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
|
||||
return consumer;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -157,11 +151,25 @@ public class BatteryConsumerData {
|
||||
|
||||
private void computeTotalPower(BatteryUsageStats batteryUsageStats,
|
||||
double[] powerByComponentMah) {
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT;
|
||||
component++) {
|
||||
powerByComponentMah[component] += consumer.getConsumedPower(component);
|
||||
}
|
||||
final BatteryConsumer consumer =
|
||||
batteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; component++) {
|
||||
powerByComponentMah[component] += consumer.getConsumedPower(component);
|
||||
}
|
||||
}
|
||||
|
||||
private void computeTotalPowerForCustomComponent(
|
||||
BatteryUsageStats batteryUsageStats, double[] powerByComponentMah) {
|
||||
final BatteryConsumer consumer =
|
||||
batteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
final int customComponentCount = consumer.getCustomPowerComponentCount();
|
||||
for (int component = 0;
|
||||
component < Math.min(customComponentCount, powerByComponentMah.length);
|
||||
component++) {
|
||||
powerByComponentMah[component] += consumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + component);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,19 +183,6 @@ public class BatteryConsumerData {
|
||||
}
|
||||
}
|
||||
|
||||
private void computeTotalPowerForCustomComponent(
|
||||
BatteryUsageStats batteryUsageStats, double[] powerByComponentMah) {
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
final int customComponentCount = consumer.getCustomPowerComponentCount();
|
||||
for (int component = 0;
|
||||
component < Math.min(customComponentCount, powerByComponentMah.length);
|
||||
component++) {
|
||||
powerByComponentMah[component] += consumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + component);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addEntry(String title, EntryType entryType, double amount, double totalAmount,
|
||||
boolean isSystemBatteryConsumer) {
|
||||
Entry entry = new Entry();
|
||||
@@ -212,8 +207,6 @@ public class BatteryConsumerData {
|
||||
return "APP|"
|
||||
+ UserHandle.getUserId(((UidBatteryConsumer) consumer).getUid()) + "|"
|
||||
+ ((UidBatteryConsumer) consumer).getUid();
|
||||
} else if (consumer instanceof SystemBatteryConsumer) {
|
||||
return ((SystemBatteryConsumer) consumer).getDrainType() + "|0|0";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.content.pm.PackageManager;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.util.DebugUtils;
|
||||
|
||||
@@ -113,20 +112,6 @@ class BatteryConsumerInfoHelper {
|
||||
// Won't happen
|
||||
}
|
||||
}
|
||||
} else if (batteryConsumer instanceof SystemBatteryConsumer) {
|
||||
final SystemBatteryConsumer systemBatteryConsumer =
|
||||
(SystemBatteryConsumer) batteryConsumer;
|
||||
final int drainType = systemBatteryConsumer.getDrainType();
|
||||
String name = DebugUtils.constantToString(SystemBatteryConsumer.class, "DRAIN_TYPE_",
|
||||
drainType);
|
||||
info.label = name.charAt(0) + name.substring(1).toLowerCase().replace('_', ' ');
|
||||
info.isSystemBatteryConsumer = true;
|
||||
try {
|
||||
info.iconInfo =
|
||||
packageManager.getApplicationInfo(SYSTEM_SERVER_PACKAGE_NAME, 0);
|
||||
} catch (PackageManager.NameNotFoundException nameNotFoundException) {
|
||||
// Won't happen
|
||||
}
|
||||
} else {
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
|
||||
@@ -18,68 +18,60 @@ package com.android.frameworks.core.batterystatsviewer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.BatteryStatsManager;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.Bundle;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.ComponentActivity;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.loader.content.Loader;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.android.settingslib.utils.AsyncLoaderCompat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Picker, showing a sorted lists of applications and other types of entities consuming power.
|
||||
* Opens BatteryStatsViewerActivity upon item selection.
|
||||
*/
|
||||
public class BatteryConsumerPickerActivity extends FragmentActivity {
|
||||
public class BatteryConsumerPickerActivity extends ComponentActivity {
|
||||
private static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId";
|
||||
private static final int BATTERY_STATS_REFRESH_RATE_MILLIS = 60 * 1000;
|
||||
private BatteryConsumerListAdapter mBatteryConsumerListAdapter;
|
||||
private RecyclerView mAppList;
|
||||
private View mLoadingView;
|
||||
private final Runnable mBatteryStatsRefresh = this::loadBatteryStats;
|
||||
|
||||
private interface OnBatteryConsumerSelectedListener {
|
||||
void onBatteryConsumerSelected(String batteryConsumerId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
|
||||
setContentView(R.layout.battery_consumer_picker_activity_layout);
|
||||
setContentView(R.layout.battery_consumer_picker_layout);
|
||||
mLoadingView = findViewById(R.id.loading_view);
|
||||
|
||||
ViewPager viewPager = findViewById(R.id.pager);
|
||||
mAppList = findViewById(R.id.list_view);
|
||||
mAppList.setLayoutManager(new LinearLayoutManager(this));
|
||||
mBatteryConsumerListAdapter =
|
||||
new BatteryConsumerListAdapter((this::setSelectedBatteryConsumer));
|
||||
mAppList.setAdapter(mBatteryConsumerListAdapter);
|
||||
|
||||
FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(
|
||||
getSupportFragmentManager()) {
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return new BatteryConsumerPickerFragment(
|
||||
BatteryConsumerPickerFragment.PICKER_TYPE_APP);
|
||||
case 1:
|
||||
default:
|
||||
return new BatteryConsumerPickerFragment(
|
||||
BatteryConsumerPickerFragment.PICKER_TYPE_DRAIN);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return "Apps";
|
||||
case 1:
|
||||
return "Drains";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
viewPager.setAdapter(adapter);
|
||||
TabLayout tabLayout = findViewById(R.id.tab_layout);
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
if (icicle == null) {
|
||||
final String batteryConsumerId = getPreferences(Context.MODE_PRIVATE)
|
||||
.getString(PREF_SELECTED_BATTERY_CONSUMER, null);
|
||||
@@ -101,4 +93,183 @@ public class BatteryConsumerPickerActivity extends FragmentActivity {
|
||||
.putExtra(BatteryStatsViewerActivity.EXTRA_BATTERY_CONSUMER, batteryConsumerId);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
loadBatteryStats();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
|
||||
}
|
||||
|
||||
private void loadBatteryStats() {
|
||||
LoaderManager.getInstance(this).restartLoader(0, null,
|
||||
new BatteryConsumerListLoaderCallbacks());
|
||||
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
|
||||
}
|
||||
|
||||
private static class BatteryConsumerListLoader extends
|
||||
AsyncLoaderCompat<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> {
|
||||
private final BatteryStatsManager mBatteryStatsManager;
|
||||
private final PackageManager mPackageManager;
|
||||
|
||||
BatteryConsumerListLoader(Context context) {
|
||||
super(context);
|
||||
mBatteryStatsManager = context.getSystemService(BatteryStatsManager.class);
|
||||
mPackageManager = context.getPackageManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BatteryConsumerInfoHelper.BatteryConsumerInfo> loadInBackground() {
|
||||
final BatteryUsageStats batteryUsageStats = mBatteryStatsManager.getBatteryUsageStats();
|
||||
List<BatteryConsumerInfoHelper.BatteryConsumerInfo> batteryConsumerList =
|
||||
new ArrayList<>();
|
||||
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
scope++) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(
|
||||
batteryUsageStats.getAggregateBatteryConsumer(scope),
|
||||
BatteryConsumerData.batteryConsumerId(scope),
|
||||
mPackageManager));
|
||||
}
|
||||
|
||||
for (UidBatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
|
||||
BatteryConsumerData.batteryConsumerId(consumer),
|
||||
mPackageManager));
|
||||
}
|
||||
|
||||
batteryConsumerList.sort(
|
||||
Comparator.comparing(
|
||||
(BatteryConsumerInfoHelper.BatteryConsumerInfo a) -> a.powerMah)
|
||||
.reversed());
|
||||
|
||||
return batteryConsumerList;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(List<BatteryConsumerInfoHelper.BatteryConsumerInfo> result) {
|
||||
}
|
||||
}
|
||||
|
||||
private class BatteryConsumerListLoaderCallbacks implements
|
||||
LoaderManager.LoaderCallbacks<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> {
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> onCreateLoader(int id,
|
||||
Bundle args) {
|
||||
return new BatteryConsumerListLoader(BatteryConsumerPickerActivity.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(
|
||||
@NonNull Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> loader,
|
||||
List<BatteryConsumerInfoHelper.BatteryConsumerInfo> batteryConsumerList) {
|
||||
mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList);
|
||||
mAppList.setVisibility(View.VISIBLE);
|
||||
mLoadingView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(
|
||||
@NonNull Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> loader) {
|
||||
}
|
||||
}
|
||||
|
||||
public class BatteryConsumerListAdapter
|
||||
extends RecyclerView.Adapter<BatteryConsumerViewHolder> {
|
||||
private final OnBatteryConsumerSelectedListener mListener;
|
||||
private List<BatteryConsumerInfoHelper.BatteryConsumerInfo> mBatteryConsumerList;
|
||||
|
||||
public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
void setBatteryConsumerList(
|
||||
List<BatteryConsumerInfoHelper.BatteryConsumerInfo> batteryConsumerList) {
|
||||
mBatteryConsumerList = batteryConsumerList;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mBatteryConsumerList.size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public BatteryConsumerViewHolder onCreateViewHolder(
|
||||
@NonNull ViewGroup viewGroup,
|
||||
int position) {
|
||||
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
|
||||
View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup,
|
||||
false);
|
||||
return new BatteryConsumerViewHolder(view, mListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) {
|
||||
BatteryConsumerInfoHelper.BatteryConsumerInfo item = mBatteryConsumerList.get(position);
|
||||
viewHolder.id = item.id;
|
||||
viewHolder.titleView.setText(item.label);
|
||||
if (item.details != null) {
|
||||
viewHolder.detailsView.setText(item.details);
|
||||
viewHolder.detailsView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.detailsView.setVisibility(View.GONE);
|
||||
}
|
||||
viewHolder.powerView.setText(
|
||||
String.format(Locale.getDefault(), "%.1f mAh", item.powerMah));
|
||||
if (item.iconInfo != null) {
|
||||
viewHolder.iconView.setImageDrawable(
|
||||
item.iconInfo.loadIcon(getPackageManager()));
|
||||
} else {
|
||||
viewHolder.iconView.setImageResource(R.drawable.gm_device_24);
|
||||
}
|
||||
if (item.packages != null) {
|
||||
viewHolder.packagesView.setText(item.packages);
|
||||
viewHolder.packagesView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.packagesView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// View Holder used when displaying apps
|
||||
public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder
|
||||
implements View.OnClickListener {
|
||||
private final OnBatteryConsumerSelectedListener mListener;
|
||||
|
||||
public String id;
|
||||
public TextView titleView;
|
||||
public TextView detailsView;
|
||||
public ImageView iconView;
|
||||
public TextView packagesView;
|
||||
public TextView powerView;
|
||||
|
||||
BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) {
|
||||
super(view);
|
||||
mListener = listener;
|
||||
view.setOnClickListener(this);
|
||||
titleView = view.findViewById(android.R.id.title);
|
||||
detailsView = view.findViewById(R.id.details);
|
||||
iconView = view.findViewById(android.R.id.icon);
|
||||
packagesView = view.findViewById(R.id.packages);
|
||||
powerView = view.findViewById(R.id.power_mah);
|
||||
powerView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mListener.onBatteryConsumerSelected(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,267 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.frameworks.core.batterystatsviewer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.BatteryStatsManager;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.loader.content.Loader;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.frameworks.core.batterystatsviewer.BatteryConsumerInfoHelper.BatteryConsumerInfo;
|
||||
import com.android.settingslib.utils.AsyncLoaderCompat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Picker, showing a sorted lists of applications or other types of entities consuming power.
|
||||
* Returns the selected entity ID or null.
|
||||
*/
|
||||
public class BatteryConsumerPickerFragment extends Fragment {
|
||||
private static final String TAG = "AppPicker";
|
||||
|
||||
public static final String PICKER_TYPE = "pickertype";
|
||||
|
||||
public static final int PICKER_TYPE_APP = 0;
|
||||
public static final int PICKER_TYPE_DRAIN = 1;
|
||||
|
||||
private BatteryConsumerListAdapter mBatteryConsumerListAdapter;
|
||||
private RecyclerView mAppList;
|
||||
private View mLoadingView;
|
||||
|
||||
private interface OnBatteryConsumerSelectedListener {
|
||||
void onBatteryConsumerSelected(String batteryConsumerId);
|
||||
}
|
||||
|
||||
public BatteryConsumerPickerFragment(int pickerType) {
|
||||
Bundle args = new Bundle();
|
||||
args.putInt(PICKER_TYPE, pickerType);
|
||||
setArguments(args);
|
||||
}
|
||||
|
||||
public BatteryConsumerPickerFragment() {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.battery_consumer_picker_layout, container, false);
|
||||
mLoadingView = view.findViewById(R.id.loading_view);
|
||||
|
||||
mAppList = view.findViewById(R.id.list_view);
|
||||
mAppList.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
mBatteryConsumerListAdapter = new BatteryConsumerListAdapter(
|
||||
BatteryConsumerPickerFragment.this::setSelectedBatteryConsumer);
|
||||
mAppList.setAdapter(mBatteryConsumerListAdapter);
|
||||
|
||||
LoaderManager.getInstance(this).initLoader(0, getArguments(),
|
||||
new BatteryConsumerListLoaderCallbacks());
|
||||
return view;
|
||||
}
|
||||
|
||||
public void setSelectedBatteryConsumer(String id) {
|
||||
((BatteryConsumerPickerActivity) getActivity()).setSelectedBatteryConsumer(id);
|
||||
}
|
||||
|
||||
private static class BatteryConsumerListLoader extends
|
||||
AsyncLoaderCompat<List<BatteryConsumerInfo>> {
|
||||
private final int mPickerType;
|
||||
private final BatteryStatsManager mBatteryStatsManager;
|
||||
private final PackageManager mPackageManager;
|
||||
|
||||
BatteryConsumerListLoader(Context context, int pickerType) {
|
||||
super(context);
|
||||
mBatteryStatsManager = context.getSystemService(BatteryStatsManager.class);
|
||||
mPickerType = pickerType;
|
||||
mPackageManager = context.getPackageManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BatteryConsumerInfo> loadInBackground() {
|
||||
final BatteryUsageStats batteryUsageStats = mBatteryStatsManager.getBatteryUsageStats();
|
||||
List<BatteryConsumerInfo> batteryConsumerList = new ArrayList<>();
|
||||
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
scope++) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(
|
||||
batteryUsageStats.getAggregateBatteryConsumer(scope),
|
||||
BatteryConsumerData.batteryConsumerId(scope),
|
||||
mPackageManager));
|
||||
}
|
||||
|
||||
switch (mPickerType) {
|
||||
case PICKER_TYPE_APP:
|
||||
for (UidBatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
|
||||
BatteryConsumerData.batteryConsumerId(consumer),
|
||||
mPackageManager));
|
||||
}
|
||||
break;
|
||||
case PICKER_TYPE_DRAIN:
|
||||
default:
|
||||
for (SystemBatteryConsumer consumer :
|
||||
batteryUsageStats.getSystemBatteryConsumers()) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
|
||||
BatteryConsumerData.batteryConsumerId(consumer),
|
||||
mPackageManager));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
batteryConsumerList.sort(
|
||||
Comparator.comparing((BatteryConsumerInfo a) -> a.powerMah).reversed());
|
||||
return batteryConsumerList;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(List<BatteryConsumerInfo> result) {
|
||||
}
|
||||
}
|
||||
|
||||
private class BatteryConsumerListLoaderCallbacks implements
|
||||
LoaderManager.LoaderCallbacks<List<BatteryConsumerInfo>> {
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Loader<List<BatteryConsumerInfo>> onCreateLoader(int id, Bundle args) {
|
||||
return new BatteryConsumerListLoader(getContext(), args.getInt(PICKER_TYPE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(@NonNull Loader<List<BatteryConsumerInfo>> loader,
|
||||
List<BatteryConsumerInfo> batteryConsumerList) {
|
||||
mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList);
|
||||
mAppList.setVisibility(View.VISIBLE);
|
||||
mLoadingView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(
|
||||
@NonNull Loader<List<BatteryConsumerInfo>> loader) {
|
||||
}
|
||||
}
|
||||
|
||||
public class BatteryConsumerListAdapter extends
|
||||
RecyclerView.Adapter<BatteryConsumerViewHolder> {
|
||||
private final OnBatteryConsumerSelectedListener mListener;
|
||||
private List<BatteryConsumerInfo> mBatteryConsumerList;
|
||||
|
||||
public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
void setBatteryConsumerList(List<BatteryConsumerInfo> batteryConsumerList) {
|
||||
mBatteryConsumerList = batteryConsumerList;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mBatteryConsumerList.size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public BatteryConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
|
||||
int position) {
|
||||
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
|
||||
View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup,
|
||||
false);
|
||||
return new BatteryConsumerViewHolder(view, mListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) {
|
||||
BatteryConsumerInfo item = mBatteryConsumerList.get(position);
|
||||
viewHolder.id = item.id;
|
||||
viewHolder.titleView.setText(item.label);
|
||||
if (item.details != null) {
|
||||
viewHolder.detailsView.setText(item.details);
|
||||
viewHolder.detailsView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.detailsView.setVisibility(View.GONE);
|
||||
}
|
||||
viewHolder.powerView.setText(
|
||||
String.format(Locale.getDefault(), "%.1f mAh", item.powerMah));
|
||||
if (item.iconInfo != null) {
|
||||
viewHolder.iconView.setImageDrawable(
|
||||
item.iconInfo.loadIcon(getContext().getPackageManager()));
|
||||
} else {
|
||||
viewHolder.iconView.setImageResource(R.drawable.gm_device_24);
|
||||
}
|
||||
if (item.packages != null) {
|
||||
viewHolder.packagesView.setText(item.packages);
|
||||
viewHolder.packagesView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.packagesView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// View Holder used when displaying apps
|
||||
public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder
|
||||
implements View.OnClickListener {
|
||||
private final OnBatteryConsumerSelectedListener mListener;
|
||||
|
||||
public String id;
|
||||
public TextView titleView;
|
||||
public TextView detailsView;
|
||||
public ImageView iconView;
|
||||
public TextView packagesView;
|
||||
public TextView powerView;
|
||||
|
||||
BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) {
|
||||
super(view);
|
||||
mListener = listener;
|
||||
view.setOnClickListener(this);
|
||||
titleView = view.findViewById(android.R.id.title);
|
||||
detailsView = view.findViewById(R.id.details);
|
||||
iconView = view.findViewById(android.R.id.icon);
|
||||
packagesView = view.findViewById(R.id.packages);
|
||||
powerView = view.findViewById(R.id.power_mah);
|
||||
powerView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mListener.onBatteryConsumerSelected(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
private static final int LOADER_BATTERY_USAGE_STATS = 1;
|
||||
|
||||
private BatteryStatsDataAdapter mBatteryStatsDataAdapter;
|
||||
private final Runnable mBatteryStatsRefresh = this::periodicBatteryStatsRefresh;
|
||||
private final Runnable mBatteryStatsRefresh = this::loadBatteryStats;
|
||||
private String mBatteryConsumerId;
|
||||
private TextView mTitleView;
|
||||
private TextView mDetailsView;
|
||||
@@ -85,13 +85,15 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
mLoadingView = findViewById(R.id.loading_view);
|
||||
mEmptyView = findViewById(R.id.empty_view);
|
||||
|
||||
loadBatteryStats();
|
||||
LoaderManager loaderManager = LoaderManager.getInstance(this);
|
||||
loaderManager.restartLoader(LOADER_BATTERY_USAGE_STATS, null,
|
||||
new BatteryUsageStatsLoaderCallbacks());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
periodicBatteryStatsRefresh();
|
||||
loadBatteryStats();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -100,15 +102,11 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
|
||||
}
|
||||
|
||||
private void periodicBatteryStatsRefresh() {
|
||||
loadBatteryStats();
|
||||
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
|
||||
}
|
||||
|
||||
private void loadBatteryStats() {
|
||||
LoaderManager loaderManager = LoaderManager.getInstance(this);
|
||||
loaderManager.restartLoader(LOADER_BATTERY_USAGE_STATS, null,
|
||||
new BatteryUsageStatsLoaderCallbacks());
|
||||
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
|
||||
}
|
||||
|
||||
private static class BatteryUsageStatsLoader extends
|
||||
|
||||
@@ -60,6 +60,8 @@ public class BatteryChargeCalculatorTest {
|
||||
|
||||
BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
|
||||
|
||||
assertThat(batteryUsageStats.getConsumedPower())
|
||||
.isWithin(PRECISION).of(380.0);
|
||||
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10);
|
||||
assertThat(batteryUsageStats.getDischargedPowerRange().getLower())
|
||||
.isWithin(PRECISION).of(360.0);
|
||||
|
||||
@@ -27,7 +27,6 @@ import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.UserBatteryConsumer;
|
||||
import android.util.SparseArray;
|
||||
@@ -206,16 +205,6 @@ public class BatteryUsageStatsRule implements TestRule {
|
||||
return null;
|
||||
}
|
||||
|
||||
public SystemBatteryConsumer getSystemBatteryConsumer(
|
||||
@SystemBatteryConsumer.DrainType int drainType) {
|
||||
for (SystemBatteryConsumer sbc : mBatteryUsageStats.getSystemBatteryConsumers()) {
|
||||
if (sbc.getDrainType() == drainType) {
|
||||
return sbc;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public UserBatteryConsumer getUserBatteryConsumer(int userId) {
|
||||
for (UserBatteryConsumer ubc : mBatteryUsageStats.getUserBatteryConsumers()) {
|
||||
if (ubc.getUserId() == userId) {
|
||||
|
||||
@@ -23,7 +23,6 @@ import static org.junit.Assert.fail;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.Parcel;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -71,7 +70,6 @@ public class BatteryUsageStatsTest {
|
||||
.setDischargePercentage(20)
|
||||
.setDischargedPowerRange(1000, 2000)
|
||||
.setStatsStartTimestamp(1000);
|
||||
|
||||
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid)
|
||||
.setPackageWithHighestDrain("foo")
|
||||
.setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, 1000)
|
||||
@@ -87,17 +85,6 @@ public class BatteryUsageStatsTest {
|
||||
.setUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 800);
|
||||
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_CAMERA)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 10100)
|
||||
.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200)
|
||||
.setUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 10300)
|
||||
.setUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400)
|
||||
.setPowerConsumedByApps(20000);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
|
||||
.setConsumedPower(
|
||||
@@ -111,6 +98,7 @@ public class BatteryUsageStatsTest {
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setConsumedPower(30000)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 20100)
|
||||
.setConsumedPowerForCustomComponent(
|
||||
@@ -124,10 +112,7 @@ public class BatteryUsageStatsTest {
|
||||
}
|
||||
|
||||
public void validateBatteryUsageStats(BatteryUsageStats batteryUsageStats) {
|
||||
// Camera: (10100 + 10200) - 20000 (consumed by apps) = 300
|
||||
// App: 300 + 400 + 500 = 1200
|
||||
// Total: 1500
|
||||
assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(1500);
|
||||
assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(30000);
|
||||
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(20);
|
||||
assertThat(batteryUsageStats.getDischargedPowerRange().getLower()).isEqualTo(1000);
|
||||
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()).isEqualTo(2000);
|
||||
@@ -161,30 +146,6 @@ public class BatteryUsageStatsTest {
|
||||
}
|
||||
}
|
||||
|
||||
final List<SystemBatteryConsumer> systemBatteryConsumers =
|
||||
batteryUsageStats.getSystemBatteryConsumers();
|
||||
for (SystemBatteryConsumer systemBatteryConsumer : systemBatteryConsumers) {
|
||||
if (systemBatteryConsumer.getDrainType() == SystemBatteryConsumer.DRAIN_TYPE_CAMERA) {
|
||||
assertThat(systemBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10100);
|
||||
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
|
||||
assertThat(systemBatteryConsumer.getUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10300);
|
||||
assertThat(systemBatteryConsumer.getUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10400);
|
||||
assertThat(systemBatteryConsumer.getConsumedPower()).isEqualTo(20300);
|
||||
assertThat(systemBatteryConsumer.getPowerConsumedByApps()).isEqualTo(20000);
|
||||
assertThat(systemBatteryConsumer.getUsageDurationMillis())
|
||||
.isEqualTo(10400); // max
|
||||
assertThat(systemBatteryConsumer.getCustomPowerComponentCount()).isEqualTo(1);
|
||||
assertThat(systemBatteryConsumer.getCustomPowerComponentName(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo("FOO");
|
||||
} else {
|
||||
fail("Unexpected drain type " + systemBatteryConsumer.getDrainType());
|
||||
}
|
||||
}
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = batteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS);
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(
|
||||
|
||||
@@ -64,7 +64,9 @@ public class BluetoothPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
|
||||
|
||||
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
|
||||
0.11388, 6000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.24722, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
@@ -95,7 +97,9 @@ public class BluetoothPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
|
||||
|
||||
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
|
||||
0.1, 6000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.2, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
@@ -123,7 +127,9 @@ public class BluetoothPowerCalculatorTest {
|
||||
mStatsRule.apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(),
|
||||
calculator);
|
||||
|
||||
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
|
||||
0.10378, 3583, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.22950, 8416, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
@@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.util.SparseLongArray;
|
||||
|
||||
@@ -68,15 +67,6 @@ public class CustomMeasuredPowerCalculatorTest {
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||
.isWithin(PRECISION).of(33.33333);
|
||||
|
||||
SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_CUSTOM);
|
||||
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||
.isWithin(PRECISION).of(27.77777);
|
||||
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||
.isWithin(PRECISION).of(55.55555);
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.internal.os;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
@@ -46,13 +45,6 @@ public class IdlePowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_IDLE);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isWithin(PRECISION).of(0.7);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isEqualTo(3000);
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.internal.os;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
@@ -53,8 +52,7 @@ public class MemoryPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MEMORY);
|
||||
BatteryConsumer consumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY))
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY))
|
||||
|
||||
@@ -27,7 +27,6 @@ import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkStats;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.telephony.DataConnectionRealTimeInfo;
|
||||
import android.telephony.ModemActivityInfo;
|
||||
@@ -100,17 +99,6 @@ public class MobileRadioPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(2.2444);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(consumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(2.2444);
|
||||
assertThat(consumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.8);
|
||||
|
||||
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
|
||||
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(0.8);
|
||||
@@ -171,17 +159,6 @@ public class MobileRadioPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO);
|
||||
|
||||
// 100000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) + 1.53934 (apps)= 4.31711 mAh
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(4.31711);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(consumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(1.53934);
|
||||
|
||||
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
|
||||
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(1.53934);
|
||||
|
||||
@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
import android.app.ActivityManager;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.view.Display;
|
||||
|
||||
@@ -82,21 +81,6 @@ public class ScreenPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
|
||||
// 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) = 166.66666 mAh
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(consumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(consumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
|
||||
UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
|
||||
assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(20 * MINUTE_IN_MS);
|
||||
@@ -130,8 +114,6 @@ public class ScreenPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(deviceConsumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
@@ -141,8 +123,6 @@ public class ScreenPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(appsConsumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -174,19 +154,6 @@ public class ScreenPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(92.0);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(consumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(92.0);
|
||||
assertThat(consumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(92.0);
|
||||
|
||||
UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
|
||||
assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(20 * MINUTE_IN_MS);
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkStats;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
import android.os.WorkSource;
|
||||
import android.os.connectivity.WifiActivityEnergyInfo;
|
||||
@@ -94,17 +93,6 @@ public class WifiPowerCalculatorTest {
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
SystemBatteryConsumer systemConsumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
|
||||
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(5577);
|
||||
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(1.11153);
|
||||
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.466333);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(4002);
|
||||
@@ -139,18 +127,6 @@ public class WifiPowerCalculatorTest {
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
SystemBatteryConsumer systemConsumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
|
||||
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(5577);
|
||||
/* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
|
||||
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(1.11153 / (0.2214666 + 0.645200) * 1_000_000 / 3600000);
|
||||
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.14946);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(4002);
|
||||
@@ -196,17 +172,6 @@ public class WifiPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(0.8231573);
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
SystemBatteryConsumer systemConsumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
|
||||
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(2222);
|
||||
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(2.575000);
|
||||
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(1.69907);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -228,17 +193,5 @@ public class WifiPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(0.8231573 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
SystemBatteryConsumer systemConsumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
|
||||
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(2222);
|
||||
/* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
|
||||
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(2.575000 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
|
||||
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.277777);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user