BatteryStats.java revision 617f877c06c82584a38f41bb60d836e08c5e3bda
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter;
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
42105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
43105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
44617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * A constant indicating a a wifi turn on timer
45617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
46617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
47617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
48617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int WIFI_TURNED_ON = 4;
49617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
50617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
55617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int FULL_WIFI_LOCK = 5;
56105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
57105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
58105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
59105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
60105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
61105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
62617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCAN_WIFI_LOCK = 6;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_TOTAL = 0;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_UNPLUGGED = 3;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
87617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final int BATTERY_STATS_CHECKIN_VERSION = 3;
8822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
8922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_KB = 1024;
9022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_MB = 1048576; // 1024^2
9122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_GB = 1073741824; //1024^3
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: Update this list if you add/change any stats above.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" };
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PROCESS_DATA = "process";
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SENSOR_DATA = "sensor";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WAKELOCK_DATA = "wakelock";
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String NETWORK_DATA = "network";
101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String USER_ACTIVITY_DATA = "useract";
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String BATTERY_DATA = "battery";
103105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private static final String WIFI_LOCK_DATA = "wifilock";
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String MISC_DATA = "misc";
105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String SCREEN_BRIGHTNESS_DATA = "brightness";
106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String SIGNAL_STRENGTH_TIME_DATA = "sigtime";
107617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String SIGNAL_STRENGTH_COUNT_DATA = "sigcnt";
108617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String DATA_CONNECTION_TIME_DATA = "dconntime";
109617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    private static final String DATA_CONNECTION_COUNT_DATA = "dconncnt";
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final StringBuilder mFormatBuilder = new StringBuilder(8);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
115617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
116617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
117617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static abstract class Counter {
118617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
119617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
120617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Returns the count associated with this Counter for the
121617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * selected type of statistics.
122617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
123617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
124617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
125617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract int getCount(int which);
126617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
127617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
128617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Temporary for debugging.
129617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
130617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void logState(Printer pw, String prefix);
131617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
132617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
133617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getCount(int which);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTotalTime(long batteryRealtime, int which);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
159627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOnLocked();
218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteWifiTurnedOffLocked();
219105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
220105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
221105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract long getWifiTurnedOnTime(long batteryRealtime, int which);
224105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
225105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Note that these must match the constants in android.os.LocalPowerManager.
229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        static final String[] USER_ACTIVITY_TYPES = {
231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            "other", "cheek", "touch", "long_touch", "touch_up", "button", "unknown"
232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        };
233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static final int NUM_USER_ACTIVITY_TYPES = 7;
235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteUserActivityLocked(int type);
237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract boolean hasUserActivity();
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract int getUserActivityCount(int type, int which);
239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the screen has been on while the device was
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DARK = 0;
339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DIM = 1;
340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    static final String[] SCREEN_BRIGHTNESS_NAMES = {
345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        "dark", "dim", "medium", "light", "bright"
346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    };
347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int NUM_SCREEN_BRIGHTNESS_BINS = 5;
349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the time in milliseconds that the screen has been on with
352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * the given brightness
353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract long getScreenBrightnessTime(int brightnessBin,
357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which);
358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getInputEventCount(int which);
360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the phone has been on while the device was
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
368d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
369627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
370627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_POOR = 1;
371627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_MODERATE = 2;
372627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GOOD = 3;
373627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int SIGNAL_STRENGTH_GREAT = 4;
374627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
375627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] SIGNAL_STRENGTH_NAMES = {
376627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "poor", "moderate", "good", "great"
377627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
378627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
379627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
380627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
381627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
382627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
383627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
384627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
385627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
386627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
387627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
388627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
389627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given signal strength.
392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
397627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
398627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
399627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
400627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
401627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_OTHER = 4;
402627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
403627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
404627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        "none", "gprs", "edge", "umts", "other"
405627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
406627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
407627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = 5;
408627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
409627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
410627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * Returns the time in milliseconds that the phone has been running with
411627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
412627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
413627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
414627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
415627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
416627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
417627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
419617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given data
420617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * connection type.
421617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneDataConnectionCount(int dataType, int which);
425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
427105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that wifi has been on while the device was
428105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
429105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
430105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
431105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
432105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
433d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
434d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
435d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * Returns the time in milliseconds that wifi has been on and the driver has
436d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
437d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
438d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
439d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
440d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
441d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that bluetooth has been on while the device was
444105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was unplugged from power,
476105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * or the last time it was booted while unplugged.
477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getUnpluggedStartLevel();
479105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
480105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was plugged into power.
482105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
483105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getPluggedStartLevel();
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static void formatTime(StringBuilder out, long seconds) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTime(long time) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTimeMs(long time) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private final String formatBytesLocked(long bytes) {
57422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        mFormatBuilder.setLength(0);
57522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
57622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        if (bytes < BYTES_PER_KB) {
57722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return bytes + "B";
57822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_MB) {
57922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB);
58022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
58122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_GB){
58222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB);
58322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
58422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else {
58522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB);
58622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
58722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
58822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    }
58922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMicros = timer.getTotalTime(batteryRealtime, which);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = timer.getCount(which);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(formatTimeMs(totalTimeMillis));
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(name);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name, int which, String linePrefix) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalTimeMicros = timer.getTotalTime(now, which);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = timer.getCount(which);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(name);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpCheckinLocked(PrintWriter pw, int which) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
693d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
69922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
70022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                whichBatteryRealtime / 1000, whichBatteryUptime / 1000,
707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                totalRealtime / 1000, totalUptime / 1000);
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
71022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
71122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
71222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotal = 0;
71322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotal = 0;
71422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
71522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
71622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
71722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
71822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
71922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
72022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
72122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
72222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
72322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
72422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
72522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
72622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
72722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
72822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        fullWakeLockTimeTotal += fullWakeTimer.getTotalTime(batteryRealtime, which);
72922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
73022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
73122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
73222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
73322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        partialWakeLockTimeTotal += partialWakeTimer.getTotalTime(
73422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                            batteryRealtime, which);
73522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
73622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
73722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
73822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
73922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
742d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
74322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal,
744617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                fullWakeLockTimeTotal, partialWakeLockTimeTotal,
745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                getInputEventCount(which));
746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Dump screen brightness stats
748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getScreenBrightnessTime(i, batteryRealtime, which) / 1000;
751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
753105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
754627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
755617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        args = new Object[NUM_SIGNAL_STRENGTH_BINS];
756627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
757627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
758627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
759617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_TIME_DATA, args);
760617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
761617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneSignalStrengthCount(i, which);
762617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
763617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_COUNT_DATA, args);
764627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
765627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
766627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
767627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
768627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
769627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_TIME_DATA, args);
771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneDataConnectionCount(i, which);
773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
774617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_COUNT_DATA, args);
775627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
776105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
777105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
778105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    getPluggedStartLevel());
779105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
789617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
793617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
794617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        fullWifiLockOnTime, scanWifiLockOnTime, wifiTurnedOnTime);
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
800617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                args = new Object[Uid.NUM_USER_ACTIVITY_TYPES];
801617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
802617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
803617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
804617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    args[i] = val;
805617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) hasData = true;
806617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
807617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
808617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, USER_ACTIVITY_DATA, args);
809617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
810617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpLocked(Printer pw, String prefix, int which) {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
905d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
91322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
91422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
91522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
918617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "  Time on battery: "
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(whichBatteryRealtime / 1000) + "("
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatRatioLocked(whichBatteryRealtime, totalRealtime)
921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + ") realtime, "
922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + formatTimeMs(whichBatteryUptime / 1000)
923617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime)
924617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + ") uptime");
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
926617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "  Total run time: "
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalRealtime / 1000)
928617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "realtime, "
929617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + formatTimeMs(totalUptime / 1000)
930617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "uptime, ");
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
932105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
933105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
934d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
935105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
936105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
938627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                + "  Screen on: " + formatTimeMs(screenOnTime / 1000)
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
940617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "), Input events: " + getInputEventCount(which)
941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + ", Active phone call: " + formatTimeMs(phoneOnTime / 1000)
942617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime) + ")");
943617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.setLength(0);
944617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Screen brightnesses: ");
945617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean didOne = false;
946617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
947617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            final long time = getScreenBrightnessTime(i, batteryRealtime, which);
948617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (time == 0) {
949617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                continue;
950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
951617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (didOne) sb.append(", ");
952617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            didOne = true;
953617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(SCREEN_BRIGHTNESS_NAMES[i]);
954617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(" ");
955617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(formatTimeMs(time/1000));
956617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("(");
957617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(formatRatioLocked(time, screenOnTime));
958617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(")");
959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
960617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (!didOne) sb.append("No activity");
961617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        pw.println(sb.toString());
962105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
96322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
96422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
96522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
96622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotalMicros = 0;
96722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotalMicros = 0;
96822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
96922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
97022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
97122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
97222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
97322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
97422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
97522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
97622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
97722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
97822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
97922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
98022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
98122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
98222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTime(
98322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
98422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
98522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
98622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
98722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
98822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTime(
98922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
99022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
99122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
99222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
99322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
99422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
99522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        pw.println(prefix
99622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + "  Total received: " + formatBytesLocked(rxTotal)
99722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + ", Total sent: " + formatBytesLocked(txTotal));
99822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        pw.println(prefix
99922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + "  Total full wakelock time: " + formatTimeMs(
100022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        (fullWakeLockTimeTotalMicros + 500) / 1000)
100122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                + ", Total partial waklock time: " + formatTimeMs(
100222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        (partialWakeLockTimeTotalMicros + 500) / 1000));
100322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1004627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
1005617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Signal levels: ");
1006617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        didOne = false;
1007627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
1008627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
1009627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1010627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1011627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1012627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1013627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1014627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(SIGNAL_STRENGTH_NAMES[i]);
1015627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
1016627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
1017627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1018627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneSignalStrengthCount(i, which));
1021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1022627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1023627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1024627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1025627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1026627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
1027617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Radio types: ");
1028627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
1029627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1030627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
1031627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1032627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1033627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1034627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1035627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1036627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
1037627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
1038627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatTimeMs(time/1000));
1039627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1040627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1041617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1042617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneDataConnectionCount(i, which));
1043617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1044627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1045627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1046627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1047627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1048617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        pw.println(prefix
1049617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "  Wifi on: " + formatTimeMs(wifiOnTime / 1000)
1050617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
1051617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000)
1052617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
1053617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
1054617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
1055617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1056105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
1057105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1058105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
1059105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
1060105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently unplugged");
1061105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Discharge cycle start level: " +
1062105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
1063105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
1064105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently plugged into power");
1065105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle start level: " +
1066105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
1067105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle end level: " +
1068105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getPluggedStartLevel());
1069105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(" ");
1071105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
107322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
1082105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
1083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
1084617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which);
1085105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
108722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                pw.println(prefix + "    Network: " + formatBytesLocked(tcpReceived) + " received, "
108822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        + formatBytesLocked(tcpSent) + " sent");
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1090617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
1092617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
1093617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1094617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
1095617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) {
1096617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        if (!hasData) {
1097617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.setLength(0);
1098617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append("    User activity: ");
1099617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            hasData = true;
1100617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        } else {
1101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append(", ");
1102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        }
1103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(val);
1104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(" ");
1105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(Uid.USER_ACTIVITY_TYPES[i]);
1106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    }
1107617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1108617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
1109617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    pw.println(sb.toString());
1110617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1111617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1112617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1113617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
1114617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    || wifiTurnedOnTime != 0) {
1115617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                pw.println(prefix + "    Turned Wifi On Time: "
1116617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        + formatTimeMs(wifiTurnedOnTime / 1000)
1117617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        + "(" + formatRatioLocked(wifiTurnedOnTime,
1118617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                                whichBatteryRealtime)+ ")");
1119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Full Wifi Lock Time: "
11202a15f38ec2072141de086720a8e914c51056a69dEvan Millar                        + formatTimeMs(fullWifiLockOnTime / 1000)
1121105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(fullWifiLockOnTime,
1122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
1123105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Scan Wifi Lock Time: "
11242a15f38ec2072141de086720a8e914c51056a69dEvan Millar                        + formatTimeMs(scanWifiLockOnTime / 1000)
1125105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(scanWifiLockOnTime,
1126105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
1127105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(formatTimeMs(totalTime));
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "    Proc " + ent.getKey() + ":");
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      CPU: " + formatTime(userTime) + "user + "
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + formatTime(systemTime) + "kernel");
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + starts + " process starts");
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(prefix + "    Apk " + ent.getKey() + ":");
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + wakeups + " wakeup alarms");
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "      Service " + sent.getKey() + ":");
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Created for: "
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + formatTimeMs(startTime / 1000)
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " uptime");
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Starts: " + starts
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", launches: " + launches);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      (nothing executed)");
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    (nothing executed)");
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_TOTAL);
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_LAST);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_CURRENT);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_UNPLUGGED);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_TOTAL);
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_LAST);
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_CURRENT);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1306