115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
20e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.ArrayList;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter;
22e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
265284090631e638b916d9a453212e9dc802656a67Wink Savilleimport android.telephony.SignalStrength;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackbornimport android.util.Slog;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
311ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services.  All times are represented in microseconds
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = false;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a partial wake lock timer.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_PARTIAL = 0;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a full wake lock timer.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_FULL = 1;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a window wake lock timer.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WAKE_TYPE_WINDOW = 2;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A constant indicating a sensor timer.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SENSOR = 3;
62105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
63105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
6458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * A constant indicating a a wifi running timer
65617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
6658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public static final int WIFI_RUNNING = 4;
67617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
68617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
69105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a full wifi lock timer
70105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
71617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int FULL_WIFI_LOCK = 5;
72105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
73105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
74105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * A constant indicating a scan wifi lock timer
75105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
76617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCAN_WIFI_LOCK = 6;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     /**
795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      * A constant indicating a wifi multicast timer
805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt      */
815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     public static final int WIFI_MULTICAST_ENABLED = 7;
825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating an audio turn on timer
85244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
86244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int AUDIO_TURNED_ON = 7;
87244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
88244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
89244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     * A constant indicating a video turn on timer
90244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani     */
91244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public static final int VIDEO_TURNED_ON = 8;
92244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
93244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include all of the data in the stats, including previously saved data.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int STATS_SINCE_CHARGED = 0;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the last run in the stats.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_LAST = 1;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the current run in the stats.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STATS_CURRENT = 2;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Include only the run since the last time the device was unplugged in the stats.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int STATS_SINCE_UNPLUGGED = 3;
112e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar
113e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // NOTE: Update this list if you add/change any stats above.
114e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    // These characters are supposed to represent "total", "last", "current",
1153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    // and "unplugged". They were shortened for efficiency sake.
116e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String[] STAT_NAMES = { "t", "l", "c", "u" };
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bump the version on this if the checkin format changes.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int BATTERY_STATS_CHECKIN_VERSION = 5;
12222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
12322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_KB = 1024;
12422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_MB = 1048576; // 1024^2
12522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private static final long BYTES_PER_GB = 1073741824; //1024^3
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
128e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private static final String UID_DATA = "uid";
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String APK_DATA = "apk";
130e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String PROCESS_DATA = "pr";
131e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SENSOR_DATA = "sr";
132e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WAKELOCK_DATA = "wl";
133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final String KERNEL_WAKELOCK_DATA = "kwl";
134e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String NETWORK_DATA = "nt";
135e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String USER_ACTIVITY_DATA = "ua";
136e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_DATA = "bt";
137c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    private static final String BATTERY_DISCHARGE_DATA = "dc";
138e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String BATTERY_LEVEL_DATA = "lv";
139e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String WIFI_LOCK_DATA = "wfl";
140e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String MISC_DATA = "m";
141e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SCREEN_BRIGHTNESS_DATA = "br";
142e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
143f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private static final String SIGNAL_SCANNING_TIME_DATA = "sst";
144e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String SIGNAL_STRENGTH_COUNT_DATA = "sgc";
145e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_TIME_DATA = "dct";
146e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar    private static final String DATA_CONNECTION_COUNT_DATA = "dcc";
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final StringBuilder mFormatBuilder = new StringBuilder(32);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Formatter mFormatter = new Formatter(mFormatBuilder);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
152617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
153617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
154617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static abstract class Counter {
155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
157617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Returns the count associated with this Counter for the
158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * selected type of statistics.
159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
162c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
163617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
164617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
165617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Temporary for debugging.
166617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
167617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void logState(Printer pw, String prefix);
168617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
170617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Timer {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the count associated with this Timer for the
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract int getCountLocked(int which);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns the total time in microseconds associated with this Timer for the
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * selected type of statistics.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param batteryRealtime system realtime on  battery in microseconds
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a time in microseconds
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
191c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public abstract long getTotalTimeLocked(long batteryRealtime, int which);
192244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for debugging.
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
196627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public abstract void logState(Printer pw, String prefix);
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 uid.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class Uid {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing wakelock statistics.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Wakelock objects.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Wakelock> getWakelockStats();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Wakelock {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getWakeTime(int type);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing sensor statistics.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Integer sensor ids to Uid.Sensor objects.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<Integer, ? extends Sensor> getSensorStats();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
226b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn         * Returns a mapping containing active process data.
227b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn         */
228b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public abstract SparseArray<? extends Pid> getPidStats();
229b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
230b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing process statistics.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Proc objects.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Proc> getProcessStats();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a mapping containing package statistics.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a Map from Strings to Uid.Pkg objects.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Map<String, ? extends Pkg> getPackageStats();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getUid();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesReceived(int which);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract long getTcpBytesSent(int which);
258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
25958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public abstract void noteWifiRunningLocked();
26058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public abstract void noteWifiStoppedLocked();
261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockAcquiredLocked();
262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteFullWifiLockReleasedLocked();
263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockAcquiredLocked();
264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract void noteScanWifiLockReleasedLocked();
2655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastEnabledLocked();
2665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract void noteWifiMulticastDisabledLocked();
267244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOnLocked();
268244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteAudioTurnedOffLocked();
269244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOnLocked();
270244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract void noteVideoTurnedOffLocked();
27158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public abstract long getWifiRunningTime(long batteryRealtime, int which);
272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getFullWifiLockTime(long batteryRealtime, int which);
273105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public abstract long getScanWifiLockTime(long batteryRealtime, int which);
2745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public abstract long getWifiMulticastTime(long batteryRealtime,
2755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                  int which);
276244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getAudioTurnedOnTime(long batteryRealtime, int which);
277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public abstract long getVideoTurnedOnTime(long batteryRealtime, int which);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Note that these must match the constants in android.os.LocalPowerManager.
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        static final String[] USER_ACTIVITY_TYPES = {
283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            "other", "cheek", "touch", "long_touch", "touch_up", "button", "unknown"
284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        };
285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static final int NUM_USER_ACTIVITY_TYPES = 7;
287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract void noteUserActivityLocked(int type);
289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract boolean hasUserActivity();
290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public abstract int getUserActivityCount(int type, int which);
291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Sensor {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Magic sensor number for the GPS.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int GPS = -10000;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getHandle();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Timer getSensorTime();
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
301b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public class Pid {
302b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            public long mWakeSum;
303b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            public long mWakeStart;
304b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
305b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Proc {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
311287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public static class ExcessivePower {
312287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                public static final int TYPE_WAKE = 1;
313287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                public static final int TYPE_CPU = 2;
314287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
315287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                public int type;
3169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                public long overTime;
3179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                public long usedTime;
3189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
3199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in user code.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getUserTime(int which);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the total time (in 1/100 sec) spent executing in system code.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract long getSystemTime(int which);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times the process has been started.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getStarts(int which);
340eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
341eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
342eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Returns the cpu time spent in microseconds while the process was in the foreground.
343eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED
344eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * @return foreground cpu time in microseconds
345eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
346eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public abstract long getForegroundTime(int which);
347e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
348e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /**
349e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * Returns the approximate cpu time spent in microseconds, at a certain CPU speed.
350e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @param speedStep the index of the CPU speed. This is not the actual speed of the
351e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * CPU.
352e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED
353e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             * @see BatteryStats#getCpuSpeedSteps()
354e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani             */
355e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public abstract long getTimeAtCpuSpeedStep(int speedStep, int which);
3569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
357287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public abstract int countExcessivePowers();
3589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
359287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public abstract ExcessivePower getExcessivePower(int i);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static abstract class Pkg {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns the number of times this package has done something that could wake up the
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract int getWakeups(int which);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Returns a mapping containing service statistics.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract Map<String, ? extends Serv> getServiceStats();
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public abstract class Serv {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the amount of time spent started.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param batteryUptime elapsed uptime on battery in microseconds.
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @return
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract long getStartTime(long batteryUptime, int which);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number of times startService() has been called.
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getStarts(int which);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Returns the total number times the service has been launched.
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 *
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public abstract int getLaunches(int which);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
411ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public final static class HistoryItem implements Parcelable {
4121fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final String TAG = "HistoryItem";
4131fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final boolean DEBUG = false;
4141fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
4156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public HistoryItem next;
41632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
41732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public long time;
4186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final byte CMD_NULL = 0;
4201fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final byte CMD_UPDATE = 1;
4211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final byte CMD_START = 2;
4221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final byte CMD_OVERFLOW = 3;
4236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public byte cmd = CMD_NULL;
4256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
42632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public byte batteryLevel;
4276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public byte batteryStatus;
4286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public byte batteryHealth;
4296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public byte batteryPlugType;
43032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
4316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public char batteryTemperature;
4326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public char batteryVoltage;
4336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // Constants from SCREEN_BRIGHTNESS_*
4351fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_BRIGHTNESS_MASK = 0x0000000f;
4366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public static final int STATE_BRIGHTNESS_SHIFT = 0;
4373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // Constants from SIGNAL_STRENGTH_*
4381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_SIGNAL_STRENGTH_MASK = 0x000000f0;
43932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public static final int STATE_SIGNAL_STRENGTH_SHIFT = 4;
4403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // Constants from ServiceState.STATE_*
4411fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_PHONE_STATE_MASK = 0x00000f00;
44232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public static final int STATE_PHONE_STATE_SHIFT = 8;
4433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // Constants from DATA_CONNECTION_*
4441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_DATA_CONNECTION_MASK = 0x0000f000;
44532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public static final int STATE_DATA_CONNECTION_SHIFT = 12;
44632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
4471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // These states always appear directly in the first int token
4481fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // of a delta change; they should be ones that change relatively
4491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // frequently.
4501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WAKE_LOCK_FLAG = 1<<30;
4511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_SENSOR_ON_FLAG = 1<<29;
45232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public static final int STATE_GPS_ON_FLAG = 1<<28;
4531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_PHONE_SCANNING_FLAG = 1<<27;
4541fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WIFI_RUNNING_FLAG = 1<<26;
4551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<25;
4561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WIFI_SCAN_LOCK_FLAG = 1<<24;
4571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<23;
4581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // These are on the lower bits used for the command; if they change
4591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // we need to write another int of data.
4601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_AUDIO_ON_FLAG = 1<<22;
4611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_VIDEO_ON_FLAG = 1<<21;
4621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_SCREEN_ON_FLAG = 1<<20;
4631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_BATTERY_PLUGGED_FLAG = 1<<19;
4641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_PHONE_IN_CALL_FLAG = 1<<18;
4651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_WIFI_ON_FLAG = 1<<17;
4661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public static final int STATE_BLUETOOTH_ON_FLAG = 1<<16;
46732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
468f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        public static final int MOST_INTERESTING_STATES =
469f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            STATE_BATTERY_PLUGGED_FLAG | STATE_SCREEN_ON_FLAG
470f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            | STATE_GPS_ON_FLAG | STATE_PHONE_IN_CALL_FLAG;
471f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
47232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public int states;
47332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
4746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public HistoryItem() {
47532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
47632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
4776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public HistoryItem(long time, Parcel src) {
47832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            this.time = time;
4790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            readFromParcel(src);
48032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
48132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
48232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public int describeContents() {
48332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            return 0;
48432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
48532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
48632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
48732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            dest.writeLong(time);
4886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int bat = (((int)cmd)&0xff)
4896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | ((((int)batteryLevel)<<8)&0xff00)
4906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | ((((int)batteryStatus)<<16)&0xf0000)
4916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | ((((int)batteryHealth)<<20)&0xf00000)
4926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | ((((int)batteryPlugType)<<24)&0xf000000);
4936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            dest.writeInt(bat);
4946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            bat = (((int)batteryTemperature)&0xffff)
4956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | ((((int)batteryVoltage)<<16)&0xffff0000);
4966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            dest.writeInt(bat);
49732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            dest.writeInt(states);
49832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
4990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        private void readFromParcel(Parcel src) {
5010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            int bat = src.readInt();
5020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            cmd = (byte)(bat&0xff);
5030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryLevel = (byte)((bat>>8)&0xff);
5040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryStatus = (byte)((bat>>16)&0xf);
5050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryHealth = (byte)((bat>>20)&0xf);
5060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryPlugType = (byte)((bat>>24)&0xf);
5070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            bat = src.readInt();
5080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryTemperature = (char)(bat&0xffff);
5090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            batteryVoltage = (char)((bat>>16)&0xffff);
5100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            states = src.readInt();
5110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
5120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5131fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // Part of initial delta int that specifies the time delta.
5141fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_TIME_MASK = 0x3ffff;
5151fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_TIME_ABS = 0x3fffd;    // Following is an entire abs update.
5161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_TIME_INT = 0x3fffe;    // The delta is a following int
5171fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_TIME_LONG = 0x3ffff;   // The delta is a following long
5181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // Part of initial delta int holding the command code.
5191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_CMD_MASK = 0x3;
5201fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_CMD_SHIFT = 18;
5211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // Flag in delta int: a new battery level int follows.
5221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_BATTERY_LEVEL_FLAG = 1<<20;
5231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        // Flag in delta int: a new full state and battery status int follows.
5241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_STATE_FLAG = 1<<21;
5251fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        static final int DELTA_STATE_MASK = 0xffc00000;
5261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5271fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public void writeDelta(Parcel dest, HistoryItem last) {
5281fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (last == null || last.cmd != CMD_UPDATE) {
5291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                dest.writeInt(DELTA_TIME_ABS);
5301fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                writeToParcel(dest, 0);
5311fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                return;
5321fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5331fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5341fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final long deltaTime = time - last.time;
5351fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final int lastBatteryLevelInt = last.buildBatteryLevelInt();
5361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final int lastStateInt = last.buildStateInt();
5371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            int deltaTimeToken;
5391fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (deltaTime < 0 || deltaTime > Integer.MAX_VALUE) {
5401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                deltaTimeToken = DELTA_TIME_LONG;
5411fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (deltaTime >= DELTA_TIME_ABS) {
5421fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                deltaTimeToken = DELTA_TIME_INT;
5431fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else {
5441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                deltaTimeToken = (int)deltaTime;
5451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            int firstToken = deltaTimeToken
5471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | (cmd<<DELTA_CMD_SHIFT)
5481fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | (states&DELTA_STATE_MASK);
5491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final int batteryLevelInt = buildBatteryLevelInt();
5501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final boolean batteryLevelIntChanged = batteryLevelInt != lastBatteryLevelInt;
5511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (batteryLevelIntChanged) {
5521fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                firstToken |= DELTA_BATTERY_LEVEL_FLAG;
5531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5541fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final int stateInt = buildStateInt();
5551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            final boolean stateIntChanged = stateInt != lastStateInt;
5561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (stateIntChanged) {
5571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                firstToken |= DELTA_STATE_FLAG;
5581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            dest.writeInt(firstToken);
5601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (DEBUG) Slog.i(TAG, "WRITE DELTA: firstToken=0x" + Integer.toHexString(firstToken)
5611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    + " deltaTime=" + deltaTime);
5621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (deltaTimeToken >= DELTA_TIME_INT) {
5641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (deltaTimeToken == DELTA_TIME_INT) {
5651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    if (DEBUG) Slog.i(TAG, "WRITE DELTA: int deltaTime=" + (int)deltaTime);
5661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    dest.writeInt((int)deltaTime);
5671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                } else {
5681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    if (DEBUG) Slog.i(TAG, "WRITE DELTA: long deltaTime=" + deltaTime);
5691fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    dest.writeLong(deltaTime);
5701fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                }
5711fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (batteryLevelIntChanged) {
5731fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                dest.writeInt(batteryLevelInt);
5741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "WRITE DELTA: batteryToken=0x"
5751fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + Integer.toHexString(batteryLevelInt)
5761fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryLevel=" + batteryLevel
5771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryTemp=" + (int)batteryTemperature
5781fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryVolt=" + (int)batteryVoltage);
5791fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5801fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (stateIntChanged) {
5811fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                dest.writeInt(stateInt);
5821fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "WRITE DELTA: stateToken=0x"
5831fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + Integer.toHexString(stateInt)
5841fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryStatus=" + batteryStatus
5851fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryHealth=" + batteryHealth
5861fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryPlugType=" + batteryPlugType
5871fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " states=0x" + Integer.toHexString(states));
5881fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
5891fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
5901fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5911fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        private int buildBatteryLevelInt() {
5921fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            return ((((int)batteryLevel)<<24)&0xff000000)
5931fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | ((((int)batteryTemperature)<<14)&0x00ffc000)
5941fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | (((int)batteryVoltage)&0x00003fff);
5951fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
5961fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
5971fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        private int buildStateInt() {
5981fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            return ((((int)batteryStatus)<<28)&0xf0000000)
5991fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | ((((int)batteryHealth)<<24)&0x0f000000)
6001fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | ((((int)batteryPlugType)<<22)&0x00c00000)
6011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    | (states&(~DELTA_STATE_MASK));
6021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
6031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
6041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public void readDelta(Parcel src) {
6051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            int firstToken = src.readInt();
6061fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            int deltaTimeToken = firstToken&DELTA_TIME_MASK;
6071fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            cmd = (byte)((firstToken>>DELTA_CMD_SHIFT)&DELTA_CMD_MASK);
6081fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (DEBUG) Slog.i(TAG, "READ DELTA: firstToken=0x" + Integer.toHexString(firstToken)
6091fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    + " deltaTimeToken=" + deltaTimeToken);
6101fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
6111fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if (deltaTimeToken < DELTA_TIME_ABS) {
6121fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                time += deltaTimeToken;
6131fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (deltaTimeToken == DELTA_TIME_ABS) {
6141fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                time = src.readLong();
6151fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                readFromParcel(src);
6161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                return;
6171fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (deltaTimeToken == DELTA_TIME_INT) {
6181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                int delta = src.readInt();
6191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                time += delta;
6201fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + time);
6211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else {
6221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                long delta = src.readLong();
6231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + time);
6241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                time += delta;
6251fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
6261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
6271fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if ((firstToken&DELTA_BATTERY_LEVEL_FLAG) != 0) {
6281fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                int batteryLevelInt = src.readInt();
6291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryLevel = (byte)((batteryLevelInt>>24)&0xff);
6301fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryTemperature = (char)((batteryLevelInt>>14)&0x3ff);
6311fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryVoltage = (char)(batteryLevelInt&0x3fff);
6321fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "READ DELTA: batteryToken=0x"
6331fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + Integer.toHexString(batteryLevelInt)
6341fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryLevel=" + batteryLevel
6351fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryTemp=" + (int)batteryTemperature
6361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryVolt=" + (int)batteryVoltage);
6371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
6381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
6391fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            if ((firstToken&DELTA_STATE_FLAG) != 0) {
6401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                int stateInt = src.readInt();
6411fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                states = (firstToken&DELTA_STATE_MASK) | (stateInt&(~DELTA_STATE_MASK));
6421fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryStatus = (byte)((stateInt>>28)&0xf);
6431fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryHealth = (byte)((stateInt>>24)&0xf);
6441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                batteryPlugType = (byte)((stateInt>>22)&0x3);
6451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                if (DEBUG) Slog.i(TAG, "READ DELTA: stateToken=0x"
6461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + Integer.toHexString(stateInt)
6471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryStatus=" + batteryStatus
6481fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryHealth=" + batteryHealth
6491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " batteryPlugType=" + batteryPlugType
6501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                        + " states=0x" + Integer.toHexString(states));
6511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else {
6521fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                states = (firstToken&DELTA_STATE_MASK) | (states&(~DELTA_STATE_MASK));
6531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            }
6540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
6550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
6561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        public void clear() {
6571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            time = 0;
6581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            cmd = CMD_NULL;
6591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryLevel = 0;
6601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryStatus = 0;
6611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryHealth = 0;
6621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryPlugType = 0;
6631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryTemperature = 0;
6641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            batteryVoltage = 0;
6651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            states = 0;
6661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
6671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn
668ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        public void setTo(HistoryItem o) {
669ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            time = o.time;
670ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            cmd = o.cmd;
671ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryLevel = o.batteryLevel;
672ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryStatus = o.batteryStatus;
673ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryHealth = o.batteryHealth;
674ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryPlugType = o.batteryPlugType;
675ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryTemperature = o.batteryTemperature;
676ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            batteryVoltage = o.batteryVoltage;
677ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            states = o.states;
678ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
679ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
6806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void setTo(long time, byte cmd, HistoryItem o) {
6816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.time = time;
6826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.cmd = cmd;
6836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryLevel = o.batteryLevel;
6846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryStatus = o.batteryStatus;
6856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryHealth = o.batteryHealth;
6866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryPlugType = o.batteryPlugType;
6876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryTemperature = o.batteryTemperature;
6886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            batteryVoltage = o.batteryVoltage;
6896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            states = o.states;
6906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
6919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
6929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public boolean same(HistoryItem o) {
6939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return batteryLevel == o.batteryLevel
6949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && batteryStatus == o.batteryStatus
6959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && batteryHealth == o.batteryHealth
6969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && batteryPlugType == o.batteryPlugType
6979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && batteryTemperature == o.batteryTemperature
6989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && batteryVoltage == o.batteryVoltage
6999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && states == o.states;
7009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
7016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
7026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
7036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final class BitDescription {
7046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public final int mask;
7056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public final int shift;
7066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public final String name;
7076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public final String[] values;
7086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
7096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public BitDescription(int mask, String name) {
7106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.mask = mask;
7116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.shift = -1;
7126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.name = name;
7136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.values = null;
7146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
7156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
7166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public BitDescription(int mask, int shift, String name, String[] values) {
7176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.mask = mask;
7186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.shift = shift;
7196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.name = name;
7206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            this.values = values;
7216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
72232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
72332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
724ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public abstract boolean startIteratingHistoryLocked();
725ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
726ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public abstract boolean getNextHistoryLocked(HistoryItem out);
727ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
7280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public abstract void finishIteratingHistoryLocked();
7290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
7300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public abstract boolean startIteratingOldHistoryLocked();
7310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
7320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public abstract boolean getNextOldHistoryLocked(HistoryItem out);
7330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
7340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public abstract void finishIteratingOldHistoryLocked();
7350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
737b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn     * Return the base time offset for the battery history.
738b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn     */
739b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public abstract long getHistoryBaseTime();
740b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
741b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    /**
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of times the device has been started.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getStartCount();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
747eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on while the device was
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getScreenOnTime(long batteryRealtime, int which);
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
754617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DARK = 0;
755617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_DIM = 1;
756617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
757617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
758617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
759617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
760617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    static final String[] SCREEN_BRIGHTNESS_NAMES = {
761617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        "dark", "dim", "medium", "light", "bright"
762617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    };
763617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
764617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final int NUM_SCREEN_BRIGHTNESS_BINS = 5;
765617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
766617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
767eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the screen has been on with
768617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * the given brightness
769617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract long getScreenBrightnessTime(int brightnessBin,
773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which);
774617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
775617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getInputEventCount(int which);
776617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
778eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been on while the device was
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * running on battery.
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getPhoneOnTime(long batteryRealtime, int which);
784627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
785627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
786eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
787627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given signal strength.
788627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
789627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
790627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
791627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneSignalStrengthTime(int strengthBin,
792627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
793627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
794617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
795f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * Returns the time in microseconds that the phone has been trying to
796f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * acquire a signal.
797f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     *
798f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * {@hide}
799f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     */
800f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public abstract long getPhoneSignalScanningTime(
801f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which);
802f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
803f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    /**
804617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given signal strength.
805617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
806617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
807617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
808617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
809617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
810627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_NONE = 0;
811627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_GPRS = 1;
812627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_EDGE = 2;
813627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public static final int DATA_CONNECTION_UMTS = 3;
8146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_CDMA = 4;
8156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_EVDO_0 = 5;
8166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_EVDO_A = 6;
8176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_1xRTT = 7;
8186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_HSDPA = 8;
8196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_HSUPA = 9;
8206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_HSPA = 10;
8216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_IDEN = 11;
8226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int DATA_CONNECTION_EVDO_B = 12;
823962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt    public static final int DATA_CONNECTION_LTE = 13;
824962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt    public static final int DATA_CONNECTION_EHRPD = 14;
825962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt    public static final int DATA_CONNECTION_OTHER = 15;
826962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt
827627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    static final String[] DATA_CONNECTION_NAMES = {
8286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        "none", "gprs", "edge", "umts", "cdma", "evdo_0", "evdo_A",
829962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt        "1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte",
830962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt        "ehrpd", "other"
831627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    };
832627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
8336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1;
834627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
835627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    /**
836eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that the phone has been running with
837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * the given data connection.
838627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     *
839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     * {@hide}
840627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn     */
841627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public abstract long getPhoneDataConnectionTime(int dataType,
842627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which);
843627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
845617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * Returns the number of times the phone has entered the given data
846617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * connection type.
847617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     *
848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * {@hide}
849617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
850617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public abstract int getPhoneDataConnectionCount(int dataType, int which);
8516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
8526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public static final BitDescription[] HISTORY_STATE_DESCRIPTIONS
8536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            = new BitDescription[] {
8546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged"),
8556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen"),
8566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_GPS_ON_FLAG, "gps"),
8573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call"),
8586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning"),
8596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi"),
8606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running"),
8616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock"),
8626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG, "wifi_scan_lock"),
8636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast"),
8646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth"),
8656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio"),
8666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_VIDEO_ON_FLAG, "video"),
8679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock"),
8689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor"),
8696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK,
8706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness",
8716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                SCREEN_BRIGHTNESS_NAMES),
8726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_SIGNAL_STRENGTH_MASK,
8736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT, "signal_strength",
8745284090631e638b916d9a453212e9dc802656a67Wink Saville                SignalStrength.SIGNAL_STRENGTH_NAMES),
8756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK,
8766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state",
8776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                new String[] {"in", "out", "emergency", "off"}),
8786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK,
8796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn",
8806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                DATA_CONNECTION_NAMES),
8816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    };
882617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
883617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
884eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on while the device was
885105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
886105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
887105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
888105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
889105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getWifiOnTime(long batteryRealtime, int which);
890d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
891d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    /**
892eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that wifi has been on and the driver has
893d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * been in the running state while the device was running on battery.
894d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     *
895d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     * {@hide}
896d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood     */
89758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public abstract long getGlobalWifiRunningTime(long batteryRealtime, int which);
898d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
899105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
900eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani     * Returns the time in microseconds that bluetooth has been on while the device was
901105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * running on battery.
902105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
903105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * {@hide}
904105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
905105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public abstract long getBluetoothOnTime(long batteryRealtime, int which);
906105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
907105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return whether we are currently running on battery.
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract boolean getIsOnBattery();
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a SparseArray containing the statistics for each uid.
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract SparseArray<? extends Uid> getUidStats();
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery uptime in microseconds.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryUptime(long curTime);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9253f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
9263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptimeMs() {
9283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
9293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the time that the radio was on for data transfers.
9333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return the uptime in microseconds while unplugged
9343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public abstract long getRadioDataUptime();
9363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current battery realtime in microseconds.
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the amount of elapsed realtime in microseconds.
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long getBatteryRealtime(long curTime);
943105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
945633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the battery percentage level at the last time the device was unplugged from power, or
946633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * the last time it booted on battery power.
947105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
948633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeStartLevel();
949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
950105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
951633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * Returns the current battery percentage level if we are in a discharge cycle, otherwise
952633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar     * returns the level at the last plug event.
953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
954633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public abstract int getDischargeCurrentLevel();
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     * Get the amount the battery has discharged since the stats were
9583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     * last reset after charging, as a lower-end approximation.
9593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     */
9603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public abstract int getLowDischargeAmountSinceCharge();
9613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
9623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    /**
9633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     * Get the amount the battery has discharged since the stats were
9643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     * last reset after charging, as an upper-end approximation.
9653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn     */
9663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public abstract int getHighDischargeAmountSinceCharge();
9673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
9683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    /**
969c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * Get the amount the battery has discharged while the screen was on,
970c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * since the last time power was unplugged.
971c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     */
972c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public abstract int getDischargeAmountScreenOn();
973c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
974c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    /**
975c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * Get the amount the battery has discharged while the screen was on,
976c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * since the last time the device was charged.
977c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     */
978c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public abstract int getDischargeAmountScreenOnSinceCharge();
979c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
980c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    /**
981c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * Get the amount the battery has discharged while the screen was off,
982c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * since the last time power was unplugged.
983c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     */
984c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public abstract int getDischargeAmountScreenOff();
985c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
986c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    /**
987c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * Get the amount the battery has discharged while the screen was off,
988c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     * since the last time the device was charged.
989c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn     */
990c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public abstract int getDischargeAmountScreenOffSinceCharge();
991c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
992c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    /**
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery uptime in microseconds.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the elapsed realtime in microseconds.
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryUptime(long curTime, int which);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current battery realtime in microseconds.
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeBatteryRealtime(long curTime, int which);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current uptime in microseconds.
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeUptime(long curTime, int which);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the total, last, or current realtime in microseconds.
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * *
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curTime the current elapsed realtime in microseconds.
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract long computeRealtime(long curTime, int which);
1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public abstract Map<String, ? extends Timer> getKernelWakelockStats();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1026e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    /** Returns the number of different speeds that the CPU can run at */
1027e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public abstract int getCpuSpeedSteps();
1028e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
10291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeRaw(StringBuilder out, long seconds) {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long days = seconds / (60 * 60 * 24);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (days != 0) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(days);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("d ");
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long used = days * 60 * 60 * 24;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long hours = (seconds - used) / (60 * 60);
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hours != 0 || used != 0) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(hours);
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("h ");
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += hours * 60 * 60;
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mins = (seconds-used) / 60;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mins != 0 || used != 0) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(mins);
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("m ");
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        used += mins * 60;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seconds != 0 || used != 0) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append(seconds-used);
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.append("s ");
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTime(StringBuilder sb, long time) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 100;
10591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((time - (sec * 100)) * 10);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private final static void formatTimeMs(StringBuilder sb, long time) {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long sec = time / 1000;
10661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        formatTimeRaw(sb, sec);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(time - (sec * 1000));
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append("ms ");
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final String formatRatioLocked(long num, long den) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (den == 0L) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "---%";
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float perc = ((float)num) / ((float)den) * 100;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatBuilder.setLength(0);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFormatter.format("%.1f%%", perc);
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFormatBuilder.toString();
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
108122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    private final String formatBytesLocked(long bytes) {
108222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        mFormatBuilder.setLength(0);
108322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
108422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        if (bytes < BYTES_PER_KB) {
108522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return bytes + "B";
108622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_MB) {
108722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB);
108822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
108922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else if (bytes < BYTES_PER_GB){
109022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB);
109122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
109222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        } else {
109322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB);
109422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            return mFormatBuilder.toString();
109522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
109622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar    }
109722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1098c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    private static long computeWakeLock(Timer timer, long batteryRealtime, int which) {
1099c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn        if (timer != null) {
1100c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn            // Convert from microseconds to milliseconds with rounding
1101c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn            long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which);
1102c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn            long totalTimeMillis = (totalTimeMicros + 500) / 1000;
1103c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn            return totalTimeMillis;
1104c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn        }
1105c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn        return 0;
1106c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    }
1107c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param batteryRealtime the current on-battery time in microseconds.
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLock(StringBuilder sb, Timer timer,
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long batteryRealtime, String name, int which, String linePrefix) {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
1122c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn            long totalTimeMillis = computeWakeLock(timer, batteryRealtime, which);
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            int count = timer.getCountLocked(which);
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTimeMillis != 0) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(linePrefix);
11271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalTimeMillis);
11281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                if (name != null) sb.append(name);
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(' ');
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append('(');
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(count);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(" times)");
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ", ";
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linePrefix;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin version of wakelock printer. Prints simple comma-separated list.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sb a StringBuilder object.
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timer a Timer object contining the wakelock times.
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param now the current time in microseconds.
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name the name of the wakelock.
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT.
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param linePrefix a String to be prepended to each line of output.
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the line prefix
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now,
1151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name, int which, String linePrefix) {
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long totalTimeMicros = 0;
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = 0;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (timer != null) {
1155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            totalTimeMicros = timer.getTotalTimeLocked(now, which);
1156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            count = timer.getCountLocked(which);
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(linePrefix);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(',');
1161c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        sb.append(name != null ? name + "," : "");
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sb.append(count);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ",";
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dump a comma-separated line of values for terse checkin mode.
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw the PageWriter to dump log to
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param category category of data (e.g. "total", "last", "unplugged", "current" )
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" ,  "process", "network")
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args type-dependent data arguments
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           Object... args ) {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(uid); pw.print(',');
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(category); pw.print(',');
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print(type);
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Object arg : args) {
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(',');
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.print(arg);
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.print('\n');
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checkin server version of dump to produce more compact, computer-readable log.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * NOTE: all times are expressed in 'ms'.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
119321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public final void dumpCheckinLocked(PrintWriter pw, int which, int reqUid) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtime(rawRealtime);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
1204105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
120558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which);
1206105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
121022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
121122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
121222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String category = STAT_NAMES[which];
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump "battery" stat
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, BATTERY_DATA,
12176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                which == STATS_SINCE_CHARGED ? getStartCount() : "N/A",
1218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                whichBatteryRealtime / 1000, whichBatteryUptime / 1000,
1219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                totalRealtime / 1000, totalUptime / 1000);
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
122122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
122222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
122322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
122422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotal = 0;
122522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotal = 0;
122622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
122722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
122822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
122922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
123022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
123122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
123222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
123322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
123422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
123522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
123622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
123722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
123822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
123922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
1240c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotal += fullWakeTimer.getTotalTimeLocked(batteryRealtime, which);
124122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
124222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
124322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
124422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
1245c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotal += partialWakeTimer.getTotalTimeLocked(
124622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                            batteryRealtime, which);
124722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
124822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
124922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
125022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
125122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Dump misc stats
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dumpLine(pw, 0 /* uid */, category, MISC_DATA,
1254d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood                screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
125522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal,
1256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                fullWakeLockTimeTotal, partialWakeLockTimeTotal,
1257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                getInputEventCount(which));
1258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Dump screen brightness stats
1260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
1261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getScreenBrightnessTime(i, batteryRealtime, which) / 1000;
1263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
1265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1266627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump signal strength stats
12675284090631e638b916d9a453212e9dc802656a67Wink Saville        args = new Object[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
12685284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
1269627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
1270627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_TIME_DATA, args);
1272f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        dumpLine(pw, 0 /* uid */, category, SIGNAL_SCANNING_TIME_DATA,
1273f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                getPhoneSignalScanningTime(batteryRealtime, which) / 1000);
12745284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
1275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneSignalStrengthCount(i, which);
1276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_COUNT_DATA, args);
1278627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1279627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Dump network type stats
1280627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        args = new Object[NUM_DATA_CONNECTION_TYPES];
1281627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1282627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
1283627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_TIME_DATA, args);
1285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            args[i] = getPhoneDataConnectionCount(i, which);
1287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_COUNT_DATA, args);
1289627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
12906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (which == STATS_SINCE_UNPLUGGED) {
1291e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar            dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
1292633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    getDischargeCurrentLevel());
1293105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1295c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (which == STATS_SINCE_UNPLUGGED) {
1296c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
1297c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    getDischargeStartLevel()-getDischargeCurrentLevel(),
1298c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    getDischargeStartLevel()-getDischargeCurrentLevel(),
1299c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    getDischargeAmountScreenOn(), getDischargeAmountScreenOff());
1300c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
1301c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
1302c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(),
1303c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    getDischargeAmountScreenOn(), getDischargeAmountScreenOff());
1304c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
1305c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
130621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (reqUid < 0) {
130721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
130821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (kernelWakelocks.size() > 0) {
130921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
131021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.setLength(0);
131121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    printWakeLockCheckin(sb, ent.getValue(), batteryRealtime, null, which, "");
131221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
131321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, KERNEL_WAKELOCK_DATA, ent.getKey(),
131421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            sb.toString());
131521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
1316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
132121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (reqUid >= 0 && uid != reqUid) {
132221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                continue;
132321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dump Network stats per uid, if any
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long rx = u.getTcpBytesReceived(which);
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tx = u.getTcpBytesSent(which);
1328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
1329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
133058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which);
1331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx);
1333105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
133558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    || uidWifiRunningTime != 0) {
1336105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                dumpLine(pw, uid, category, WIFI_LOCK_DATA,
133758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        fullWifiLockOnTime, scanWifiLockOnTime, uidWifiRunningTime);
1338105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
1341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                args = new Object[Uid.NUM_USER_ACTIVITY_TYPES];
1342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
1343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
1344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
1345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    args[i] = val;
1346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) hasData = true;
1347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
1349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    dumpLine(pw, 0 /* uid */, category, USER_ACTIVITY_DATA, args);
1350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : wakelocks.entrySet()) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = "";
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
1360c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL),
1361c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "f", which, linePrefix);
1362c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL),
1363c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "p", which, linePrefix);
1364c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW),
1365c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            batteryRealtime, "w", which, linePrefix);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Only log if we had at lease one wakelock...
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sb.length() > 0) {
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString());
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0)  {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : sensors.entrySet()) {
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
1383c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000;
1384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : processStats.entrySet()) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime = ps.getUserTime(which);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime = ps.getSystemTime(which);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts = ps.getStarts(which);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (userTime != 0 || systemTime != 0 || starts != 0) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dumpLine(pw, uid, category, PROCESS_DATA,
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ent.getKey(), // proc
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                userTime * 10, // cpu time in ms
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                systemTime * 10, // user time in ms
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                starts); // process starts
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : packageStats.entrySet()) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            : serviceStats.entrySet()) {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long startTime = ss.getStartTime(batteryUptime, which);
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int starts = ss.getStarts(which);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int launches = ss.getLaunches(which);
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (startTime != 0 || starts != 0 || launches != 0) {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dumpLine(pw, uid, category, APK_DATA,
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wakeups, // wakeup alarms
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    ent.getKey(), // Apk
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sent.getKey(), // service
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    startTime / 1000, // time spent started, in ms
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    starts,
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    launches);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
144221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public final void dumpLocked(PrintWriter pw, String prefix, int which, int reqUid) {
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawUptime = SystemClock.uptimeMillis() * 1000;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptime(rawUptime);
1446d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        final long batteryRealtime = getBatteryRealtime(rawRealtime);
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalRealtime = computeRealtime(rawRealtime, which);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long totalUptime = computeUptime(rawUptime, which);
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder sb = new StringBuilder(128);
145422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
145522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        SparseArray<? extends Uid> uidStats = getUidStats();
145622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        final int NU = uidStats.size();
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
14591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
14601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Time on battery: ");
14611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryRealtime / 1000); sb.append("(");
14621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(formatRatioLocked(whichBatteryRealtime, totalRealtime));
14631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") realtime, ");
14641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, whichBatteryUptime / 1000);
14651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(whichBatteryUptime, totalRealtime));
14661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(") uptime");
14671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
14681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
14691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
14701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total run time: ");
14711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalRealtime / 1000);
14721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("realtime, ");
14731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                formatTimeMs(sb, totalUptime / 1000);
14741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("uptime, ");
14751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long screenOnTime = getScreenOnTime(batteryRealtime, which);
1478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
147958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which);
1480105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
1481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
1482617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.setLength(0);
14831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
14841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Screen on: "); formatTimeMs(sb, screenOnTime / 1000);
14851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime));
14861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Input events: "); sb.append(getInputEventCount(which));
14871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000);
14881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime));
14891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
14901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
14911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
14921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1493617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Screen brightnesses: ");
1494617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean didOne = false;
1495617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1496617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            final long time = getScreenBrightnessTime(i, batteryRealtime, which);
1497617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (time == 0) {
1498617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                continue;
1499617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1500617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (didOne) sb.append(", ");
1501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            didOne = true;
1502617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(SCREEN_BRIGHTNESS_NAMES[i]);
1503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(" ");
15041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1505617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("(");
1506617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(formatRatioLocked(time, screenOnTime));
1507617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(")");
1508617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1509617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (!didOne) sb.append("No activity");
1510617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        pw.println(sb.toString());
1511105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
151222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        // Calculate total network and wakelock times across all uids.
151322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long rxTotal = 0;
151422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long txTotal = 0;
151522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long fullWakeLockTimeTotalMicros = 0;
151622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        long partialWakeLockTimeTotalMicros = 0;
151722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
151821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (reqUid < 0) {
151921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats();
152021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (kernelWakelocks.size() > 0) {
152121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) {
152221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
152321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    String linePrefix = ": ";
152421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.setLength(0);
152521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append(prefix);
152621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append("  Kernel Wake lock ");
152721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    sb.append(ent.getKey());
152821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    linePrefix = printWakeLock(sb, ent.getValue(), batteryRealtime, null, which,
152921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            linePrefix);
153021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    if (!linePrefix.equals(": ")) {
153121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        sb.append(" realtime");
153294b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks                        // Only print out wake locks that were held
153394b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks                        pw.println(sb.toString());
153421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
1535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
153922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        for (int iu = 0; iu < NU; iu++) {
154022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Uid u = uidStats.valueAt(iu);
154122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            rxTotal += u.getTcpBytesReceived(which);
154222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            txTotal += u.getTcpBytesSent(which);
154322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
154422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
154522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            if (wakelocks.size() > 0) {
154622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
154722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                        : wakelocks.entrySet()) {
154822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Uid.Wakelock wl = ent.getValue();
154922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
155022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
155122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (fullWakeTimer != null) {
1552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTimeLocked(
155322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
155422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
155522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
155622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
155722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    if (partialWakeTimer != null) {
1558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTimeLocked(
155922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                                batteryRealtime, which);
156022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                    }
156122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar                }
156222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar            }
156322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar        }
156422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
15651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.print(prefix);
15661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  Total received: "); pw.print(formatBytesLocked(rxTotal));
15671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal));
15681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
15691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
15701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Total full wakelock time: "); formatTimeMs(sb,
15711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (fullWakeLockTimeTotalMicros + 500) / 1000);
15721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(", Total partial waklock time: "); formatTimeMs(sb,
15731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        (partialWakeLockTimeTotalMicros + 500) / 1000);
15741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
157522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
1576627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
15771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1578617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Signal levels: ");
1579617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        didOne = false;
15805284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
1581627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
1582627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1583627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1584627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
15875284090631e638b916d9a453212e9dc802656a67Wink Saville            sb.append(SignalStrength.SIGNAL_STRENGTH_NAMES[i]);
1588627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
15891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1591627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1592617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneSignalStrengthCount(i, which));
1594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1595627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1596627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1597627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
1598f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1599f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.setLength(0);
1600f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.append(prefix);
1601f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        sb.append("  Signal scanning time: ");
1602f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        formatTimeMs(sb, getPhoneSignalScanningTime(batteryRealtime, which) / 1000);
1603f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        pw.println(sb.toString());
1604f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1605627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        sb.setLength(0);
16061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
1607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        sb.append("  Radio types: ");
1608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        didOne = false;
1609627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
1611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (time == 0) {
1612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                continue;
1613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (didOne) sb.append(", ");
1615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            didOne = true;
1616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(DATA_CONNECTION_NAMES[i]);
1617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(" ");
16181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            formatTimeMs(sb, time/1000);
1619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append("(");
1620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            sb.append(formatRatioLocked(time, whichBatteryRealtime));
1621617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(") ");
1622617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append(getPhoneDataConnectionCount(i, which));
1623617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            sb.append("x");
1624627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1625627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (!didOne) sb.append("No activity");
1626627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        pw.println(sb.toString());
16273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
16283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.setLength(0);
16293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(prefix);
16303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append("  Radio data uptime when unplugged: ");
16313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(getRadioDataUptime() / 1000);
16323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        sb.append(" ms");
16333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        pw.println(sb.toString());
16343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
16351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.setLength(0);
16361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        sb.append(prefix);
16371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("  Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
16381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiOnTime, whichBatteryRealtime));
16391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Wifi running: "); formatTimeMs(sb, wifiRunningTime / 1000);
16401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(wifiRunningTime, whichBatteryRealtime));
16411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("), Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000);
16421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime));
16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(")");
16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        pw.println(sb.toString());
1645617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1646105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        pw.println(" ");
1647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
16486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (which == STATS_SINCE_UNPLUGGED) {
1649105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (getIsOnBattery()) {
16501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently unplugged");
16511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle start level: ");
16521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
16531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Discharge cycle current level: ");
16541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
165599d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn            } else {
16561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("  Device is currently plugged into power");
16571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle start level: ");
16581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeStartLevel());
16591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Last discharge cycle end level: ");
16601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(getDischargeCurrentLevel());
1661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1662c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            pw.print(prefix); pw.print("    Amount discharged while screen on: ");
1663c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    pw.println(getDischargeAmountScreenOn());
1664c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            pw.print(prefix); pw.print("    Amount discharged while screen off: ");
1665c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    pw.println(getDischargeAmountScreenOff());
1666617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(" ");
16679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        } else {
16689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            pw.print(prefix); pw.println("  Device battery use since last full charge");
16699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            pw.print(prefix); pw.print("    Amount discharged (lower bound): ");
16709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    pw.println(getLowDischargeAmountSinceCharge());
16719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            pw.print(prefix); pw.print("    Amount discharged (upper bound): ");
16729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    pw.println(getHighDischargeAmountSinceCharge());
1673c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            pw.print(prefix); pw.print("    Amount discharged while screen on: ");
1674c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    pw.println(getDischargeAmountScreenOnSinceCharge());
1675c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            pw.print(prefix); pw.print("    Amount discharged while screen off: ");
1676c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    pw.println(getDischargeAmountScreenOffSinceCharge());
16779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            pw.println(" ");
1678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
168022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu=0; iu<NU; iu++) {
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int uid = uidStats.keyAt(iu);
1683e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) {
168421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                continue;
168521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
168621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = uidStats.valueAt(iu);
168821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "  #" + uid + ":");
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean uidActivity = false;
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpReceived = u.getTcpBytesReceived(which);
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long tcpSent = u.getTcpBytesSent(which);
1694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which);
1695105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which);
169658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which);
1697105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tcpReceived != 0 || tcpSent != 0) {
16991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.print("    Network: ");
17001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, ");
17011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(formatBytesLocked(tcpSent)); pw.println(" sent");
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1703617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1704617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.hasUserActivity()) {
1705617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                boolean hasData = false;
1706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
1707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    int val = u.getUserActivityCount(i, which);
1708617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    if (val != 0) {
1709617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        if (!hasData) {
1710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.setLength(0);
1711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append("    User activity: ");
1712617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            hasData = true;
1713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        } else {
1714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                            sb.append(", ");
1715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        }
1716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(val);
1717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(" ");
1718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                        sb.append(Uid.USER_ACTIVITY_TYPES[i]);
1719617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    }
1720617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1721617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (hasData) {
1722617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    pw.println(sb.toString());
1723617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1724617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1726617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0
172758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    || uidWifiRunningTime != 0) {
17281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.setLength(0);
172958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                sb.append(prefix); sb.append("    Wifi Running: ");
173058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        formatTimeMs(sb, uidWifiRunningTime / 1000);
173158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime,
17321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
17331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Full Wifi Lock: ");
17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, fullWifiLockOnTime / 1000);
17351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
17361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")\n");
17371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                sb.append(prefix); sb.append("    Scan Wifi Lock: ");
17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        formatTimeMs(sb, scanWifiLockOnTime / 1000);
17391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append("("); sb.append(formatRatioLocked(scanWifiLockOnTime,
17401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                whichBatteryRealtime)); sb.append(")");
17411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.println(sb.toString());
1742105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wakelocks.size() > 0) {
1746c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                long totalFull = 0, totalPartial = 0, totalWindow = 0;
1747c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                int count = 0;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : wakelocks.entrySet()) {
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String linePrefix = ": ";
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Wake lock ");
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(ent.getKey());
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime,
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "full", which, linePrefix);
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime,
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "partial", which, linePrefix);
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime,
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "window", which, linePrefix);
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!linePrefix.equals(": ")) {
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(" realtime");
176494b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks                        // Only print out wake locks that were held
176594b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks                        pw.println(sb.toString());
176694b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks                        uidActivity = true;
1767c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        count++;
1768c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                    }
1769c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                    totalFull += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL),
1770c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            batteryRealtime, which);
1771c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                    totalPartial += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL),
1772c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            batteryRealtime, which);
1773c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                    totalWindow += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW),
1774c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            batteryRealtime, which);
1775c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                }
1776c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                if (count > 1) {
1777c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                    if (totalFull != 0 || totalPartial != 0 || totalWindow != 0) {
1778c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        sb.setLength(0);
1779c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        sb.append(prefix);
1780c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        sb.append("    TOTAL wake: ");
1781c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        boolean needComma = false;
1782c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        if (totalFull != 0) {
1783c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            needComma = true;
1784c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            formatTimeMs(sb, totalFull);
1785c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            sb.append("full");
1786c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        }
1787c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        if (totalPartial != 0) {
1788c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            if (needComma) {
1789c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                                sb.append(", ");
1790c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            }
1791c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            needComma = true;
1792c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            formatTimeMs(sb, totalPartial);
1793c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            sb.append("partial");
1794c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        }
1795c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        if (totalWindow != 0) {
1796c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            if (needComma) {
1797c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                                sb.append(", ");
1798c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            }
1799c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            needComma = true;
1800c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            formatTimeMs(sb, totalWindow);
1801c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                            sb.append("window");
1802c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        }
1803c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        sb.append(" realtime");
1804c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        pw.println(sb.toString());
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sensors.size() > 0) {
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : sensors.entrySet()) {
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int sensorNumber = ent.getKey();
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.setLength(0);
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(prefix);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append("    Sensor ");
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int handle = se.getHandle();
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handle == Uid.Sensor.GPS) {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("GPS");
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append(handle);
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sb.append(": ");
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Timer timer = se.getSensorTime();
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (timer != null) {
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Convert from microseconds to milliseconds with rounding
1829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        long totalTime = (timer.getTotalTimeLocked(
1830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                batteryRealtime, which) + 500) / 1000;
1831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        int count = timer.getCountLocked(which);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //timer.logState();
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (totalTime != 0) {
18341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            formatTimeMs(sb, totalTime);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("realtime (");
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(count);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append(" times)");
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sb.append("(not used)");
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sb.append("(not used)");
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pw.println(sb.toString());
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (processStats.size() > 0) {
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : processStats.entrySet()) {
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long userTime;
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long systemTime;
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int starts;
18589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    int numExcessive;
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userTime = ps.getUserTime(which);
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    systemTime = ps.getSystemTime(which);
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    starts = ps.getStarts(which);
18639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    numExcessive = which == STATS_SINCE_CHARGED
1864287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            ? ps.countExcessivePowers() : 0;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (userTime != 0 || systemTime != 0 || starts != 0
18679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                            || numExcessive != 0) {
18681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.setLength(0);
18691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("    Proc ");
18701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(ent.getKey()); sb.append(":\n");
18711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        sb.append(prefix); sb.append("      CPU: ");
18721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                formatTime(sb, userTime); sb.append("usr + ");
1873b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                                formatTime(sb, systemTime); sb.append("krn");
18740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (starts != 0) {
1875b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                            sb.append("\n"); sb.append(prefix); sb.append("      ");
1876b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                                    sb.append(starts); sb.append(" proc starts");
18770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
18781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.println(sb.toString());
18799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        for (int e=0; e<numExcessive; e++) {
1880287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            Uid.Proc.ExcessivePower ew = ps.getExcessivePower(e);
18819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                            if (ew != null) {
1882287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                pw.print(prefix); pw.print("      * Killed for ");
1883287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                        if (ew.type == Uid.Proc.ExcessivePower.TYPE_WAKE) {
1884287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                            pw.print("wake lock");
1885287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                        } else if (ew.type == Uid.Proc.ExcessivePower.TYPE_CPU) {
1886287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                            pw.print("cpu");
1887287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                        } else {
1888287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                            pw.print("unknown");
1889287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                        }
1890287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                                        pw.print(" use: ");
18911ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                                        TimeUtils.formatDuration(ew.usedTime, pw);
18921ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                                        pw.print(" over ");
18931ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                                        TimeUtils.formatDuration(ew.overTime, pw);
18941ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                                        pw.print(" (");
18959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                        pw.print((ew.usedTime*100)/ew.overTime);
18969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                        pw.println("%)");
18979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                            }
18989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        }
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        uidActivity = true;
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats();
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (packageStats.size() > 0) {
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : packageStats.entrySet()) {
19081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(prefix); pw.print("    Apk "); pw.print(ent.getKey()); pw.println(":");
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean apkActivity = false;
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int wakeups = ps.getWakeups(which);
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wakeups != 0) {
19131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.print("      ");
19141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.print(wakeups); pw.println(" wakeup alarms");
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        apkActivity = true;
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Map<String, ? extends  Uid.Pkg.Serv> serviceStats = ps.getServiceStats();
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (serviceStats.size() > 0) {
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : serviceStats.entrySet()) {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStats.Uid.Pkg.Serv ss = sent.getValue();
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long startTime = ss.getStartTime(batteryUptime, which);
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int starts = ss.getStarts(which);
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int launches = ss.getLaunches(which);
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (startTime != 0 || starts != 0 || launches != 0) {
19261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.setLength(0);
19271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("      Service ");
19281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(sent.getKey()); sb.append(":\n");
19291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Created for: ");
19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        formatTimeMs(sb, startTime / 1000);
19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(" uptime\n");
19321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                sb.append(prefix); sb.append("        Starts: ");
19331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(starts);
19341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                        sb.append(", launches: "); sb.append(launches);
19351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                                pw.println(sb.toString());
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                apkActivity = true;
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!apkActivity) {
19411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(prefix); pw.println("      (nothing executed)");
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    uidActivity = true;
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!uidActivity) {
19471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print(prefix); pw.println("    (nothing executed)");
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    static void printBitDescriptions(PrintWriter pw, int oldval, int newval, BitDescription[] descriptions) {
19536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        int diff = oldval ^ newval;
19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (diff == 0) return;
19556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<descriptions.length; i++) {
19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            BitDescription bd = descriptions[i];
19576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if ((diff&bd.mask) != 0) {
19586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (bd.shift < 0) {
19596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    pw.print((newval&bd.mask) != 0 ? " +" : " -");
19606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    pw.print(bd.name);
19616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else {
19626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    pw.print(" ");
19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    pw.print(bd.name);
19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    pw.print("=");
19656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    int val = (newval&bd.mask)>>bd.shift;
19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (bd.values != null && val >= 0 && val < bd.values.length) {
19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        pw.print(bd.values[val]);
19686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
19696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        pw.print(val);
19706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
19716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
19726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
19736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
19746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
19760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
19770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
19780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
19790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public static class HistoryPrinter {
19800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldState = 0;
19810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldStatus = -1;
19820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldHealth = -1;
19830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldPlug = -1;
19840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldTemp = -1;
19850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int oldVolt = -1;
19860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
19870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        public void printNextItem(PrintWriter pw, HistoryItem rec, long now) {
19880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            pw.print("  ");
19890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            TimeUtils.formatDuration(rec.time-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN);
19900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            pw.print(" ");
19910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (rec.cmd == HistoryItem.CMD_START) {
19920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println(" START");
19930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            } else if (rec.cmd == HistoryItem.CMD_OVERFLOW) {
19940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println(" *OVERFLOW*");
19950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            } else {
19960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (rec.batteryLevel < 10) pw.print("00");
19970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.batteryLevel < 100) pw.print("0");
19980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.print(rec.batteryLevel);
19990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.print(" ");
20000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (rec.states < 0x10) pw.print("0000000");
20010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x100) pw.print("000000");
20020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x1000) pw.print("00000");
20030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x10000) pw.print("0000");
20040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x100000) pw.print("000");
20050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x1000000) pw.print("00");
20060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                else if (rec.states < 0x10000000) pw.print("0");
20070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.print(Integer.toHexString(rec.states));
20080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (oldStatus != rec.batteryStatus) {
20090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    oldStatus = rec.batteryStatus;
20100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(" status=");
20110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    switch (oldStatus) {
20120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_STATUS_UNKNOWN:
20130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("unknown");
20140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_STATUS_CHARGING:
20160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("charging");
20170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_STATUS_DISCHARGING:
20190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("discharging");
20200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
20220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("not-charging");
20230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_STATUS_FULL:
20250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("full");
20260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        default:
20280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print(oldStatus);
20290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
20310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                }
20320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (oldHealth != rec.batteryHealth) {
20330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    oldHealth = rec.batteryHealth;
20340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(" health=");
20350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    switch (oldHealth) {
20360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_UNKNOWN:
20370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("unknown");
20380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_GOOD:
20400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("good");
20410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_OVERHEAT:
20430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("overheat");
20440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_DEAD:
20460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("dead");
20470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
20490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("over-voltage");
20500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
20520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("failure");
20530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        default:
20550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print(oldHealth);
20560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
20580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                }
20590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (oldPlug != rec.batteryPlugType) {
20600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    oldPlug = rec.batteryPlugType;
20610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(" plug=");
20620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    switch (oldPlug) {
20630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case 0:
20640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("none");
20650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_PLUGGED_AC:
20670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("ac");
20680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        case BatteryManager.BATTERY_PLUGGED_USB:
20700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print("usb");
20710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        default:
20730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            pw.print(oldPlug);
20740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            break;
20750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
20760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                }
20770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (oldTemp != rec.batteryTemperature) {
20780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    oldTemp = rec.batteryTemperature;
20790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(" temp=");
20800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(oldTemp);
20810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                }
20820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                if (oldVolt != rec.batteryVoltage) {
20830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    oldVolt = rec.batteryVoltage;
20840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(" volt=");
20850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.print(oldVolt);
20860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                }
20870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                printBitDescriptions(pw, oldState, rec.states,
20880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        HISTORY_STATE_DESCRIPTIONS);
20890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println();
20900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
20910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            oldState = rec.states;
20920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
20930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
20940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dumps a human-readable summary of the battery statistics to the given PrintWriter.
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pw a Printer to receive the dump output.
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
21011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
21020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        prepareForDumpLocked();
21030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
21040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
21050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
2106ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        final HistoryItem rec = new HistoryItem();
2107ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (startIteratingHistoryLocked()) {
210832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            pw.println("Battery History:");
21090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryPrinter hprinter = new HistoryPrinter();
2110ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            while (getNextHistoryLocked(rec)) {
21110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                hprinter.printNextItem(pw, rec, now);
21120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
21130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            finishIteratingHistoryLocked();
21140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            pw.println("");
21150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
21160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
21170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (startIteratingOldHistoryLocked()) {
21180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            pw.println("Old battery History:");
21190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryPrinter hprinter = new HistoryPrinter();
21200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            while (getNextOldHistoryLocked(rec)) {
21210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                hprinter.printNextItem(pw, rec, now);
212232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            }
21230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            finishIteratingOldHistoryLocked();
2124b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            pw.println("");
2125b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
2126b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
2127b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        SparseArray<? extends Uid> uidStats = getUidStats();
2128b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        final int NU = uidStats.size();
2129b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        boolean didPid = false;
2130b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        long nowRealtime = SystemClock.elapsedRealtime();
2131b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        for (int i=0; i<NU; i++) {
2132b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            Uid uid = uidStats.valueAt(i);
2133b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            SparseArray<? extends Uid.Pid> pids = uid.getPidStats();
2134b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            if (pids != null) {
2135b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                for (int j=0; j<pids.size(); j++) {
2136b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                    Uid.Pid pid = pids.valueAt(j);
2137b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                    if (!didPid) {
2138b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                        pw.println("Per-PID Stats:");
2139b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                        didPid = true;
2140b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                    }
2141b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                    long time = pid.mWakeSum + (pid.mWakeStart != 0
2142b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                            ? (nowRealtime - pid.mWakeStart) : 0);
2143b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                    pw.print("  PID "); pw.print(pids.keyAt(j));
2144b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                            pw.print(" wake time: ");
2145b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                            TimeUtils.formatDuration(time, pw);
2146b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                            pw.println("");
2147b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn                }
2148b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            }
2149b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
2150b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        if (didPid) {
2151b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            pw.println("");
215232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
21546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        pw.println("Statistics since last charge:");
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("  System starts: " + getStartCount()
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", currently on battery: " + getIsOnBattery());
21576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dumpLocked(pw, "", STATS_SINCE_CHARGED, -1);
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println("");
21596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        pw.println("Statistics since last unplugged:");
21606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dumpLocked(pw, "", STATS_SINCE_UNPLUGGED, -1);
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
2164e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    public void dumpCheckinLocked(PrintWriter pw, String[] args, List<ApplicationInfo> apps) {
21650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        prepareForDumpLocked();
21660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUnpluggedOnly = false;
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (String arg : args) {
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ("-u".equals(arg)) {
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data");
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isUnpluggedOnly = true;
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2176e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (apps != null) {
2177e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>();
2178e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            for (int i=0; i<apps.size(); i++) {
2179e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                ApplicationInfo ai = apps.get(i);
2180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                ArrayList<String> pkgs = uids.get(ai.uid);
2181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (pkgs == null) {
2182e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    pkgs = new ArrayList<String>();
2183e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    uids.put(ai.uid, pkgs);
2184e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
2185e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                pkgs.add(ai.packageName);
2186e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
2187e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            SparseArray<? extends Uid> uidStats = getUidStats();
2188e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            final int NU = uidStats.size();
2189e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            String[] lineArgs = new String[2];
2190e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            for (int i=0; i<NU; i++) {
2191e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                int uid = uidStats.keyAt(i);
2192e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                ArrayList<String> pkgs = uids.get(uid);
2193e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (pkgs != null) {
2194e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    for (int j=0; j<pkgs.size(); j++) {
2195e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        lineArgs[0] = Integer.toString(uid);
2196e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        lineArgs[1] = pkgs.get(j);
2197e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        dumpLine(pw, 0 /* uid */, "i" /* category */, UID_DATA,
2198e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                                (Object[])lineArgs);
2199e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    }
2200e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
2201e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
2202e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isUnpluggedOnly) {
22046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            dumpCheckinLocked(pw, STATS_SINCE_UNPLUGGED, -1);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
22076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            dumpCheckinLocked(pw, STATS_SINCE_CHARGED, -1);
22086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            dumpCheckinLocked(pw, STATS_SINCE_UNPLUGGED, -1);
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2212