1a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn/* 2a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Copyright (C) 2009 The Android Open Source Project 3a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * 4a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * you may not use this file except in compliance with the License. 6a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * You may obtain a copy of the License at 7a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * 8a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * 10a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * See the License for the specific language governing permissions and 14a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * limitations under the License. 15a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn */ 16a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackbornpackage com.android.internal.os; 17a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 18a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackbornimport android.os.BatteryStats.Uid; 19a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 20a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn/** 21a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Contains power usage of an application, system service, or hardware type. 22a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn */ 23a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackbornpublic class BatterySipper implements Comparable<BatterySipper> { 24a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public int userId; 25a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public Uid uidObj; 26e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double totalPowerMah; 27a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public DrainType drainType; 2833dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski 29e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski /** 30e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski * Generic usage time in milliseconds. 31e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski */ 32e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long usageTimeMs; 33e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 34e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski /** 35e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski * Generic power usage in mAh. 36e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski */ 37e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double usagePowerMah; 38e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 39e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Subsystem usage times. 40e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long cpuTimeMs; 41e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long gpsTimeMs; 42e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long wifiRunningTimeMs; 43e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long cpuFgTimeMs; 44e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public long wakeLockTimeMs; 455b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk public long cameraTimeMs; 465b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk public long flashlightTimeMs; 4733dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski 48a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long mobileRxPackets; 49a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long mobileTxPackets; 50d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn public long mobileActive; 5177b987f1a1bb6028a871de01065b94c4cfff0b5cDianne Hackborn public int mobileActiveCount; 52d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn public double mobilemspp; // milliseconds per packet 53a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long wifiRxPackets; 54a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long wifiTxPackets; 55a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long mobileRxBytes; 56a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long mobileTxBytes; 57a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long wifiRxBytes; 58a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public long wifiTxBytes; 59a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public double percent; 60a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public double noCoveragePercent; 61a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public String[] mPackages; 62a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public String packageWithHighestDrain; 63a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 6433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski // Measured in mAh (milli-ampere per hour). 65e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // These are included when summed. 66e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double wifiPowerMah; 67e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double cpuPowerMah; 68e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double wakeLockPowerMah; 69e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double mobileRadioPowerMah; 70e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double gpsPowerMah; 71e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double sensorPowerMah; 725b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk public double cameraPowerMah; 735b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk public double flashlightPowerMah; 7433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski 75a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public enum DrainType { 76a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn IDLE, 77a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn CELL, 78a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn PHONE, 79a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn WIFI, 80a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn BLUETOOTH, 81abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn FLASHLIGHT, 82a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn SCREEN, 83a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn APP, 84a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn USER, 85a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn UNACCOUNTED, 865b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk OVERCOUNTED, 875b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk CAMERA 88a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 89a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 90e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public BatterySipper(DrainType drainType, Uid uid, double value) { 91e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski this.totalPowerMah = value; 92a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn this.drainType = drainType; 93a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn uidObj = uid; 94a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 95a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 96d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn public void computeMobilemspp() { 97d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn long packets = mobileRxPackets+mobileTxPackets; 98d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn mobilemspp = packets > 0 ? (mobileActive / (double)packets) : 0; 99d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn } 100d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn 101a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn @Override 102a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public int compareTo(BatterySipper other) { 103fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn // Over-counted always goes to the bottom. 104fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn if (drainType != other.drainType) { 105fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn if (drainType == DrainType.OVERCOUNTED) { 106fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn // This is "larger" 107fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn return 1; 108fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } else if (other.drainType == DrainType.OVERCOUNTED) { 109fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn return -1; 110fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } 111fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } 112a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn // Return the flipped value because we want the items in descending order 113e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski return Double.compare(other.totalPowerMah, totalPowerMah); 114a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 115a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 116a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn /** 117a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Gets a list of packages associated with the current user 118a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn */ 119a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public String[] getPackages() { 120a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn return mPackages; 121a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 122a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn 123a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn public int getUid() { 124a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn // Bail out if the current sipper is not an App sipper. 125a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn if (uidObj == null) { 126a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn return 0; 127a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 128a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn return uidObj.getUid(); 129a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn } 13033dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski 13133dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski /** 13233dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski * Add stats from other to this BatterySipper. 13333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski */ 13433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski public void add(BatterySipper other) { 135e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski totalPowerMah += other.totalPowerMah; 136e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski usageTimeMs += other.usageTimeMs; 137e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski usagePowerMah += other.usagePowerMah; 138e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski cpuTimeMs += other.cpuTimeMs; 139e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski gpsTimeMs += other.gpsTimeMs; 140e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski wifiRunningTimeMs += other.wifiRunningTimeMs; 141e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski cpuFgTimeMs += other.cpuFgTimeMs; 142e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski wakeLockTimeMs += other.wakeLockTimeMs; 1435b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk cameraTimeMs += other.cameraTimeMs; 1445b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk flashlightTimeMs += other.flashlightTimeMs; 14533dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileRxPackets += other.mobileRxPackets; 14633dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileTxPackets += other.mobileTxPackets; 14733dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileActive += other.mobileActive; 14833dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileActiveCount += other.mobileActiveCount; 14933dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski wifiRxPackets += other.wifiRxPackets; 15033dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski wifiTxPackets += other.wifiTxPackets; 15133dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileRxBytes += other.mobileRxBytes; 15233dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski mobileTxBytes += other.mobileTxBytes; 15333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski wifiRxBytes += other.wifiRxBytes; 15433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski wifiTxBytes += other.wifiTxBytes; 155e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski wifiPowerMah += other.wifiPowerMah; 156e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski gpsPowerMah += other.gpsPowerMah; 157e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski cpuPowerMah += other.cpuPowerMah; 158e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski sensorPowerMah += other.sensorPowerMah; 159e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mobileRadioPowerMah += other.mobileRadioPowerMah; 160e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski wakeLockPowerMah += other.wakeLockPowerMah; 1615b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk cameraPowerMah += other.cameraPowerMah; 1625b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk flashlightPowerMah += other.flashlightPowerMah; 163e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 164e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 165e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski /** 166e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski * Sum all the powers and store the value into `value`. 167e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski * @return the sum of all the power in this BatterySipper. 168e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski */ 169e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public double sumPower() { 1705b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk return totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah + 1715b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah + 1725b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk flashlightPowerMah; 17333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski } 174a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn} 175