/* * Copyright (C) 2009 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.BatteryStats.Uid; /** * Contains power usage of an application, system service, or hardware type. */ public class BatterySipper implements Comparable<BatterySipper> { public int userId; public Uid uidObj; public double totalPowerMah; public DrainType drainType; /** * Generic usage time in milliseconds. */ public long usageTimeMs; /** * Generic power usage in mAh. */ public double usagePowerMah; // Subsystem usage times. public long cpuTimeMs; public long gpsTimeMs; public long wifiRunningTimeMs; public long cpuFgTimeMs; public long wakeLockTimeMs; public long cameraTimeMs; public long flashlightTimeMs; public long mobileRxPackets; public long mobileTxPackets; public long mobileActive; public int mobileActiveCount; public double mobilemspp; // milliseconds per packet public long wifiRxPackets; public long wifiTxPackets; public long mobileRxBytes; public long mobileTxBytes; public long wifiRxBytes; public long wifiTxBytes; public double percent; public double noCoveragePercent; public String[] mPackages; public String packageWithHighestDrain; // Measured in mAh (milli-ampere per hour). // These are included when summed. public double wifiPowerMah; public double cpuPowerMah; public double wakeLockPowerMah; public double mobileRadioPowerMah; public double gpsPowerMah; public double sensorPowerMah; public double cameraPowerMah; public double flashlightPowerMah; public enum DrainType { IDLE, CELL, PHONE, WIFI, BLUETOOTH, FLASHLIGHT, SCREEN, APP, USER, UNACCOUNTED, OVERCOUNTED, CAMERA } public BatterySipper(DrainType drainType, Uid uid, double value) { this.totalPowerMah = value; this.drainType = drainType; uidObj = uid; } public void computeMobilemspp() { long packets = mobileRxPackets+mobileTxPackets; mobilemspp = packets > 0 ? (mobileActive / (double)packets) : 0; } @Override public int compareTo(BatterySipper other) { // Over-counted always goes to the bottom. if (drainType != other.drainType) { if (drainType == DrainType.OVERCOUNTED) { // This is "larger" return 1; } else if (other.drainType == DrainType.OVERCOUNTED) { return -1; } } // Return the flipped value because we want the items in descending order return Double.compare(other.totalPowerMah, totalPowerMah); } /** * Gets a list of packages associated with the current user */ public String[] getPackages() { return mPackages; } public int getUid() { // Bail out if the current sipper is not an App sipper. if (uidObj == null) { return 0; } return uidObj.getUid(); } /** * Add stats from other to this BatterySipper. */ public void add(BatterySipper other) { totalPowerMah += other.totalPowerMah; usageTimeMs += other.usageTimeMs; usagePowerMah += other.usagePowerMah; cpuTimeMs += other.cpuTimeMs; gpsTimeMs += other.gpsTimeMs; wifiRunningTimeMs += other.wifiRunningTimeMs; cpuFgTimeMs += other.cpuFgTimeMs; wakeLockTimeMs += other.wakeLockTimeMs; cameraTimeMs += other.cameraTimeMs; flashlightTimeMs += other.flashlightTimeMs; mobileRxPackets += other.mobileRxPackets; mobileTxPackets += other.mobileTxPackets; mobileActive += other.mobileActive; mobileActiveCount += other.mobileActiveCount; wifiRxPackets += other.wifiRxPackets; wifiTxPackets += other.wifiTxPackets; mobileRxBytes += other.mobileRxBytes; mobileTxBytes += other.mobileTxBytes; wifiRxBytes += other.wifiRxBytes; wifiTxBytes += other.wifiTxBytes; wifiPowerMah += other.wifiPowerMah; gpsPowerMah += other.gpsPowerMah; cpuPowerMah += other.cpuPowerMah; sensorPowerMah += other.sensorPowerMah; mobileRadioPowerMah += other.mobileRadioPowerMah; wakeLockPowerMah += other.wakeLockPowerMah; cameraPowerMah += other.cameraPowerMah; flashlightPowerMah += other.flashlightPowerMah; } /** * Sum all the powers and store the value into `value`. * @return the sum of all the power in this BatterySipper. */ public double sumPower() { return totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah + sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah + flashlightPowerMah; } }