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 /** 746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly * A constant indicating a wifi scan 75105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 766ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public static final int WIFI_SCAN = 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"; 1396ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly private static final String WIFI_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(); 2636ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public abstract void noteWifiScanStartedLocked(); 2646ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public abstract void noteWifiScanStoppedLocked(); 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); 2736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public abstract long getWifiScanTime(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 /** 280df693de4fe12f081555b449e2726e205fbd86572Jeff Brown * Note that these must match the constants in android.os.PowerManager. 281df693de4fe12f081555b449e2726e205fbd86572Jeff Brown * Also, if the user activity types change, the BatteryStatsImpl.VERSION must 282df693de4fe12f081555b449e2726e205fbd86572Jeff Brown * also be bumped. 283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn static final String[] USER_ACTIVITY_TYPES = { 285df693de4fe12f081555b449e2726e205fbd86572Jeff Brown "other", "button", "touch" 286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn }; 287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 288df693de4fe12f081555b449e2726e205fbd86572Jeff Brown public static final int NUM_USER_ACTIVITY_TYPES = 3; 289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract void noteUserActivityLocked(int type); 291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract boolean hasUserActivity(); 292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract int getUserActivityCount(int type, int which); 293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Sensor { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Magic sensor number for the GPS. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int GPS = -10000; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getHandle(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Timer getSensorTime(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 303b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public class Pid { 304b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long mWakeSum; 305b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long mWakeStart; 306b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 307b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Proc { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 313287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public static class ExcessivePower { 314287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public static final int TYPE_WAKE = 1; 315287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public static final int TYPE_CPU = 2; 316287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 317287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int type; 3189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long overTime; 3199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long usedTime; 3209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 3219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in user code. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getUserTime(int which); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in system code. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getSystemTime(int which); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the process has been started. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 342eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 343eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 344eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the cpu time spent in microseconds while the process was in the foreground. 345eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED 346eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * @return foreground cpu time in microseconds 347eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 348eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public abstract long getForegroundTime(int which); 349e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 350e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** 351e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * Returns the approximate cpu time spent in microseconds, at a certain CPU speed. 352e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * @param speedStep the index of the CPU speed. This is not the actual speed of the 353e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * CPU. 354e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * @param which one of STATS_TOTAL, STATS_LAST, STATS_CURRENT or STATS_UNPLUGGED 355e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * @see BatteryStats#getCpuSpeedSteps() 356e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani */ 357e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public abstract long getTimeAtCpuSpeedStep(int speedStep, int which); 3589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 359287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public abstract int countExcessivePowers(); 3609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 361287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public abstract ExcessivePower getExcessivePower(int i); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Pkg { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times this package has done something that could wake up the 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getWakeups(int which); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing service statistics. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Serv> getServiceStats(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract class Serv { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of time spent started. 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryUptime elapsed uptime on battery in microseconds. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getStartTime(long batteryUptime, int which); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number of times startService() has been called. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number times the service has been launched. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getLaunches(int which); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 413ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public final static class HistoryItem implements Parcelable { 4141fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final String TAG = "HistoryItem"; 4151fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final boolean DEBUG = false; 4161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 4176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public HistoryItem next; 41832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 41932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public long time; 4206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final byte CMD_NULL = 0; 4221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final byte CMD_UPDATE = 1; 4231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final byte CMD_START = 2; 4241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final byte CMD_OVERFLOW = 3; 4256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public byte cmd = CMD_NULL; 4276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 42832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public byte batteryLevel; 4296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public byte batteryStatus; 4306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public byte batteryHealth; 4316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public byte batteryPlugType; 43232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 4336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public char batteryTemperature; 4346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public char batteryVoltage; 4356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // Constants from SCREEN_BRIGHTNESS_* 4371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_BRIGHTNESS_MASK = 0x0000000f; 4386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int STATE_BRIGHTNESS_SHIFT = 0; 4393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // Constants from SIGNAL_STRENGTH_* 4401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_SIGNAL_STRENGTH_MASK = 0x000000f0; 44132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public static final int STATE_SIGNAL_STRENGTH_SHIFT = 4; 4423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // Constants from ServiceState.STATE_* 4431fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_PHONE_STATE_MASK = 0x00000f00; 44432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public static final int STATE_PHONE_STATE_SHIFT = 8; 4453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // Constants from DATA_CONNECTION_* 4461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_DATA_CONNECTION_MASK = 0x0000f000; 44732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public static final int STATE_DATA_CONNECTION_SHIFT = 12; 44832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 4491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // These states always appear directly in the first int token 4501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // of a delta change; they should be ones that change relatively 4511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // frequently. 4521fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_WAKE_LOCK_FLAG = 1<<30; 4531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_SENSOR_ON_FLAG = 1<<29; 45432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public static final int STATE_GPS_ON_FLAG = 1<<28; 4551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_PHONE_SCANNING_FLAG = 1<<27; 4561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_WIFI_RUNNING_FLAG = 1<<26; 4571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<25; 4586ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public static final int STATE_WIFI_SCAN_FLAG = 1<<24; 4591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<23; 4601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // These are on the lower bits used for the command; if they change 4611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // we need to write another int of data. 4621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_AUDIO_ON_FLAG = 1<<22; 4631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_VIDEO_ON_FLAG = 1<<21; 4641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_SCREEN_ON_FLAG = 1<<20; 4651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_BATTERY_PLUGGED_FLAG = 1<<19; 4661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_PHONE_IN_CALL_FLAG = 1<<18; 4671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_WIFI_ON_FLAG = 1<<17; 4681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public static final int STATE_BLUETOOTH_ON_FLAG = 1<<16; 46932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 470f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn public static final int MOST_INTERESTING_STATES = 471f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn STATE_BATTERY_PLUGGED_FLAG | STATE_SCREEN_ON_FLAG 472f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn | STATE_GPS_ON_FLAG | STATE_PHONE_IN_CALL_FLAG; 473f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 47432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public int states; 47532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 4766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public HistoryItem() { 47732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 47832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 4796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public HistoryItem(long time, Parcel src) { 48032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn this.time = time; 4810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn readFromParcel(src); 48232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 48332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 48432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public int describeContents() { 48532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn return 0; 48632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 48732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 48832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 48932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn dest.writeLong(time); 4906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int bat = (((int)cmd)&0xff) 4916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | ((((int)batteryLevel)<<8)&0xff00) 4926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | ((((int)batteryStatus)<<16)&0xf0000) 4936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | ((((int)batteryHealth)<<20)&0xf00000) 4946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | ((((int)batteryPlugType)<<24)&0xf000000); 4956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dest.writeInt(bat); 4966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bat = (((int)batteryTemperature)&0xffff) 4976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | ((((int)batteryVoltage)<<16)&0xffff0000); 4986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dest.writeInt(bat); 49932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn dest.writeInt(states); 50032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 5010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 5020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private void readFromParcel(Parcel src) { 5030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int bat = src.readInt(); 5040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn cmd = (byte)(bat&0xff); 5050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryLevel = (byte)((bat>>8)&0xff); 5060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryStatus = (byte)((bat>>16)&0xf); 5070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryHealth = (byte)((bat>>20)&0xf); 5080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryPlugType = (byte)((bat>>24)&0xf); 5090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn bat = src.readInt(); 5100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryTemperature = (char)(bat&0xffff); 5110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn batteryVoltage = (char)((bat>>16)&0xffff); 5120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn states = src.readInt(); 5130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 5140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 5151fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // Part of initial delta int that specifies the time delta. 5161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_TIME_MASK = 0x3ffff; 5171fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_TIME_ABS = 0x3fffd; // Following is an entire abs update. 5181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_TIME_INT = 0x3fffe; // The delta is a following int 5191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_TIME_LONG = 0x3ffff; // The delta is a following long 5201fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // Part of initial delta int holding the command code. 5211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_CMD_MASK = 0x3; 5221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_CMD_SHIFT = 18; 5231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // Flag in delta int: a new battery level int follows. 5241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_BATTERY_LEVEL_FLAG = 1<<20; 5251fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn // Flag in delta int: a new full state and battery status int follows. 5261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_STATE_FLAG = 1<<21; 5271fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int DELTA_STATE_MASK = 0xffc00000; 5281fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public void writeDelta(Parcel dest, HistoryItem last) { 5301fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (last == null || last.cmd != CMD_UPDATE) { 5311fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeInt(DELTA_TIME_ABS); 5321fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn writeToParcel(dest, 0); 5331fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn return; 5341fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5351fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final long deltaTime = time - last.time; 5371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int lastBatteryLevelInt = last.buildBatteryLevelInt(); 5381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int lastStateInt = last.buildStateInt(); 5391fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int deltaTimeToken; 5411fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (deltaTime < 0 || deltaTime > Integer.MAX_VALUE) { 5421fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn deltaTimeToken = DELTA_TIME_LONG; 5431fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (deltaTime >= DELTA_TIME_ABS) { 5441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn deltaTimeToken = DELTA_TIME_INT; 5451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else { 5461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn deltaTimeToken = (int)deltaTime; 5471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5481fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int firstToken = deltaTimeToken 5491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | (cmd<<DELTA_CMD_SHIFT) 5501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | (states&DELTA_STATE_MASK); 5511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int batteryLevelInt = buildBatteryLevelInt(); 5521fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final boolean batteryLevelIntChanged = batteryLevelInt != lastBatteryLevelInt; 5531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (batteryLevelIntChanged) { 5541fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn firstToken |= DELTA_BATTERY_LEVEL_FLAG; 5551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int stateInt = buildStateInt(); 5571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final boolean stateIntChanged = stateInt != lastStateInt; 5581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (stateIntChanged) { 5591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn firstToken |= DELTA_STATE_FLAG; 5601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeInt(firstToken); 5621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "WRITE DELTA: firstToken=0x" + Integer.toHexString(firstToken) 5631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " deltaTime=" + deltaTime); 5641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (deltaTimeToken >= DELTA_TIME_INT) { 5661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (deltaTimeToken == DELTA_TIME_INT) { 5671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "WRITE DELTA: int deltaTime=" + (int)deltaTime); 5681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeInt((int)deltaTime); 5691fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else { 5701fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "WRITE DELTA: long deltaTime=" + deltaTime); 5711fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeLong(deltaTime); 5721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5731fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (batteryLevelIntChanged) { 5751fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeInt(batteryLevelInt); 5761fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "WRITE DELTA: batteryToken=0x" 5771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + Integer.toHexString(batteryLevelInt) 5781fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryLevel=" + batteryLevel 5791fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryTemp=" + (int)batteryTemperature 5801fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryVolt=" + (int)batteryVoltage); 5811fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5821fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (stateIntChanged) { 5831fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn dest.writeInt(stateInt); 5841fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "WRITE DELTA: stateToken=0x" 5851fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + Integer.toHexString(stateInt) 5861fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryStatus=" + batteryStatus 5871fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryHealth=" + batteryHealth 5881fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryPlugType=" + batteryPlugType 5891fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " states=0x" + Integer.toHexString(states)); 5901fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5911fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5921fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5931fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn private int buildBatteryLevelInt() { 5941fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn return ((((int)batteryLevel)<<24)&0xff000000) 5951fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | ((((int)batteryTemperature)<<14)&0x00ffc000) 5961fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | (((int)batteryVoltage)&0x00003fff); 5971fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 5981fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 5991fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn private int buildStateInt() { 6001fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn return ((((int)batteryStatus)<<28)&0xf0000000) 6011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | ((((int)batteryHealth)<<24)&0x0f000000) 6021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | ((((int)batteryPlugType)<<22)&0x00c00000) 6031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn | (states&(~DELTA_STATE_MASK)); 6041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 6051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 6061fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public void readDelta(Parcel src) { 6071fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int firstToken = src.readInt(); 6081fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int deltaTimeToken = firstToken&DELTA_TIME_MASK; 6091fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn cmd = (byte)((firstToken>>DELTA_CMD_SHIFT)&DELTA_CMD_MASK); 6101fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "READ DELTA: firstToken=0x" + Integer.toHexString(firstToken) 6111fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " deltaTimeToken=" + deltaTimeToken); 6121fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 6131fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (deltaTimeToken < DELTA_TIME_ABS) { 6141fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn time += deltaTimeToken; 6151fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (deltaTimeToken == DELTA_TIME_ABS) { 6161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn time = src.readLong(); 6171fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn readFromParcel(src); 6181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn return; 6191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (deltaTimeToken == DELTA_TIME_INT) { 6201fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int delta = src.readInt(); 6211fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn time += delta; 6221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + time); 6231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else { 6241fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn long delta = src.readLong(); 6251fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + time); 6261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn time += delta; 6271fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 6281fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 6291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if ((firstToken&DELTA_BATTERY_LEVEL_FLAG) != 0) { 6301fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int batteryLevelInt = src.readInt(); 6311fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryLevel = (byte)((batteryLevelInt>>24)&0xff); 6321fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryTemperature = (char)((batteryLevelInt>>14)&0x3ff); 6331fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryVoltage = (char)(batteryLevelInt&0x3fff); 6341fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "READ DELTA: batteryToken=0x" 6351fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + Integer.toHexString(batteryLevelInt) 6361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryLevel=" + batteryLevel 6371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryTemp=" + (int)batteryTemperature 6381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryVolt=" + (int)batteryVoltage); 6391fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 6401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 6411fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if ((firstToken&DELTA_STATE_FLAG) != 0) { 6421fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn int stateInt = src.readInt(); 6431fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn states = (firstToken&DELTA_STATE_MASK) | (stateInt&(~DELTA_STATE_MASK)); 6441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryStatus = (byte)((stateInt>>28)&0xf); 6451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryHealth = (byte)((stateInt>>24)&0xf); 6461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryPlugType = (byte)((stateInt>>22)&0x3); 6471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (DEBUG) Slog.i(TAG, "READ DELTA: stateToken=0x" 6481fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + Integer.toHexString(stateInt) 6491fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryStatus=" + batteryStatus 6501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryHealth=" + batteryHealth 6511fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " batteryPlugType=" + batteryPlugType 6521fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn + " states=0x" + Integer.toHexString(states)); 6531fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else { 6541fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn states = (firstToken&DELTA_STATE_MASK) | (states&(~DELTA_STATE_MASK)); 6551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 6560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 6570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 6581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn public void clear() { 6591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn time = 0; 6601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn cmd = CMD_NULL; 6611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryLevel = 0; 6621fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryStatus = 0; 6631fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryHealth = 0; 6641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryPlugType = 0; 6651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryTemperature = 0; 6661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn batteryVoltage = 0; 6671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn states = 0; 6681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 6691fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn 670ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void setTo(HistoryItem o) { 671ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn time = o.time; 672ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn cmd = o.cmd; 673ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryLevel = o.batteryLevel; 674ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryStatus = o.batteryStatus; 675ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryHealth = o.batteryHealth; 676ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryPlugType = o.batteryPlugType; 677ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryTemperature = o.batteryTemperature; 678ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn batteryVoltage = o.batteryVoltage; 679ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn states = o.states; 680ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 681ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 6826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setTo(long time, byte cmd, HistoryItem o) { 6836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.time = time; 6846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.cmd = cmd; 6856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryLevel = o.batteryLevel; 6866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryStatus = o.batteryStatus; 6876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryHealth = o.batteryHealth; 6886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryPlugType = o.batteryPlugType; 6896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryTemperature = o.batteryTemperature; 6906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn batteryVoltage = o.batteryVoltage; 6916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn states = o.states; 6926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 6939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 6949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public boolean same(HistoryItem o) { 6959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return batteryLevel == o.batteryLevel 6969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && batteryStatus == o.batteryStatus 6979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && batteryHealth == o.batteryHealth 6989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && batteryPlugType == o.batteryPlugType 6999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && batteryTemperature == o.batteryTemperature 7009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && batteryVoltage == o.batteryVoltage 7019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && states == o.states; 7029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 7036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 7046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 7056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final class BitDescription { 7066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public final int mask; 7076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public final int shift; 7086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public final String name; 7096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public final String[] values; 7106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 7116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public BitDescription(int mask, String name) { 7126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.mask = mask; 7136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.shift = -1; 7146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.name = name; 7156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.values = null; 7166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 7176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 7186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public BitDescription(int mask, int shift, String name, String[] values) { 7196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.mask = mask; 7206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.shift = shift; 7216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.name = name; 7226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn this.values = values; 7236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 72432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 72532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 726ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public abstract boolean startIteratingHistoryLocked(); 727ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 728ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public abstract boolean getNextHistoryLocked(HistoryItem out); 729ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 7300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public abstract void finishIteratingHistoryLocked(); 7310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 7320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public abstract boolean startIteratingOldHistoryLocked(); 7330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 7340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public abstract boolean getNextOldHistoryLocked(HistoryItem out); 7350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 7360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public abstract void finishIteratingOldHistoryLocked(); 7370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn * Return the base time offset for the battery history. 740b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn */ 741b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public abstract long getHistoryBaseTime(); 742b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn 743b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn /** 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the device has been started. 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStartCount(); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that the screen has been on while the device was 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getScreenOnTime(long batteryRealtime, int which); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 756617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int SCREEN_BRIGHTNESS_DARK = 0; 757617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int SCREEN_BRIGHTNESS_DIM = 1; 758617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int SCREEN_BRIGHTNESS_MEDIUM = 2; 759617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int SCREEN_BRIGHTNESS_LIGHT = 3; 760617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int SCREEN_BRIGHTNESS_BRIGHT = 4; 761617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 762617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn static final String[] SCREEN_BRIGHTNESS_NAMES = { 763617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn "dark", "dim", "medium", "light", "bright" 764617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn }; 765617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 766617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final int NUM_SCREEN_BRIGHTNESS_BINS = 5; 767617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 768617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 769eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that the screen has been on with 770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * the given brightness 771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * {@hide} 773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 774617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract long getScreenBrightnessTime(int brightnessBin, 775617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which); 776617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 777617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract int getInputEventCount(int which); 778617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 780eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that the phone has been on while the device was 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getPhoneOnTime(long batteryRealtime, int which); 786627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 787627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn /** 788eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that the phone has been running with 789627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * the given signal strength. 790627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * 791627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * {@hide} 792627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn */ 793627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public abstract long getPhoneSignalStrengthTime(int strengthBin, 794627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which); 795627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 797f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * Returns the time in microseconds that the phone has been trying to 798f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * acquire a signal. 799f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 800f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * {@hide} 801f37447bad3773b62176baa837908daf6edb44273Amith Yamasani */ 802f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public abstract long getPhoneSignalScanningTime( 803f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which); 804f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 805f37447bad3773b62176baa837908daf6edb44273Amith Yamasani /** 806617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Returns the number of times the phone has entered the given signal strength. 807617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 808617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * {@hide} 809617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 810617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract int getPhoneSignalStrengthCount(int strengthBin, int which); 811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 812627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_NONE = 0; 813627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_GPRS = 1; 814627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_EDGE = 2; 815627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_UMTS = 3; 8166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_CDMA = 4; 8176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_EVDO_0 = 5; 8186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_EVDO_A = 6; 8196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_1xRTT = 7; 8206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_HSDPA = 8; 8216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_HSUPA = 9; 8226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_HSPA = 10; 8236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_IDEN = 11; 8246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int DATA_CONNECTION_EVDO_B = 12; 825962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt public static final int DATA_CONNECTION_LTE = 13; 826962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt public static final int DATA_CONNECTION_EHRPD = 14; 827962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt public static final int DATA_CONNECTION_OTHER = 15; 828962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt 829627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn static final String[] DATA_CONNECTION_NAMES = { 8306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn "none", "gprs", "edge", "umts", "cdma", "evdo_0", "evdo_A", 831962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt "1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte", 832962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt "ehrpd", "other" 833627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn }; 834627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 8356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1; 836627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn /** 838eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that the phone has been running with 839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * the given data connection. 840627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * 841627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * {@hide} 842627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn */ 843627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public abstract long getPhoneDataConnectionTime(int dataType, 844627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which); 845627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 847617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Returns the number of times the phone has entered the given data 848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * connection type. 849617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 850617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * {@hide} 851617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 852617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public abstract int getPhoneDataConnectionCount(int dataType, int which); 8536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 8546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public static final BitDescription[] HISTORY_STATE_DESCRIPTIONS 8556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn = new BitDescription[] { 8566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged"), 8576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen"), 8586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_GPS_ON_FLAG, "gps"), 8593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call"), 8606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning"), 8616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi"), 8626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running"), 8636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock"), 8646ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly new BitDescription(HistoryItem.STATE_WIFI_SCAN_FLAG, "wifi_scan"), 8656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast"), 8666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth"), 8676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio"), 8686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_VIDEO_ON_FLAG, "video"), 8699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock"), 8709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor"), 8716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK, 8726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness", 8736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SCREEN_BRIGHTNESS_NAMES), 8746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_SIGNAL_STRENGTH_MASK, 8756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT, "signal_strength", 8765284090631e638b916d9a453212e9dc802656a67Wink Saville SignalStrength.SIGNAL_STRENGTH_NAMES), 8776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK, 8786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state", 8796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new String[] {"in", "out", "emergency", "off"}), 8806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK, 8816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", 8826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn DATA_CONNECTION_NAMES), 8836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn }; 884617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 885617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 886eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that wifi has been on while the device was 887105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 888105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 889105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 890105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 891105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getWifiOnTime(long batteryRealtime, int which); 892d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 893d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood /** 894eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that wifi has been on and the driver has 895d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * been in the running state while the device was running on battery. 896d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * 897d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * {@hide} 898d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood */ 89958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public abstract long getGlobalWifiRunningTime(long batteryRealtime, int which); 900d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 901105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 902eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Returns the time in microseconds that bluetooth has been on while the device was 903105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 904105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 905105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 906105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 907105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getBluetoothOnTime(long batteryRealtime, int which); 908105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 909105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return whether we are currently running on battery. 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract boolean getIsOnBattery(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a SparseArray containing the statistics for each uid. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract SparseArray<? extends Uid> getUidStats(); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery uptime in microseconds. 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryUptime(long curTime); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 9283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptimeMs() { 9303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 9313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Returns the time that the radio was on for data transfers. 9353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return the uptime in microseconds while unplugged 9363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public abstract long getRadioDataUptime(); 9383f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery realtime in microseconds. 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryRealtime(long curTime); 945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 946105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 947633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar * Returns the battery percentage level at the last time the device was unplugged from power, or 948633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar * the last time it booted on battery power. 949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 950633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public abstract int getDischargeStartLevel(); 951105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 952105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 953633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar * Returns the current battery percentage level if we are in a discharge cycle, otherwise 954633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar * returns the level at the last plug event. 955105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 956633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public abstract int getDischargeCurrentLevel(); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn * Get the amount the battery has discharged since the stats were 9603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn * last reset after charging, as a lower-end approximation. 9613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn */ 9623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public abstract int getLowDischargeAmountSinceCharge(); 9633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 9643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn /** 9653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn * Get the amount the battery has discharged since the stats were 9663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn * last reset after charging, as an upper-end approximation. 9673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn */ 9683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public abstract int getHighDischargeAmountSinceCharge(); 9693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 9703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn /** 971c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * Get the amount the battery has discharged while the screen was on, 972c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * since the last time power was unplugged. 973c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn */ 974c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public abstract int getDischargeAmountScreenOn(); 975c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 976c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn /** 977c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * Get the amount the battery has discharged while the screen was on, 978c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * since the last time the device was charged. 979c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn */ 980c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public abstract int getDischargeAmountScreenOnSinceCharge(); 981c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 982c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn /** 983c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * Get the amount the battery has discharged while the screen was off, 984c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * since the last time power was unplugged. 985c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn */ 986c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public abstract int getDischargeAmountScreenOff(); 987c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 988c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn /** 989c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * Get the amount the battery has discharged while the screen was off, 990c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn * since the last time the device was charged. 991c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn */ 992c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public abstract int getDischargeAmountScreenOffSinceCharge(); 993c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 994c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn /** 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery uptime in microseconds. 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the elapsed realtime in microseconds. 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryUptime(long curTime, int which); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery realtime in microseconds. 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryRealtime(long curTime, int which); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current uptime in microseconds. 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeUptime(long curTime, int which); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current realtime in microseconds. 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * * 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeRealtime(long curTime, int which); 1025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public abstract Map<String, ? extends Timer> getKernelWakelockStats(); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1028e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** Returns the number of different speeds that the CPU can run at */ 1029e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public abstract int getCpuSpeedSteps(); 1030e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 10311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private final static void formatTimeRaw(StringBuilder out, long seconds) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long days = seconds / (60 * 60 * 24); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (days != 0) { 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(days); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("d "); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long used = days * 60 * 60 * 24; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long hours = (seconds - used) / (60 * 60); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hours != 0 || used != 0) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(hours); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("h "); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += hours * 60 * 60; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mins = (seconds-used) / 60; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mins != 0 || used != 0) { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(mins); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("m "); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += mins * 60; 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (seconds != 0 || used != 0) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(seconds-used); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("s "); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private final static void formatTime(StringBuilder sb, long time) { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 100; 10611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeRaw(sb, sec); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((time - (sec * 100)) * 10); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private final static void formatTimeMs(StringBuilder sb, long time) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 1000; 10681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeRaw(sb, sec); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(time - (sec * 1000)); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String formatRatioLocked(long num, long den) { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (den == 0L) { 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "---%"; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float perc = ((float)num) / ((float)den) * 100; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatBuilder.setLength(0); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatter.format("%.1f%%", perc); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormatBuilder.toString(); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private final String formatBytesLocked(long bytes) { 108422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatBuilder.setLength(0); 108522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 108622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (bytes < BYTES_PER_KB) { 108722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return bytes + "B"; 108822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else if (bytes < BYTES_PER_MB) { 108922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB); 109022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 109122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else if (bytes < BYTES_PER_GB){ 109222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB); 109322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 109422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else { 109522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB); 109622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 109722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 109822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 109922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 1100c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn private static long computeWakeLock(Timer timer, long batteryRealtime, int which) { 1101c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (timer != null) { 1102c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn // Convert from microseconds to milliseconds with rounding 1103c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which); 1104c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn long totalTimeMillis = (totalTimeMicros + 500) / 1000; 1105c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn return totalTimeMillis; 1106c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1107c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn return 0; 1108c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1109c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryRealtime the current on-battery time in microseconds. 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLock(StringBuilder sb, Timer timer, 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime, String name, int which, String linePrefix) { 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 1124c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn long totalTimeMillis = computeWakeLock(timer, batteryRealtime, which); 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count = timer.getCountLocked(which); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTimeMillis != 0) { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 11291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, totalTimeMillis); 11301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name != null) sb.append(name); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(' '); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('('); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ", "; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return linePrefix; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin version of wakelock printer. Prints simple comma-separated list. 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param now the current time in microseconds. 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now, 1153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name, int which, String linePrefix) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMicros = 0; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 1157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTimeMicros = timer.getTotalTimeLocked(now, which); 1158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = timer.getCountLocked(which); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(','); 1163c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sb.append(name != null ? name + "," : ""); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ","; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dump a comma-separated line of values for terse checkin mode. 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw the PageWriter to dump log to 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param category category of data (e.g. "total", "last", "unplugged", "current" ) 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network") 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args type-dependent data arguments 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void dumpLine(PrintWriter pw, int uid, String category, String type, 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object... args ) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(uid); pw.print(','); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(category); pw.print(','); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(type); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Object arg : args) { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(','); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(arg); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print('\n'); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin server version of dump to produce more compact, computer-readable log. 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: all times are expressed in 'ms'. 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 119521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public final void dumpCheckinLocked(PrintWriter pw, int which, int reqUid) { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtime(rawRealtime); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 1206105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 120758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which); 1208105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 121222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar SparseArray<? extends Uid> uidStats = getUidStats(); 121322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar final int NU = uidStats.size(); 121422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String category = STAT_NAMES[which]; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump "battery" stat 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, 12196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn which == STATS_SINCE_CHARGED ? getStartCount() : "N/A", 1220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn whichBatteryRealtime / 1000, whichBatteryUptime / 1000, 1221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn totalRealtime / 1000, totalUptime / 1000); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 122322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar // Calculate total network and wakelock times across all uids. 122422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long rxTotal = 0; 122522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long txTotal = 0; 122622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long fullWakeLockTimeTotal = 0; 122722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long partialWakeLockTimeTotal = 0; 122822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 122922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (int iu = 0; iu < NU; iu++) { 123022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid u = uidStats.valueAt(iu); 123122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar rxTotal += u.getTcpBytesReceived(which); 123222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar txTotal += u.getTcpBytesSent(which); 123322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 123422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 123522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (wakelocks.size() > 0) { 123622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 123722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar : wakelocks.entrySet()) { 123822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid.Wakelock wl = ent.getValue(); 123922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 124022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL); 124122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (fullWakeTimer != null) { 1242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar fullWakeLockTimeTotal += fullWakeTimer.getTotalTimeLocked(batteryRealtime, which); 124322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 124422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 124522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL); 124622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (partialWakeTimer != null) { 1247c64edde69d18498fb2954f71a546357b07ab996aEvan Millar partialWakeLockTimeTotal += partialWakeTimer.getTotalTimeLocked( 124822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 124922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 125022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 125122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 125222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 125322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump misc stats 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, MISC_DATA, 1256d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000, 125722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal, 1258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn fullWakeLockTimeTotal, partialWakeLockTimeTotal, 1259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn getInputEventCount(which)); 1260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Dump screen brightness stats 1262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; 1263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 1264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn args[i] = getScreenBrightnessTime(i, batteryRealtime, which) / 1000; 1265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args); 1267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1268627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Dump signal strength stats 12695284090631e638b916d9a453212e9dc802656a67Wink Saville args = new Object[SignalStrength.NUM_SIGNAL_STRENGTH_BINS]; 12705284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 1271627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000; 1272627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_TIME_DATA, args); 1274f37447bad3773b62176baa837908daf6edb44273Amith Yamasani dumpLine(pw, 0 /* uid */, category, SIGNAL_SCANNING_TIME_DATA, 1275f37447bad3773b62176baa837908daf6edb44273Amith Yamasani getPhoneSignalScanningTime(batteryRealtime, which) / 1000); 12765284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 1277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn args[i] = getPhoneSignalStrengthCount(i, which); 1278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_COUNT_DATA, args); 1280627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1281627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Dump network type stats 1282627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args = new Object[NUM_DATA_CONNECTION_TYPES]; 1283627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 1284627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000; 1285627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_TIME_DATA, args); 1287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 1288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn args[i] = getPhoneDataConnectionCount(i, which); 1289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_COUNT_DATA, args); 1291627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 12926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 1293e84de8d702bd26fb1e5b55f3cfdd953d8a31ec22Evan Millar dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(), 1294633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar getDischargeCurrentLevel()); 1295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1297c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 1298c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, 1299c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn getDischargeStartLevel()-getDischargeCurrentLevel(), 1300c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn getDischargeStartLevel()-getDischargeCurrentLevel(), 1301c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn getDischargeAmountScreenOn(), getDischargeAmountScreenOff()); 1302c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 1303c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, 1304c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(), 1305c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn getDischargeAmountScreenOn(), getDischargeAmountScreenOff()); 1306c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 1307c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 130821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (reqUid < 0) { 130921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats(); 131021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (kernelWakelocks.size() > 0) { 131121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) { 131221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.setLength(0); 131321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn printWakeLockCheckin(sb, ent.getValue(), batteryRealtime, null, which, ""); 131421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 131521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn dumpLine(pw, 0 /* uid */, category, KERNEL_WAKELOCK_DATA, ent.getKey(), 131621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.toString()); 131721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 1318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 132321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (reqUid >= 0 && uid != reqUid) { 132421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn continue; 132521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump Network stats per uid, if any 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long rx = u.getTcpBytesReceived(which); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tx = u.getTcpBytesSent(which); 1330105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 13316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly long wifiScanTime = u.getWifiScanTime(batteryRealtime, which); 133258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); 1333105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx); 1335105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 13366ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (fullWifiLockOnTime != 0 || wifiScanTime != 0 133758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn || uidWifiRunningTime != 0) { 13386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly dumpLine(pw, uid, category, WIFI_DATA, 13396ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly fullWifiLockOnTime, wifiScanTime, uidWifiRunningTime); 1340105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.hasUserActivity()) { 1343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn args = new Object[Uid.NUM_USER_ACTIVITY_TYPES]; 1344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean hasData = false; 1345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 1346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val = u.getUserActivityCount(i, which); 1347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn args[i] = val; 1348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (val != 0) hasData = true; 1349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (hasData) { 1351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn dumpLine(pw, 0 /* uid */, category, USER_ACTIVITY_DATA, args); 1352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ""; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 1362c64edde69d18498fb2954f71a546357b07ab996aEvan Millar linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), 1363c64edde69d18498fb2954f71a546357b07ab996aEvan Millar batteryRealtime, "f", which, linePrefix); 1364c64edde69d18498fb2954f71a546357b07ab996aEvan Millar linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), 1365c64edde69d18498fb2954f71a546357b07ab996aEvan Millar batteryRealtime, "p", which, linePrefix); 1366c64edde69d18498fb2954f71a546357b07ab996aEvan Millar linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), 1367c64edde69d18498fb2954f71a546357b07ab996aEvan Millar batteryRealtime, "w", which, linePrefix); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only log if we had at lease one wakelock... 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sb.length() > 0) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString()); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 1385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime = (timer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000; 1386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count = timer.getCountLocked(which); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime = ps.getUserTime(which); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime = ps.getSystemTime(which); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ps.getStarts(which); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userTime != 0 || systemTime != 0 || starts != 0) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, PROCESS_DATA, 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // proc 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime * 10, // cpu time in ms 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime * 10, // user time in ms 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts); // process starts 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, APK_DATA, 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakeups, // wakeup alarms 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // Apk 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sent.getKey(), // service 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime / 1000, // time spent started, in ms 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts, 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project launches); 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 } 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 144421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public final void dumpLocked(PrintWriter pw, String prefix, int which, int reqUid) { 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 1448d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long batteryRealtime = getBatteryRealtime(rawRealtime); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 145622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 145722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar SparseArray<? extends Uid> uidStats = getUidStats(); 145822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar final int NU = uidStats.size(); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 14611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 14621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" Time on battery: "); 14631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, whichBatteryRealtime / 1000); sb.append("("); 14641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(formatRatioLocked(whichBatteryRealtime, totalRealtime)); 14651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(") realtime, "); 14661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, whichBatteryUptime / 1000); 14671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(whichBatteryUptime, totalRealtime)); 14681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(") uptime"); 14691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 14701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 14711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 14721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" Total run time: "); 14731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, totalRealtime / 1000); 14741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("realtime, "); 14751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, totalUptime / 1000); 14761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("uptime, "); 14771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 1480105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 148158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which); 1482105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 1483105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 1484617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.setLength(0); 14851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 14861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" Screen on: "); formatTimeMs(sb, screenOnTime / 1000); 14871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(screenOnTime, whichBatteryRealtime)); 14881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("), Input events: "); sb.append(getInputEventCount(which)); 14891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(", Active phone call: "); formatTimeMs(sb, phoneOnTime / 1000); 14901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(phoneOnTime, whichBatteryRealtime)); 14911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(")"); 14921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 14931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 14941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 1495617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" Screen brightnesses: "); 1496617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean didOne = false; 1497617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 1498617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn final long time = getScreenBrightnessTime(i, batteryRealtime, which); 1499617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (time == 0) { 1500617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn continue; 1501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1502617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (didOne) sb.append(", "); 1503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn didOne = true; 1504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(SCREEN_BRIGHTNESS_NAMES[i]); 1505617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" "); 15061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, time/1000); 1507617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append("("); 1508617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(formatRatioLocked(time, screenOnTime)); 1509617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(")"); 1510617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (!didOne) sb.append("No activity"); 1512617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn pw.println(sb.toString()); 1513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 151422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar // Calculate total network and wakelock times across all uids. 151522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long rxTotal = 0; 151622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long txTotal = 0; 151722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long fullWakeLockTimeTotalMicros = 0; 151822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long partialWakeLockTimeTotalMicros = 0; 151922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 152021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (reqUid < 0) { 152121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Map<String, ? extends BatteryStats.Timer> kernelWakelocks = getKernelWakelockStats(); 152221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (kernelWakelocks.size() > 0) { 152321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn for (Map.Entry<String, ? extends BatteryStats.Timer> ent : kernelWakelocks.entrySet()) { 152421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 152521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String linePrefix = ": "; 152621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.setLength(0); 152721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.append(prefix); 152821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.append(" Kernel Wake lock "); 152921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.append(ent.getKey()); 153021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn linePrefix = printWakeLock(sb, ent.getValue(), batteryRealtime, null, which, 153121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn linePrefix); 153221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (!linePrefix.equals(": ")) { 153321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn sb.append(" realtime"); 153494b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks // Only print out wake locks that were held 153594b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks pw.println(sb.toString()); 153621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 1537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 154122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (int iu = 0; iu < NU; iu++) { 154222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid u = uidStats.valueAt(iu); 154322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar rxTotal += u.getTcpBytesReceived(which); 154422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar txTotal += u.getTcpBytesSent(which); 154522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 154622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 154722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (wakelocks.size() > 0) { 154822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 154922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar : wakelocks.entrySet()) { 155022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid.Wakelock wl = ent.getValue(); 155122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 155222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL); 155322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (fullWakeTimer != null) { 1554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTimeLocked( 155522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 155622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 155722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 155822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL); 155922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (partialWakeTimer != null) { 1560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTimeLocked( 156122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 156222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 156322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 156422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 156522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 156622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 15671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); 15681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Total received: "); pw.print(formatBytesLocked(rxTotal)); 15691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal)); 15701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 15711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 15721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" Total full wakelock time: "); formatTimeMs(sb, 15731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn (fullWakeLockTimeTotalMicros + 500) / 1000); 15741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(", Total partial waklock time: "); formatTimeMs(sb, 15751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn (partialWakeLockTimeTotalMicros + 500) / 1000); 15761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 157722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 1578627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.setLength(0); 15791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 1580617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" Signal levels: "); 1581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn didOne = false; 15825284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 1583627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which); 1584627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (time == 0) { 1585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn continue; 1586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1587627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (didOne) sb.append(", "); 1588627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = true; 15895284090631e638b916d9a453212e9dc802656a67Wink Saville sb.append(SignalStrength.SIGNAL_STRENGTH_NAMES[i]); 1590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" "); 15911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, time/1000); 1592627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append("("); 1593627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatRatioLocked(time, whichBatteryRealtime)); 1594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(") "); 1595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(getPhoneSignalStrengthCount(i, which)); 1596617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append("x"); 1597627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1598627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (!didOne) sb.append("No activity"); 1599627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(sb.toString()); 1600f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1601f37447bad3773b62176baa837908daf6edb44273Amith Yamasani sb.setLength(0); 1602f37447bad3773b62176baa837908daf6edb44273Amith Yamasani sb.append(prefix); 1603f37447bad3773b62176baa837908daf6edb44273Amith Yamasani sb.append(" Signal scanning time: "); 1604f37447bad3773b62176baa837908daf6edb44273Amith Yamasani formatTimeMs(sb, getPhoneSignalScanningTime(batteryRealtime, which) / 1000); 1605f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pw.println(sb.toString()); 1606f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1607627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.setLength(0); 16081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 1609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" Radio types: "); 1610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = false; 1611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 1612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn final long time = getPhoneDataConnectionTime(i, batteryRealtime, which); 1613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (time == 0) { 1614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn continue; 1615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (didOne) sb.append(", "); 1617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = true; 1618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(DATA_CONNECTION_NAMES[i]); 1619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" "); 16201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, time/1000); 1621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append("("); 1622627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatRatioLocked(time, whichBatteryRealtime)); 1623617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(") "); 1624617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(getPhoneDataConnectionCount(i, which)); 1625617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append("x"); 1626627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1627627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (!didOne) sb.append("No activity"); 1628627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(sb.toString()); 16293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 16303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani sb.setLength(0); 16313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani sb.append(prefix); 16323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani sb.append(" Radio data uptime when unplugged: "); 16333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani sb.append(getRadioDataUptime() / 1000); 16343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani sb.append(" ms"); 16353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani pw.println(sb.toString()); 16363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 16371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 16381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); 16391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000); 16401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(wifiOnTime, whichBatteryRealtime)); 16411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("), Wifi running: "); formatTimeMs(sb, wifiRunningTime / 1000); 16421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(wifiRunningTime, whichBatteryRealtime)); 16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("), Bluetooth on: "); formatTimeMs(sb, bluetoothOnTime / 1000); 16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)); 16451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(")"); 16461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 1647617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1648105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(" "); 1649105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 16506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 1651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (getIsOnBattery()) { 16521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println(" Device is currently unplugged"); 16531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Discharge cycle start level: "); 16541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(getDischargeStartLevel()); 16551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Discharge cycle current level: "); 16561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(getDischargeCurrentLevel()); 165799d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn } else { 16581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println(" Device is currently plugged into power"); 16591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Last discharge cycle start level: "); 16601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(getDischargeStartLevel()); 16611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Last discharge cycle end level: "); 16621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(getDischargeCurrentLevel()); 1663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1664c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.print(prefix); pw.print(" Amount discharged while screen on: "); 1665c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.println(getDischargeAmountScreenOn()); 1666c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.print(prefix); pw.print(" Amount discharged while screen off: "); 1667c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.println(getDischargeAmountScreenOff()); 1668617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn pw.println(" "); 16699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 16709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.println(" Device battery use since last full charge"); 16719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print(" Amount discharged (lower bound): "); 16729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.println(getLowDischargeAmountSinceCharge()); 16739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print(" Amount discharged (upper bound): "); 16749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.println(getHighDischargeAmountSinceCharge()); 1675c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.print(prefix); pw.print(" Amount discharged while screen on: "); 1676c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.println(getDischargeAmountScreenOnSinceCharge()); 1677c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.print(prefix); pw.print(" Amount discharged while screen off: "); 1678c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn pw.println(getDischargeAmountScreenOffSinceCharge()); 16799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.println(" "); 1680105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 168222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu=0; iu<NU; iu++) { 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 1685e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) { 168621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn continue; 168721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 168821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 169021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " #" + uid + ":"); 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean uidActivity = false; 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpReceived = u.getTcpBytesReceived(which); 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpSent = u.getTcpBytesSent(which); 1696105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 16976ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly long wifiScanTime = u.getWifiScanTime(batteryRealtime, which); 169858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); 1699105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tcpReceived != 0 || tcpSent != 0) { 17011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Network: "); 17021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, "); 17031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(formatBytesLocked(tcpSent)); pw.println(" sent"); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1705617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.hasUserActivity()) { 1707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean hasData = false; 17084c7a4a776741ddaa49df1361aa3a8f3977e59196Raph Levien for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 1709617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val = u.getUserActivityCount(i, which); 1710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (val != 0) { 1711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (!hasData) { 1712617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.setLength(0); 1713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" User activity: "); 1714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn hasData = true; 1715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(", "); 1717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(val); 1719617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(" "); 1720617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn sb.append(Uid.USER_ACTIVITY_TYPES[i]); 1721617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1722617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1723617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (hasData) { 1724617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn pw.println(sb.toString()); 1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1726617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1727617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 17286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (fullWifiLockOnTime != 0 || wifiScanTime != 0 172958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn || uidWifiRunningTime != 0) { 17301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 173158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sb.append(prefix); sb.append(" Wifi Running: "); 173258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn formatTimeMs(sb, uidWifiRunningTime / 1000); 173358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime, 17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn whichBatteryRealtime)); sb.append(")\n"); 17351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" Full Wifi Lock: "); 17366ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly formatTimeMs(sb, fullWifiLockOnTime / 1000); 17376ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime, 17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn whichBatteryRealtime)); sb.append(")\n"); 17396ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly sb.append(prefix); sb.append(" Wifi Scan: "); 17406ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly formatTimeMs(sb, wifiScanTime / 1000); 17416ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly sb.append("("); sb.append(formatRatioLocked(wifiScanTime, 17421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn whichBatteryRealtime)); sb.append(")"); 17431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 1744105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 1748c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn long totalFull = 0, totalPartial = 0, totalWindow = 0; 1749c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn int count = 0; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ": "; 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Wake lock "); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(ent.getKey()); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime, 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "full", which, linePrefix); 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime, 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "partial", which, linePrefix); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime, 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", which, linePrefix); 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!linePrefix.equals(": ")) { 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" realtime"); 176694b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks // Only print out wake locks that were held 176794b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks pw.println(sb.toString()); 176894b916da2ce7b5fb8d87e884fad7132ef3091720Jason Parks uidActivity = true; 1769c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn count++; 1770c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1771c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn totalFull += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL), 1772c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn batteryRealtime, which); 1773c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn totalPartial += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL), 1774c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn batteryRealtime, which); 1775c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn totalWindow += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW), 1776c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn batteryRealtime, which); 1777c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1778c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (count > 1) { 1779c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (totalFull != 0 || totalPartial != 0 || totalWindow != 0) { 1780c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.setLength(0); 1781c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append(prefix); 1782c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append(" TOTAL wake: "); 1783c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn boolean needComma = false; 1784c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (totalFull != 0) { 1785c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn needComma = true; 1786c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn formatTimeMs(sb, totalFull); 1787c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append("full"); 1788c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1789c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (totalPartial != 0) { 1790c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (needComma) { 1791c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append(", "); 1792c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1793c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn needComma = true; 1794c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn formatTimeMs(sb, totalPartial); 1795c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append("partial"); 1796c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1797c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (totalWindow != 0) { 1798c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn if (needComma) { 1799c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append(", "); 1800c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1801c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn needComma = true; 1802c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn formatTimeMs(sb, totalWindow); 1803c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append("window"); 1804c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn } 1805c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn sb.append(" realtime"); 1806c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn pw.println(sb.toString()); 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Sensor "); 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int handle = se.getHandle(); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (handle == Uid.Sensor.GPS) { 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("GPS"); 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(handle); 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(": "); 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 1831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime = (timer.getTotalTimeLocked( 1832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar batteryRealtime, which) + 500) / 1000; 1833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count = timer.getCountLocked(which); 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //timer.logState(); 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 18361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, totalTime); 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("realtime ("); 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(sb.toString()); 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime; 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts; 18609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int numExcessive; 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime = ps.getUserTime(which); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime = ps.getSystemTime(which); 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts = ps.getStarts(which); 18659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn numExcessive = which == STATS_SINCE_CHARGED 1866287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ? ps.countExcessivePowers() : 0; 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (userTime != 0 || systemTime != 0 || starts != 0 18699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn || numExcessive != 0) { 18701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 18711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" Proc "); 18721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(ent.getKey()); sb.append(":\n"); 18731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" CPU: "); 18741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTime(sb, userTime); sb.append("usr + "); 1875b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn formatTime(sb, systemTime); sb.append("krn"); 18760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (starts != 0) { 1877b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn sb.append("\n"); sb.append(prefix); sb.append(" "); 1878b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn sb.append(starts); sb.append(" proc starts"); 18790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 18801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 18819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int e=0; e<numExcessive; e++) { 1882287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Uid.Proc.ExcessivePower ew = ps.getExcessivePower(e); 18839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (ew != null) { 1884287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn pw.print(prefix); pw.print(" * Killed for "); 1885287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (ew.type == Uid.Proc.ExcessivePower.TYPE_WAKE) { 1886287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn pw.print("wake lock"); 1887287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (ew.type == Uid.Proc.ExcessivePower.TYPE_CPU) { 1888287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn pw.print("cpu"); 1889287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1890287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn pw.print("unknown"); 1891287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1892287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn pw.print(" use: "); 18931ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(ew.usedTime, pw); 18941ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" over "); 18951ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(ew.overTime, pw); 18961ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" ("); 18979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print((ew.usedTime*100)/ew.overTime); 18989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.println("%)"); 18999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 19009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" Apk "); pw.print(ent.getKey()); pw.println(":"); 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean apkActivity = false; 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakeups != 0) { 19151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print(" "); 19161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(wakeups); pw.println(" wakeup alarms"); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (serviceStats.size() > 0) { 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 19281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.setLength(0); 19291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" Service "); 19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(sent.getKey()); sb.append(":\n"); 19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" Created for: "); 19321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn formatTimeMs(sb, startTime / 1000); 19331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" uptime\n"); 19341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(prefix); sb.append(" Starts: "); 19351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(starts); 19361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(", launches: "); sb.append(launches); 19371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(sb.toString()); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!apkActivity) { 19431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println(" (nothing executed)"); 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!uidActivity) { 19491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println(" (nothing executed)"); 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn static void printBitDescriptions(PrintWriter pw, int oldval, int newval, BitDescription[] descriptions) { 19556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int diff = oldval ^ newval; 19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (diff == 0) return; 19576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<descriptions.length; i++) { 19586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn BitDescription bd = descriptions[i]; 19596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if ((diff&bd.mask) != 0) { 19606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (bd.shift < 0) { 19616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print((newval&bd.mask) != 0 ? " +" : " -"); 19626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print(bd.name); 19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print(" "); 19656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print(bd.name); 19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print("="); 19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int val = (newval&bd.mask)>>bd.shift; 19686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (bd.values != null && val >= 0 && val < bd.values.length) { 19696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print(bd.values[val]); 19706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 19716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.print(val); 19726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 19736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 19746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 19766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 19776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 19780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void prepareForDumpLocked() { 19790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 19800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 19810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public static class HistoryPrinter { 19820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldState = 0; 19830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldStatus = -1; 19840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldHealth = -1; 19850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldPlug = -1; 19860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldTemp = -1; 19870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int oldVolt = -1; 19880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 19890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void printNextItem(PrintWriter pw, HistoryItem rec, long now) { 19900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" "); 19910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn TimeUtils.formatDuration(rec.time-now, pw, TimeUtils.HUNDRED_DAY_FIELD_LEN); 19920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" "); 19930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (rec.cmd == HistoryItem.CMD_START) { 19940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println(" START"); 19950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if (rec.cmd == HistoryItem.CMD_OVERFLOW) { 19960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println(" *OVERFLOW*"); 19970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 19980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (rec.batteryLevel < 10) pw.print("00"); 19990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.batteryLevel < 100) pw.print("0"); 20000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(rec.batteryLevel); 20010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" "); 20020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (rec.states < 0x10) pw.print("0000000"); 20030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x100) pw.print("000000"); 20040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x1000) pw.print("00000"); 20050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x10000) pw.print("0000"); 20060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x100000) pw.print("000"); 20070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x1000000) pw.print("00"); 20080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn else if (rec.states < 0x10000000) pw.print("0"); 20090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(Integer.toHexString(rec.states)); 20100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (oldStatus != rec.batteryStatus) { 20110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldStatus = rec.batteryStatus; 20120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" status="); 20130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn switch (oldStatus) { 20140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_STATUS_UNKNOWN: 20150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("unknown"); 20160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_STATUS_CHARGING: 20180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("charging"); 20190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_STATUS_DISCHARGING: 20210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("discharging"); 20220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_STATUS_NOT_CHARGING: 20240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("not-charging"); 20250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_STATUS_FULL: 20270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("full"); 20280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn default: 20300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(oldStatus); 20310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (oldHealth != rec.batteryHealth) { 20350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldHealth = rec.batteryHealth; 20360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" health="); 20370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn switch (oldHealth) { 20380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_UNKNOWN: 20390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("unknown"); 20400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_GOOD: 20420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("good"); 20430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_OVERHEAT: 20450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("overheat"); 20460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_DEAD: 20480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("dead"); 20490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE: 20510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("over-voltage"); 20520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE: 20540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("failure"); 20550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn default: 20570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(oldHealth); 20580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (oldPlug != rec.batteryPlugType) { 20620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldPlug = rec.batteryPlugType; 20630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" plug="); 20640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn switch (oldPlug) { 20650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case 0: 20660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("none"); 20670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_PLUGGED_AC: 20690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("ac"); 20700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn case BatteryManager.BATTERY_PLUGGED_USB: 20720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print("usb"); 20730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 207437a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu case BatteryManager.BATTERY_PLUGGED_WIRELESS: 207537a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu pw.print("wireless"); 207637a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu break; 20770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn default: 20780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(oldPlug); 20790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn break; 20800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (oldTemp != rec.batteryTemperature) { 20830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldTemp = rec.batteryTemperature; 20840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" temp="); 20850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(oldTemp); 20860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (oldVolt != rec.batteryVoltage) { 20880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldVolt = rec.batteryVoltage; 20890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(" volt="); 20900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.print(oldVolt); 20910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn printBitDescriptions(pw, oldState, rec.states, 20930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HISTORY_STATE_DESCRIPTIONS); 20940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println(); 20950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn oldState = rec.states; 20970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 20990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dumps a human-readable summary of the battery statistics to the given PrintWriter. 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw a Printer to receive the dump output. 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 21061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 21070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn prepareForDumpLocked(); 21080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 21090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); 21100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 2111ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn final HistoryItem rec = new HistoryItem(); 2112ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (startIteratingHistoryLocked()) { 211332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn pw.println("Battery History:"); 21140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HistoryPrinter hprinter = new HistoryPrinter(); 2115ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn while (getNextHistoryLocked(rec)) { 21160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn hprinter.printNextItem(pw, rec, now); 21170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 21180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn finishIteratingHistoryLocked(); 21190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println(""); 21200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 21210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 21220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (startIteratingOldHistoryLocked()) { 21230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Old battery History:"); 21240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HistoryPrinter hprinter = new HistoryPrinter(); 21250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn while (getNextOldHistoryLocked(rec)) { 21260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn hprinter.printNextItem(pw, rec, now); 212732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn finishIteratingOldHistoryLocked(); 2129b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.println(""); 2130b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 2131b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn 2132b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn SparseArray<? extends Uid> uidStats = getUidStats(); 2133b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn final int NU = uidStats.size(); 2134b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn boolean didPid = false; 2135b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn long nowRealtime = SystemClock.elapsedRealtime(); 2136b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn for (int i=0; i<NU; i++) { 2137b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn Uid uid = uidStats.valueAt(i); 2138b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn SparseArray<? extends Uid.Pid> pids = uid.getPidStats(); 2139b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn if (pids != null) { 2140b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn for (int j=0; j<pids.size(); j++) { 2141b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn Uid.Pid pid = pids.valueAt(j); 2142b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn if (!didPid) { 2143b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.println("Per-PID Stats:"); 2144b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn didPid = true; 2145b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 2146b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn long time = pid.mWakeSum + (pid.mWakeStart != 0 2147b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn ? (nowRealtime - pid.mWakeStart) : 0); 2148b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.print(" PID "); pw.print(pids.keyAt(j)); 2149b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.print(" wake time: "); 2150b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn TimeUtils.formatDuration(time, pw); 2151b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.println(""); 2152b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 2153b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 2154b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 2155b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn if (didPid) { 2156b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn pw.println(""); 215732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 215832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 21596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.println("Statistics since last charge:"); 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" System starts: " + getStartCount() 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", currently on battery: " + getIsOnBattery()); 21626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dumpLocked(pw, "", STATS_SINCE_CHARGED, -1); 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 21646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn pw.println("Statistics since last unplugged:"); 21656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dumpLocked(pw, "", STATS_SINCE_UNPLUGGED, -1); 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 2169e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public void dumpCheckinLocked(PrintWriter pw, String[] args, List<ApplicationInfo> apps) { 21700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn prepareForDumpLocked(); 21710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isUnpluggedOnly = false; 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String arg : args) { 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("-u".equals(arg)) { 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data"); 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isUnpluggedOnly = true; 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (apps != null) { 2182e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>(); 2183e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<apps.size(); i++) { 2184e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn ApplicationInfo ai = apps.get(i); 2185e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn ArrayList<String> pkgs = uids.get(ai.uid); 2186e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (pkgs == null) { 2187e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pkgs = new ArrayList<String>(); 2188e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn uids.put(ai.uid, pkgs); 2189e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2190e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pkgs.add(ai.packageName); 2191e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2192e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn SparseArray<? extends Uid> uidStats = getUidStats(); 2193e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn final int NU = uidStats.size(); 2194e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] lineArgs = new String[2]; 2195e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<NU; i++) { 2196e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int uid = uidStats.keyAt(i); 2197e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn ArrayList<String> pkgs = uids.get(uid); 2198e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (pkgs != null) { 2199e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int j=0; j<pkgs.size(); j++) { 2200e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn lineArgs[0] = Integer.toString(uid); 2201e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn lineArgs[1] = pkgs.get(j); 2202e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn dumpLine(pw, 0 /* uid */, "i" /* category */, UID_DATA, 2203e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn (Object[])lineArgs); 2204e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2205e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2207e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isUnpluggedOnly) { 22096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dumpCheckinLocked(pw, STATS_SINCE_UNPLUGGED, -1); 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 22126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dumpCheckinLocked(pw, STATS_SINCE_CHARGED, -1); 22136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dumpCheckinLocked(pw, STATS_SINCE_UNPLUGGED, -1); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2217