1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.internal.os; 17 18 import android.os.BatteryStats.Uid; 19 20 /** 21 * Contains power usage of an application, system service, or hardware type. 22 */ 23 public class BatterySipper implements Comparable<BatterySipper> { 24 public int userId; 25 public Uid uidObj; 26 public double totalPowerMah; 27 public DrainType drainType; 28 29 /** 30 * Generic usage time in milliseconds. 31 */ 32 public long usageTimeMs; 33 34 /** 35 * Generic power usage in mAh. 36 */ 37 public double usagePowerMah; 38 39 // Subsystem usage times. 40 public long cpuTimeMs; 41 public long gpsTimeMs; 42 public long wifiRunningTimeMs; 43 public long cpuFgTimeMs; 44 public long wakeLockTimeMs; 45 public long cameraTimeMs; 46 public long flashlightTimeMs; 47 public long bluetoothRunningTimeMs; 48 49 public long mobileRxPackets; 50 public long mobileTxPackets; 51 public long mobileActive; 52 public int mobileActiveCount; 53 public double mobilemspp; // milliseconds per packet 54 public long wifiRxPackets; 55 public long wifiTxPackets; 56 public long mobileRxBytes; 57 public long mobileTxBytes; 58 public long wifiRxBytes; 59 public long wifiTxBytes; 60 public long btRxBytes; 61 public long btTxBytes; 62 public double percent; 63 public double noCoveragePercent; 64 public String[] mPackages; 65 public String packageWithHighestDrain; 66 67 // Measured in mAh (milli-ampere per hour). 68 // These are included when summed. 69 public double wifiPowerMah; 70 public double cpuPowerMah; 71 public double wakeLockPowerMah; 72 public double mobileRadioPowerMah; 73 public double gpsPowerMah; 74 public double sensorPowerMah; 75 public double cameraPowerMah; 76 public double flashlightPowerMah; 77 public double bluetoothPowerMah; 78 79 public enum DrainType { 80 IDLE, 81 CELL, 82 PHONE, 83 WIFI, 84 BLUETOOTH, 85 FLASHLIGHT, 86 SCREEN, 87 APP, 88 USER, 89 UNACCOUNTED, 90 OVERCOUNTED, 91 CAMERA 92 } 93 BatterySipper(DrainType drainType, Uid uid, double value)94 public BatterySipper(DrainType drainType, Uid uid, double value) { 95 this.totalPowerMah = value; 96 this.drainType = drainType; 97 uidObj = uid; 98 } 99 computeMobilemspp()100 public void computeMobilemspp() { 101 long packets = mobileRxPackets+mobileTxPackets; 102 mobilemspp = packets > 0 ? (mobileActive / (double)packets) : 0; 103 } 104 105 @Override compareTo(BatterySipper other)106 public int compareTo(BatterySipper other) { 107 // Over-counted always goes to the bottom. 108 if (drainType != other.drainType) { 109 if (drainType == DrainType.OVERCOUNTED) { 110 // This is "larger" 111 return 1; 112 } else if (other.drainType == DrainType.OVERCOUNTED) { 113 return -1; 114 } 115 } 116 // Return the flipped value because we want the items in descending order 117 return Double.compare(other.totalPowerMah, totalPowerMah); 118 } 119 120 /** 121 * Gets a list of packages associated with the current user 122 */ getPackages()123 public String[] getPackages() { 124 return mPackages; 125 } 126 getUid()127 public int getUid() { 128 // Bail out if the current sipper is not an App sipper. 129 if (uidObj == null) { 130 return 0; 131 } 132 return uidObj.getUid(); 133 } 134 135 /** 136 * Add stats from other to this BatterySipper. 137 */ add(BatterySipper other)138 public void add(BatterySipper other) { 139 totalPowerMah += other.totalPowerMah; 140 usageTimeMs += other.usageTimeMs; 141 usagePowerMah += other.usagePowerMah; 142 cpuTimeMs += other.cpuTimeMs; 143 gpsTimeMs += other.gpsTimeMs; 144 wifiRunningTimeMs += other.wifiRunningTimeMs; 145 cpuFgTimeMs += other.cpuFgTimeMs; 146 wakeLockTimeMs += other.wakeLockTimeMs; 147 cameraTimeMs += other.cameraTimeMs; 148 flashlightTimeMs += other.flashlightTimeMs; 149 bluetoothRunningTimeMs += other.bluetoothRunningTimeMs; 150 mobileRxPackets += other.mobileRxPackets; 151 mobileTxPackets += other.mobileTxPackets; 152 mobileActive += other.mobileActive; 153 mobileActiveCount += other.mobileActiveCount; 154 wifiRxPackets += other.wifiRxPackets; 155 wifiTxPackets += other.wifiTxPackets; 156 mobileRxBytes += other.mobileRxBytes; 157 mobileTxBytes += other.mobileTxBytes; 158 wifiRxBytes += other.wifiRxBytes; 159 wifiTxBytes += other.wifiTxBytes; 160 btRxBytes += other.btRxBytes; 161 btTxBytes += other.btTxBytes; 162 wifiPowerMah += other.wifiPowerMah; 163 gpsPowerMah += other.gpsPowerMah; 164 cpuPowerMah += other.cpuPowerMah; 165 sensorPowerMah += other.sensorPowerMah; 166 mobileRadioPowerMah += other.mobileRadioPowerMah; 167 wakeLockPowerMah += other.wakeLockPowerMah; 168 cameraPowerMah += other.cameraPowerMah; 169 flashlightPowerMah += other.flashlightPowerMah; 170 bluetoothPowerMah += other.bluetoothPowerMah; 171 } 172 173 /** 174 * Sum all the powers and store the value into `value`. 175 * @return the sum of all the power in this BatterySipper. 176 */ sumPower()177 public double sumPower() { 178 return totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah + 179 sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah + 180 flashlightPowerMah + bluetoothPowerMah; 181 } 182 } 183