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