• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 import java.util.List;
21 
22 /**
23  * Contains power usage of an application, system service, or hardware type.
24  */
25 public class BatterySipper implements Comparable<BatterySipper> {
26     public int userId;
27     public Uid uidObj;
28     public DrainType drainType;
29 
30     /**
31      * Smeared power from screen usage.
32      * We split the screen usage power and smear them among apps, based on activity time.
33      */
34     public double screenPowerMah;
35 
36     /**
37      * Smeared power using proportional method.
38      *
39      * we smear power usage from hidden sippers to all apps proportionally.(except for screen usage)
40      *
41      * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
42      * @see BatteryStatsHelper#removeHiddenBatterySippers(List)
43      */
44     public double proportionalSmearMah;
45 
46     /**
47      * Total power that adding the smeared power.
48      *
49      * @see #sumPower()
50      */
51     public double totalSmearedPowerMah;
52 
53     /**
54      * Total power before smearing
55      */
56     public double totalPowerMah;
57 
58     /**
59      * Whether we should hide this sipper
60      *
61      * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
62      */
63     public boolean shouldHide;
64 
65     /**
66      * Generic usage time in milliseconds.
67      */
68     public long usageTimeMs;
69 
70     /**
71      * Generic power usage in mAh.
72      */
73     public double usagePowerMah;
74 
75     // Subsystem usage times.
76     public long cpuTimeMs;
77     public long gpsTimeMs;
78     public long wifiRunningTimeMs;
79     public long cpuFgTimeMs;
80     public long wakeLockTimeMs;
81     public long cameraTimeMs;
82     public long flashlightTimeMs;
83     public long bluetoothRunningTimeMs;
84 
85     public long mobileRxPackets;
86     public long mobileTxPackets;
87     public long mobileActive;
88     public int mobileActiveCount;
89     public double mobilemspp;         // milliseconds per packet
90     public long wifiRxPackets;
91     public long wifiTxPackets;
92     public long mobileRxBytes;
93     public long mobileTxBytes;
94     public long wifiRxBytes;
95     public long wifiTxBytes;
96     public long btRxBytes;
97     public long btTxBytes;
98     public double percent;
99     public double noCoveragePercent;
100     public String[] mPackages;
101     public String packageWithHighestDrain;
102 
103     // Measured in mAh (milli-ampere per hour).
104     // These are included when summed.
105     public double wifiPowerMah;
106     public double cpuPowerMah;
107     public double wakeLockPowerMah;
108     public double mobileRadioPowerMah;
109     public double gpsPowerMah;
110     public double sensorPowerMah;
111     public double cameraPowerMah;
112     public double flashlightPowerMah;
113     public double bluetoothPowerMah;
114 
115     public enum DrainType {
116         IDLE,
117         CELL,
118         PHONE,
119         WIFI,
120         BLUETOOTH,
121         FLASHLIGHT,
122         SCREEN,
123         APP,
124         USER,
125         UNACCOUNTED,
126         OVERCOUNTED,
127         CAMERA,
128         MEMORY
129     }
130 
BatterySipper(DrainType drainType, Uid uid, double value)131     public BatterySipper(DrainType drainType, Uid uid, double value) {
132         this.totalPowerMah = value;
133         this.drainType = drainType;
134         uidObj = uid;
135     }
136 
computeMobilemspp()137     public void computeMobilemspp() {
138         long packets = mobileRxPackets + mobileTxPackets;
139         mobilemspp = packets > 0 ? (mobileActive / (double) packets) : 0;
140     }
141 
142     @Override
compareTo(BatterySipper other)143     public int compareTo(BatterySipper other) {
144         // Over-counted always goes to the bottom.
145         if (drainType != other.drainType) {
146             if (drainType == DrainType.OVERCOUNTED) {
147                 // This is "larger"
148                 return 1;
149             } else if (other.drainType == DrainType.OVERCOUNTED) {
150                 return -1;
151             }
152         }
153         // Return the flipped value because we want the items in descending order
154         return Double.compare(other.totalPowerMah, totalPowerMah);
155     }
156 
157     /**
158      * Gets a list of packages associated with the current user
159      */
getPackages()160     public String[] getPackages() {
161         return mPackages;
162     }
163 
getUid()164     public int getUid() {
165         // Bail out if the current sipper is not an App sipper.
166         if (uidObj == null) {
167             return 0;
168         }
169         return uidObj.getUid();
170     }
171 
172     /**
173      * Add stats from other to this BatterySipper.
174      */
add(BatterySipper other)175     public void add(BatterySipper other) {
176         totalPowerMah += other.totalPowerMah;
177         usageTimeMs += other.usageTimeMs;
178         usagePowerMah += other.usagePowerMah;
179         cpuTimeMs += other.cpuTimeMs;
180         gpsTimeMs += other.gpsTimeMs;
181         wifiRunningTimeMs += other.wifiRunningTimeMs;
182         cpuFgTimeMs += other.cpuFgTimeMs;
183         wakeLockTimeMs += other.wakeLockTimeMs;
184         cameraTimeMs += other.cameraTimeMs;
185         flashlightTimeMs += other.flashlightTimeMs;
186         bluetoothRunningTimeMs += other.bluetoothRunningTimeMs;
187         mobileRxPackets += other.mobileRxPackets;
188         mobileTxPackets += other.mobileTxPackets;
189         mobileActive += other.mobileActive;
190         mobileActiveCount += other.mobileActiveCount;
191         wifiRxPackets += other.wifiRxPackets;
192         wifiTxPackets += other.wifiTxPackets;
193         mobileRxBytes += other.mobileRxBytes;
194         mobileTxBytes += other.mobileTxBytes;
195         wifiRxBytes += other.wifiRxBytes;
196         wifiTxBytes += other.wifiTxBytes;
197         btRxBytes += other.btRxBytes;
198         btTxBytes += other.btTxBytes;
199         wifiPowerMah += other.wifiPowerMah;
200         gpsPowerMah += other.gpsPowerMah;
201         cpuPowerMah += other.cpuPowerMah;
202         sensorPowerMah += other.sensorPowerMah;
203         mobileRadioPowerMah += other.mobileRadioPowerMah;
204         wakeLockPowerMah += other.wakeLockPowerMah;
205         cameraPowerMah += other.cameraPowerMah;
206         flashlightPowerMah += other.flashlightPowerMah;
207         bluetoothPowerMah += other.bluetoothPowerMah;
208         screenPowerMah += other.screenPowerMah;
209         proportionalSmearMah += other.proportionalSmearMah;
210         totalSmearedPowerMah += other.totalSmearedPowerMah;
211     }
212 
213     /**
214      * Sum all the powers and store the value into `value`.
215      * Also sum the {@code smearedTotalPowerMah} by adding smeared powerMah.
216      *
217      * @return the sum of all the power in this BatterySipper.
218      */
sumPower()219     public double sumPower() {
220         totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah +
221                 sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah +
222                 flashlightPowerMah + bluetoothPowerMah;
223         totalSmearedPowerMah = totalPowerMah + screenPowerMah + proportionalSmearMah;
224 
225         return totalPowerMah;
226     }
227 }
228