BatteryStats.java revision 627bba736d022c39696b7c582a6af5592d2b8c33
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     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int BATTERY_STATS_CHECKIN_VERSION = 1;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: Update this list if you add/change any stats above.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" };
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PROCESS_DATA = "process";
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SENSOR_DATA = "sensor";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WAKELOCK_DATA = "wakelock";
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String NETWORK_DATA = "network";
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String BATTERY_DATA = "battery";
91105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private static final String WIFI_LOCK_DATA = "wifilock";
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String MISC_DATA = "misc";
93627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    private static final String SIGNAL_STRENGTH_DATA = "signal";
94627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    private static final String DATA_CONNECTION_DATA = "dataconn";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final StringBuilder mFormatBuilder = new StringBuilder(8);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getCount(int which);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTotalTime(long batteryRealtime, int which);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
125627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the screen has been on while the device was
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the phone has been on while the device was
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
295d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
296627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
297627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_POOR = 1;
298627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_MODERATE = 2;
299627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GOOD = 3;
300627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GREAT = 4;
301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] SIGNAL_STRENGTH_NAMES = {
303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "poor", "moderate", "good", "great"
304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
312627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
313627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_OTHER = 4;
322627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "gprs", "edge", "umts", "other"
325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = 5;
328627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
329627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
330627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
331627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
332627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
339105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that wifi has been on while the device was
340105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
341105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
342105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
345d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
346d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
347d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * Returns the time in milliseconds that wifi has been on and the driver has
348d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
349d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
350d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
351d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
352d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
353d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
354105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
355105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that bluetooth has been on while the device was
356105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
357105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
359105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
385105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
386105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
387105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was unplugged from power,
388105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * or the last time it was booted while unplugged.
389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getUnpluggedStartLevel();
391105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
392105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was plugged into power.
394105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
395105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getPluggedStartLevel();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static void formatTime(StringBuilder out, long seconds) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTime(long time) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTimeMs(long time) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMicros = timer.getTotalTime(batteryRealtime, which);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = timer.getCount(which);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(formatTimeMs(totalTimeMillis));
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(name);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name, int which, String linePrefix) {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalTimeMicros = timer.getTotalTime(now, which);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = timer.getCount(which);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(name);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpCheckinLocked(PrintWriter pw, int which) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
588d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                whichBatteryUptime / 1000, whichBatteryRealtime / 1000,
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                totalUptime / 1000, totalRealtime / 1000);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
603d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
604d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                wifiRunningTime / 1000, bluetoothOnTime / 1000);
605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
606627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
607627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        Object[] args = new Object[NUM_SIGNAL_STRENGTH_BINS];
608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
609627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_DATA, args);
612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_DATA, args);
619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
620105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
621105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
622105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    getPluggedStartLevel());
623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SparseArray<? extends Uid> uidStats = getUidStats();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = uidStats.size();
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        fullWifiLockOnTime, scanWifiLockOnTime);
641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpLocked(Printer pw, String prefix, int which) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
736d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Time on battery: " + formatTimeMs(whichBatteryUptime / 1000)
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime)
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") uptime, "
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(whichBatteryRealtime / 1000) + "("
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatRatioLocked(whichBatteryRealtime, totalRealtime)
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") realtime");
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Total: "
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalUptime / 1000)
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "uptime, "
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalRealtime / 1000)
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "realtime");
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
761d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
765627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "  Screen on: " + formatTimeMs(screenOnTime / 1000)
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
767627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Phone on: " + formatTimeMs(phoneOnTime / 1000)
768627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime));
769627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(prefix
770627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "  Wifi on: " + formatTimeMs(wifiOnTime / 1000)
771105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
772627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000)
773d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
774627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
775105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
776105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
777627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
778627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.append("  Signal strengths: ");
779627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        boolean didOne = false;
780627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
781627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
782627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
783627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
784627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
785627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
786627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
787627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(SIGNAL_STRENGTH_NAMES[i]);
788627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
789627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
790627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
791627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
792627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(")");
793627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
794627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
795627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
796627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
797627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.append("  Data types: ");
799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
800627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
801627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
802627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
803627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
804627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
805627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
806627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
807627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
808627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
809627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
810627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
811627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
812627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(")");
813627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
814627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
815627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
816627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently unplugged");
822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Discharge cycle start level: " +
823105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently plugged into power");
826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle start level: " +
827105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle end level: " +
829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getPluggedStartLevel());
830105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(" ");
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SparseArray<? extends Uid> uidStats = getUidStats();
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = uidStats.size();
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
845105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
846105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
847105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    Network: " + tcpReceived + " bytes received, "
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + tcpSent + " bytes sent");
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
852105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
853105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Full Wifi Lock Time: "
854105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + formatTime(fullWifiLockOnTime / 1000)
855105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(fullWifiLockOnTime,
856105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
857105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Scan Wifi Lock Time: "
858105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + formatTime(scanWifiLockOnTime / 1000)
859105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(scanWifiLockOnTime,
860105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
861105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(formatTimeMs(totalTime));
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "    Proc " + ent.getKey() + ":");
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      CPU: " + formatTime(userTime) + "user + "
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + formatTime(systemTime) + "kernel");
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + starts + " process starts");
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(prefix + "    Apk " + ent.getKey() + ":");
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + wakeups + " wakeup alarms");
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "      Service " + sent.getKey() + ":");
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Created for: "
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + formatTimeMs(startTime / 1000)
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " uptime");
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Starts: " + starts
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", launches: " + launches);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      (nothing executed)");
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    (nothing executed)");
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_TOTAL);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_LAST);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_CURRENT);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_UNPLUGGED);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_TOTAL);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_LAST);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_CURRENT);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1040