115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
58105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
59105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
60617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * A constant indicating a a wifi turn on timer
61617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
62617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
63617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
64617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int WIFI_TURNED_ON = 4;
65617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
66617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
67105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
68105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
69105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
70105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
71617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int FULL_WIFI_LOCK = 5;
72105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
73105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
74105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
75105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
76105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
77105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
78617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCAN_WIFI_LOCK = 6;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     /**
815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      * A constant indicating a wifi multicast timer
825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      *
835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      * {@hide}
845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      */
855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     public static final int WIFI_MULTICAST_ENABLED = 7;
865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating an audio turn on timer
89244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     *
90244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * {@hide}
91244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
92244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int AUDIO_TURNED_ON = 7;
93244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
94244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
95244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating a video turn on timer
96244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     *
97244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * {@hide}
98244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
99244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int VIDEO_TURNED_ON = 8;
100244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
101244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_TOTAL = 0;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_UNPLUGGED = 3;
120e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar
121e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // NOTE: Update this list if you add/change any stats above.
122e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // These characters are supposed to represent "total", "last", "current",
123e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // and "unplugged". They were shortened for effeciency sake.
124e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String[] STAT_NAMES = { "t", "l", "c", "u" };
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int BATTERY_STATS_CHECKIN_VERSION = 5;
13022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
13122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_KB = 1024;
13222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_MB = 1048576; // 1024^2
13322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_GB = 1073741824; //1024^3
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
137e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String PROCESS_DATA = "pr";
138e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SENSOR_DATA = "sr";
139e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WAKELOCK_DATA = "wl";
140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final String KERNEL_WAKELOCK_DATA = "kwl";
141e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String NETWORK_DATA = "nt";
142e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String USER_ACTIVITY_DATA = "ua";
143e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_DATA = "bt";
144e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_LEVEL_DATA = "lv";
145e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WIFI_LOCK_DATA = "wfl";
146e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String MISC_DATA = "m";
147e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SCREEN_BRIGHTNESS_DATA = "br";
148e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
149f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private static final String SIGNAL_SCANNING_TIME_DATA = "sst";
150e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_COUNT_DATA = "sgc";
151e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_TIME_DATA = "dct";
152e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_COUNT_DATA = "dcc";
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final StringBuilder mFormatBuilder = new StringBuilder(32);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static abstract class Counter {
161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
163617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Returns the count associated with this Counter for the
164617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * selected type of statistics.
165617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
166617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
167617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
168c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
170617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
171617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Temporary for debugging.
172617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
173617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void logState(Printer pw, String prefix);
174617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
175617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
176617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract long getTotalTimeLocked(long batteryRealtime, int which);
198244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
202627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOnLocked();
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOffLocked();
262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
2665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastEnabledLocked();
2675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastDisabledLocked();
268244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOnLocked();
269244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOffLocked();
270244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOnLocked();
271244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOffLocked();
272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract long getWifiTurnedOnTime(long batteryRealtime, int which);
273105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
2755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract long getWifiMulticastTime(long batteryRealtime,
2765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                  int which);
277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getAudioTurnedOnTime(long batteryRealtime, int which);
278244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getVideoTurnedOnTime(long batteryRealtime, int which);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Note that these must match the constants in android.os.LocalPowerManager.
282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        static final String[] USER_ACTIVITY_TYPES = {
284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            "other", "cheek", "touch", "long_touch", "touch_up", "button", "unknown"
285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        };
286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static final int NUM_USER_ACTIVITY_TYPES = 7;
288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteUserActivityLocked(int type);
290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract boolean hasUserActivity();
291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract int getUserActivityCount(int type, int which);
292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
327eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
328eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
329eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Returns the cpu time spent in microseconds while the process was in the foreground.
330eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED
331eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @return foreground cpu time in microseconds
332eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
333eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public abstract long getForegroundTime(int which);
334e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
335e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /**
336e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * Returns the approximate cpu time spent in microseconds, at a certain CPU speed.
337e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @param speedStep the index of the CPU speed. This is not the actual speed of the
338e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * CPU.
339e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED
340e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @see BatteryStats#getCpuSpeedSteps()
341e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             */
342e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public abstract long getTimeAtCpuSpeedStep(int speedStep, int which);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
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 getWakeups(int which);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
400eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on while the device was
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
407617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DARK = 0;
408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DIM = 1;
409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
411617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
412617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
413617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    static final String[] SCREEN_BRIGHTNESS_NAMES = {
414617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        "dark", "dim", "medium", "light", "bright"
415617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    };
416617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
417617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int NUM_SCREEN_BRIGHTNESS_BINS = 5;
418617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
419617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
420eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on with
421617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * the given brightness
422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract long getScreenBrightnessTime(int brightnessBin,
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which);
427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getInputEventCount(int which);
429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
431eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been on while the device was
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
437d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
438627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
439627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_POOR = 1;
440627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_MODERATE = 2;
441627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GOOD = 3;
442627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GREAT = 4;
443627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
444627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] SIGNAL_STRENGTH_NAMES = {
445627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "poor", "moderate", "good", "great"
446627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
447627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
448627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
449627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
450627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
451eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
452627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
453627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
454627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
455627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
456627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
457627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
458627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
460f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * Returns the time in microseconds that the phone has been trying to
461f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * acquire a signal.
462f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     *
463f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * {@hide}
464f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     */
465f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public abstract long getPhoneSignalScanningTime(
466f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which);
467f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
468f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    /**
469617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given signal strength.
470617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
471617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
472617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
473617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
474617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
475627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
477627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
478627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
479627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_OTHER = 4;
480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
482627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "gprs", "edge", "umts", "other"
483627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
484627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
485627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = 5;
486627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
487627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
488eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
489627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
490627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
491627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
492627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
493627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
494627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
495627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
497617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given data
498617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * connection type.
499617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
500617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
502617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneDataConnectionCount(int dataType, int which);
503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
505eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on while the device was
506105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
509105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
511d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
512d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
513eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on and the driver has
514d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
515d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
516d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
517d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
518d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
519d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
520105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
521eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that bluetooth has been on while the device was
522105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
523105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
524105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
527105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
528105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
5473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
5483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptimeMs() {
5493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
5503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
5513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
5533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the time that the radio was on for data transfers.
5543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return the uptime in microseconds while unplugged
5553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
5563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public abstract long getRadioDataUptime();
5573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
566633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the battery percentage level at the last time the device was unplugged from power, or
567633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * the last time it booted on battery power.
568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
569633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeStartLevel();
570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
571105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
572633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the current battery percentage level if we are in a discharge cycle, otherwise
573633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * returns the level at the last plug event.
574105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
575633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeCurrentLevel();
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public abstract Map<String, ? extends Timer> getKernelWakelockStats();
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
611e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /** Returns the number of different speeds that the CPU can run at */
612e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public abstract int getCpuSpeedSteps();
613e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
6141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeRaw(StringBuilder out, long seconds) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTime(StringBuilder sb, long time) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
6441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeMs(StringBuilder sb, long time) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
6511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private final String formatBytesLocked(long bytes) {
66722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        mFormatBuilder.setLength(0);
66822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
66922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        if (bytes < BYTES_PER_KB) {
67022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return bytes + "B";
67122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_MB) {
67222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB);
67322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
67422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_GB){
67522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB);
67622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
67722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else {
67822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB);
67922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
68022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
68122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    }
68222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int count = timer.getCountLocked(which);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
7041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalTimeMillis);
7051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                if (name != null) sb.append(name);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name, int which, String linePrefix) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            totalTimeMicros = timer.getTotalTimeLocked(now, which);
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            count = timer.getCountLocked(which);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        sb.append(name != null ? name + "," : "");
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public final void dumpCheckinLocked(PrintWriter pw, int which, int reqUid) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
782d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
783105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
78822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
78922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
795617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                whichBatteryRealtime / 1000, whichBatteryUptime / 1000,
796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                totalRealtime / 1000, totalUptime / 1000);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
79922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
80022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
80122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotal = 0;
80222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotal = 0;
80322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
80422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
80522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
80622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
80722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
80822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
80922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
81022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
81122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
81222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
81322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
81422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
81522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
81622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotal += fullWakeTimer.getTotalTimeLocked(batteryRealtime, which);
81822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
81922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
82022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
82122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotal += partialWakeTimer.getTotalTimeLocked(
82322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                            batteryRealtime, which);
82422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
82522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
82622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
82722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
82822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
831d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
83222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal,
833617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                fullWakeLockTimeTotal, partialWakeLockTimeTotal,
834617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                getInputEventCount(which));
835617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
836617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Dump screen brightness stats
837617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
838617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
839617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getScreenBrightnessTime(i, batteryRealtime, which) / 1000;
840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
843627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
844617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        args = new Object[NUM_SIGNAL_STRENGTH_BINS];
845627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
846627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
847627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_TIME_DATA, args);
849f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        dumpLine(pw, 0 /* uid */, category, SIGNAL_SCANNING_TIME_DATA,
850f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                getPhoneSignalScanningTime(batteryRealtime, which) / 1000);
851617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
852617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneSignalStrengthCount(i, which);
853617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
854617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_COUNT_DATA, args);
855627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
856627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
857627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
858627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
859627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
860627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
861617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_TIME_DATA, args);
862617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
863617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneDataConnectionCount(i, which);
864617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
865617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_COUNT_DATA, args);
866627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
867105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
868e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar            dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
869633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    getDischargeCurrentLevel());
870105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (reqUid < 0) {
87321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
87421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (kernelWakelocks.size() > 0) {
87521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
87621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.setLength(0);
87721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    printWakeLockCheckin(sb, ent.getValue(), batteryRealtime, null, which, "");
87821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
87921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, KERNEL_WAKELOCK_DATA, ent.getKey(),
88021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            sb.toString());
88121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
88721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (reqUid >= 0 && uid != reqUid) {
88821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                continue;
88921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
894105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
895105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
896617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
897105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
899105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
900617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
901617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
902105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
903617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        fullWifiLockOnTime, scanWifiLockOnTime, wifiTurnedOnTime);
904105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
906617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
907617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                args = new Object[Uid.NUM_USER_ACTIVITY_TYPES];
908617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
909617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
910617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
911617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    args[i] = val;
912617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) hasData = true;
913617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
914617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
915617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, USER_ACTIVITY_DATA, args);
916617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
917617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
918617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
926c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL),
927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "f", which, linePrefix);
928c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL),
929c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "p", which, linePrefix);
930c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW),
931c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "w", which, linePrefix);
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000;
950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
100821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public final void dumpLocked(PrintWriter pw, String prefix, int which, int reqUid) {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
1012d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
102022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
102122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
102222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
10251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
10261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Time on battery: ");
10271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryRealtime / 1000); sb.append("(");
10281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(formatRatioLocked(whichBatteryRealtime, totalRealtime));
10291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") realtime, ");
10301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryUptime / 1000);
10311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(whichBatteryUptime, totalRealtime));
10321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") uptime");
10331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
10341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
10351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
10361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total run time: ");
10371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalRealtime / 1000);
10381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("realtime, ");
10391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalUptime / 1000);
10401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("uptime, ");
10411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1043105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
1044105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
1045d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
1046105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
1047105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
1048617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.setLength(0);
10491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
10501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Screen on: "); formatTimeMs(sb, screenOnTime / 1000);
10511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime));
10521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Input events: "); sb.append(getInputEventCount(which));
10531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000);
10541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime));
10551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
10561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
10571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
10581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1059617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Screen brightnesses: ");
1060617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean didOne = false;
1061617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1062617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            final long time = getScreenBrightnessTime(i, batteryRealtime, which);
1063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (time == 0) {
1064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                continue;
1065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (didOne) sb.append(", ");
1067617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            didOne = true;
1068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(SCREEN_BRIGHTNESS_NAMES[i]);
1069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(" ");
10701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("(");
1072617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(formatRatioLocked(time, screenOnTime));
1073617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(")");
1074617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1075617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (!didOne) sb.append("No activity");
1076617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        pw.println(sb.toString());
1077105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
107822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
107922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
108022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
108122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotalMicros = 0;
108222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotalMicros = 0;
108322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
108421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (reqUid < 0) {
108521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
108621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (kernelWakelocks.size() > 0) {
108721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
108821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
108921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    String linePrefix = ": ";
109021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.setLength(0);
109121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append(prefix);
109221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append("  Kernel Wake lock ");
109321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append(ent.getKey());
109421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    linePrefix = printWakeLock(sb, ent.getValue(), batteryRealtime, null, which,
109521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            linePrefix);
109621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    if (!linePrefix.equals(": ")) {
109721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        sb.append(" realtime");
109821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    } else {
109921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        sb.append(": (nothing executed)");
110021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
110121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    pw.println(sb.toString());
1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
110622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
110722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
110822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
110922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
111022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
111122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
111222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
111322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
111422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
111522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
111622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
111722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
111822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTimeLocked(
112022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
112122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
112222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
112322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
112422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTimeLocked(
112622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
112722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
112822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
112922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
113022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
113122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
11321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(prefix);
11331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  Total received: "); pw.print(formatBytesLocked(rxTotal));
11341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal));
11351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
11361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
11371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total full wakelock time: "); formatTimeMs(sb,
11381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (fullWakeLockTimeTotalMicros + 500) / 1000);
11391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Total partial waklock time: "); formatTimeMs(sb,
11401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (partialWakeLockTimeTotalMicros + 500) / 1000);
11411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
114222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
11441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Signal levels: ");
1146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        didOne = false;
1147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
1148627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
1149627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1150627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1151627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1152627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1153627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1154627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(SIGNAL_STRENGTH_NAMES[i]);
1155627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
11561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1157627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1158627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneSignalStrengthCount(i, which));
1161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1162627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1163627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1164627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1165f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1166f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.setLength(0);
1167f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.append(prefix);
1168f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.append("  Signal scanning time: ");
1169f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        formatTimeMs(sb, getPhoneSignalScanningTime(batteryRealtime, which) / 1000);
1170f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        pw.println(sb.toString());
1171f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1172627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
11731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1174617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Radio types: ");
1175627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
1176627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1177627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
1178627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1179627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1180627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1181627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1182627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1183627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
1184627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
11851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1186627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1187627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneDataConnectionCount(i, which));
1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1191627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1193627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.setLength(0);
11963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(prefix);
11973f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append("  Radio data uptime when unplugged: ");
11983f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(getRadioDataUptime() / 1000);
11993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(" ms");
12003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        pw.println(sb.toString());
12013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
12031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
12041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
12051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiOnTime, whichBatteryRealtime));
12061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Wifi running: "); formatTimeMs(sb, wifiRunningTime / 1000);
12071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiRunningTime, whichBatteryRealtime));
12081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000);
12091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime));
12101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
12111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
1212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1213105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
1214105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1215105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
1216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
12171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently unplugged");
12181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle start level: ");
12191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
12201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle current level: ");
12211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
1222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
12231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently plugged into power");
12241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle start level: ");
12251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
12261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle end level: ");
12271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
1228105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(" ");
1230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
123222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
123521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (reqUid >= 0 && uid != reqUid) {
123621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                continue;
123721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
123821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
124021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
1246105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
1247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
1248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
1249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
12511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Network: ");
12521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, ");
12531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpSent)); pw.println(" sent");
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
1257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
1258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
1260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) {
1261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        if (!hasData) {
1262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.setLength(0);
1263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append("    User activity: ");
1264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            hasData = true;
1265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        } else {
1266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append(", ");
1267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        }
1268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(val);
1269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(" ");
1270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(Uid.USER_ACTIVITY_TYPES[i]);
1271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    }
1272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
1274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    pw.println(sb.toString());
1275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
1279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
12801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.setLength(0);
12811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Turned Wifi On: ");
12821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, wifiTurnedOnTime / 1000);
12831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(wifiTurnedOnTime,
12841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
12851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Full Wifi Lock: ");
12861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, fullWifiLockOnTime / 1000);
12871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
12881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
12891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Scan Wifi Lock: ");
12901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, scanWifiLockOnTime / 1000);
12911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(scanWifiLockOnTime,
12921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")");
12931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.println(sb.toString());
1294105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
1342c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(
1343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                batteryRealtime, which) + 500) / 1000;
1344c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
13471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            formatTimeMs(sb, totalTime);
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
13771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.setLength(0);
13781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("    Proc ");
13791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(ent.getKey()); sb.append(":\n");
13801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("      CPU: ");
13811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                formatTime(sb, userTime); sb.append("usr + ");
13821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                formatTime(sb, systemTime); sb.append("krn\n");
13831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("      "); sb.append(starts);
13841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(" proc starts");
13851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(sb.toString());
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
13951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(prefix); pw.print("    Apk "); pw.print(ent.getKey()); pw.println(":");
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
14001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.print("      ");
14011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.print(wakeups); pw.println(" wakeup alarms");
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
14131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.setLength(0);
14141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("      Service ");
14151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(sent.getKey()); sb.append(":\n");
14161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Created for: ");
14171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        formatTimeMs(sb, startTime / 1000);
14181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(" uptime\n");
14191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Starts: ");
14201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(starts);
14211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(", launches: "); sb.append(launches);
14221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.println(sb.toString());
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
14281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.println("      (nothing executed)");
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
14341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("    (nothing executed)");
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
14451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
144921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        dumpLocked(pw, "", STATS_TOTAL, -1);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
145221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        dumpLocked(pw, "", STATS_LAST, -1);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
145521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        dumpLocked(pw, "", STATS_CURRENT, -1);
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
145821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        dumpLocked(pw, "", STATS_UNPLUGGED, -1);
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
147321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            dumpCheckinLocked(pw, STATS_UNPLUGGED, -1);
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
147621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            dumpCheckinLocked(pw, STATS_TOTAL, -1);
147721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            dumpCheckinLocked(pw, STATS_LAST, -1);
147821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            dumpCheckinLocked(pw, STATS_UNPLUGGED, -1);
147921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            dumpCheckinLocked(pw, STATS_CURRENT, -1);
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1484