BatteryStats.java revision eaeb663bcd7a82b654954b42663232cbd7bef7e7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter;
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
42105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
43105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
44617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * A constant indicating a a wifi turn on timer
45617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
46617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
47617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
48617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int WIFI_TURNED_ON = 4;
49617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
50617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
55617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int FULL_WIFI_LOCK = 5;
56105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
57105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
58105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
59105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
60105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
61105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
62617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCAN_WIFI_LOCK = 6;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     /**
655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      * A constant indicating a wifi multicast timer
665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      *
675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      * {@hide}
685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      */
695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     public static final int WIFI_MULTICAST_ENABLED = 7;
705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating an audio turn on timer
73244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     *
74244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * {@hide}
75244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
76244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int AUDIO_TURNED_ON = 7;
77244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
78244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
79244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating a video turn on timer
80244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     *
81244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * {@hide}
82244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
83244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int VIDEO_TURNED_ON = 8;
84244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
85244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_TOTAL = 0;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_UNPLUGGED = 3;
104e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar
105e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // NOTE: Update this list if you add/change any stats above.
106e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // These characters are supposed to represent "total", "last", "current",
107e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // and "unplugged". They were shortened for effeciency sake.
108e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String[] STAT_NAMES = { "t", "l", "c", "u" };
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int BATTERY_STATS_CHECKIN_VERSION = 5;
11422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
11522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_KB = 1024;
11622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_MB = 1048576; // 1024^2
11722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_GB = 1073741824; //1024^3
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
121e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String PROCESS_DATA = "pr";
122e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SENSOR_DATA = "sr";
123e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WAKELOCK_DATA = "wl";
124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final String KERNEL_WAKELOCK_DATA = "kwl";
125e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String NETWORK_DATA = "nt";
126e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String USER_ACTIVITY_DATA = "ua";
127e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_DATA = "bt";
128e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_LEVEL_DATA = "lv";
129e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WIFI_LOCK_DATA = "wfl";
130e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String MISC_DATA = "m";
131e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SCREEN_BRIGHTNESS_DATA = "br";
132e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
133e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_COUNT_DATA = "sgc";
134e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_TIME_DATA = "dct";
135e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_COUNT_DATA = "dcc";
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final StringBuilder mFormatBuilder = new StringBuilder(32);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
141617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
142617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
143617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static abstract class Counter {
144617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Returns the count associated with this Counter for the
147617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * selected type of statistics.
148617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
149617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
150617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
152617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
153617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
154617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Temporary for debugging.
155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void logState(Printer pw, String prefix);
157617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
170c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract long getTotalTimeLocked(long batteryRealtime, int which);
181244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
185627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
242105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOnLocked();
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOffLocked();
245105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
246105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
248105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
2495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastEnabledLocked();
2505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastDisabledLocked();
251244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOnLocked();
252244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOffLocked();
253244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOnLocked();
254244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOffLocked();
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract long getWifiTurnedOnTime(long batteryRealtime, int which);
256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
2585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract long getWifiMulticastTime(long batteryRealtime,
2595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                  int which);
260244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getAudioTurnedOnTime(long batteryRealtime, int which);
261244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getVideoTurnedOnTime(long batteryRealtime, int which);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Note that these must match the constants in android.os.LocalPowerManager.
265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        static final String[] USER_ACTIVITY_TYPES = {
267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            "other", "cheek", "touch", "long_touch", "touch_up", "button", "unknown"
268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        };
269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static final int NUM_USER_ACTIVITY_TYPES = 7;
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteUserActivityLocked(int type);
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract boolean hasUserActivity();
274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract int getUserActivityCount(int type, int which);
275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
310eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
311eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
312eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Returns the cpu time spent in microseconds while the process was in the foreground.
313eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED
314eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @return foreground cpu time in microseconds
315eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
316eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public abstract long getForegroundTime(int which);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on while the device was
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DARK = 0;
382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DIM = 1;
383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    static final String[] SCREEN_BRIGHTNESS_NAMES = {
388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        "dark", "dim", "medium", "light", "bright"
389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    };
390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int NUM_SCREEN_BRIGHTNESS_BINS = 5;
392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
394eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on with
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * the given brightness
396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract long getScreenBrightnessTime(int brightnessBin,
400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which);
401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getInputEventCount(int which);
403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
405eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been on while the device was
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
411d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
412627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
413627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_POOR = 1;
414627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_MODERATE = 2;
415627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GOOD = 3;
416627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GREAT = 4;
417627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
418627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] SIGNAL_STRENGTH_NAMES = {
419627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "poor", "moderate", "good", "great"
420627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
421627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
422627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
423627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
424627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
425eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
426627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
427627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
428627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
429627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
430627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
431627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
432627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given signal strength.
435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
440627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
441627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
442627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
443627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
444627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_OTHER = 4;
445627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
446627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
447627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "gprs", "edge", "umts", "other"
448627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
449627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
450627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = 5;
451627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
452627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
453eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
454627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
455627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
456627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
457627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
458627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
459627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
460627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
462617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given data
463617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * connection type.
464617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
465617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
466617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
467617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneDataConnectionCount(int dataType, int which);
468617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
469617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
470eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on while the device was
471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
472105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
476d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
477d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
478eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on and the driver has
479d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
480d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
481d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
482d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
483d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
484d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
485105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
486eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that bluetooth has been on while the device was
487105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
488105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
489105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
493105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
517105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
518633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the battery percentage level at the last time the device was unplugged from power, or
519633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * the last time it booted on battery power.
520105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
521633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeStartLevel();
522105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
523105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
524633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the current battery percentage level if we are in a discharge cycle, otherwise
525633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * returns the level at the last plug event.
526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
527633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeCurrentLevel();
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public abstract Map<String, ? extends Timer> getKernelWakelockStats();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeRaw(StringBuilder out, long seconds) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTime(StringBuilder sb, long time) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
5931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeMs(StringBuilder sb, long time) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
6001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private final String formatBytesLocked(long bytes) {
61622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        mFormatBuilder.setLength(0);
61722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
61822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        if (bytes < BYTES_PER_KB) {
61922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return bytes + "B";
62022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_MB) {
62122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB);
62222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
62322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_GB){
62422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB);
62522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
62622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else {
62722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB);
62822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
62922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
63022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    }
63122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int count = timer.getCountLocked(which);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
6531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalTimeMillis);
6541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                if (name != null) sb.append(name);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name, int which, String linePrefix) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            totalTimeMicros = timer.getTotalTimeLocked(now, which);
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            count = timer.getCountLocked(which);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        sb.append(name != null ? name + "," : "");
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpCheckinLocked(PrintWriter pw, int which) {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
734d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
735105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
74022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
74122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                whichBatteryRealtime / 1000, whichBatteryUptime / 1000,
748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                totalRealtime / 1000, totalUptime / 1000);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
75122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
75222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
75322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotal = 0;
75422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotal = 0;
75522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
75622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
75722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
75822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
75922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
76022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
76122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
76222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
76322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
76422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
76522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
76622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
76722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
76822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotal += fullWakeTimer.getTotalTimeLocked(batteryRealtime, which);
77022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
77122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
77222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
77322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotal += partialWakeTimer.getTotalTimeLocked(
77522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                            batteryRealtime, which);
77622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
77722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
77822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
77922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
78022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
783d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
78422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal,
785617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                fullWakeLockTimeTotal, partialWakeLockTimeTotal,
786617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                getInputEventCount(which));
787617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
788617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Dump screen brightness stats
789617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
790617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
791617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getScreenBrightnessTime(i, batteryRealtime, which) / 1000;
792617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
793617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
795627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        args = new Object[NUM_SIGNAL_STRENGTH_BINS];
797627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
800617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_TIME_DATA, args);
801617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
802617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneSignalStrengthCount(i, which);
803617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
804617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_COUNT_DATA, args);
805627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
806627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
807627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
808627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
809627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
810627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_TIME_DATA, args);
812617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
813617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneDataConnectionCount(i, which);
814617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
815617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_COUNT_DATA, args);
816627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
818e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar            dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
819633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    getDischargeCurrentLevel());
820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kernelWakelocks.size() > 0) {
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                sb.setLength(0);
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                printWakeLockCheckin(sb, ent.getValue(), batteryRealtime, null, which, "");
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                dumpLine(pw, 0 /* uid */, category, KERNEL_WAKELOCK_DATA, ent.getKey(),
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        sb.toString());
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
844105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
845617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
846617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
847105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        fullWifiLockOnTime, scanWifiLockOnTime, wifiTurnedOnTime);
849105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
851617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
852617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                args = new Object[Uid.NUM_USER_ACTIVITY_TYPES];
853617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
854617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
855617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
856617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    args[i] = val;
857617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) hasData = true;
858617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
859617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
860617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, USER_ACTIVITY_DATA, args);
861617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
862617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
863617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL),
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "f", which, linePrefix);
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL),
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "p", which, linePrefix);
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW),
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "w", which, linePrefix);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000;
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
9531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final void dumpLocked(PrintWriter pw, String prefix, int which) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
957d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
96522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
96622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
96722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
9701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
9711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Time on battery: ");
9721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryRealtime / 1000); sb.append("(");
9731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(formatRatioLocked(whichBatteryRealtime, totalRealtime));
9741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") realtime, ");
9751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryUptime / 1000);
9761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(whichBatteryUptime, totalRealtime));
9771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") uptime");
9781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
9791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
9801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
9811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total run time: ");
9821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalRealtime / 1000);
9831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("realtime, ");
9841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalUptime / 1000);
9851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("uptime, ");
9861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
988105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
989105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
990d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
991105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
992105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
993617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.setLength(0);
9941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
9951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Screen on: "); formatTimeMs(sb, screenOnTime / 1000);
9961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime));
9971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Input events: "); sb.append(getInputEventCount(which));
9981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000);
9991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime));
10001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
10011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
10021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
10031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1004617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Screen brightnesses: ");
1005617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean didOne = false;
1006617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1007617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            final long time = getScreenBrightnessTime(i, batteryRealtime, which);
1008617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (time == 0) {
1009617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                continue;
1010617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1011617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (didOne) sb.append(", ");
1012617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            didOne = true;
1013617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(SCREEN_BRIGHTNESS_NAMES[i]);
1014617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(" ");
10151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1016617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("(");
1017617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(formatRatioLocked(time, screenOnTime));
1018617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(")");
1019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (!didOne) sb.append("No activity");
1021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        pw.println(sb.toString());
1022105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
102322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
102422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
102522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
102622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotalMicros = 0;
102722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotalMicros = 0;
102822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kernelWakelocks.size() > 0) {
1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
1032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String linePrefix = ": ";
1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                sb.setLength(0);
1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                sb.append(prefix);
1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                sb.append("  Kernel Wake lock ");
1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                sb.append(ent.getKey());
1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                linePrefix = printWakeLock(sb, ent.getValue(), batteryRealtime, null, which,
1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        linePrefix);
1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (!linePrefix.equals(": ")) {
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    sb.append(" realtime");
1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                } else {
1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    sb.append(": (nothing executed)");
1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                pw.println(sb.toString());
1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
104922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
105022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
105122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
105222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
105322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
105422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
105522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
105622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
105722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
105822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
105922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
106022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
106122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTimeLocked(
106322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
106422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
106522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
106622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
106722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
1068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTimeLocked(
106922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
107022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
107122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
107222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
107322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
107422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
10751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(prefix);
10761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  Total received: "); pw.print(formatBytesLocked(rxTotal));
10771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal));
10781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
10791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
10801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total full wakelock time: "); formatTimeMs(sb,
10811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (fullWakeLockTimeTotalMicros + 500) / 1000);
10821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Total partial waklock time: "); formatTimeMs(sb,
10831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (partialWakeLockTimeTotalMicros + 500) / 1000);
10841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
108522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1086627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
10871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Signal levels: ");
1089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        didOne = false;
1090627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
1091627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
1092627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1093627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1094627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1095627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1096627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1097627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(SIGNAL_STRENGTH_NAMES[i]);
1098627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
10991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1101627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneSignalStrengthCount(i, which));
1104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1105627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1106627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1108627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1109627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
11101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1111617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Radio types: ");
1112627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
1113627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1114627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
1115627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1116627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1117627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1118627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1119627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1120627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
1121627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
11221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1123627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1124627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1125617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1126617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneDataConnectionCount(i, which));
1127617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1128627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1129627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1130627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1131627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
11321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
11331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
11341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
11351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiOnTime, whichBatteryRealtime));
11361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Wifi running: "); formatTimeMs(sb, wifiRunningTime / 1000);
11371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiRunningTime, whichBatteryRealtime));
11381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000);
11391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime));
11401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
11411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
1142617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
1144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
1146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
11471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently unplugged");
11481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle start level: ");
11491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
11501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle current level: ");
11511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
1152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
11531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently plugged into power");
11541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle start level: ");
11551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
11561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle end level: ");
11571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
1158105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(" ");
1160105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
116222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
1171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
1172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
1173617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
1174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
11761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Network: ");
11771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, ");
11781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpSent)); pw.println(" sent");
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1180617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
1182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
1183617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
1185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) {
1186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        if (!hasData) {
1187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.setLength(0);
1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append("    User activity: ");
1189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            hasData = true;
1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        } else {
1191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append(", ");
1192617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        }
1193617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(val);
1194617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(" ");
1195617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(Uid.USER_ACTIVITY_TYPES[i]);
1196617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    }
1197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
1199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    pw.println(sb.toString());
1200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
1204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
12051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.setLength(0);
12061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Turned Wifi On: ");
12071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, wifiTurnedOnTime / 1000);
12081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(wifiTurnedOnTime,
12091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
12101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Full Wifi Lock: ");
12111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, fullWifiLockOnTime / 1000);
12121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
12131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
12141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Scan Wifi Lock: ");
12151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, scanWifiLockOnTime / 1000);
12161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(scanWifiLockOnTime,
12171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")");
12181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.println(sb.toString());
1219105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
1267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(
1268c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                batteryRealtime, which) + 500) / 1000;
1269c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
12721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            formatTimeMs(sb, totalTime);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
13021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.setLength(0);
13031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("    Proc ");
13041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(ent.getKey()); sb.append(":\n");
13051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("      CPU: ");
13061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                formatTime(sb, userTime); sb.append("usr + ");
13071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                formatTime(sb, systemTime); sb.append("krn\n");
13081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("      "); sb.append(starts);
13091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(" proc starts");
13101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(sb.toString());
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
13201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(prefix); pw.print("    Apk "); pw.print(ent.getKey()); pw.println(":");
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
13251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.print("      ");
13261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.print(wakeups); pw.println(" wakeup alarms");
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
13381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.setLength(0);
13391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("      Service ");
13401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(sent.getKey()); sb.append(":\n");
13411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Created for: ");
13421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        formatTimeMs(sb, startTime / 1000);
13431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(" uptime\n");
13441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Starts: ");
13451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(starts);
13461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(", launches: "); sb.append(launches);
13471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.println(sb.toString());
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
13531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.println("      (nothing executed)");
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
13591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("    (nothing executed)");
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
13701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_TOTAL);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_LAST);
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_CURRENT);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_UNPLUGGED);
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_TOTAL);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_LAST);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_CURRENT);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1409