BatteryStats.java revision d4c5f8919b0522bcaab41a5863c313fec52d3a79
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
7105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl.Timer;
8105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
44105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
45105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
46105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
47105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
48105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FULL_WIFI_LOCK = 4;
51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
55105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
56105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
57105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int SCAN_WIFI_LOCK = 5;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_TOTAL = 0;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_UNPLUGGED = 3;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int BATTERY_STATS_CHECKIN_VERSION = 1;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: Update this list if you add/change any stats above.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" };
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PROCESS_DATA = "process";
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SENSOR_DATA = "sensor";
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String WAKELOCK_DATA = "wakelock";
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String NETWORK_DATA = "network";
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String BATTERY_DATA = "battery";
93105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private static final String WIFI_LOCK_DATA = "wifilock";
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String MISC_DATA = "misc";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final StringBuilder mFormatBuilder = new StringBuilder(8);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getCount(int which);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTotalTime(long batteryRealtime, int which);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract void logState();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the screen has been on while the device was
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time in milliseconds that the phone has been on while the device was
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
295d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that wifi has been on while the device was
298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
303d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
304d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
305d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * Returns the time in milliseconds that wifi has been on and the driver has
306d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
307d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
308d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
309d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
310d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public abstract long getWifiRunningTime(long batteryRealtime, int which);
311d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the time in milliseconds that bluetooth has been on while the device was
314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
345105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was unplugged from power,
346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * or the last time it was booted while unplugged.
347105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getUnpluggedStartLevel();
349105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
350105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Returns the battery percentage level at the last time the device was plugged into power.
352105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
353105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract int getPluggedStartLevel();
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static void formatTime(StringBuilder out, long seconds) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTime(long time) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String formatTimeMs(long time) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder();
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        formatTime(sb, sec);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sb.toString();
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Convert from microseconds to milliseconds with rounding
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMicros = timer.getTotalTime(batteryRealtime, which);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = timer.getCount(which);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(formatTimeMs(totalTimeMillis));
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(name);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name, int which, String linePrefix) {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            totalTimeMicros = timer.getTotalTime(now, which);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = timer.getCount(which);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(name);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpCheckinLocked(PrintWriter pw, int which) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
546d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                which == STATS_TOTAL ? getStartCount() : "N/A",
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                whichBatteryUptime / 1000, whichBatteryRealtime / 1000,
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                totalUptime / 1000, totalRealtime / 1000);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
561d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
562d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                wifiRunningTime / 1000, bluetoothOnTime / 1000);
563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
566105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    getPluggedStartLevel());
567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SparseArray<? extends Uid> uidStats = getUidStats();
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = uidStats.size();
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
578105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
582105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
583105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        fullWifiLockOnTime, scanWifiLockOnTime);
585105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void dumpLocked(Printer pw, String prefix, int which) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
680d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Time on battery: " + formatTimeMs(whichBatteryUptime / 1000)
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime)
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") uptime, "
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(whichBatteryRealtime / 1000) + "("
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatRatioLocked(whichBatteryRealtime, totalRealtime)
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ") realtime");
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Total: "
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalUptime / 1000)
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "uptime, "
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + formatTimeMs(totalRealtime / 1000)
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "realtime");
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
703105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
704105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
705d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
706105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
707105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "  Time with screen on: " + formatTimeMs(screenOnTime / 1000)
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "), time with phone on: " + formatTimeMs(phoneOnTime / 1000)
712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime)
713105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "), time with wifi on: " + formatTimeMs(wifiOnTime / 1000)
714105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
715d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                + "), time with wifi running: " + formatTimeMs(wifiRunningTime / 1000)
716d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "), time with bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
718105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
719105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
720105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (which == STATS_UNPLUGGED) {
723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently unplugged");
725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Discharge cycle start level: " +
726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "  Device is currently plugged into power");
729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle start level: " +
730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getUnpluggedStartLevel());
731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Last discharge cycle end level: " +
732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        getPluggedStartLevel());
733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(" ");
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SparseArray<? extends Uid> uidStats = getUidStats();
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = uidStats.size();
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    Network: " + tcpReceived + " bytes received, "
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + tcpSent + " bytes sent");
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) {
756105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Full Wifi Lock Time: "
757105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + formatTime(fullWifiLockOnTime / 1000)
758105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(fullWifiLockOnTime,
759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                pw.println(prefix + "    Scan Wifi Lock Time: "
761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + formatTime(scanWifiLockOnTime / 1000)
762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        + "(" + formatRatioLocked(scanWifiLockOnTime,
763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                whichBatteryRealtime)+ ")");
764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(": (nothing executed)");
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int count = timer.getCount(which);
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(formatTimeMs(totalTime));
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "    Proc " + ent.getKey() + ":");
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      CPU: " + formatTime(userTime) + "user + "
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + formatTime(systemTime) + "kernel");
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + starts + " process starts");
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(prefix + "    Apk " + ent.getKey() + ":");
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      " + wakeups + " wakeup alarms");
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "      Service " + sent.getKey() + ":");
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Created for: "
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + formatTimeMs(startTime / 1000)
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " uptime");
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pw.println(prefix + "        Starts: " + starts
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", launches: " + launches);
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pw.println(prefix + "      (nothing executed)");
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(prefix + "    (nothing executed)");
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     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Total Statistics (Current and Historic):");
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_TOTAL);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Last Run Statistics (Previous run of system):");
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_LAST);
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Current Battery Statistics (Currently running system):");
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_CURRENT);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("Unplugged Statistics (Since last unplugged from power):");
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLocked(pw, "", STATS_UNPLUGGED);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpCheckinLocked(PrintWriter pw, String[] args) {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_TOTAL);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_LAST);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_UNPLUGGED);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dumpCheckinLocked(pw, STATS_CURRENT);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
943