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