BatteryStats.java revision 22ac043ec139714644256cc5e2a9ff8d126ade00
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter;
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
42105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
43105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
44105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
45105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
46105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
47105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
48105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FULL_WIFI_LOCK = 4;
49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
55105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int SCAN_WIFI_LOCK = 5;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_TOTAL = 0;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_UNPLUGGED = 3;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final int BATTERY_STATS_CHECKIN_VERSION = 2;
8122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
8222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_KB = 1024;
8322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_MB = 1048576; // 1024^2
8422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_GB = 1073741824; //1024^3
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: Update this list if you add/change any stats above.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" };
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PROCESS_DATA = "process";
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SENSOR_DATA = "sensor";
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WAKELOCK_DATA = "wakelock";
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String NETWORK_DATA = "network";
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String BATTERY_DATA = "battery";
95105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private static final String WIFI_LOCK_DATA = "wifilock";
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String MISC_DATA = "misc";
97627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    private static final String SIGNAL_STRENGTH_DATA = "signal";
98627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    private static final String DATA_CONNECTION_DATA = "dataconn";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final StringBuilder mFormatBuilder = new StringBuilder(8);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getCount(int which);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTotalTime(long batteryRealtime, int which);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
129627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
189105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the screen has been on while the device was
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the phone has been on while the device was
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
299d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
300627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_POOR = 1;
302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_MODERATE = 2;
303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GOOD = 3;
304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GREAT = 4;
305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] SIGNAL_STRENGTH_NAMES = {
307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "poor", "moderate", "good", "great"
308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
312627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
313627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
322627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_OTHER = 4;
326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
328627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "gprs", "edge", "umts", "other"
329627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
330627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
331627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = 5;
332627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
338627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
339627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
340627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
341627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that wifi has been on while the device was
344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
345105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
347105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
349d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
350d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
351d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * Returns the time in milliseconds that wifi has been on and the driver has
352d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
353d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
354d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
355d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
356d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
357d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
359105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that bluetooth has been on while the device was
360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
363105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
364105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
365105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
366105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
391105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was unplugged from power,
392105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * or the last time it was booted while unplugged.
393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
394105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getUnpluggedStartLevel();
395105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
396105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
397105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was plugged into power.
398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getPluggedStartLevel();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static void formatTime(StringBuilder out, long seconds) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTime(long time) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTimeMs(long time) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private final String formatBytesLocked(long bytes) {
49022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        mFormatBuilder.setLength(0);
49122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
49222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        if (bytes < BYTES_PER_KB) {
49322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return bytes + "B";
49422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_MB) {
49522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB);
49622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
49722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_GB){
49822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB);
49922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
50022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else {
50122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB);
50222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
50322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
50422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    }
50522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMicros = timer.getTotalTime(batteryRealtime, which);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = timer.getCount(which);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(formatTimeMs(totalTimeMillis));
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(name);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name, int which, String linePrefix) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalTimeMicros = timer.getTotalTime(now, which);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = timer.getCount(which);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(name);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpCheckinLocked(PrintWriter pw, int which) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
609d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
61522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
61622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                whichBatteryUptime / 1000, whichBatteryRealtime / 1000,
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                totalUptime / 1000, totalRealtime / 1000);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
62622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
62722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
62822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotal = 0;
62922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotal = 0;
63022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
63122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
63222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
63322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
63422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
63522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
63622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
63722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
63822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
63922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
64022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
64122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
64222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
64322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
64422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        fullWakeLockTimeTotal += fullWakeTimer.getTotalTime(batteryRealtime, which);
64522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
64622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
64722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
64822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
64922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        partialWakeLockTimeTotal += partialWakeTimer.getTotalTime(
65022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                            batteryRealtime, which);
65122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
65222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
65322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
65422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
65522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
658d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
65922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal,
66022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                fullWakeLockTimeTotal, partialWakeLockTimeTotal);
661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
662627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
663627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        Object[] args = new Object[NUM_SIGNAL_STRENGTH_BINS];
664627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
665627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
666627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
667627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_DATA, args);
668627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
669627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
670627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
671627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
672627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
673627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
674627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_DATA, args);
675627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    getPluggedStartLevel());
679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
687105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
688105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
691105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        fullWifiLockOnTime, scanWifiLockOnTime);
695105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpLocked(Printer pw, String prefix, int which) {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
790d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
79822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
79922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
80022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Time on battery: " + formatTimeMs(whichBatteryUptime / 1000)
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime)
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") uptime, "
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(whichBatteryRealtime / 1000) + "("
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatRatioLocked(whichBatteryRealtime, totalRealtime)
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") realtime");
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Total: "
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalUptime / 1000)
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "uptime, "
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalRealtime / 1000)
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "realtime");
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
818d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
822627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "  Screen on: " + formatTimeMs(screenOnTime / 1000)
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
824627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Phone on: " + formatTimeMs(phoneOnTime / 1000)
825627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime));
826627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(prefix
827627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "  Wifi on: " + formatTimeMs(wifiOnTime / 1000)
828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
829627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000)
830d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
831627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
83422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
83522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
83622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
83722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotalMicros = 0;
83822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotalMicros = 0;
83922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
84022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
84122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
84222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
84322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
84422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
84522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
84622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
84722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
84822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
84922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
85022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
85122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
85222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
85322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTime(
85422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
85522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
85622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
85722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
85822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
85922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTime(
86022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
86122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
86222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
86322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
86422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
86522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
86622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        pw.println(prefix
86722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + "  Total received: " + formatBytesLocked(rxTotal)
86822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + ", Total sent: " + formatBytesLocked(txTotal));
86922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        pw.println(prefix
87022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + "  Total full wakelock time: " + formatTimeMs(
87122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        (fullWakeLockTimeTotalMicros + 500) / 1000)
87222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + ", Total partial waklock time: " + formatTimeMs(
87322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        (partialWakeLockTimeTotalMicros + 500) / 1000));
87422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
875627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
876627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.append("  Signal strengths: ");
877627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        boolean didOne = false;
878627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
879627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
880627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
881627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
882627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
883627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
884627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
885627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(SIGNAL_STRENGTH_NAMES[i]);
886627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
887627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
888627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
889627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
890627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(")");
891627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
892627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
893627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
894627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
895627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
896627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.append("  Data types: ");
897627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
898627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
899627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
900627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
901627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
902627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
903627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
904627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
905627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
906627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
907627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
908627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
909627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
910627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(")");
911627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
912627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
913627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
914627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
915105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
916105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
917105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
918105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
919105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently unplugged");
920105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Discharge cycle start level: " +
921105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
922105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
923105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently plugged into power");
924105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle start level: " +
925105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
926105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle end level: " +
927105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getPluggedStartLevel());
928105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
929105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(" ");
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
93322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
943105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
94622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                pw.println(prefix + "    Network: " + formatBytesLocked(tcpReceived) + " received, "
94722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        + formatBytesLocked(tcpSent) + " sent");
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
950105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Full Wifi Lock Time: "
9512a15f38ec2072141de086720a8e914c51056a69dEvan Millar                        + formatTimeMs(fullWifiLockOnTime / 1000)
952105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(fullWifiLockOnTime,
953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
954105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Scan Wifi Lock Time: "
9552a15f38ec2072141de086720a8e914c51056a69dEvan Millar                        + formatTimeMs(scanWifiLockOnTime / 1000)
956105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(scanWifiLockOnTime,
957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(formatTimeMs(totalTime));
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "    Proc " + ent.getKey() + ":");
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      CPU: " + formatTime(userTime) + "user + "
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + formatTime(systemTime) + "kernel");
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + starts + " process starts");
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(prefix + "    Apk " + ent.getKey() + ":");
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + wakeups + " wakeup alarms");
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "      Service " + sent.getKey() + ":");
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Created for: "
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + formatTimeMs(startTime / 1000)
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " uptime");
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Starts: " + starts
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", launches: " + launches);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      (nothing executed)");
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    (nothing executed)");
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_TOTAL);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_LAST);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_CURRENT);
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_UNPLUGGED);
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_TOTAL);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_LAST);
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_CURRENT);
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1137