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