blob: 9b51a8ef641071ec252acf35921092192c8b662c [file] [log] [blame]
/*
* Copyright (C) 2021 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.internal.os;
import android.os.AggregateBatteryConsumer;
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UidBatteryConsumer;
import android.util.SparseArray;
/**
* Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type
* {@link android.hardware.power.stats.EnergyConsumerType#OTHER}).
*/
public class CustomMeasuredPowerCalculator extends PowerCalculator {
public CustomMeasuredPowerCalculator(PowerProfile powerProfile) {
}
@Override
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
double[] totalAppPowerMah = null;
final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders =
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
totalAppPowerMah = calculateApp(app, app.getBatteryStatsUid(), totalAppPowerMah);
}
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
batteryStats.getCustomConsumerMeasuredBatteryConsumptionUC());
if (customMeasuredPowerMah != null) {
final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder =
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
deviceBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
customMeasuredPowerMah[i]);
}
}
if (totalAppPowerMah != null) {
final AggregateBatteryConsumer.Builder appsBatteryConsumerBuilder =
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS);
for (int i = 0; i < totalAppPowerMah.length; i++) {
appsBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
totalAppPowerMah[i]);
}
}
}
private double[] calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
double[] totalPowerMah) {
double[] newTotalPowerMah = null;
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
u.getCustomConsumerMeasuredBatteryConsumptionUC());
if (customMeasuredPowerMah != null) {
if (totalPowerMah == null) {
newTotalPowerMah = new double[customMeasuredPowerMah.length];
} else if (totalPowerMah.length != customMeasuredPowerMah.length) {
newTotalPowerMah = new double[customMeasuredPowerMah.length];
System.arraycopy(totalPowerMah, 0, newTotalPowerMah, 0,
customMeasuredPowerMah.length);
} else {
newTotalPowerMah = totalPowerMah;
}
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
app.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
customMeasuredPowerMah[i]);
newTotalPowerMah[i] += customMeasuredPowerMah[i];
}
}
return newTotalPowerMah;
}
@Override
protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
long rawUptimeUs, int statsType) {
updateCustomMeasuredPowerMah(app, u.getCustomConsumerMeasuredBatteryConsumptionUC());
}
private void updateCustomMeasuredPowerMah(BatterySipper sipper, long[] measuredChargeUC) {
sipper.customMeasuredPowerMah = calculateMeasuredEnergiesMah(measuredChargeUC);
}
private double[] calculateMeasuredEnergiesMah(long[] measuredChargeUC) {
if (measuredChargeUC == null) {
return null;
}
final double[] measuredEnergiesMah = new double[measuredChargeUC.length];
for (int i = 0; i < measuredChargeUC.length; i++) {
measuredEnergiesMah[i] = uCtoMah(measuredChargeUC[i]);
}
return measuredEnergiesMah;
}
}