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
205dad8068e251744ca38fd333c6543185f0c85b3cjackqdyuleiimport java.util.List;
215dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
22a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn/**
23a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn * Contains power usage of an application, system service, or hardware type.
24a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn */
25a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackbornpublic class BatterySipper implements Comparable<BatterySipper> {
26a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public int userId;
27a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public Uid uidObj;
28a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public DrainType drainType;
2933dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski
30e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    /**
315dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Smeared power from screen usage.
325dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * We split the screen usage power and smear them among apps, based on activity time.
335dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     */
345dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    public double screenPowerMah;
355dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
365dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    /**
375dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Smeared power using proportional method.
385dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     *
395dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * we smear power usage from hidden sippers to all apps proportionally.(except for screen usage)
405dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     *
415dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
425dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * @see BatteryStatsHelper#removeHiddenBatterySippers(List)
435dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     */
445dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    public double proportionalSmearMah;
455dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
465dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    /**
475dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Total power that adding the smeared power.
485dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     *
495dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * @see #sumPower()
505dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     */
515dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    public double totalSmearedPowerMah;
525dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
535dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    /**
545dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Total power before smearing
555dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     */
565dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    public double totalPowerMah;
575dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
585dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    /**
595dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Whether we should hide this sipper
605dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     *
615dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * @see BatteryStatsHelper#shouldHideSipper(BatterySipper)
625dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     */
635dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    public boolean shouldHide;
645dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
655dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei    /**
66e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     * Generic usage time in milliseconds.
67e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     */
68e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long usageTimeMs;
69e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
70e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    /**
71e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     * Generic power usage in mAh.
72e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     */
73e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double usagePowerMah;
74e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
75e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    // Subsystem usage times.
76e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long cpuTimeMs;
77e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long gpsTimeMs;
78e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long wifiRunningTimeMs;
79e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long cpuFgTimeMs;
80e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public long wakeLockTimeMs;
815b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk    public long cameraTimeMs;
825b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk    public long flashlightTimeMs;
839f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public long bluetoothRunningTimeMs;
8433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski
85a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long mobileRxPackets;
86a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long mobileTxPackets;
87d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn    public long mobileActive;
8877b987f1a1bb6028a871de01065b94c4cfff0b5cDianne Hackborn    public int mobileActiveCount;
89d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn    public double mobilemspp;         // milliseconds per packet
90a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long wifiRxPackets;
91a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long wifiTxPackets;
92a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long mobileRxBytes;
93a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long mobileTxBytes;
94a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long wifiRxBytes;
95a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public long wifiTxBytes;
969f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public long btRxBytes;
979f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public long btTxBytes;
98a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public double percent;
99a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public double noCoveragePercent;
100a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public String[] mPackages;
101a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public String packageWithHighestDrain;
102a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn
10333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski    // Measured in mAh (milli-ampere per hour).
104e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    // These are included when summed.
105e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double wifiPowerMah;
106e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double cpuPowerMah;
107e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double wakeLockPowerMah;
108e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double mobileRadioPowerMah;
109e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double gpsPowerMah;
110e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double sensorPowerMah;
1115b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk    public double cameraPowerMah;
1125b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk    public double flashlightPowerMah;
1139f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public double bluetoothPowerMah;
11433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski
115a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public enum DrainType {
116a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        IDLE,
117a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        CELL,
118a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        PHONE,
119a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        WIFI,
120a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        BLUETOOTH,
121abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        FLASHLIGHT,
122a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        SCREEN,
123a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        APP,
124a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        USER,
125a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        UNACCOUNTED,
1265b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk        OVERCOUNTED,
1272dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr        CAMERA,
1282dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr        MEMORY
129a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    }
130a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn
131e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public BatterySipper(DrainType drainType, Uid uid, double value) {
132e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        this.totalPowerMah = value;
133a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        this.drainType = drainType;
134a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        uidObj = uid;
135a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    }
136a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn
137d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn    public void computeMobilemspp() {
1385dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        long packets = mobileRxPackets + mobileTxPackets;
1395dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        mobilemspp = packets > 0 ? (mobileActive / (double) packets) : 0;
140d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn    }
141d45665bf0b26fddf5716a0fd43036848d9301960Dianne Hackborn
142a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    @Override
143a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public int compareTo(BatterySipper other) {
144fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        // Over-counted always goes to the bottom.
145fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        if (drainType != other.drainType) {
146fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            if (drainType == DrainType.OVERCOUNTED) {
147fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                // This is "larger"
148fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                return 1;
149fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            } else if (other.drainType == DrainType.OVERCOUNTED) {
150fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn                return -1;
151fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            }
152fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        }
153a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        // Return the flipped value because we want the items in descending order
154e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        return Double.compare(other.totalPowerMah, totalPowerMah);
155a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    }
156a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn
157a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    /**
158a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn     * Gets a list of packages associated with the current user
159a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn     */
160a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public String[] getPackages() {
161a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        return mPackages;
162a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    }
163a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn
164a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    public int getUid() {
165a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        // Bail out if the current sipper is not an App sipper.
166a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        if (uidObj == null) {
167a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn            return 0;
168a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        }
169a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn        return uidObj.getUid();
170a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn    }
17133dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski
17233dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski    /**
17333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski     * Add stats from other to this BatterySipper.
17433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski     */
17533dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski    public void add(BatterySipper other) {
176e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        totalPowerMah += other.totalPowerMah;
177e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        usageTimeMs += other.usageTimeMs;
178e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        usagePowerMah += other.usagePowerMah;
179e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        cpuTimeMs += other.cpuTimeMs;
180e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        gpsTimeMs += other.gpsTimeMs;
181e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        wifiRunningTimeMs += other.wifiRunningTimeMs;
182e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        cpuFgTimeMs += other.cpuFgTimeMs;
183e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        wakeLockTimeMs += other.wakeLockTimeMs;
1845b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk        cameraTimeMs += other.cameraTimeMs;
1855b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk        flashlightTimeMs += other.flashlightTimeMs;
1869f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        bluetoothRunningTimeMs += other.bluetoothRunningTimeMs;
18733dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileRxPackets += other.mobileRxPackets;
18833dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileTxPackets += other.mobileTxPackets;
18933dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileActive += other.mobileActive;
19033dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileActiveCount += other.mobileActiveCount;
19133dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        wifiRxPackets += other.wifiRxPackets;
19233dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        wifiTxPackets += other.wifiTxPackets;
19333dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileRxBytes += other.mobileRxBytes;
19433dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        mobileTxBytes += other.mobileTxBytes;
19533dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        wifiRxBytes += other.wifiRxBytes;
19633dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski        wifiTxBytes += other.wifiTxBytes;
1979f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        btRxBytes += other.btRxBytes;
1989f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        btTxBytes += other.btTxBytes;
199e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        wifiPowerMah += other.wifiPowerMah;
200e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        gpsPowerMah += other.gpsPowerMah;
201e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        cpuPowerMah += other.cpuPowerMah;
202e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        sensorPowerMah += other.sensorPowerMah;
203e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mobileRadioPowerMah += other.mobileRadioPowerMah;
204e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        wakeLockPowerMah += other.wakeLockPowerMah;
2055b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk        cameraPowerMah += other.cameraPowerMah;
2065b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk        flashlightPowerMah += other.flashlightPowerMah;
2079f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        bluetoothPowerMah += other.bluetoothPowerMah;
2085dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        screenPowerMah += other.screenPowerMah;
2095dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        proportionalSmearMah += other.proportionalSmearMah;
2105dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        totalSmearedPowerMah += other.totalSmearedPowerMah;
211e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
212e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
213e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    /**
214e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     * Sum all the powers and store the value into `value`.
2155dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     * Also sum the {@code smearedTotalPowerMah} by adding smeared powerMah.
2165dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei     *
217e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     * @return the sum of all the power in this BatterySipper.
218e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski     */
219e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public double sumPower() {
2205dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        totalPowerMah = usagePowerMah + wifiPowerMah + gpsPowerMah + cpuPowerMah +
2215b1308f02d720808727af61863bd59c227d6fe02Ruben Brunk                sensorPowerMah + mobileRadioPowerMah + wakeLockPowerMah + cameraPowerMah +
2229f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                flashlightPowerMah + bluetoothPowerMah;
2235dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        totalSmearedPowerMah = totalPowerMah + screenPowerMah + proportionalSmearMah;
2245dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei
2255dad8068e251744ca38fd333c6543185f0c85b3cjackqdyulei        return totalPowerMah;
22633dac5593519a3e9eb83550faf0d55f9f0caefdfAdam Lesinski    }
227a7c837f043c1ca0bdecd42645ba7da8c5717566dDianne Hackborn}
228